export const dart = Object.create(null);
export const dartx = Object.create(null);
export const _debugger = Object.create(null);
export const _foreign_helper = Object.create(null);
export const _interceptors = Object.create(null);
export const _internal = Object.create(null);
export const _isolate_helper = Object.create(null);
export const _js_embedded_names = Object.create(null);
export const _js_helper = Object.create(null);
export const _js_mirrors = Object.create(null);
export const _js_primitives = Object.create(null);
export const _metadata = Object.create(null);
export const _native_typed_data = Object.create(null);
export const async = Object.create(null);
export const collection = Object.create(null);
export const convert = Object.create(null);
export const core = Object.create(null);
export const developer = Object.create(null);
export const io = Object.create(null);
export const isolate = Object.create(null);
export const js = Object.create(null);
export const js_util = Object.create(null);
export const math = Object.create(null);
export const mirrors = Object.create(null);
export const typed_data = Object.create(null);
export const indexed_db = Object.create(null);
export const html$ = Object.create(null);
export const html_common = Object.create(null);
export const svg$ = Object.create(null);
export const web_audio = Object.create(null);
export const web_gl = Object.create(null);
export const web_sql = Object.create(null);
let ListOfObject = () => (ListOfObject = dart.constFn(core.List$(core.Object)))();
let JSArrayOfListOfObject = () => (JSArrayOfListOfObject = dart.constFn(_interceptors.JSArray$(ListOfObject())))();
let JSArrayOfObject = () => (JSArrayOfObject = dart.constFn(_interceptors.JSArray$(core.Object)))();
let MapOfSymbol$dynamic = () => (MapOfSymbol$dynamic = dart.constFn(core.Map$(core.Symbol, dart.dynamic)))();
let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
let JSMutableArray = () => (JSMutableArray = dart.constFn(_interceptors.JSMutableArray$()))();
let JSFixedArray = () => (JSFixedArray = dart.constFn(_interceptors.JSFixedArray$()))();
let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
let ComparableOfnum = () => (ComparableOfnum = dart.constFn(core.Comparable$(core.num)))();
let StringTonum = () => (StringTonum = dart.constFn(dart.functionType(core.num, [core.String])))();
let StringTodouble = () => (StringTodouble = dart.constFn(dart.functionType(core.double, [core.String])))();
let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.functionType(core.bool, [dart.dynamic])))();
let ListMixin = () => (ListMixin = dart.constFn(collection.ListMixin$()))();
let ListBase = () => (ListBase = dart.constFn(collection.ListBase$()))();
let UnmodifiableListMixin = () => (UnmodifiableListMixin = dart.constFn(_internal.UnmodifiableListMixin$()))();
let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
let _Transformation = () => (_Transformation = dart.constFn(_internal._Transformation$()))();
let MappedIterable = () => (MappedIterable = dart.constFn(_internal.MappedIterable$()))();
let EfficientLengthMappedIterable = () => (EfficientLengthMappedIterable = dart.constFn(_internal.EfficientLengthMappedIterable$()))();
let Iterator = () => (Iterator = dart.constFn(core.Iterator$()))();
let MappedIterator = () => (MappedIterator = dart.constFn(_internal.MappedIterator$()))();
let MappedListIterable = () => (MappedListIterable = dart.constFn(_internal.MappedListIterable$()))();
let _ElementPredicate = () => (_ElementPredicate = dart.constFn(_internal._ElementPredicate$()))();
let WhereIterable = () => (WhereIterable = dart.constFn(_internal.WhereIterable$()))();
let WhereIterator = () => (WhereIterator = dart.constFn(_internal.WhereIterator$()))();
let _ExpandFunction = () => (_ExpandFunction = dart.constFn(_internal._ExpandFunction$()))();
let ExpandIterable = () => (ExpandIterable = dart.constFn(_internal.ExpandIterable$()))();
let ExpandIterator = () => (ExpandIterator = dart.constFn(_internal.ExpandIterator$()))();
let TakeIterable = () => (TakeIterable = dart.constFn(_internal.TakeIterable$()))();
let EfficientLengthTakeIterable = () => (EfficientLengthTakeIterable = dart.constFn(_internal.EfficientLengthTakeIterable$()))();
let TakeIterator = () => (TakeIterator = dart.constFn(_internal.TakeIterator$()))();
let TakeWhileIterable = () => (TakeWhileIterable = dart.constFn(_internal.TakeWhileIterable$()))();
let TakeWhileIterator = () => (TakeWhileIterator = dart.constFn(_internal.TakeWhileIterator$()))();
let SkipIterable = () => (SkipIterable = dart.constFn(_internal.SkipIterable$()))();
let EfficientLengthSkipIterable = () => (EfficientLengthSkipIterable = dart.constFn(_internal.EfficientLengthSkipIterable$()))();
let SkipIterator = () => (SkipIterator = dart.constFn(_internal.SkipIterator$()))();
let SkipWhileIterable = () => (SkipWhileIterable = dart.constFn(_internal.SkipWhileIterable$()))();
let SkipWhileIterator = () => (SkipWhileIterator = dart.constFn(_internal.SkipWhileIterator$()))();
let EmptyIterable = () => (EmptyIterable = dart.constFn(_internal.EmptyIterable$()))();
let EmptyIterator = () => (EmptyIterator = dart.constFn(_internal.EmptyIterator$()))();
let FixedLengthListMixin = () => (FixedLengthListMixin = dart.constFn(_internal.FixedLengthListMixin$()))();
let FixedLengthListBase = () => (FixedLengthListBase = dart.constFn(_internal.FixedLengthListBase$()))();
let ListMapView = () => (ListMapView = dart.constFn(_internal.ListMapView$()))();
let ReversedListIterable = () => (ReversedListIterable = dart.constFn(_internal.ReversedListIterable$()))();
let MapOfint$_IsolateContext = () => (MapOfint$_IsolateContext = dart.constFn(core.Map$(core.int, _isolate_helper._IsolateContext)))();
let MapOfint$dynamic = () => (MapOfint$dynamic = dart.constFn(core.Map$(core.int, dart.dynamic)))();
let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic])))();
let StringTovoid = () => (StringTovoid = dart.constFn(dart.functionType(dart.void, [core.String])))();
let ExpandoOfint = () => (ExpandoOfint = dart.constFn(core.Expando$(core.int)))();
let _FutureOfString = () => (_FutureOfString = dart.constFn(async._Future$(core.String)))();
let _FutureOfbool = () => (_FutureOfbool = dart.constFn(async._Future$(core.bool)))();
let _FutureOfint = () => (_FutureOfint = dart.constFn(async._Future$(core.int)))();
let VoidToObject = () => (VoidToObject = dart.constFn(dart.functionType(core.Object, [])))();
let Stream = () => (Stream = dart.constFn(async.Stream$()))();
let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.functionType(dart.void, [])))();
let TimerTovoid = () => (TimerTovoid = dart.constFn(dart.functionType(dart.void, [async.Timer])))();
let MapOfdynamic$int = () => (MapOfdynamic$int = dart.constFn(core.Map$(dart.dynamic, core.int)))();
let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic])))();
let InternalMap = () => (InternalMap = dart.constFn(_js_helper.InternalMap$()))();
let JSArrayOfint = () => (JSArrayOfint = dart.constFn(_interceptors.JSArray$(core.int)))();
let ListOfint = () => (ListOfint = dart.constFn(core.List$(core.int)))();
let SyncIterator = () => (SyncIterator = dart.constFn(_js_helper.SyncIterator$()))();
let IterableBase = () => (IterableBase = dart.constFn(collection.IterableBase$()))();
let SyncIterable = () => (SyncIterable = dart.constFn(_js_helper.SyncIterable$()))();
let JsLinkedHashMap = () => (JsLinkedHashMap = dart.constFn(_js_helper.JsLinkedHashMap$()))();
let Es6LinkedHashMap = () => (Es6LinkedHashMap = dart.constFn(_js_helper.Es6LinkedHashMap$()))();
let LinkedHashMapCell = () => (LinkedHashMapCell = dart.constFn(_js_helper.LinkedHashMapCell$()))();
let LinkedHashMapKeyIterable = () => (LinkedHashMapKeyIterable = dart.constFn(_js_helper.LinkedHashMapKeyIterable$()))();
let LinkedHashMapKeyIterator = () => (LinkedHashMapKeyIterator = dart.constFn(_js_helper.LinkedHashMapKeyIterator$()))();
let IteratorOfMatch = () => (IteratorOfMatch = dart.constFn(core.Iterator$(core.Match)))();
let IterableOfMatch = () => (IterableOfMatch = dart.constFn(core.Iterable$(core.Match)))();
let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
let JSArrayOfClassMirror = () => (JSArrayOfClassMirror = dart.constFn(_interceptors.JSArray$(mirrors.ClassMirror)))();
let ListOfClassMirror = () => (ListOfClassMirror = dart.constFn(core.List$(mirrors.ClassMirror)))();
let ListOfTypeVariableMirror = () => (ListOfTypeVariableMirror = dart.constFn(core.List$(mirrors.TypeVariableMirror)))();
let MapOfSymbol$MethodMirror = () => (MapOfSymbol$MethodMirror = dart.constFn(core.Map$(core.Symbol, mirrors.MethodMirror)))();
let JSArrayOfType = () => (JSArrayOfType = dart.constFn(_interceptors.JSArray$(core.Type)))();
let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
let ListOfFloat32x4 = () => (ListOfFloat32x4 = dart.constFn(core.List$(typed_data.Float32x4)))();
let ListOfInt32x4 = () => (ListOfInt32x4 = dart.constFn(core.List$(typed_data.Int32x4)))();
let ListOfFloat64x2 = () => (ListOfFloat64x2 = dart.constFn(core.List$(typed_data.Float64x2)))();
let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
let ListOfdouble = () => (ListOfdouble = dart.constFn(core.List$(core.double)))();
let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
let ZoneBinaryCallbackOfdynamic$Object$StackTrace = () => (ZoneBinaryCallbackOfdynamic$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, core.Object, core.StackTrace)))();
let _BufferingStreamSubscription = () => (_BufferingStreamSubscription = dart.constFn(async._BufferingStreamSubscription$()))();
let _ControllerSubscription = () => (_ControllerSubscription = dart.constFn(async._ControllerSubscription$()))();
let _BroadcastSubscription = () => (_BroadcastSubscription = dart.constFn(async._BroadcastSubscription$()))();
let _BroadcastStreamController = () => (_BroadcastStreamController = dart.constFn(async._BroadcastStreamController$()))();
let _SyncBroadcastStreamController = () => (_SyncBroadcastStreamController = dart.constFn(async._SyncBroadcastStreamController$()))();
let _AsyncBroadcastStreamController = () => (_AsyncBroadcastStreamController = dart.constFn(async._AsyncBroadcastStreamController$()))();
let _AsBroadcastStreamController = () => (_AsBroadcastStreamController = dart.constFn(async._AsBroadcastStreamController$()))();
let _DoneSubscription = () => (_DoneSubscription = dart.constFn(async._DoneSubscription$()))();
let FutureOr = () => (FutureOr = dart.constFn(async.FutureOr$()))();
let dynamicToFutureOr = () => (dynamicToFutureOr = dart.constFn(dart.functionType(async.FutureOr, [dart.dynamic])))();
let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.functionType(dart.dynamic, [])))();
let Future = () => (Future = dart.constFn(async.Future$()))();
let Completer = () => (Completer = dart.constFn(async.Completer$()))();
let _FutureOnValue = () => (_FutureOnValue = dart.constFn(async._FutureOnValue$()))();
let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
let _Future = () => (_Future = dart.constFn(async._Future$()))();
let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
let EventSink = () => (EventSink = dart.constFn(async.EventSink$()))();
let StreamView = () => (StreamView = dart.constFn(async.StreamView$()))();
let StreamConsumer = () => (StreamConsumer = dart.constFn(async.StreamConsumer$()))();
let StreamSink = () => (StreamSink = dart.constFn(async.StreamSink$()))();
let StreamTransformer = () => (StreamTransformer = dart.constFn(async.StreamTransformer$()))();
let StreamIterator = () => (StreamIterator = dart.constFn(async.StreamIterator$()))();
let _ControllerEventSinkWrapper = () => (_ControllerEventSinkWrapper = dart.constFn(async._ControllerEventSinkWrapper$()))();
let StreamController = () => (StreamController = dart.constFn(async.StreamController$()))();
let SynchronousStreamController = () => (SynchronousStreamController = dart.constFn(async.SynchronousStreamController$()))();
let _StreamControllerLifecycle = () => (_StreamControllerLifecycle = dart.constFn(async._StreamControllerLifecycle$()))();
let _StreamController = () => (_StreamController = dart.constFn(async._StreamController$()))();
let _SyncStreamControllerDispatch = () => (_SyncStreamControllerDispatch = dart.constFn(async._SyncStreamControllerDispatch$()))();
let _AsyncStreamControllerDispatch = () => (_AsyncStreamControllerDispatch = dart.constFn(async._AsyncStreamControllerDispatch$()))();
let _AsyncStreamController = () => (_AsyncStreamController = dart.constFn(async._AsyncStreamController$()))();
let _SyncStreamController = () => (_SyncStreamController = dart.constFn(async._SyncStreamController$()))();
let _StreamSinkWrapper = () => (_StreamSinkWrapper = dart.constFn(async._StreamSinkWrapper$()))();
let _AddStreamState = () => (_AddStreamState = dart.constFn(async._AddStreamState$()))();
let _StreamControllerAddStreamState = () => (_StreamControllerAddStreamState = dart.constFn(async._StreamControllerAddStreamState$()))();
let _EventSink = () => (_EventSink = dart.constFn(async._EventSink$()))();
let _EventDispatch = () => (_EventDispatch = dart.constFn(async._EventDispatch$()))();
let _EventGenerator = () => (_EventGenerator = dart.constFn(async._EventGenerator$()))();
let _GeneratedStreamImpl = () => (_GeneratedStreamImpl = dart.constFn(async._GeneratedStreamImpl$()))();
let _PendingEvents = () => (_PendingEvents = dart.constFn(async._PendingEvents$()))();
let _IterablePendingEvents = () => (_IterablePendingEvents = dart.constFn(async._IterablePendingEvents$()))();
let _DataHandler = () => (_DataHandler = dart.constFn(async._DataHandler$()))();
let _DelayedEvent = () => (_DelayedEvent = dart.constFn(async._DelayedEvent$()))();
let _DelayedData = () => (_DelayedData = dart.constFn(async._DelayedData$()))();
let _StreamImplEvents = () => (_StreamImplEvents = dart.constFn(async._StreamImplEvents$()))();
let _BroadcastCallback = () => (_BroadcastCallback = dart.constFn(async._BroadcastCallback$()))();
let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
let _WhereStream = () => (_WhereStream = dart.constFn(async._WhereStream$()))();
let _Transformation$ = () => (_Transformation$ = dart.constFn(async._Transformation$()))();
let _MapStream = () => (_MapStream = dart.constFn(async._MapStream$()))();
let _ExpandStream = () => (_ExpandStream = dart.constFn(async._ExpandStream$()))();
let _HandleErrorStream = () => (_HandleErrorStream = dart.constFn(async._HandleErrorStream$()))();
let _TakeStream = () => (_TakeStream = dart.constFn(async._TakeStream$()))();
let _StateStreamSubscription = () => (_StateStreamSubscription = dart.constFn(async._StateStreamSubscription$()))();
let _TakeWhileStream = () => (_TakeWhileStream = dart.constFn(async._TakeWhileStream$()))();
let _SkipStream = () => (_SkipStream = dart.constFn(async._SkipStream$()))();
let _SkipWhileStream = () => (_SkipWhileStream = dart.constFn(async._SkipWhileStream$()))();
let _Equality = () => (_Equality = dart.constFn(async._Equality$()))();
let _DistinctStream = () => (_DistinctStream = dart.constFn(async._DistinctStream$()))();
let _EventSinkWrapper = () => (_EventSinkWrapper = dart.constFn(async._EventSinkWrapper$()))();
let _SinkTransformerStreamSubscription = () => (_SinkTransformerStreamSubscription = dart.constFn(async._SinkTransformerStreamSubscription$()))();
let _SinkMapper = () => (_SinkMapper = dart.constFn(async._SinkMapper$()))();
let _StreamSinkTransformer = () => (_StreamSinkTransformer = dart.constFn(async._StreamSinkTransformer$()))();
let _BoundSinkStream = () => (_BoundSinkStream = dart.constFn(async._BoundSinkStream$()))();
let _TransformDataHandler = () => (_TransformDataHandler = dart.constFn(async._TransformDataHandler$()))();
let _TransformErrorHandler = () => (_TransformErrorHandler = dart.constFn(async._TransformErrorHandler$()))();
let _TransformDoneHandler = () => (_TransformDoneHandler = dart.constFn(async._TransformDoneHandler$()))();
let _HandlerEventSink = () => (_HandlerEventSink = dart.constFn(async._HandlerEventSink$()))();
let _StreamHandlerTransformer = () => (_StreamHandlerTransformer = dart.constFn(async._StreamHandlerTransformer$()))();
let _SubscriptionTransformer = () => (_SubscriptionTransformer = dart.constFn(async._SubscriptionTransformer$()))();
let _StreamSubscriptionTransformer = () => (_StreamSubscriptionTransformer = dart.constFn(async._StreamSubscriptionTransformer$()))();
let _BoundSubscriptionStream = () => (_BoundSubscriptionStream = dart.constFn(async._BoundSubscriptionStream$()))();
let ZoneCallback = () => (ZoneCallback = dart.constFn(async.ZoneCallback$()))();
let ZoneUnaryCallback = () => (ZoneUnaryCallback = dart.constFn(async.ZoneUnaryCallback$()))();
let ZoneBinaryCallback = () => (ZoneBinaryCallback = dart.constFn(async.ZoneBinaryCallback$()))();
let HandleUncaughtErrorHandler = () => (HandleUncaughtErrorHandler = dart.constFn(async.HandleUncaughtErrorHandler$()))();
let RunHandler = () => (RunHandler = dart.constFn(async.RunHandler$()))();
let RunUnaryHandler = () => (RunUnaryHandler = dart.constFn(async.RunUnaryHandler$()))();
let RunBinaryHandler = () => (RunBinaryHandler = dart.constFn(async.RunBinaryHandler$()))();
let RegisterCallbackHandler = () => (RegisterCallbackHandler = dart.constFn(async.RegisterCallbackHandler$()))();
let RegisterUnaryCallbackHandler = () => (RegisterUnaryCallbackHandler = dart.constFn(async.RegisterUnaryCallbackHandler$()))();
let RegisterBinaryCallbackHandler = () => (RegisterBinaryCallbackHandler = dart.constFn(async.RegisterBinaryCallbackHandler$()))();
let _ZoneFunction = () => (_ZoneFunction = dart.constFn(async._ZoneFunction$()))();
let _ZoneFunctionOfRunHandler = () => (_ZoneFunctionOfRunHandler = dart.constFn(async._ZoneFunction$(async.RunHandler)))();
let _ZoneFunctionOfRunUnaryHandler = () => (_ZoneFunctionOfRunUnaryHandler = dart.constFn(async._ZoneFunction$(async.RunUnaryHandler)))();
let _ZoneFunctionOfRunBinaryHandler = () => (_ZoneFunctionOfRunBinaryHandler = dart.constFn(async._ZoneFunction$(async.RunBinaryHandler)))();
let _ZoneFunctionOfRegisterCallbackHandler = () => (_ZoneFunctionOfRegisterCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterCallbackHandler)))();
let _ZoneFunctionOfRegisterUnaryCallbackHandler = () => (_ZoneFunctionOfRegisterUnaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterUnaryCallbackHandler)))();
let _ZoneFunctionOfRegisterBinaryCallbackHandler = () => (_ZoneFunctionOfRegisterBinaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterBinaryCallbackHandler)))();
let _ZoneFunctionOfErrorCallbackHandler = () => (_ZoneFunctionOfErrorCallbackHandler = dart.constFn(async._ZoneFunction$(async.ErrorCallbackHandler)))();
let _ZoneFunctionOfScheduleMicrotaskHandler = () => (_ZoneFunctionOfScheduleMicrotaskHandler = dart.constFn(async._ZoneFunction$(async.ScheduleMicrotaskHandler)))();
let _ZoneFunctionOfCreateTimerHandler = () => (_ZoneFunctionOfCreateTimerHandler = dart.constFn(async._ZoneFunction$(async.CreateTimerHandler)))();
let _ZoneFunctionOfCreatePeriodicTimerHandler = () => (_ZoneFunctionOfCreatePeriodicTimerHandler = dart.constFn(async._ZoneFunction$(async.CreatePeriodicTimerHandler)))();
let _ZoneFunctionOfPrintHandler = () => (_ZoneFunctionOfPrintHandler = dart.constFn(async._ZoneFunction$(async.PrintHandler)))();
let _ZoneFunctionOfForkHandler = () => (_ZoneFunctionOfForkHandler = dart.constFn(async._ZoneFunction$(async.ForkHandler)))();
let _ZoneFunctionOfHandleUncaughtErrorHandler = () => (_ZoneFunctionOfHandleUncaughtErrorHandler = dart.constFn(async._ZoneFunction$(async.HandleUncaughtErrorHandler)))();
let _HashMap = () => (_HashMap = dart.constFn(collection._HashMap$()))();
let _IdentityHashMap = () => (_IdentityHashMap = dart.constFn(collection._IdentityHashMap$()))();
let _PredicateOfObject = () => (_PredicateOfObject = dart.constFn(collection._Predicate$(core.Object)))();
let _CustomHashMap = () => (_CustomHashMap = dart.constFn(collection._CustomHashMap$()))();
let _HashMapKeyIterable = () => (_HashMapKeyIterable = dart.constFn(collection._HashMapKeyIterable$()))();
let _HashMapKeyIterator = () => (_HashMapKeyIterator = dart.constFn(collection._HashMapKeyIterator$()))();
let _LinkedIdentityHashMap = () => (_LinkedIdentityHashMap = dart.constFn(collection._LinkedIdentityHashMap$()))();
let _Es6LinkedIdentityHashMap = () => (_Es6LinkedIdentityHashMap = dart.constFn(collection._Es6LinkedIdentityHashMap$()))();
let _Es6MapIterable = () => (_Es6MapIterable = dart.constFn(collection._Es6MapIterable$()))();
let _Es6MapIterator = () => (_Es6MapIterator = dart.constFn(collection._Es6MapIterator$()))();
let _LinkedCustomHashMap = () => (_LinkedCustomHashMap = dart.constFn(collection._LinkedCustomHashMap$()))();
let IterableOfObject = () => (IterableOfObject = dart.constFn(core.Iterable$(core.Object)))();
let SetOfObject = () => (SetOfObject = dart.constFn(core.Set$(core.Object)))();
let SetMixin = () => (SetMixin = dart.constFn(collection.SetMixin$()))();
let SetBase = () => (SetBase = dart.constFn(collection.SetBase$()))();
let _HashSetBase = () => (_HashSetBase = dart.constFn(collection._HashSetBase$()))();
let _HashSet = () => (_HashSet = dart.constFn(collection._HashSet$()))();
let _IdentityHashSet = () => (_IdentityHashSet = dart.constFn(collection._IdentityHashSet$()))();
let _CustomHashSet = () => (_CustomHashSet = dart.constFn(collection._CustomHashSet$()))();
let _HashSetIterator = () => (_HashSetIterator = dart.constFn(collection._HashSetIterator$()))();
let _LinkedHashSet = () => (_LinkedHashSet = dart.constFn(collection._LinkedHashSet$()))();
let _LinkedIdentityHashSet = () => (_LinkedIdentityHashSet = dart.constFn(collection._LinkedIdentityHashSet$()))();
let _LinkedCustomHashSet = () => (_LinkedCustomHashSet = dart.constFn(collection._LinkedCustomHashSet$()))();
let _LinkedHashSetCell = () => (_LinkedHashSetCell = dart.constFn(collection._LinkedHashSetCell$()))();
let _LinkedHashSetIterator = () => (_LinkedHashSetIterator = dart.constFn(collection._LinkedHashSetIterator$()))();
let UnmodifiableListView = () => (UnmodifiableListView = dart.constFn(collection.UnmodifiableListView$()))();
let _Equality$ = () => (_Equality$ = dart.constFn(collection._Equality$()))();
let _Hasher = () => (_Hasher = dart.constFn(collection._Hasher$()))();
let HashMap = () => (HashMap = dart.constFn(collection.HashMap$()))();
let HashSet = () => (HashSet = dart.constFn(collection.HashSet$()))();
let IterableMixin = () => (IterableMixin = dart.constFn(collection.IterableMixin$()))();
let HasNextIterator = () => (HasNextIterator = dart.constFn(collection.HasNextIterator$()))();
let LinkedHashMap = () => (LinkedHashMap = dart.constFn(collection.LinkedHashMap$()))();
let LinkedHashSet = () => (LinkedHashSet = dart.constFn(collection.LinkedHashSet$()))();
let LinkedList = () => (LinkedList = dart.constFn(collection.LinkedList$()))();
let _LinkedListIterator = () => (_LinkedListIterator = dart.constFn(collection._LinkedListIterator$()))();
let LinkedListEntry = () => (LinkedListEntry = dart.constFn(collection.LinkedListEntry$()))();
let MapMixin = () => (MapMixin = dart.constFn(collection.MapMixin$()))();
let MapBase = () => (MapBase = dart.constFn(collection.MapBase$()))();
let _UnmodifiableMapMixin = () => (_UnmodifiableMapMixin = dart.constFn(collection._UnmodifiableMapMixin$()))();
let UnmodifiableMapBase = () => (UnmodifiableMapBase = dart.constFn(collection.UnmodifiableMapBase$()))();
let _MapBaseValueIterable = () => (_MapBaseValueIterable = dart.constFn(collection._MapBaseValueIterable$()))();
let _MapBaseValueIterator = () => (_MapBaseValueIterator = dart.constFn(collection._MapBaseValueIterator$()))();
let MapView = () => (MapView = dart.constFn(collection.MapView$()))();
let UnmodifiableMapView = () => (UnmodifiableMapView = dart.constFn(collection.UnmodifiableMapView$()))();
let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic, dart.dynamic])))();
let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
let DoubleLinkedQueue = () => (DoubleLinkedQueue = dart.constFn(collection.DoubleLinkedQueue$()))();
let _DoubleLinkedQueueIterator = () => (_DoubleLinkedQueueIterator = dart.constFn(collection._DoubleLinkedQueueIterator$()))();
let ListQueue = () => (ListQueue = dart.constFn(collection.ListQueue$()))();
let _ListQueueIterator = () => (_ListQueueIterator = dart.constFn(collection._ListQueueIterator$()))();
let _Predicate$ = () => (_Predicate$ = dart.constFn(collection._Predicate$()))();
let _SplayTreeNode = () => (_SplayTreeNode = dart.constFn(collection._SplayTreeNode$()))();
let _SplayTreeMapNode = () => (_SplayTreeMapNode = dart.constFn(collection._SplayTreeMapNode$()))();
let _SplayTree = () => (_SplayTree = dart.constFn(collection._SplayTree$()))();
let _TypeTest = () => (_TypeTest = dart.constFn(collection._TypeTest$()))();
let SplayTreeMap = () => (SplayTreeMap = dart.constFn(collection.SplayTreeMap$()))();
let _SplayTreeIterator = () => (_SplayTreeIterator = dart.constFn(collection._SplayTreeIterator$()))();
let _SplayTreeKeyIterable = () => (_SplayTreeKeyIterable = dart.constFn(collection._SplayTreeKeyIterable$()))();
let _SplayTreeValueIterable = () => (_SplayTreeValueIterable = dart.constFn(collection._SplayTreeValueIterable$()))();
let _SplayTreeKeyIterator = () => (_SplayTreeKeyIterator = dart.constFn(collection._SplayTreeKeyIterator$()))();
let _SplayTreeValueIterator = () => (_SplayTreeValueIterator = dart.constFn(collection._SplayTreeValueIterator$()))();
let _SplayTreeNodeIterator = () => (_SplayTreeNodeIterator = dart.constFn(collection._SplayTreeNodeIterator$()))();
let SplayTreeSet = () => (SplayTreeSet = dart.constFn(collection.SplayTreeSet$()))();
let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
let MappedIterableOfString$dynamic = () => (MappedIterableOfString$dynamic = dart.constFn(_internal.MappedIterable$(core.String, dart.dynamic)))();
let SinkOfObject = () => (SinkOfObject = dart.constFn(core.Sink$(core.Object)))();
let Codec = () => (Codec = dart.constFn(convert.Codec$()))();
let ComparableOfString = () => (ComparableOfString = dart.constFn(core.Comparable$(core.String)))();
let List = () => (List = dart.constFn(core.List$()))();
let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
let MapOfString$Encoding = () => (MapOfString$Encoding = dart.constFn(core.Map$(core.String, convert.Encoding)))();
let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.functionType(dart.void, [ListOfint()])))();
let _ChunkedConversionCallback = () => (_ChunkedConversionCallback = dart.constFn(convert._ChunkedConversionCallback$()))();
let ChunkedConverter = () => (ChunkedConverter = dart.constFn(convert.ChunkedConverter$()))();
let _SimpleCallbackSink = () => (_SimpleCallbackSink = dart.constFn(convert._SimpleCallbackSink$()))();
let _ConverterStreamEventSink = () => (_ConverterStreamEventSink = dart.constFn(convert._ConverterStreamEventSink$()))();
let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
let Comparator = () => (Comparator = dart.constFn(core.Comparator$()))();
let Comparable = () => (Comparable = dart.constFn(core.Comparable$()))();
let ComparableOfDateTime = () => (ComparableOfDateTime = dart.constFn(core.Comparable$(core.DateTime)))();
let ComparableOfDuration = () => (ComparableOfDuration = dart.constFn(core.Comparable$(core.Duration)))();
let Expando = () => (Expando = dart.constFn(core.Expando$()))();
let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
let Set = () => (Set = dart.constFn(core.Set$()))();
let Sink = () => (Sink = dart.constFn(core.Sink$()))();
let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
let ListOfFileSystemEntityType = () => (ListOfFileSystemEntityType = dart.constFn(core.List$(io.FileSystemEntityType)))();
let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
let JSArrayOf_Credentials = () => (JSArrayOf_Credentials = dart.constFn(_interceptors.JSArray$(io._Credentials)))();
let JSArrayOf_ProxyCredentials = () => (JSArrayOf_ProxyCredentials = dart.constFn(_interceptors.JSArray$(io._ProxyCredentials)))();
let FutureOf_HttpClientRequest = () => (FutureOf_HttpClientRequest = dart.constFn(async.Future$(io._HttpClientRequest)))();
let FutureOrOf_HttpClientRequest = () => (FutureOrOf_HttpClientRequest = dart.constFn(async.FutureOr$(io._HttpClientRequest)))();
let X509CertificateAndStringAndintTobool = () => (X509CertificateAndStringAndintTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate, core.String, core.int])))();
let FutureOfbool = () => (FutureOfbool = dart.constFn(async.Future$(core.bool)))();
let UriAndStringAndStringToFutureOfbool = () => (UriAndStringAndStringToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.Uri, core.String, core.String])))();
let StringAndintAndString__ToFutureOfbool = () => (StringAndintAndString__ToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.String, core.int, core.String, core.String])))();
let UriToString = () => (UriToString = dart.constFn(dart.functionType(core.String, [core.Uri])))();
let MapOfString$_ConnectionTarget = () => (MapOfString$_ConnectionTarget = dart.constFn(core.Map$(core.String, io._ConnectionTarget)))();
let ListOf_Credentials = () => (ListOf_Credentials = dart.constFn(core.List$(io._Credentials)))();
let ListOf_ProxyCredentials = () => (ListOf_ProxyCredentials = dart.constFn(core.List$(io._ProxyCredentials)))();
let MapOfint$_HttpConnection = () => (MapOfint$_HttpConnection = dart.constFn(core.Map$(core.int, io._HttpConnection)))();
let HashMapOfint$_HttpConnection = () => (HashMapOfint$_HttpConnection = dart.constFn(collection.HashMap$(core.int, io._HttpConnection)))();
let LinkedListOf_HttpConnection = () => (LinkedListOf_HttpConnection = dart.constFn(collection.LinkedList$(io._HttpConnection)))();
let StreamControllerOfHttpRequest = () => (StreamControllerOfHttpRequest = dart.constFn(async.StreamController$(io.HttpRequest)))();
let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
let ListOfbool = () => (ListOfbool = dart.constFn(core.List$(core.bool)))();
let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
let ListOfMapOfString$String = () => (ListOfMapOfString$String = dart.constFn(core.List$(MapOfString$String())))();
let FutureOfServiceExtensionResponse = () => (FutureOfServiceExtensionResponse = dart.constFn(async.Future$(developer.ServiceExtensionResponse)))();
let MapOfint$_FileResourceInfo = () => (MapOfint$_FileResourceInfo = dart.constFn(core.Map$(core.int, io._FileResourceInfo)))();
let MapOfint$_ProcessResourceInfo = () => (MapOfint$_ProcessResourceInfo = dart.constFn(core.Map$(core.int, io._ProcessResourceInfo)))();
let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
let X509CertificateTodynamic = () => (X509CertificateTodynamic = dart.constFn(dart.functionType(dart.dynamic, [io.X509Certificate])))();
let intToListOfint = () => (intToListOfint = dart.constFn(dart.functionType(ListOfint(), [core.int])))();
let StreamOfRawSocket = () => (StreamOfRawSocket = dart.constFn(async.Stream$(io.RawSocket)))();
let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
let Point$ = () => (Point$ = dart.constFn(math.Point$()))();
let RectangleOfnum = () => (RectangleOfnum = dart.constFn(math.Rectangle$(core.num)))();
let _RectangleBase = () => (_RectangleBase = dart.constFn(math._RectangleBase$()))();
let Rectangle = () => (Rectangle = dart.constFn(math.Rectangle$()))();
let MutableRectangle = () => (MutableRectangle = dart.constFn(math.MutableRectangle$()))();
let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html$.EventStreamProvider$(html$.Event)))();
let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html$.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
let FutureOfDatabase = () => (FutureOfDatabase = dart.constFn(async.Future$(indexed_db.Database)))();
let CompleterOfIdbFactory = () => (CompleterOfIdbFactory = dart.constFn(async.Completer$(indexed_db.IdbFactory)))();
let FutureOfIdbFactory = () => (FutureOfIdbFactory = dart.constFn(async.Future$(indexed_db.IdbFactory)))();
let FutureOfListOfString = () => (FutureOfListOfString = dart.constFn(async.Future$(ListOfString())))();
let EventTovoid = () => (EventTovoid = dart.constFn(dart.functionType(dart.void, [html$.Event])))();
let CompleterOfDatabase = () => (CompleterOfDatabase = dart.constFn(async.Completer$(indexed_db.Database)))();
let ListOfEventTarget = () => (ListOfEventTarget = dart.constFn(core.List$(html$.EventTarget)))();
let RectangleOfint = () => (RectangleOfint = dart.constFn(math.Rectangle$(core.int)))();
let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html$.Node)))();
let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html$.Node)))();
let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html$.Element)))();
let IterableOfMapOfString$dynamic = () => (IterableOfMapOfString$dynamic = dart.constFn(core.Iterable$(MapOfString$dynamic())))();
let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html$.EventStreamProvider$(html$.WheelEvent)))();
let EventStreamProviderOfTransitionEvent = () => (EventStreamProviderOfTransitionEvent = dart.constFn(html$.EventStreamProvider$(html$.TransitionEvent)))();
let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html$.EventStreamProvider$(html$.MouseEvent)))();
let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html$.EventStreamProvider$(html$.ClipboardEvent)))();
let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyboardEvent)))();
let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html$.EventStreamProvider$(html$.TouchEvent)))();
let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.WheelEvent)))();
let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.TransitionEvent)))();
let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html$.Entry)))();
let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html$.EventStreamProvider$(html$.ProgressEvent)))();
let EventStreamProviderOfMediaKeyEvent = () => (EventStreamProviderOfMediaKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaKeyEvent)))();
let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MessageEvent)))();
let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html$.EventStreamProvider$(html$.PopStateEvent)))();
let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html$.EventStreamProvider$(html$.StorageEvent)))();
let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html$.EventStreamProvider$(web_gl.ContextEvent)))();
let ListOfnum = () => (ListOfnum = dart.constFn(core.List$(core.num)))();
let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html$.MessagePort)))();
let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html$.FileSystem)))();
let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html$.Entry)))();
let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html$.CssRule)))();
let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html$.Element)))();
let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html$.CssStyleDeclaration)))();
let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html$.File)))();
let CompleterOfString = () => (CompleterOfString = dart.constFn(async.Completer$(core.String)))();
let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html$.Metadata)))();
let CompleterOfListOfEntry = () => (CompleterOfListOfEntry = dart.constFn(async.Completer$(ListOfEntry())))();
let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
let ImmutableListMixin = () => (ImmutableListMixin = dart.constFn(html$.ImmutableListMixin$()))();
let ElementAndElementToint = () => (ElementAndElementToint = dart.constFn(dart.functionType(core.int, [html$.Element, html$.Element])))();
let ElementTobool = () => (ElementTobool = dart.constFn(dart.functionType(core.bool, [html$.Element])))();
let ElementList = () => (ElementList = dart.constFn(html$.ElementList$()))();
let _FrozenElementList = () => (_FrozenElementList = dart.constFn(html$._FrozenElementList$()))();
let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html$._EventStream$(html$.Event)))();
let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.Event)))();
let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html$.FileWriter)))();
let CompleterOfFile$ = () => (CompleterOfFile$ = dart.constFn(async.Completer$(html$.File)))();
let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html$.FontFace)))();
let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html$.GamepadButton)))();
let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html$.Geoposition)))();
let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
let ListOfSourceInfo = () => (ListOfSourceInfo = dart.constFn(core.List$(html$.SourceInfo)))();
let CompleterOfListOfSourceInfo = () => (CompleterOfListOfSourceInfo = dart.constFn(async.Completer$(ListOfSourceInfo())))();
let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MidiMessageEvent)))();
let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html$.MimeType)))();
let ListOfMutationRecord = () => (ListOfMutationRecord = dart.constFn(core.List$(html$.MutationRecord)))();
let _wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = () => (_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = dart.constFn(html$._wrapZoneBinaryCallback$(ListOfMutationRecord(), html$.MutationObserver, dart.void)))();
let MapOfString$bool = () => (MapOfString$bool = dart.constFn(core.Map$(core.String, core.bool)))();
let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html$.MediaStream)))();
let NodeTobool = () => (NodeTobool = dart.constFn(dart.functionType(core.bool, [html$.Node])))();
let ComparatorOfNode = () => (ComparatorOfNode = dart.constFn(core.Comparator$(html$.Node)))();
let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html$.Plugin)))();
let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDtmfToneChangeEvent)))();
let JSArrayOfMapOfString$String = () => (JSArrayOfMapOfString$String = dart.constFn(_interceptors.JSArray$(MapOfString$String())))();
let CompleterOfRtcSessionDescription = () => (CompleterOfRtcSessionDescription = dart.constFn(async.Completer$(html$.RtcSessionDescription)))();
let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html$.RtcStatsResponse)))();
let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaStreamEvent)))();
let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDataChannelEvent)))();
let EventStreamProviderOfRtcIceCandidateEvent = () => (EventStreamProviderOfRtcIceCandidateEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcIceCandidateEvent)))();
let ListOfOptionElement = () => (ListOfOptionElement = dart.constFn(core.List$(html$.OptionElement)))();
let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html$.OptionElement)))();
let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html$.OptionElement)))();
let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html$.SourceBuffer)))();
let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html$.SpeechGrammar)))();
let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionError)))();
let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionEvent)))();
let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html$.SpeechRecognitionResult)))();
let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechSynthesisEvent)))();
let VoidToString = () => (VoidToString = dart.constFn(dart.functionType(core.String, [])))();
let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, core.String])))();
let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html$._WrappedList$(html$.TableSectionElement)))();
let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html$._WrappedList$(html$.TableRowElement)))();
let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html$._WrappedList$(html$.TableCellElement)))();
let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html$.TextTrackCue)))();
let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html$.TextTrack)))();
let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html$.EventStreamProvider$(html$.TrackEvent)))();
let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html$.Touch)))();
let ListOfTrackDefault = () => (ListOfTrackDefault = dart.constFn(core.List$(html$.TrackDefault)))();
let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html$.EventStreamProvider$(html$.CloseEvent)))();
let CompleterOfnum = () => (CompleterOfnum = dart.constFn(async.Completer$(core.num)))();
let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceMotionEvent)))();
let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceOrientationEvent)))();
let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html$.EventStreamProvider$(html$.AnimationEvent)))();
let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html$.EventStreamProvider$(html$.BeforeUnloadEvent)))();
let _EventStreamOfBeforeUnloadEvent = () => (_EventStreamOfBeforeUnloadEvent = dart.constFn(html$._EventStream$(html$.BeforeUnloadEvent)))();
let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html$.BeforeUnloadEvent)))();
let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.BeforeUnloadEvent)))();
let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementListEventStreamImpl$(html$.BeforeUnloadEvent)))();
let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.functionType(core.String, [core.String, core.String])))();
let SetOfStringTodynamic = () => (SetOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [SetOfString()])))();
let EventStreamProvider = () => (EventStreamProvider = dart.constFn(html$.EventStreamProvider$()))();
let ElementStream = () => (ElementStream = dart.constFn(html$.ElementStream$()))();
let _EventStream = () => (_EventStream = dart.constFn(html$._EventStream$()))();
let _ElementEventStreamImpl = () => (_ElementEventStreamImpl = dart.constFn(html$._ElementEventStreamImpl$()))();
let _ElementListEventStreamImpl = () => (_ElementListEventStreamImpl = dart.constFn(html$._ElementListEventStreamImpl$()))();
let _EventListener = () => (_EventListener = dart.constFn(html$._EventListener$()))();
let _wrapZoneCallbackOfEvent$dynamic = () => (_wrapZoneCallbackOfEvent$dynamic = dart.constFn(html$._wrapZoneCallback$(html$.Event, dart.dynamic)))();
let _EventStreamSubscription = () => (_EventStreamSubscription = dart.constFn(html$._EventStreamSubscription$()))();
let CustomStream = () => (CustomStream = dart.constFn(html$.CustomStream$()))();
let _CustomEventStreamImpl = () => (_CustomEventStreamImpl = dart.constFn(html$._CustomEventStreamImpl$()))();
let EventStreamProviderOfKeyEvent = () => (EventStreamProviderOfKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyEvent)))();
let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html$.CustomStream$(html$.KeyEvent)))();
let _StreamPool = () => (_StreamPool = dart.constFn(html$._StreamPool$()))();
let _CustomEventStreamProvider = () => (_CustomEventStreamProvider = dart.constFn(html$._CustomEventStreamProvider$()))();
let MapOfString$Function = () => (MapOfString$Function = dart.constFn(core.Map$(core.String, core.Function)))();
let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html$.KeyEvent)))();
let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html$.KeyEvent)))();
let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))();
let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html$.NodeValidator)))();
let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html$.NodeValidator)))();
let _WrappedList = () => (_WrappedList = dart.constFn(html$._WrappedList$()))();
let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html$.Node)))();
let _WrappedIterator = () => (_WrappedIterator = dart.constFn(html$._WrappedIterator$()))();
let HttpRequestTodynamic = () => (HttpRequestTodynamic = dart.constFn(dart.functionType(dart.dynamic, [html$.HttpRequest])))();
let FixedSizeListIterator = () => (FixedSizeListIterator = dart.constFn(html$.FixedSizeListIterator$()))();
let _VariableSizeListIterator = () => (_VariableSizeListIterator = dart.constFn(html$._VariableSizeListIterator$()))();
let _wrapZoneCallback = () => (_wrapZoneCallback = dart.constFn(html$._wrapZoneCallback$()))();
let _wrapZoneBinaryCallback = () => (_wrapZoneBinaryCallback = dart.constFn(html$._wrapZoneBinaryCallback$()))();
let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.functionType(dart.void, [html$.Element])))();
let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg$.Length)))();
let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg$.Number)))();
let ListOfPathSeg = () => (ListOfPathSeg = dart.constFn(core.List$(svg$.PathSeg)))();
let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
let dynamicTodynamic$ = () => (dynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic])))();
let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.String])))();
let VoidTo_MethodStats = () => (VoidTo_MethodStats = dart.constFn(dart.definiteFunctionType(dart._MethodStats, [])))();
let VoidToFunctionType = () => (VoidToFunctionType = dart.constFn(dart.definiteFunctionType(dart.FunctionType, [])))();
let dynamicToString = () => (dynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic])))();
let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
let dynamicTovoid$ = () => (dynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
let TypeTodynamic = () => (TypeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type])))();
let VoidToString$ = () => (VoidToString$ = dart.constFn(dart.definiteFunctionType(core.String, [])))();
let StringToString$ = () => (StringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String])))();
let StringAndStringTodynamic = () => (StringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String])))();
let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
let dynamicAnddynamicAnddynamicTodynamic = () => (dynamicAnddynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])))();
let dynamicToArgumentError = () => (dynamicToArgumentError = dart.constFn(dart.definiteFunctionType(core.ArgumentError, [dart.dynamic])))();
let dynamicToStackTrace = () => (dynamicToStackTrace = dart.constFn(dart.definiteFunctionType(core.StackTrace, [dart.dynamic])))();
let dynamicToint = () => (dynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic])))();
let dynamicAndMapTodynamic = () => (dynamicAndMapTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Map])))();
let dynamicAndStringTodynamic = () => (dynamicAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])))();
let dynamicAndStringAnddynamicTovoid = () => (dynamicAndStringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, dart.dynamic])))();
let FAndintToF = () => (FAndintToF = dart.constFn(dart.definiteFunctionType(F => [F, [F, core.int]])))();
let JSSyntaxRegExpTodynamic = () => (JSSyntaxRegExpTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_js_helper.JSSyntaxRegExp])))();
let JSSyntaxRegExpToint = () => (JSSyntaxRegExpToint = dart.constFn(dart.definiteFunctionType(core.int, [_js_helper.JSSyntaxRegExp])))();
let JSSyntaxRegExpAndStringAndintToMatch = () => (JSSyntaxRegExpAndStringAndintToMatch = dart.constFn(dart.definiteFunctionType(core.Match, [_js_helper.JSSyntaxRegExp, core.String, core.int])))();
let dynamicAnddynamicAnddynamicToint = () => (dynamicAnddynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic])))();
let dynamicAnddynamicAnddynamicToString = () => (dynamicAnddynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic, dart.dynamic])))();
let dynamicAnddynamicAnddynamicTobool = () => (dynamicAnddynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic, dart.dynamic])))();
let StringAndStringAndintToIterableOfMatch = () => (StringAndStringAndintToIterableOfMatch = dart.constFn(dart.definiteFunctionType(IterableOfMatch(), [core.String, core.String, core.int])))();
let StringAnddynamicAndintTobool = () => (StringAnddynamicAndintTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String, dart.dynamic, core.int])))();
let StringAndJSSyntaxRegExpAndString__ToString = () => (StringAndJSSyntaxRegExpAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, _js_helper.JSSyntaxRegExp, core.String, core.int])))();
let StringAndPatternAndStringToString = () => (StringAndPatternAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String])))();
let MatchToString$ = () => (MatchToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.Match])))();
let StringAndPatternAndFn__ToString = () => (StringAndPatternAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), StringToString()])))();
let StringAndFnAndFnToString = () => (StringAndFnAndFnToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, MatchToString(), StringToString()])))();
let StringAndStringAndFn__ToString = () => (StringAndStringAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String, MatchToString(), StringToString()])))();
let StringAndPatternAndString__ToString = () => (StringAndPatternAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String, core.int])))();
let StringAndPatternAndFn__ToString$ = () => (StringAndPatternAndFn__ToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), core.int])))();
let StringAndintAndint__ToString = () => (StringAndintAndint__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.String])))();
let dynamicToType = () => (dynamicToType = dart.constFn(dart.definiteFunctionType(core.Type, [dart.dynamic])))();
let dynamicAndintTodynamic = () => (dynamicAndintTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.int])))();
let SymbolToString = () => (SymbolToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Symbol])))();
let dynamicAnddynamicToSymbol = () => (dynamicAnddynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic, dart.dynamic])))();
let dynamicToInstanceMirror = () => (dynamicToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [dart.dynamic])))();
let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.Symbol, dart.dynamic])))();
let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
let intTobool = () => (intTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.int])))();
let intAndListAndintTovoid = () => (intAndListAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.List, core.int])))();
let intAndintAndintToint = () => (intAndintAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int, core.int])))();
let FunctionAndObjectAndStackTraceTodynamic = () => (FunctionAndObjectAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.Object, core.StackTrace])))();
let FunctionAndZoneToFunction = () => (FunctionAndZoneToFunction = dart.constFn(dart.definiteFunctionType(R => [core.Function, [core.Function, async.Zone]])))();
let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
let FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
let _EventSinkAnddynamicAnddynamicTovoid = () => (_EventSinkAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._EventSink, dart.dynamic, dart.dynamic])))();
let _ZoneToZoneDelegate = () => (_ZoneToZoneDelegate = dart.constFn(dart.definiteFunctionType(async.ZoneDelegate, [async._Zone])))();
let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]])))();
let ObjectAndStackTraceTovoid = () => (ObjectAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])))();
let ZoneAndZoneDelegateAndZone__ToR$ = () => (ZoneAndZoneDelegateAndZone__ToR$ = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
let ZoneAndZoneDelegateAndZone__ToR$0 = () => (ZoneAndZoneDelegateAndZone__ToR$0 = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
let ZoneAndZoneDelegateAndZone__ToR$1 = () => (ZoneAndZoneDelegateAndZone__ToR$1 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]])))();
let ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = () => (ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = dart.constFn(dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
let ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = () => (ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = dart.constFn(dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]])))();
let ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = () => (ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]])))();
let ZoneAndZoneDelegateAndZone__ToAsyncError = () => (ZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(dart.definiteFunctionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTodynamic()])))();
let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()])))();
let ZoneAndZoneDelegateAndZone__ToTimer$ = () => (ZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
let ZoneAndZoneDelegateAndZone__Tovoid$ = () => (ZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
let ZoneAndZoneDelegateAndZone__ToZone = () => (ZoneAndZoneDelegateAndZone__ToZone = dart.constFn(dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])))();
let ZoneAndZoneDelegateAndZone__Todynamic = () => (ZoneAndZoneDelegateAndZone__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace])))();
let Fn__ToR = () => (Fn__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [dart.functionType(R, [])], {zoneValues: core.Map, zoneSpecification: async.ZoneSpecification, onError: core.Function}])))();
let ObjectTobool = () => (ObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object])))();
let dynamicAnddynamicTobool = () => (dynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic])))();
let IterableAndListTovoid = () => (IterableAndListTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Iterable, core.List])))();
let _SplayTreeMapNodeTobool = () => (_SplayTreeMapNodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [collection._SplayTreeMapNode])))();
let dynamicAndFnTodynamic = () => (dynamicAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dynamicAnddynamicTodynamic()])))();
let Uint8ListAndintAndintTovoid$ = () => (Uint8ListAndintAndintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
let StringAndFnTodynamic = () => (StringAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, dynamicAnddynamicTodynamic()])))();
let EventSinkOfStringTo_LineSplitterEventSink = () => (EventSinkOfStringTo_LineSplitterEventSink = dart.constFn(dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])))();
let intAndintToint = () => (intAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int])))();
let dynamicAndintToint = () => (dynamicAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, core.int])))();
let intAndintTovoid = () => (intAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int])))();
let StringToint$ = () => (StringToint$ = dart.constFn(dart.definiteFunctionType(core.int, [core.String])))();
let intToString = () => (intToString = dart.constFn(dart.definiteFunctionType(core.String, [core.int])))();
let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
let dynamicTo_Directory = () => (dynamicTo_Directory = dart.constFn(dart.definiteFunctionType(io._Directory, [dart.dynamic])))();
let dynamicToDirectory = () => (dynamicToDirectory = dart.constFn(dart.definiteFunctionType(io.Directory, [dart.dynamic])))();
let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
let dynamicToFutureOfHttpClientResponse = () => (dynamicToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [dart.dynamic])))();
let VoidToFutureOfHttpClientResponse = () => (VoidToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [])))();
let VoidToListOfString = () => (VoidToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [])))();
let _AuthenticationSchemeTo_Credentials = () => (_AuthenticationSchemeTo_Credentials = dart.constFn(dart.definiteFunctionType(io._Credentials, [io._AuthenticationScheme])))();
let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
let _HttpClientConnectionTo_ConnectionInfo = () => (_HttpClientConnectionTo_ConnectionInfo = dart.constFn(dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection])))();
let dynamicToFutureOrOf_ConnectionInfo = () => (dynamicToFutureOrOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOrOf_ConnectionInfo(), [dart.dynamic])))();
let _ConnectionTargetTobool = () => (_ConnectionTargetTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io._ConnectionTarget])))();
let _ConnectionInfoTo_HttpClientRequest = () => (_ConnectionInfoTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._ConnectionInfo])))();
let _ConnectionInfoToFutureOrOf_HttpClientRequest = () => (_ConnectionInfoToFutureOrOf_HttpClientRequest = dart.constFn(dart.definiteFunctionType(FutureOrOf_HttpClientRequest(), [io._ConnectionInfo])))();
let _HttpClientRequestTo_HttpClientRequest = () => (_HttpClientRequestTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._HttpClientRequest])))();
let VoidTo_ConnectionTarget = () => (VoidTo_ConnectionTarget = dart.constFn(dart.definiteFunctionType(io._ConnectionTarget, [])))();
let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
let dynamicToLink = () => (dynamicToLink = dart.constFn(dart.definiteFunctionType(io.Link, [dart.dynamic])))();
let DurationTovoid = () => (DurationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Duration])))();
let RawSecureServerSocketToSecureServerSocket = () => (RawSecureServerSocketToSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])))();
let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
let FunctionAndListTodynamic = () => (FunctionAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.List])))();
let TAndTToT = () => (TAndTToT = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
let TAndTToT$ = () => (TAndTToT$ = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
let numAndnumTodouble = () => (numAndnumTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num, core.num])))();
let numAndnumTonum = () => (numAndnumTonum = dart.constFn(dart.definiteFunctionType(core.num, [core.num, core.num])))();
let numTodouble = () => (numTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num])))();
let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T => [T, [T]])))();
let LibraryMirrorTobool = () => (LibraryMirrorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [mirrors.LibraryMirror])))();
let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Event])))();
let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileSystem])))();
let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileError])))();
let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Entry])))();
let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Metadata])))();
let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileWriter])))();
let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.File])))();
let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Geoposition])))();
let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.PositionError])))();
let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.ProgressEvent])))();
let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.MediaStream])))();
let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.NavigatorUserMediaError])))();
let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcSessionDescription])))();
let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcStatsResponse])))();
let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.BeforeUnloadEvent])))();
let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
let boolAndCssClassSetImplTobool = () => (boolAndCssClassSetImplTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.bool, html_common.CssClassSetImpl])))();
let SetOfStringTobool = () => (SetOfStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [SetOfString()])))();
let SetOfStringTovoid = () => (SetOfStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [SetOfString()])))();
let EventAndStringTobool = () => (EventAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Event, core.String])))();
let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.Event])))();
let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.KeyEvent])))();
let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.NodeValidator])))();
let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.definiteFunctionType(core.int, [html$.Node, html$.Node])))();
let FromToTo = () => (FromToTo = dart.constFn(dart.definiteFunctionType((From, To) => [To, [From]])))();
let dynamicToWindowBase = () => (dynamicToWindowBase = dart.constFn(dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])))();
let dynamicToEventTarget = () => (dynamicToEventTarget = dart.constFn(dart.definiteFunctionType(html$.EventTarget, [dart.dynamic])))();
let dynamicAnddynamicAnddynamic__Todynamic = () => (dynamicAnddynamicAnddynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
let dynamicAnddynamicAndString__Tovoid = () => (dynamicAnddynamicAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, core.String, core.Type, core.String])))();
let _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = () => (_wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = dart.constFn(dart.definiteFunctionType((A, R) => [html$._wrapZoneCallback$(A, R), [html$._wrapZoneCallback$(A, R)]])))();
let _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = () => (_wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = dart.constFn(dart.definiteFunctionType((A, B, R) => [html$._wrapZoneBinaryCallback$(A, B, R), [html$._wrapZoneBinaryCallback$(A, B, R)]])))();
let StringToElement = () => (StringToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [core.String])))();
let StringToElementListOfElement = () => (StringToElementListOfElement = dart.constFn(dart.definiteFunctionType(ElementListOfElement(), [core.String])))();
let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
dart.mixin = function(base, ...mixins) {
  class Mixin extends base {}
  for (let m of mixins) {
    dart.copyProperties(Mixin.prototype, m.prototype);
  }
  Mixin.prototype.new = function(...args) {
    for (let i = mixins.length - 1; i >= 0; i--) {
      mixins[i].prototype.new.call(this);
    }
    base.prototype.new.apply(this, args);
  };
  dart.setSignature(Mixin, {
    methods: () => {
      let s = {};
      for (let m of mixins) {
        dart.copyProperties(s, m[dart._methodSig]);
      }
      return s;
    },
    fields: () => {
      let s = {};
      for (let m of mixins) {
        dart.copyProperties(s, m[dart._fieldSig]);
      }
      return s;
    },
    getters: () => {
      let s = {};
      for (let m of mixins) {
        dart.copyProperties(s, m[dart._getterSig]);
      }
      return s;
    },
    setters: () => {
      let s = {};
      for (let m of mixins) {
        dart.copyProperties(s, m[dart._setterSig]);
      }
      return s;
    }
  });
  Mixin[dart._mixins] = mixins;
  return Mixin;
};
dart.getMixins = function(clazz) {
  return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
};
dart.getImplements = function(clazz) {
  return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
};
dart.flattenFutures = function(builder) {
  function flatten(T) {
    if (!T) return builder(dart.dynamic);
    let futureClass = dart.getGenericClass(async.Future);
    if (dart.getGenericClass(T) == futureClass) {
      let args = dart.getGenericArgs(T);
      if (args) return builder(args[0]);
    }
    return builder(T);
  }
  return flatten;
};
dart.generic = function(typeConstructor, setBaseClass) {
  if (setBaseClass === void 0) setBaseClass = null;
  return (() => {
    let length = typeConstructor.length;
    if (length < 1) {
      dart.throwInternalError('must have at least one generic type argument');
    }
    let resultMap = new Map();
    function makeGenericType(...args) {
      if (args.length != length && args.length != 0) {
        dart.throwInternalError('requires ' + length + ' or 0 type arguments');
      }
      while (args.length < length)
        args.push(dart.dynamic);
      let value = resultMap;
      for (let i = 0; i < length; i++) {
        let arg = args[i];
        if (arg == null) {
          dart.throwInternalError('type arguments should not be null: ' + typeConstructor);
        }
        let map = value;
        value = map.get(arg);
        if (value === void 0) {
          if (i + 1 == length) {
            value = typeConstructor.apply(null, args);
            if (value) {
              value[dart._typeArguments] = args;
              value[dart._originalDeclaration] = makeGenericType;
            }
            map.set(arg, value);
            if (setBaseClass) setBaseClass(value);
          } else {
            value = new Map();
            map.set(arg, value);
          }
        }
      }
      return value;
    }
    makeGenericType[dart._genericTypeCtor] = typeConstructor;
    return makeGenericType;
  })();
};
dart.getGenericClass = function(type) {
  return dart.safeGetOwnProperty(type, dart._originalDeclaration);
};
dart.getGenericArgs = function(type) {
  return dart.safeGetOwnProperty(type, dart._typeArguments);
};
dart.getConstructorSig = function(value) {
  return value[dart._constructorSig];
};
dart.getMethodSig = function(value) {
  return value[dart._methodSig];
};
dart.getFieldSig = function(value) {
  return value[dart._fieldSig];
};
dart.getGetterSig = function(value) {
  return value[dart._getterSig];
};
dart.getSetterSig = function(value) {
  return value[dart._setterSig];
};
dart.getStaticSig = function(value) {
  return value[dart._staticSig];
};
dart.getStaticFieldSig = function(value) {
  return value[dart._staticFieldSig];
};
dart.getStaticGetterSig = function(value) {
  return value[dart._staticGetterSig];
};
dart.getStaticSetterSig = function(value) {
  return value[dart._staticSetterSig];
};
dart.getGenericTypeCtor = function(value) {
  return value[dart._genericTypeCtor];
};
dart.getType = function(obj) {
  return obj == null ? core.Object : obj.__proto__.constructor;
};
dart.isJsInterop = function(obj) {
  if (typeof obj === "function") {
    return dart._getRuntimeType(obj) == null;
  }
  if (typeof obj !== "object") return false;
  if (dart.getExtensionType(obj) != null) return false;
  return !(obj instanceof core.Object);
};
dart.getMethodType = function(type, name) {
  let sigObj = type[dart._methodSig];
  if (sigObj === void 0) return void 0;
  return sigObj[name];
};
dart.getFieldType = function(type, name) {
  let sigObj = type[dart._fieldSig];
  if (sigObj === void 0) return void 0;
  let fieldType = sigObj[name];
  return fieldType instanceof Array ? fieldType[0] : fieldType;
};
dart.getSetterType = function(type, name) {
  let sigObj = type[dart._setterSig];
  if (sigObj === void 0) return void 0;
  return sigObj[name];
};
dart.classGetConstructorType = function(cls, name) {
  if (!name) name = 'new';
  if (cls === void 0) return void 0;
  if (cls == null) return void 0;
  let sigCtor = cls[dart._constructorSig];
  if (sigCtor === void 0) return void 0;
  return sigCtor[name];
};
dart.bind = function(obj, name, f) {
  if (f === void 0) f = obj[name];
  f = f.bind(obj);
  let sig = dart.getMethodType(dart.getType(obj), name);
  dart.assert(sig);
  dart.tag(f, sig);
  return f;
};
dart.gbind = function(f, ...typeArgs) {
  let result = f.apply(null, typeArgs);
  let sig = dart._getRuntimeType(f).apply(null, typeArgs);
  dart.tag(result, sig);
  return result;
};
dart._setInstanceSignature = function(f, sigF, kind) {
  dart.defineMemoizedGetter(f, kind, () => {
    let sigObj = sigF();
    let proto = f.__proto__;
    sigObj.__proto__ = kind in proto ? proto[kind] : null;
    return sigObj;
  });
};
dart._setMethodSignature = function(f, sigF) {
  return dart._setInstanceSignature(f, sigF, dart._methodSig);
};
dart._setFieldSignature = function(f, sigF) {
  return dart._setInstanceSignature(f, sigF, dart._fieldSig);
};
dart._setGetterSignature = function(f, sigF) {
  return dart._setInstanceSignature(f, sigF, dart._getterSig);
};
dart._setSetterSignature = function(f, sigF) {
  return dart._setInstanceSignature(f, sigF, dart._setterSig);
};
dart._setConstructorSignature = function(f, sigF) {
  return dart.defineMemoizedGetter(f, dart._constructorSig, sigF);
};
dart._setStaticSignature = function(f, sigF) {
  return dart.defineMemoizedGetter(f, dart._staticSig, sigF);
};
dart._setStaticFieldSignature = function(f, sigF) {
  return dart.defineMemoizedGetter(f, dart._staticFieldSig, sigF);
};
dart._setStaticGetterSignature = function(f, sigF) {
  return dart.defineMemoizedGetter(f, dart._staticGetterSig, sigF);
};
dart._setStaticSetterSignature = function(f, sigF) {
  return dart.defineMemoizedGetter(f, dart._staticSetterSig, sigF);
};
dart._setStaticTypes = function(f, names) {
  for (let name of names) {
    if (!f[name]) continue;
    dart.tagLazy(f[name], function() {
      return f[dart._staticSig][name];
    });
  }
};
dart.setSignature = function(f, signature) {
  let constructors = 'constructors' in signature ? signature.constructors : () => ({});
  let methods = 'methods' in signature ? signature.methods : () => ({});
  let fields = 'fields' in signature ? signature.fields : () => ({});
  let getters = 'getters' in signature ? signature.getters : () => ({});
  let setters = 'setters' in signature ? signature.setters : () => ({});
  let statics = 'statics' in signature ? signature.statics : () => ({});
  let staticFields = 'sfields' in signature ? signature.sfields : () => ({});
  let staticGetters = 'sgetters' in signature ? signature.sgetters : () => ({});
  let staticSetters = 'ssetters' in signature ? signature.ssetters : () => ({});
  let names = 'names' in signature ? signature.names : [];
  dart._setConstructorSignature(f, constructors);
  dart._setMethodSignature(f, methods);
  dart._setFieldSignature(f, fields);
  dart._setGetterSignature(f, getters);
  dart._setSetterSignature(f, setters);
  dart._setStaticSignature(f, statics);
  dart._setStaticFieldSignature(f, staticFields);
  dart._setStaticGetterSignature(f, staticGetters);
  dart._setStaticSetterSignature(f, staticSetters);
  dart._setStaticTypes(f, names);
};
dart._hasSigEntry = function(type, sigF, name) {
  let sigObj = type[sigF];
  if (sigObj === void 0) return false;
  return name in sigObj;
};
dart.hasMethod = function(type, name) {
  return dart._hasSigEntry(type, dart._methodSig, name);
};
dart.hasGetter = function(type, name) {
  return dart._hasSigEntry(type, dart._getterSig, name);
};
dart.hasSetter = function(type, name) {
  return dart._hasSigEntry(type, dart._setterSig, name);
};
dart.hasField = function(type, name) {
  return dart._hasSigEntry(type, dart._fieldSig, name);
};
dart.defineNamedConstructor = function(clazz, name) {
  let proto = clazz.prototype;
  let initMethod = proto[name];
  let ctor = function(...args) {
    initMethod.apply(this, args);
  };
  ctor[dart.isNamedConstructor] = true;
  ctor.prototype = proto;
  dart.defineProperty(clazz, name, {value: ctor, configurable: true});
};
dart.getExtensionType = function(obj) {
  return obj[dart._extensionType];
};
dart.getExtensionSymbol = function(name) {
  let sym = dartx[name];
  if (sym == null) {
    sym = Symbol("dartx." + name.toString());
    dartx[name] = sym;
  }
  return sym;
};
dart.defineExtensionNames = function(names) {
  return names.forEach(dart.getExtensionSymbol);
};
dart._installProperties = function(jsProto, extProto) {
  let coreObjProto = core.Object.prototype;
  let parentsExtension = jsProto.__proto__[dart._extensionType];
  let installedParent = parentsExtension && parentsExtension.prototype;
  dart._installProperties2(jsProto, extProto, coreObjProto, installedParent);
};
dart._installProperties2 = function(jsProto, extProto, coreObjProto, installedParent) {
  if (extProto === coreObjProto) {
    dart._installPropertiesForObject(jsProto, coreObjProto);
    return;
  }
  if (jsProto !== extProto) {
    let extParent = extProto.__proto__;
    if (installedParent !== extParent) {
      dart._installProperties2(jsProto, extParent, coreObjProto, installedParent);
    }
  }
  dart.copyTheseProperties(jsProto, extProto, dart.getOwnPropertySymbols(extProto));
};
dart._installPropertiesForObject = function(jsProto, coreObjProto) {
  let names = dart.getOwnPropertyNames(coreObjProto);
  for (let i = 0; i < names.length; ++i) {
    let name = names[i];
    let desc = dart.getOwnPropertyDescriptor(coreObjProto, name);
    dart.defineProperty(jsProto, dart.getExtensionSymbol(name), desc);
  }
  return;
};
dart.registerExtension = function(jsType, dartExtType) {
  if (!jsType) return;
  let extProto = dartExtType.prototype;
  let jsProto = jsType.prototype;
  if (!jsProto) return;
  jsProto[dart._extensionType] = dartExtType;
  dart._installProperties(jsProto, extProto);
  function updateSig(sigF) {
    let originalSigFn = dart.getOwnPropertyDescriptor(dartExtType, sigF).get;
    dart.assert(originalSigFn);
    dart.defineMemoizedGetter(jsType, sigF, originalSigFn);
  }
  updateSig(dart._methodSig);
  updateSig(dart._fieldSig);
  updateSig(dart._getterSig);
  updateSig(dart._setterSig);
};
dart.defineExtensionMembers = function(type, methodNames) {
  let proto = type.prototype;
  for (let name of methodNames) {
    let method = dart.getOwnPropertyDescriptor(proto, name);
    dart.defineProperty(proto, dart.getExtensionSymbol(name), method);
  }
  function upgradeSig(sigF) {
    let originalSigFn = dart.getOwnPropertyDescriptor(type, sigF).get;
    dart.defineMemoizedGetter(type, sigF, function() {
      let sig = originalSigFn();
      let propertyNames = Object.getOwnPropertyNames(sig);
      for (let name of methodNames) {
        if (name in sig) {
          sig[dart.getExtensionSymbol(name)] = sig[name];
        }
      }
      return sig;
    });
  }
  upgradeSig(dart._methodSig);
  upgradeSig(dart._fieldSig);
  upgradeSig(dart._getterSig);
  upgradeSig(dart._setterSig);
};
dart.setType = function(obj, type) {
  obj.__proto__ = type.prototype;
  return obj;
};
dart.list = function(obj, elementType) {
  return dart.setType(obj, dart.getGenericClass(_interceptors.JSArray)(elementType));
};
dart.setBaseClass = function(derived, base) {
  derived.prototype.__proto__ = base.prototype;
  derived.__proto__ = base;
};
dart.setExtensionBaseClass = function(derived, base) {
  if (base) {
    derived.prototype[dart._extensionType] = derived;
    derived.prototype.__proto__ = base.prototype;
  }
};
dart.callableClass = function(callableCtor, classExpr) {
  callableCtor.prototype = classExpr.prototype;
  callableCtor.prototype.constructor = callableCtor;
  callableCtor.__proto__ = classExpr;
  return callableCtor;
};
dart.defineNamedConstructorCallable = function(clazz, name, ctor) {
  ctor.prototype = clazz.prototype;
  dart.defineProperty(clazz, name, {value: ctor, configurable: true});
};
dart.defineEnumValues = function(enumClass, names) {
  let values = [];
  for (var i = 0; i < names.length; i++) {
    let value = dart.const(new enumClass(i));
    values.push(value);
    Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
  }
  enumClass.values = dart.constList(values, enumClass);
};
dart.fn = function(closure, t) {
  if (t == null) {
    t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
  }
  dart.tag(closure, t);
  return closure;
};
dart.lazyFn = function(closure, computeType) {
  dart.tagLazy(closure, computeType);
  return closure;
};
dart._checkPrimitiveType = function(obj) {
  if (obj == null) return core.Null;
  if (typeof obj == "number") {
    if (Math.floor(obj) == obj) {
      return core.int;
    }
    return core.double;
  }
  if (typeof obj == "boolean") {
    return core.bool;
  }
  if (typeof obj == "string") {
    return core.String;
  }
  if (typeof obj == "symbol") {
    return dart.jsobject;
  }
  return null;
};
dart.getFunctionType = function(obj) {
  let args = Array(obj.length).fill(dart.dynamic);
  return dart.definiteFunctionType(dart.bottom, args, void 0);
};
dart.getReifiedType = function(obj) {
  let result = dart._checkPrimitiveType(obj);
  if (result != null) return result;
  return dart._nonPrimitiveRuntimeType(obj);
};
dart._nonPrimitiveRuntimeType = function(obj) {
  let result = dart._getRuntimeType(obj);
  if (result != null) return result;
  result = dart.getExtensionType(obj);
  if (result != null) return result;
  result = obj.constructor;
  if (result === Function) {
    return dart.jsobject;
  }
  if (result == null) {
    return dart.jsobject;
  }
  return result;
};
dart.wrapType = function(type) {
  if (type.hasOwnProperty(dart._typeObject)) {
    return type[dart._typeObject];
  }
  return type[dart._typeObject] = new dart.WrappedType(type);
};
dart.lazyJSType = function(getJSTypeCallback, name) {
  let key = getJSTypeCallback.toString();
  if (dart._lazyJSTypes.has(key)) {
    return dart._lazyJSTypes.get(key);
  }
  let ret = new dart.LazyJSType(getJSTypeCallback, name);
  dart._lazyJSTypes.set(key, ret);
  return ret;
};
dart.lazyAnonymousJSType = function(name) {
  if (dart._lazyJSTypes.has(name)) {
    return dart._lazyJSTypes.get(name);
  }
  let ret = new dart.LazyJSType(null, name);
  dart._lazyJSTypes.set(name, ret);
  return ret;
};
const _wrappedType = Symbol('_wrappedType');
dart.unwrapType = function(obj) {
  return obj[_wrappedType];
};
dart._getRuntimeType = function(value) {
  return value[dart._runtimeType];
};
dart.getIsNamedConstructor = function(value) {
  return value[dart.isNamedConstructor];
};
dart.getDartLibraryName = function(value) {
  return value[dart_library.dartLibraryName];
};
dart.tag = function(value, t) {
  value[dart._runtimeType] = t;
};
dart.tagComputed = function(value, compute) {
  dart.defineProperty(value, dart._runtimeType, {get: compute});
};
dart.tagLazy = function(value, compute) {
  dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
};
dart._warn = function(arg) {
  console.warn(arg);
};
const _jsTypeCallback = Symbol('_jsTypeCallback');
const _rawJSType = Symbol('_rawJSType');
const _dartName = Symbol('_dartName');
dart._isInstanceOfLazyJSType = function(o, t) {
  if (t[_jsTypeCallback] != null) {
    if (t[_rawJSType] == null) {
      let expected = t[_dartName];
      let actual = dart.typeName(dart.getReifiedType(o));
      dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
      return true;
    }
    return dart.is(o, t[_rawJSType]);
  }
  if (o == null) return false;
  return dart._isJSObject(o);
};
dart._asInstanceOfLazyJSType = function(o, t) {
  if (t[_jsTypeCallback] != null) {
    if (t[_rawJSType] == null) {
      let expected = t[_dartName];
      let actual = dart.typeName(dart.getReifiedType(o));
      dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
      return o;
    }
    return dart.as(o, t[_rawJSType]);
  }
  if (o == null) return null;
  if (!dart.test(dart._isJSObject(o))) dart._throwCastError(o, t, true);
  return o;
};
dart._isJSObject = function(o) {
  return !dart.getReifiedType(o)[dart._runtimeType];
};
dart._initialize2 = function() {
  dart.TypeRep.prototype.is = function is_T(object) {
    return dart.is(object, this);
  };
  dart.TypeRep.prototype.as = function as_T(object) {
    return dart.as(object, this);
  };
  dart.TypeRep.prototype._check = function check_T(object) {
    return dart.check(object, this);
  };
  dart.Dynamic.prototype.is = function is_Dynamic(object) {
    return true;
  };
  dart.Dynamic.prototype.as = function as_Dynamic(object) {
    return object;
  };
  dart.Dynamic.prototype._check = function check_Dynamic(object) {
    return object;
  };
  dart.LazyJSType.prototype.is = function is_T(object) {
    return dart._isInstanceOfLazyJSType(object, this);
  };
  dart.LazyJSType.prototype.as = function as_T(object) {
    return dart._asInstanceOfLazyJSType(object, this);
  };
  dart.LazyJSType.prototype._check = function check_T(object) {
    return dart._asInstanceOfLazyJSType(object, this);
  };
};
dart._memoizeArray = function(map, arr, create) {
  let len = arr.length;
  map = dart._lookupNonTerminal(map, len);
  for (var i = 0; i < len - 1; ++i) {
    map = dart._lookupNonTerminal(map, arr[i]);
  }
  let result = map.get(arr[len - 1]);
  if (result !== void 0) return result;
  map.set(arr[len - 1], result = create());
  return result;
};
dart._normalizeParameter = function(a) {
  if (a instanceof Array) {
    let result = [];
    result.push(a[0] == dart.dynamic ? dart.bottom : a[0]);
    result.push(a.slice(1));
    return result;
  }
  return a == dart.dynamic ? dart.bottom : a;
};
dart._canonicalizeArray = function(definite, array, map) {
  let arr = definite ? array : array.map(dart._normalizeParameter);
  return dart._memoizeArray(map, arr, () => arr);
};
dart._canonicalizeNamed = function(definite, named, map) {
  let key = [];
  let names = dart.getOwnPropertyNames(named);
  let r = {};
  for (var i = 0; i < names.length; ++i) {
    let name = names[i];
    let type = named[name];
    if (!definite) r[name] = type = dart._normalizeParameter(type);
    key.push(name);
    key.push(type);
  }
  if (!definite) named = r;
  return dart._memoizeArray(map, key, () => named);
};
dart._lookupNonTerminal = function(map, key) {
  let result = map.get(key);
  if (result !== void 0) return result;
  map.set(key, result = new Map());
  return result;
};
dart._createSmall = function(count, definite, returnType, required) {
  let map = dart._fnTypeSmallMap[count];
  let args = definite ? required : required.map(dart._normalizeParameter);
  for (var i = 0; i < count; ++i) {
    map = dart._lookupNonTerminal(map, args[i]);
  }
  let result = map.get(returnType);
  if (result !== void 0) return result;
  result = new dart.FunctionType(returnType, args, [], {});
  map.set(returnType, result);
  return result;
};
dart.typedef = function(name, closure) {
  return new dart.Typedef(name, closure);
};
dart._functionType = function(definite, returnType, args, extra) {
  if (args === void 0 && extra === void 0) {
    const fnTypeParts = returnType;
    function makeGenericFnType(...types) {
      let parts = fnTypeParts.apply(null, types);
      return dart.FunctionType.create(definite, parts[0], parts[1], parts[2]);
    }
    makeGenericFnType[dart._typeFormalCount] = fnTypeParts.length;
    return makeGenericFnType;
  }
  return dart.FunctionType.create(definite, returnType, args, extra);
};
dart.functionType = function(returnType, args, extra) {
  return dart._functionType(false, returnType, args, extra);
};
dart.definiteFunctionType = function(returnType, args, extra) {
  return dart._functionType(true, returnType, args, extra);
};
dart.typeName = function(type) {
  if (type === void 0) return "undefined type";
  if (type === null) return "null type";
  if (type instanceof dart.TypeRep) {
    if (type instanceof dart.Typedef) {
      return type.name + "(" + type.functionType.toString() + ")";
    }
    return type.toString();
  }
  if (type instanceof dart.WrappedType) {
    return "Wrapped(" + dart.unwrapType(type) + ")";
  }
  let tag = dart._getRuntimeType(type);
  if (tag === core.Type) {
    let name = type.name;
    let args = dart.getGenericArgs(type);
    if (!args) return name;
    let result = name;
    let allDynamic = true;
    result += '<';
    for (let i = 0; i < args.length; ++i) {
      if (i > 0) result += ', ';
      let argName = dart.typeName(args[i]);
      if (argName != 'dynamic') allDynamic = false;
      result += argName;
    }
    result += '>';
    if (allDynamic) return name;
    return result;
  }
  if (tag) return "Not a type: " + tag.name;
  return "JSObject<" + type.name + ">";
};
dart.getImplicitFunctionType = function(type) {
  if (dart.test(dart.isFunctionType(type))) return type;
  return dart.getMethodType(type, 'call');
};
dart.isFunctionType = function(type) {
  return type instanceof dart.AbstractFunctionType || type === core.Function;
};
dart.isLazyJSSubtype = function(t1, t2, isCovariant) {
  if (dart.equals(t1, t2)) return true;
  if (t1[_jsTypeCallback] == null || t2[_jsTypeCallback] == null) return true;
  return dart.isClassSubType(t1[_rawJSType], t2[_rawJSType], isCovariant);
};
dart.isFunctionSubtype = function(ft1, ft2, isCovariant) {
  if (ft2 === core.Function) {
    return true;
  }
  if (ft1 === core.Function) {
    return false;
  }
  let ret1 = ft1.returnType;
  let ret2 = ft2.returnType;
  let args1 = ft1.args;
  let args2 = ft2.args;
  if (args1.length > args2.length) {
    return isCovariant ? false : null;
  }
  for (let i = 0; i < args1.length; ++i) {
    if (!dart._isSubtype(args2[i], args1[i], !isCovariant)) {
      return null;
    }
  }
  let optionals1 = ft1.optionals;
  let optionals2 = ft2.optionals;
  if (args1.length + optionals1.length < args2.length + optionals2.length) {
    return isCovariant ? false : null;
  }
  let j = 0;
  for (let i = args1.length; i < args2.length; ++i, ++j) {
    if (!dart._isSubtype(args2[i], optionals1[j], !isCovariant)) {
      return null;
    }
  }
  for (let i = 0; i < optionals2.length; ++i, ++j) {
    if (!dart._isSubtype(optionals2[i], optionals1[j], !isCovariant)) {
      return null;
    }
  }
  let named1 = ft1.named;
  let named2 = ft2.named;
  let names = dart.getOwnPropertyNames(named2);
  for (let i = 0; i < names.length; ++i) {
    let name = names[i];
    let n1 = named1[name];
    let n2 = named2[name];
    if (n1 === void 0) {
      return isCovariant ? false : null;
    }
    if (!dart._isSubtype(n2, n1, !isCovariant)) {
      return null;
    }
  }
  if (ret1 === dart.void) return dart._isTop(ret2);
  if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
  return true;
};
dart._subtypeMemo = function(f) {
  let memo = new Map();
  return (t1, t2) => {
    let map = memo.get(t1);
    let result;
    if (map) {
      result = map.get(t2);
      if (result !== void 0) return result;
    } else {
      memo.set(t1, map = new Map());
    }
    result = f(t1, t2);
    map.set(t2, result);
    return result;
  };
};
dart._isBottom = function(type) {
  return type == dart.bottom || type == core.Null;
};
dart._isTop = function(type) {
  if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
    return dart._isTop(dart.getGenericArgs(type)[0]);
  }
  return type == core.Object || type == dart.dynamic || type == dart.void;
};
dart._isSubtype = function(t1, t2, isCovariant) {
  if (t1 === t2) return true;
  if (dart._isTop(t2) || dart._isBottom(t1)) {
    return true;
  }
  if (dart._isBottom(t2)) return null;
  if (dart._isTop(t1)) {
    if (t1 === dart.dynamic) return null;
    return false;
  }
  if (!(t1 instanceof dart.AbstractFunctionType) && !(t2 instanceof dart.AbstractFunctionType)) {
    let result = dart.isClassSubType(t1, t2, isCovariant);
    if (result === true || result === null) return result;
  }
  t1 = dart.getImplicitFunctionType(t1);
  if (!t1) return false;
  if (dart.isFunctionType(t1) && dart.isFunctionType(t2)) {
    return dart.isFunctionSubtype(t1, t2, isCovariant);
  }
  if (t1 instanceof dart.LazyJSType && t2 instanceof dart.LazyJSType) {
    return dart.isLazyJSSubtype(t1, t2, isCovariant);
  }
  return false;
};
dart.isClassSubType = function(t1, t2, isCovariant) {
  if (t1 == t2) return true;
  if (t1 == core.Object) return false;
  if (t1 == null) return t2 == core.Object || t2 == dart.dynamic;
  let raw1 = dart.getGenericClass(t1);
  let raw2 = dart.getGenericClass(t2);
  if (raw1 != null && raw1 == raw2) {
    let typeArguments1 = dart.getGenericArgs(t1);
    let typeArguments2 = dart.getGenericArgs(t2);
    let length = typeArguments1.length;
    if (typeArguments2.length == 0) {
      return true;
    } else if (length == 0) {
      if (typeArguments2.every(dart._isTop)) return true;
      return null;
    }
    dart.assert(length == typeArguments2.length);
    for (let i = 0; i < length; ++i) {
      let result = dart._isSubtype(typeArguments1[i], typeArguments2[i], isCovariant);
      if (!result) {
        return result;
      }
    }
    return true;
  }
  if (raw1 === dart.getGenericClass(async.FutureOr)) {
    let t1TypeArg = dart.getGenericArgs(t1)[0];
    let t1Future = dart.getGenericClass(async.Future)(t1TypeArg);
    return dart.isSubtype(t1Future, t2) && dart.isSubtype(t1TypeArg, t2);
  } else if (raw2 === dart.getGenericClass(async.FutureOr)) {
    let t2TypeArg = dart.getGenericArgs(t2)[0];
    let t2Future = dart.getGenericClass(async.Future)(t2TypeArg);
    return dart.isSubtype(t1, t2Future) || dart.isSubtype(t1, t2TypeArg);
  }
  let indefinite = false;
  function definitive(t1, t2) {
    let result = dart.isClassSubType(t1, t2, isCovariant);
    if (result == null) {
      indefinite = true;
      return false;
    }
    return result;
  }
  if (definitive(t1.__proto__, t2)) return true;
  let mixins = dart.getMixins(t1);
  if (mixins) {
    for (let m1 of mixins) {
      if (m1 != null && definitive(m1, t2)) return true;
    }
  }
  let getInterfaces = dart.getImplements(t1);
  if (getInterfaces) {
    for (let i1 of getInterfaces()) {
      if (i1 != null && definitive(i1, t2)) return true;
    }
  }
  if (indefinite) return null;
  return false;
};
dart.isGroundType = function(type) {
  if (type instanceof dart.AbstractFunctionType) {
    if (!dart._isTop(type.returnType)) return false;
    for (let i = 0; i < type.args.length; ++i) {
      if (!dart._isBottom(type.args[i])) return false;
    }
    for (let i = 0; i < type.optionals.length; ++i) {
      if (!dart._isBottom(type.optionals[i])) return false;
    }
    let names = dart.getOwnPropertyNames(type.named);
    for (let i = 0; i < names.length; ++i) {
      if (!dart._isBottom(type.named[names[i]])) return false;
    }
    return true;
  }
  let typeArgs = dart.getGenericArgs(type);
  if (!typeArgs) return true;
  for (let t of typeArgs) {
    if (t != core.Object && t != dart.dynamic) return false;
  }
  return true;
};
dart.trapRuntimeErrors = function(flag) {
  dart._trapRuntimeErrors = flag;
};
dart.throwCastError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.CastErrorImplementation(object, found, expected));
};
dart.throwTypeError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.TypeErrorImplementation(object, found, expected));
};
dart.throwStrongModeCastError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.StrongModeCastError(object, found, expected));
};
dart.throwStrongModeTypeError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.StrongModeTypeError(object, found, expected));
};
dart.throwUnimplementedError = function(message) {
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new core.UnimplementedError(message));
};
dart.throwAssertionError = function(message) {
  if (message === void 0) message = null;
  return (() => {
    if (dart._trapRuntimeErrors) debugger;
    let error = message != null ? new _js_helper.AssertionErrorWithMessage(message()) : new core.AssertionError();
    dart.throw(error);
  })();
};
dart.throwNullValueError = function() {
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new core.NoSuchMethodError(null, new core.Symbol('<Unexpected Null Value>'), null, null, null));
};
dart.syncStar = function(gen, E, ...args) {
  const SyncIterable_E = dart.getGenericClass(_js_helper.SyncIterable)(E);
  return new SyncIterable_E(gen, args);
};
dart.async = function(gen, T, ...args) {
  let iter;
  function onValue(res) {
    if (res === void 0) res = null;
    return next(iter.next(res));
  }
  function onError(err) {
    return next(iter.throw(err));
  }
  function next(ret) {
    if (ret.done) return ret.value;
    let future = ret.value;
    if (!dart.is(future, dart.getGenericClass(async.Future))) {
      future = async.Future.value(future);
    }
    return future.then(dart.dynamic)(onValue, {onError: onError});
  }
  return dart.getGenericClass(async.Future)(T).microtask(function() {
    iter = gen.apply(null, args)[Symbol.iterator]();
    return onValue();
  });
};
dart.asyncStar = function(gen, T, ...args) {
  return new dart._AsyncStarStreamController(gen, T, args).controller.stream;
};
dart.dload = function(obj, field) {
  let f = dart._canonicalMember(obj, field);
  dart._trackCall(obj);
  if (f != null) {
    let type = dart.getType(obj);
    if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
    if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, void 0);
    if (dart.test(dart.isJsInterop(obj))) return obj[f];
  }
  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [], {isGetter: true}));
};
dart.dloadMirror = function(obj, field) {
  let f = dart._canonicalMember(obj, field);
  dart._trackCall(obj);
  if (f != null) {
    let type = dart.getType(obj);
    if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
    if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, void 0);
  }
  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [], {isGetter: true}));
};
dart._stripGenericArguments = function(type) {
  let genericClass = dart.getGenericClass(type);
  if (genericClass != null) return genericClass();
  return type;
};
dart.dputMirror = function(obj, field, value) {
  let f = dart._canonicalMember(obj, field);
  dart._trackCall(obj);
  if (f != null) {
    let objType = dart.getType(obj);
    let setterType = dart.getSetterType(objType, f);
    if (setterType != void 0) {
      return obj[f] = dart.check(value, dart._stripGenericArguments(setterType.args[0]));
    } else {
      let fieldType = dart.getFieldType(objType, f);
      if (fieldType != void 0) {
        return obj[f] = dart.check(value, dart._stripGenericArguments(fieldType));
      }
    }
  }
  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [value], {isSetter: true}));
};
dart.dput = function(obj, field, value) {
  let f = dart._canonicalMember(obj, field);
  dart._trackCall(obj);
  if (f != null) {
    let objType = dart.getType(obj);
    let setterType = dart.getSetterType(objType, f);
    if (setterType != void 0) {
      return obj[f] = dart.check(value, setterType.args[0]);
    } else {
      let fieldType = dart.getFieldType(objType, f);
      if (fieldType != void 0) {
        return obj[f] = dart.check(value, fieldType);
      }
      if (dart.test(dart.isJsInterop(obj))) {
        return obj[f] = value;
      }
    }
  }
  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [value], {isSetter: true}));
};
dart._checkApply = function(type, actuals) {
  if (type instanceof Array) {
    type = type[0];
  }
  if (actuals.length < type.args.length) return false;
  let index = 0;
  for (let i = 0; i < type.args.length; ++i) {
    dart.check(actuals[i], type.args[i]);
    ++index;
  }
  if (actuals.length == type.args.length) return true;
  let extras = actuals.length - type.args.length;
  if (type.optionals.length > 0) {
    if (extras > type.optionals.length) return false;
    for (let i = 0, j = index; i < extras; ++i, ++j) {
      dart.check(actuals[j], type.optionals[i]);
    }
    return true;
  }
  if (extras != 1) return false;
  if (dart.getOwnPropertyNames(type.named).length == 0) return false;
  let opts = actuals[index];
  let names = dart.getOwnPropertyNames(opts);
  if (names.length == 0) return false;
  for (var name of names) {
    if (!dart.hasOwnProperty.call(type.named, name)) {
      return false;
    }
    dart.check(opts[name], type.named[name]);
  }
  return true;
};
dart._toSymbolName = function(symbol) {
  let str = symbol.toString();
  return str.substring(7, str.length - 1);
};
dart._toDisplayName = function(name) {
  if (name[0] === '_') {
    switch (name) {
      case '_get':
      {
        return '[]';
      }
      case '_set':
      {
        return '[]=';
      }
      case '_negate':
      {
        return 'unary-';
      }
      case '_constructor':
      case '_prototype':
      {
        return name.substring(1);
      }
    }
  }
  return name;
};
dart._dartSymbol = function(name) {
  return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
};
dart.extractNamedArgs = function(args) {
  if (args.length > 0) {
    let last = args[args.length - 1];
    if (last != null && last.__proto__ === Object.prototype) {
      return args.pop();
    }
  }
  return null;
};
dart._checkAndCall = function(f, ftype, obj, typeArgs, args, name) {
  dart._trackCall(obj);
  let originalTarget = obj === void 0 ? f : obj;
  function callNSM() {
    return dart.noSuchMethod(originalTarget, new dart.InvocationImpl(name, args, {namedArguments: dart.extractNamedArgs(args), isMethod: true}));
  }
  if (!(f instanceof Function)) {
    if (f != null) {
      ftype = dart.getMethodType(dart.getType(f), 'call');
      f = f.call;
    }
    if (!(f instanceof Function)) {
      return callNSM();
    }
  }
  if (ftype === void 0) {
    ftype = dart._getRuntimeType(f);
  }
  if (!ftype) {
    if (typeArgs != null) {
      dart.throwStrongModeError('call to JS object `' + obj + '` with type arguments <' + typeArgs + '> is not supported.');
    }
    return f.apply(obj, args);
  }
  let formalCount = ftype[dart._typeFormalCount];
  if (formalCount != null) {
    if (typeArgs == null) {
      typeArgs = Array(formalCount).fill(dart.dynamic);
    } else if (typeArgs.length != formalCount) {
      dart.throwStrongModeError('incorrect number of arguments to generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected ' + formalCount + '.');
    }
    ftype = ftype.apply(null, typeArgs);
  } else if (typeArgs != null) {
    dart.throwStrongModeError('got type arguments to non-generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected none.');
  }
  if (dart._checkApply(ftype, args)) {
    if (typeArgs != null) {
      return f.apply(obj, typeArgs).apply(obj, args);
    }
    return f.apply(obj, args);
  }
  return callNSM();
};
dart.dcall = function(f, ...args) {
  return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, null, args, 'call');
};
dart.dgcall = function(f, typeArgs, ...args) {
  return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, typeArgs, args, 'call');
};
dart._dhelperRepl = function(object, field, callback) {
  let rawField = field;
  if (typeof field == 'symbol') {
    if (field in object) return callback(field);
    field = field.toString();
    field = field.substring('Symbol('.length, field.length - 1);
  } else if (field.charAt(0) != '_') {
    return callback(field);
  }
  if (field in object) return callback(field);
  let proto = object;
  while (proto !== null) {
    let symbols = Object.getOwnPropertySymbols(proto);
    let target = 'Symbol(' + field + ')';
    for (let s = 0; s < symbols.length; s++) {
      let sym = symbols[s];
      if (target == sym.toString()) return callback(sym);
    }
    proto = proto.__proto__;
  }
  return callback(rawField);
};
dart.dloadRepl = function(obj, field) {
  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dload(obj, resolvedField), dynamicTodynamic$()));
};
dart.dputRepl = function(obj, field, value) {
  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dput(obj, resolvedField, value), dynamicTodynamic$()));
};
dart._callMethodRepl = function(obj, method, typeArgs, args) {
  return dart._dhelperRepl(obj, method, dart.fn(resolvedField => dart._callMethod(obj, resolvedField, typeArgs, args, method), dynamicTodynamic$()));
};
dart.dsendRepl = function(obj, method, ...args) {
  return dart._callMethodRepl(obj, method, null, args);
};
dart.dgsendRepl = function(obj, typeArgs, method, ...args) {
  return dart._callMethodRepl(obj, method, typeArgs, args);
};
dart.getDynamicStats = function() {
  let ret = JSArrayOfListOfObject().of([]);
  let keys = dart._callMethodStats[dartx.keys][dartx.toList]();
  keys[dartx.sort](dart.fn((a, b) => dart._callMethodStats[dartx._get](b).count[dartx.compareTo](dart._callMethodStats[dartx._get](a).count), StringAndStringToint()));
  for (let key of keys) {
    let stats = dart._callMethodStats[dartx._get](key);
    ret[dartx.add](JSArrayOfObject().of([stats.typeName, stats.frame, stats.count]));
  }
  return ret;
};
dart.clearDynamicStats = function() {
  dart._callMethodStats[dartx.clear]();
};
dart._trackCall = function(obj) {
  if (!dart.trackProfile) return;
  let actual = dart.getReifiedType(obj);
  let stackStr = new Error().stack;
  let stack = stackStr[dartx.split]('\n    at ');
  let src = '';
  for (let i = 2; i < dart.notNull(stack[dartx.length]); ++i) {
    let frame = stack[dartx._get](i);
    if (!dart.test(frame[dartx.contains]('dart_sdk.js'))) {
      src = frame;
      break;
    }
  }
  let actualTypeName = dart.typeName(actual);
  let o = dart._callMethodStats[dartx.putIfAbsent](dart.str`${actualTypeName} <${src}>`, dart.fn(() => new dart._MethodStats(actualTypeName, src), VoidTo_MethodStats()));
  o.count = dart.notNull(o.count) + 1;
};
dart._callMethod = function(obj, name, typeArgs, args, displayName) {
  let symbol = dart._canonicalMember(obj, name);
  if (symbol == null) {
    return dart.noSuchMethod(obj, new dart.InvocationImpl(displayName, core.List._check(args), {isMethod: true}));
  }
  let f = obj != null ? obj[symbol] : null;
  let type = dart.getType(obj);
  let ftype = dart.getMethodType(type, symbol);
  return dart._checkAndCall(f, ftype, obj, typeArgs, args, displayName);
};
dart.dsend = function(obj, method, ...args) {
  return dart._callMethod(obj, method, null, args, method);
};
dart.dgsend = function(obj, typeArgs, method, ...args) {
  return dart._callMethod(obj, method, typeArgs, args, method);
};
dart.dindex = function(obj, index) {
  return dart._callMethod(obj, '_get', null, [index], '[]');
};
dart.dsetindex = function(obj, index, value) {
  return dart._callMethod(obj, '_set', null, [index, value], '[]=');
};
dart._ignoreMemo = function(f) {
  let memo = new Map();
  return (t1, t2) => {
    let map = memo.get(t1);
    let result;
    if (map) {
      result = map.get(t2);
      if (result !== void 0) return result;
    } else {
      memo.set(t1, map = new Map());
    }
    result = f(t1, t2);
    map.set(t2, result);
    return result;
  };
};
dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) {
  let actual = dart.getReifiedType(obj);
  let result = dart.isSubtype(actual, type);
  if (result || actual == dart.jsobject || actual == core.int && type == core.double) return true;
  if (result === false) return false;
  if (ignoreFromWhiteList == void 0) return result;
  if (dart._ignoreTypeFailure(actual, type)) return true;
  return result;
};
dart.instanceOfOrNull = function(obj, type) {
  if (obj == null || dart.strongInstanceOf(obj, type, true)) return true;
  return false;
};
dart.is = function(obj, type) {
  if (obj == null) {
    return type == core.Null || dart._isTop(type);
  }
  let result = dart.strongInstanceOf(obj, type);
  if (result !== null) return result;
  let actual = dart.getReifiedType(obj);
  dart.throwStrongModeError('Strong mode is-check failure: ' + dart.typeName(actual) + ' does not soundly subtype ' + dart.typeName(type));
};
dart.as = function(obj, type) {
  if (type == dart.dynamic || obj == null) return obj;
  let result = dart.strongInstanceOf(obj, type, true);
  if (result) return obj;
  dart._throwCastError(obj, type, result);
};
dart.check = function(obj, type) {
  if (type == dart.dynamic || obj == null) return obj;
  let result = dart.strongInstanceOf(obj, type, true);
  if (result) return obj;
  dart._throwTypeError(obj, type, result);
};
dart.test = function(obj) {
  if (typeof obj == 'boolean') return obj;
  return dart.booleanConversionFailed(obj);
};
dart.booleanConversionFailed = function(obj) {
  if (obj == null) {
    dart.throw(new _js_helper.BooleanConversionAssertionError());
  }
  let actual = dart.getReifiedType(obj);
  let expected = core.bool;
  dart.throw(new _js_helper.TypeErrorImplementation.fromMessage(dart.str`type '${dart.typeName(actual)}' is not a subtype of ` + dart.str`type '${dart.typeName(expected)}' in boolean expression`));
};
dart._throwCastError = function(obj, type, result) {
  let actual = dart.getReifiedType(obj);
  if (result == false) dart.throwCastError(obj, actual, type);
  dart.throwStrongModeCastError(obj, actual, type);
};
dart._throwTypeError = function(obj, type, result) {
  let actual = dart.getReifiedType(obj);
  if (result == false) dart.throwTypeError(obj, actual, type);
  dart.throwStrongModeTypeError(obj, actual, type);
};
dart.asInt = function(obj) {
  if (obj == null) return null;
  if (Math.floor(obj) != obj) {
    dart.throwCastError(obj, dart.getReifiedType(obj), core.int);
  }
  return obj;
};
dart.addSimpleTypeTests = function(ctor) {
  ctor.is = function is_C(object) {
    if (object instanceof this) return true;
    return dart.is(object, this);
  };
  ctor.as = function as_C(object) {
    if (object instanceof this) return object;
    return dart.as(object, this);
  };
  ctor._check = function check_C(object) {
    if (object instanceof this) return object;
    return dart.check(object, this);
  };
};
dart.addTypeTests = function(ctor) {
  ctor.as = function as_G(object) {
    return dart.as(object, this);
  };
  ctor.is = function is_G(object) {
    return dart.is(object, this);
  };
  ctor._check = function check_G(object) {
    return dart.check(object, this);
  };
};
dart.equals = function(x, y) {
  if (x == null || y == null) return x == y;
  let eq = x['=='];
  return eq ? eq.call(x, y) : x === y;
};
dart.notNull = function(x) {
  if (x == null) dart.throwNullValueError();
  return x;
};
dart.map = function(values, K, V) {
  if (K === void 0) K = null;
  if (V === void 0) V = null;
  return (() => {
    if (K == null) K = dart.dynamic;
    if (V == null) V = dart.dynamic;
    let map = dart.getGenericClass(collection.LinkedHashMap)(K, V).new();
    if (Array.isArray(values)) {
      for (let i = 0, end = values.length - 1; i < end; i += 2) {
        let key = values[i];
        let value = values[i + 1];
        map._set(key, value);
      }
    } else if (typeof values === 'object') {
      for (let key of dart.getOwnPropertyNames(values)) {
        map._set(key, values[key]);
      }
    }
    return map;
  })();
};
dart.assert = function(condition, message) {
  if (message === void 0) message = null;
  return (() => {
    if (!condition) dart.throwAssertionError(message);
  })();
};
dart.throw = function(obj) {
  dart._stack = new Error();
  throw obj;
};
dart.getError = function(exception) {
  var stack = dart._stack;
  return stack !== null ? stack : exception;
};
dart.stackPrint = function(exception) {
  var error = dart.getError(exception);
  console.log(error.stack ? error.stack : 'No stack trace for: ' + error);
};
dart.stackTrace = function(exception) {
  var error = dart.getError(exception);
  return _js_helper.getTraceFromException(error);
};
dart.nullSafe = function(obj, ...callbacks) {
  if (obj == null) return obj;
  for (let callback of callbacks) {
    obj = callback(obj);
    if (obj == null) break;
  }
  return obj;
};
dart.multiKeyPutIfAbsent = function(map, keys, valueFn) {
  for (let k of keys) {
    let value = map.get(k);
    if (!value) {
      map.set(k, value = new Map());
    }
    map = value;
  }
  if (map.has(dart._value)) return map.get(dart._value);
  let value = valueFn();
  map.set(dart._value, value);
  return value;
};
dart.const = function(obj) {
  function lookupNonTerminal(map, key) {
    let result = map.get(key);
    if (result !== void 0) return result;
    map.set(key, result = new Map());
    return result;
  }
  let names = dart.getOwnNamesAndSymbols(obj);
  let count = names.length;
  let map = lookupNonTerminal(dart.constants, count);
  for (let i = 0; i < count; i++) {
    let name = names[i];
    map = lookupNonTerminal(map, name);
    map = lookupNonTerminal(map, obj[name]);
  }
  let type = dart.getReifiedType(obj);
  let value = map.get(type);
  if (value) return value;
  map.set(type, obj);
  return obj;
};
dart.constList = function(elements, elementType) {
  function lookupNonTerminal(map, key) {
    let result = map.get(key);
    if (result !== void 0) return result;
    map.set(key, result = new Map());
    return result;
  }
  let count = elements.length;
  let map = lookupNonTerminal(dart.constantLists, count);
  for (let i = 0; i < count; i++) {
    map = lookupNonTerminal(map, elements[i]);
  }
  let value = map.get(elementType);
  if (value) return value;
  value = dart.list(elements, elementType);
  map.set(elementType, value);
  return value;
};
dart.hashCode = function(obj) {
  if (obj == null) return 0;
  switch (typeof obj) {
    case "number":
    {
      return obj & 0x1FFFFFFF;
    }
    case "boolean":
    {
      return obj ? 2 * 3 * 23 * 3761 : 269 * 811;
    }
    case "function":
    {
      return _js_helper.Primitives.objectHashCode(obj);
    }
  }
  let extension = dart.getExtensionType(obj);
  if (extension != null) {
    return obj[dartx.hashCode];
  }
  return obj.hashCode;
};
dart.toString = function(obj) {
  if (obj == null) return "null";
  let extension = dart.getExtensionType(obj);
  if (extension != null) {
    return obj[dartx.toString]();
  }
  if (typeof obj == "function") {
    return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
  }
  return obj.toString();
};
dart.noSuchMethod = function(obj, invocation) {
  if (obj == null || typeof obj == "function") {
    dart.throw(new core.NoSuchMethodError(obj, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
  }
  let extension = dart.getExtensionType(obj);
  if (extension != null) {
    return obj[dartx.noSuchMethod](invocation);
  }
  return obj.noSuchMethod(invocation);
};
dart.constFn = function(x) {
  return () => x;
};
dart.runtimeType = function(obj) {
  let result = dart._checkPrimitiveType(obj);
  if (result != null) return dart.wrapType(result);
  let extension = dart.getExtensionType(obj);
  if (extension != null) {
    result = obj[dartx.runtimeType];
    return result != null ? result : dart.wrapType(extension);
  }
  if (typeof obj == "function") {
    return dart.wrapType(dart.getReifiedType(obj));
  }
  return obj.runtimeType;
};
dart.str = function(strings, ...values) {
  let s = strings[0];
  for (let i = 0, len = values.length; i < len;) {
    s += dart.notNull(dart.toString(values[i])) + strings[++i];
  }
  return s;
};
dart._canonicalMember = function(obj, name) {
  if (typeof name === "symbol") return name;
  if (obj != null && dart.getExtensionType(obj) != null) {
    return dartx[name];
  }
  if (dart.equals(name, 'constructor') || dart.equals(name, 'prototype')) {
    name = '+' + dart.notNull(core.String._check(name));
  }
  return name;
};
dart.loadLibrary = function() {
  return async.Future.value();
};
dart.defineProperty = function(obj, name, desc) {
  return Object.defineProperty(obj, name, desc);
};
dart.getOwnPropertyDescriptor = function(obj, name) {
  return Object.getOwnPropertyDescriptor(obj, name);
};
dart.getOwnPropertyNames = function(obj) {
  return Object.getOwnPropertyNames(obj);
};
dart.getOwnPropertySymbols = function(obj) {
  return Object.getOwnPropertySymbols(obj);
};
dart.throwStrongModeError = function(message) {
  if (dart.test(dart._trapRuntimeErrors)) debugger;
  throw new _js_helper.StrongModeErrorImplementation(message);
};
dart.throwInternalError = function(message) {
  if (dart.test(dart._trapRuntimeErrors)) debugger;
  throw Error(message);
};
dart.getOwnNamesAndSymbols = function(obj) {
  let names = dart.getOwnPropertyNames(obj);
  let symbols = dart.getOwnPropertySymbols(obj);
  return names.concat(symbols);
};
dart.safeGetOwnProperty = function(obj, name) {
  let desc = dart.getOwnPropertyDescriptor(obj, name);
  if (desc != null) return desc.value;
};
dart.defineLazyProperty = function(to, name, desc) {
  let init = desc.get;
  let value = null;
  function lazySetter(x) {
    init = null;
    value = x;
  }
  function circularInitError() {
    dart.throwInternalError('circular initialization for field ' + name);
  }
  function lazyGetter() {
    if (init == null) return value;
    let f = init;
    init = circularInitError;
    lazySetter(f());
    return value;
  }
  desc.get = lazyGetter;
  desc.configurable = true;
  if (desc.set) desc.set = lazySetter;
  return dart.defineProperty(to, name, desc);
};
dart.defineLazy = function(to, from) {
  for (let name of dart.getOwnNamesAndSymbols(from)) {
    dart.defineLazyProperty(to, name, dart.getOwnPropertyDescriptor(from, name));
  }
};
dart.defineMemoizedGetter = function(obj, name, getter) {
  return dart.defineLazyProperty(obj, name, {get: getter});
};
dart.copyTheseProperties = function(to, from, names) {
  for (let i = 0; i < names.length; ++i) {
    dart.copyProperty(to, from, names[i]);
  }
  return to;
};
dart.copyProperty = function(to, from, name) {
  let desc = dart.getOwnPropertyDescriptor(from, name);
  if (name == Symbol.iterator) {
    let existing = dart.getOwnPropertyDescriptor(to, name);
    if (existing != null) {
      if (existing.writable) {
        to[name] = desc.value;
      }
      return;
    }
  }
  dart.defineProperty(to, name, desc);
};
dart.export = function(to, from, name) {
  return dart.copyProperty(to, from, name);
};
dart.copyProperties = function(to, from) {
  return dart.copyTheseProperties(to, from, dart.getOwnNamesAndSymbols(from));
};
dart.global = (function() {
  if (typeof NodeList !== "undefined") {
    NodeList.prototype.get = function(i) {
      return this[i];
    };
    NamedNodeMap.prototype.get = function(i) {
      return this[i];
    };
    DOMTokenList.prototype.get = function(i) {
      return this[i];
    };
    HTMLCollection.prototype.get = function(i) {
      return this[i];
    };
    if (typeof PannerNode == "undefined") {
      let audioContext;
      if (typeof AudioContext == "undefined" && typeof webkitAudioContext != "undefined") {
        audioContext = new webkitAudioContext();
      } else {
        audioContext = new AudioContext();
        window.StereoPannerNode = audioContext.createStereoPanner().constructor;
      }
      window.PannerNode = audioContext.createPanner().constructor;
    }
    if (typeof AudioSourceNode == "undefined") {
      window.AudioSourceNode = MediaElementAudioSourceNode.__proto__;
    }
    if (typeof FontFaceSet == "undefined") {
      window.FontFaceSet = document.fonts.__proto__.constructor;
    }
    if (typeof MemoryInfo == "undefined") {
      if (typeof window.performance.memory != "undefined") {
        window.MemoryInfo = window.performance.memory.constructor;
      }
    }
    if (typeof Geolocation == "undefined") {
      navigator.geolocation.constructor;
    }
    if (typeof Animation == "undefined") {
      let d = document.createElement('div');
      if (typeof d.animate != "undefined") {
        window.Animation = d.animate(d).constructor;
      }
    }
    if (typeof SourceBufferList == "undefined") {
      window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
    }
  }
  var globalState = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {};
  return globalState;
})();
dart.JsSymbol = Symbol;
dart._mixins = Symbol("mixins");
dart.implements = Symbol("implements");
dart._typeArguments = Symbol("typeArguments");
dart._originalDeclaration = Symbol("originalDeclaration");
dart._constructorSig = Symbol("sigCtor");
dart._methodSig = Symbol("sigMethod");
dart._fieldSig = Symbol("sigField");
dart._getterSig = Symbol("sigGetter");
dart._setterSig = Symbol("sigSetter");
dart._staticSig = Symbol("sigStaticMethod");
dart._staticFieldSig = Symbol("sigStaticField");
dart._staticGetterSig = Symbol("sigStaticGetter");
dart._staticSetterSig = Symbol("sigStaticSetter");
dart._genericTypeCtor = Symbol("genericType");
dart._extensionType = Symbol("extensionType");
dart.dartx = dartx;
dart._runtimeType = Symbol("_runtimeType");
dart.isNamedConstructor = Symbol("isNamedConstructor");
dart.defineLazy(dart, {
  get _lazyJSTypes() {
    return new Map();
  },
  set _lazyJSTypes(_) {}
});
dart.metadata = Symbol("metadata");
dart._typeObject = Symbol("typeObject");
core.Object = class Object {
  constructor(...args) {
    return this.new.apply(this, args);
  }
  new() {
  }
  ['=='](other) {
    return core.identical(this, other);
  }
  get hashCode() {
    return _js_helper.Primitives.objectHashCode(this);
  }
  toString() {
    return _js_helper.Primitives.objectToString(this);
  }
  noSuchMethod(invocation) {
    dart.throw(new core.NoSuchMethodError(this, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
  }
  get runtimeType() {
    return dart.wrapType(dart.getReifiedType(this));
  }
};
core.Object.is = function is_Object(o) {
  if (o instanceof this) return true;
  return dart.is(o, this);
};
core.Object.as = function as_Object(o) {
  if (o == null || o instanceof this) return o;
  return dart.as(o, this);
};
core.Object._check = function check_Object(o) {
  if (o == null || o instanceof this) return o;
  return dart.check(o, this);
};
dart.setSignature(core.Object, {
  constructors: () => ({new: dart.definiteFunctionType(core.Object, [])}),
  getters: () => ({
    hashCode: dart.definiteFunctionType(core.int, []),
    runtimeType: dart.definiteFunctionType(core.Type, [])
  }),
  methods: () => ({
    '==': dart.definiteFunctionType(core.bool, [dart.dynamic]),
    toString: dart.definiteFunctionType(core.String, []),
    noSuchMethod: dart.definiteFunctionType(dart.dynamic, [core.Invocation])
  })
});
dart.tagComputed(core.Object, () => core.Type);
dart.TypeRep = class TypeRep extends core.Object {
  new() {
    dart._initialize;
  }
  get name() {
    return this.toString();
  }
};
dart.TypeRep[dart.implements] = () => [core.Type];
dart.setSignature(dart.TypeRep, {
  constructors: () => ({new: dart.definiteFunctionType(dart.TypeRep, [])}),
  getters: () => ({name: dart.definiteFunctionType(core.String, [])})
});
dart.Dynamic = class Dynamic extends dart.TypeRep {
  new() {
    super.new();
  }
  toString() {
    return 'dynamic';
  }
};
dart.LazyJSType = class LazyJSType extends core.Object {
  new(jsTypeCallback, dartName) {
    this[_jsTypeCallback] = jsTypeCallback;
    this[_dartName] = dartName;
  }
  get [_rawJSType]() {
    return this[_jsTypeCallback]();
  }
  toString() {
    return core.String._check(this[_jsTypeCallback] != null ? dart.typeName(this[_rawJSType]) : this[_dartName]);
  }
};
dart.LazyJSType[dart.implements] = () => [core.Type];
dart.setSignature(dart.LazyJSType, {
  constructors: () => ({new: dart.definiteFunctionType(dart.LazyJSType, [dart.dynamic, dart.dynamic])}),
  fields: () => ({
    [_jsTypeCallback]: dart.dynamic,
    [_dartName]: dart.dynamic
  }),
  getters: () => ({[_rawJSType]: dart.definiteFunctionType(dart.dynamic, [])})
});
dart.dynamic = new dart.Dynamic();
dart._initialize = dart._initialize2();
dart.Void = class Void extends dart.TypeRep {
  new() {
    super.new();
  }
  toString() {
    return 'void';
  }
};
dart.void = new dart.Void();
dart.Bottom = class Bottom extends dart.TypeRep {
  new() {
    super.new();
  }
  toString() {
    return 'bottom';
  }
};
dart.bottom = new dart.Bottom();
dart.JSObject = class JSObject extends dart.TypeRep {
  new() {
    super.new();
  }
  toString() {
    return 'NativeJavaScriptObject';
  }
};
dart.jsobject = new dart.JSObject();
core.Type = class Type extends core.Object {};
dart.WrappedType = class WrappedType extends core.Type {
  new(wrappedType) {
    this[_wrappedType] = wrappedType;
  }
  toString() {
    return dart.typeName(this[_wrappedType]);
  }
};
dart.setSignature(dart.WrappedType, {
  constructors: () => ({new: dart.definiteFunctionType(dart.WrappedType, [dart.dynamic])}),
  fields: () => ({[_wrappedType]: dart.dynamic})
});
const _stringValue = Symbol('_stringValue');
dart.AbstractFunctionType = class AbstractFunctionType extends dart.TypeRep {
  new() {
    this[_stringValue] = null;
    super.new();
  }
  toString() {
    return this.name;
  }
  get name() {
    if (this[_stringValue] != null) return this[_stringValue];
    let buffer = '(';
    for (let i = 0; i < this.args.length; ++i) {
      if (i > 0) {
        buffer = dart.notNull(buffer) + ', ';
      }
      buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.args[i]));
    }
    if (this.optionals.length > 0) {
      if (this.args.length > 0) {
        buffer = dart.notNull(buffer) + ', ';
      }
      buffer = dart.notNull(buffer) + '[';
      for (let i = 0; i < this.optionals.length; ++i) {
        if (i > 0) {
          buffer = dart.notNull(buffer) + ', ';
        }
        buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.optionals[i]));
      }
      buffer = dart.notNull(buffer) + ']';
    } else if (Object.keys(this.named).length > 0) {
      if (this.args.length > 0) {
        buffer = dart.notNull(buffer) + ', ';
      }
      buffer = dart.notNull(buffer) + '{';
      let names = dart.getOwnPropertyNames(this.named);
      names.sort();
      for (let i = 0; i < names.length; ++i) {
        if (i > 0) {
          buffer = dart.notNull(buffer) + ', ';
        }
        let typeNameString = dart.typeName(this.named[names[i]]);
        buffer = dart.notNull(buffer) + dart.str`${names[i]}: ${typeNameString}`;
      }
      buffer = dart.notNull(buffer) + '}';
    }
    let returnTypeName = dart.typeName(this.returnType);
    buffer = dart.notNull(buffer) + dart.str`) -> ${returnTypeName}`;
    this[_stringValue] = buffer;
    return buffer;
  }
};
dart.setSignature(dart.AbstractFunctionType, {
  constructors: () => ({new: dart.definiteFunctionType(dart.AbstractFunctionType, [])}),
  fields: () => ({[_stringValue]: core.String})
});
dart._fnTypeNamedArgMap = new Map();
dart._fnTypeArrayArgMap = new Map();
dart._fnTypeTypeMap = new Map();
dart._fnTypeSmallMap = [new Map(), new Map(), new Map()];
const _process = Symbol('_process');
dart.FunctionType = class FunctionType extends dart.AbstractFunctionType {
  static create(definite, returnType, args, extra) {
    if (extra === void 0 && args.length < 3) {
      return dart._createSmall(args.length, definite, returnType, args);
    }
    args = dart._canonicalizeArray(definite, args, dart._fnTypeArrayArgMap);
    let keys = null;
    let create = null;
    if (extra === void 0) {
      keys = [returnType, args];
      create = dart.fn(() => new dart.FunctionType(returnType, args, [], {}), VoidToFunctionType());
    } else if (extra instanceof Array) {
      let optionals = dart._canonicalizeArray(definite, extra, dart._fnTypeArrayArgMap);
      keys = [returnType, args, optionals];
      create = dart.fn(() => new dart.FunctionType(returnType, args, optionals, {}), VoidToFunctionType());
    } else {
      let named = dart._canonicalizeNamed(definite, extra, dart._fnTypeNamedArgMap);
      keys = [returnType, args, named];
      create = dart.fn(() => new dart.FunctionType(returnType, args, [], named), VoidToFunctionType());
    }
    return dart._memoizeArray(dart._fnTypeTypeMap, keys, create);
  }
  [_process](array, metadata) {
    let result = [];
    for (let i = 0; i < array.length; ++i) {
      let arg = array[i];
      if (arg instanceof Array) {
        dart.dsend(metadata, 'add', arg.slice(1));
        result[dartx.add](arg[0]);
      } else {
        metadata.push([]);
        result.push(arg);
      }
    }
    return result;
  }
  new(returnType, args, optionals, named) {
    this.returnType = returnType;
    this.args = args;
    this.optionals = optionals;
    this.named = named;
    this.metadata = null;
    super.new();
    this.metadata = [];
    this.args = this[_process](this.args, this.metadata);
    this.optionals = this[_process](this.optionals, this.metadata);
  }
};
dart.setSignature(dart.FunctionType, {
  constructors: () => ({new: dart.definiteFunctionType(dart.FunctionType, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
  fields: () => ({
    returnType: dart.dynamic,
    args: dart.dynamic,
    optionals: dart.dynamic,
    named: dart.dynamic,
    metadata: dart.dynamic
  }),
  methods: () => ({[_process]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])}),
  statics: () => ({create: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
  names: ['create']
});
const _name = Symbol('_name');
const _closure = Symbol('_closure');
const _functionType = Symbol('_functionType');
dart.Typedef = class Typedef extends dart.AbstractFunctionType {
  new(name, closure) {
    this[_name] = name;
    this[_closure] = closure;
    this[_functionType] = null;
    super.new();
  }
  get name() {
    return core.String._check(this[_name]);
  }
  get functionType() {
    if (this[_functionType] == null) {
      this[_functionType] = this[_closure]();
    }
    return this[_functionType];
  }
  get returnType() {
    return this.functionType.returnType;
  }
  get args() {
    return core.List._check(this.functionType.args);
  }
  get optionals() {
    return core.List._check(this.functionType.optionals);
  }
  get named() {
    return this.functionType.named;
  }
  get metadata() {
    return core.List._check(this.functionType.metadata);
  }
};
dart.setSignature(dart.Typedef, {
  constructors: () => ({new: dart.definiteFunctionType(dart.Typedef, [dart.dynamic, dart.dynamic])}),
  fields: () => ({
    [_name]: dart.dynamic,
    [_closure]: dart.dynamic,
    [_functionType]: dart.AbstractFunctionType
  }),
  getters: () => ({
    functionType: dart.definiteFunctionType(dart.AbstractFunctionType, []),
    returnType: dart.definiteFunctionType(dart.dynamic, []),
    args: dart.definiteFunctionType(core.List, []),
    optionals: dart.definiteFunctionType(core.List, []),
    named: dart.definiteFunctionType(dart.dynamic, []),
    metadata: dart.definiteFunctionType(core.List, [])
  })
});
dart._typeFormalCount = Symbol("_typeFormalCount");
dart.isSubtype = dart._subtypeMemo((t1, t2) => t1 === t2 || dart._isSubtype(t1, t2, true));
dart._trapRuntimeErrors = true;
dart._jsIterator = Symbol("_jsIterator");
dart._current = Symbol("_current");
dart._AsyncStarStreamController = class _AsyncStarStreamController {
  constructor(generator, T, args) {
    this.isAdding = false;
    this.isWaiting = false;
    this.isScheduled = false;
    this.isSuspendedAtYield = false;
    this.canceler = null;
    this.iterator = generator(this, ...args)[Symbol.iterator]();
    this.controller = dart.getGenericClass(async.StreamController)(T).new({
      onListen: () => this.scheduleGenerator(),
      onResume: () => this.onResume(),
      onCancel: () => this.onCancel()
    });
  }
  onResume() {
    if (this.isSuspendedAtYield) {
      this.scheduleGenerator();
    }
  }
  onCancel() {
    if (this.controller.isClosed) {
      return null;
    }
    if (this.canceler == null) {
      this.canceler = async.Completer.new();
      this.scheduleGenerator();
    }
    return this.canceler.future;
  }
  close() {
    if (this.canceler != null && !this.canceler.isCompleted) {
      this.canceler.complete();
    }
    this.controller.close();
  }
  scheduleGenerator() {
    if (this.isScheduled || this.controller.isPaused || this.isAdding || this.isWaiting) {
      return;
    }
    this.isScheduled = true;
    async.scheduleMicrotask(() => this.runBody());
  }
  runBody(opt_awaitValue) {
    this.isScheduled = false;
    this.isSuspendedAtYield = false;
    this.isWaiting = false;
    let iter;
    try {
      iter = this.iterator.next(opt_awaitValue);
    } catch (e) {
      this.addError(e, dart.stackTrace(e));
      this.close();
      return;
    }

    if (iter.done) {
      this.close();
      return;
    }
    if (this.isSuspendedAtYield || this.isAdding) return;
    this.isWaiting = true;
    let future = iter.value;
    if (!dart.is(future, dart.getGenericClass(async.Future))) {
      future = async.Future.value(future);
    }
    return future.then(dart.dynamic)(x => this.runBody(x), {
      onError: (e, s) => this.throwError(e, s)
    });
  }
  add(event) {
    if (!this.controller.hasListener) return true;
    this.controller.add(event);
    this.scheduleGenerator();
    this.isSuspendedAtYield = true;
    return false;
  }
  addStream(stream) {
    if (!this.controller.hasListener) return true;
    this.isAdding = true;
    this.controller.addStream(stream, {cancelOnError: false}).then(dart.dynamic)(() => {
      this.isAdding = false;
      this.scheduleGenerator();
    }, {
      onError: (e, s) => this.throwError(e, s)
    });
  }
  throwError(error, stackTrace) {
    try {
      this.iterator.throw(error);
    } catch (e) {
      this.addError(e, stackTrace);
    }

  }
  addError(error, stackTrace) {
    if (this.canceler != null && !this.canceler.isCompleted) {
      this.canceler.completeError(error, stackTrace);
      return;
    }
    if (!this.controller.hasListener) return;
    this.controller.addError(error, stackTrace);
  }
};
core.Invocation = class Invocation extends core.Object {
  get isAccessor() {
    return dart.test(this.isGetter) || dart.test(this.isSetter);
  }
};
dart.setSignature(core.Invocation, {
  getters: () => ({isAccessor: dart.definiteFunctionType(core.bool, [])})
});
dart.InvocationImpl = class InvocationImpl extends core.Invocation {
  new(memberName, positionalArguments, opts) {
    let namedArguments = opts && 'namedArguments' in opts ? opts.namedArguments : null;
    let isMethod = opts && 'isMethod' in opts ? opts.isMethod : false;
    let isGetter = opts && 'isGetter' in opts ? opts.isGetter : false;
    let isSetter = opts && 'isSetter' in opts ? opts.isSetter : false;
    this.positionalArguments = positionalArguments;
    this.isMethod = isMethod;
    this.isGetter = isGetter;
    this.isSetter = isSetter;
    this.memberName = dart._dartSymbol(memberName);
    this.namedArguments = dart.InvocationImpl._namedArgsToSymbols(namedArguments);
  }
  static _namedArgsToSymbols(namedArgs) {
    if (namedArgs == null) return dart.map({}, core.Symbol, dart.dynamic);
    return MapOfSymbol$dynamic().fromIterable(dart.getOwnPropertyNames(namedArgs), {key: dart._dartSymbol, value: dart.fn(k => namedArgs[k], dynamicTodynamic$())});
  }
};
dart.setSignature(dart.InvocationImpl, {
  constructors: () => ({new: dart.definiteFunctionType(dart.InvocationImpl, [dart.dynamic, core.List], {namedArguments: dart.dynamic, isMethod: core.bool, isGetter: core.bool, isSetter: core.bool})}),
  fields: () => ({
    memberName: core.Symbol,
    positionalArguments: core.List,
    namedArguments: MapOfSymbol$dynamic(),
    isMethod: core.bool,
    isGetter: core.bool,
    isSetter: core.bool
  }),
  statics: () => ({_namedArgsToSymbols: dart.definiteFunctionType(core.Map$(core.Symbol, dart.dynamic), [dart.dynamic])}),
  names: ['_namedArgsToSymbols']
});
dart._MethodStats = class _MethodStats extends core.Object {
  new(typeName, frame) {
    this.typeName = typeName;
    this.frame = frame;
    this.count = null;
    this.count = 0;
  }
};
dart.setSignature(dart._MethodStats, {
  constructors: () => ({new: dart.definiteFunctionType(dart._MethodStats, [core.String, core.String])}),
  fields: () => ({
    typeName: core.String,
    frame: core.String,
    count: core.int
  })
});
dart.defineLazy(dart, {
  get _callMethodStats() {
    return MapOfString$_MethodStats().new();
  },
  set _callMethodStats(_) {}
});
dart.defineLazy(dart, {
  get trackProfile() {
    return dart.global.trackDdcProfile;
  },
  set trackProfile(_) {}
});
dart._ignoreTypeFailure = (() => {
  return dart._ignoreMemo((actual, type) => {
    if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || dart.isFunctionType(type) && dart.isFunctionType(actual) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
      console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
      return true;
    }
    return false;
  });
})();
dart._stack = null;
dart._value = Symbol("_value");
dart.constants = new Map();
dart.constantLists = new Map();
dart.JsIterator = class JsIterator {
  constructor(dartIterator) {
    this.dartIterator = dartIterator;
  }
  next() {
    let i = this.dartIterator;
    let done = !i.moveNext();
    return {done: done, value: done ? void 0 : i.current};
  }
};
dart.hasOwnProperty = Object.prototype.hasOwnProperty;
_debugger.JsonMLConfig = class JsonMLConfig extends core.Object {
  new(name) {
    this.name = name;
  }
};
dart.setSignature(_debugger.JsonMLConfig, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLConfig, [core.String])}),
  fields: () => ({name: core.String}),
  sfields: () => ({
    none: _debugger.JsonMLConfig,
    skipDart: _debugger.JsonMLConfig,
    keyToString: _debugger.JsonMLConfig,
    asClass: _debugger.JsonMLConfig
  })
});
dart.defineLazy(_debugger.JsonMLConfig, {
  get none() {
    return dart.const(new _debugger.JsonMLConfig("none"));
  },
  get skipDart() {
    return dart.const(new _debugger.JsonMLConfig("skipDart"));
  },
  get keyToString() {
    return dart.const(new _debugger.JsonMLConfig("keyToString"));
  },
  get asClass() {
    return dart.const(new _debugger.JsonMLConfig("asClass"));
  }
});
_debugger._maxSpanLength = 100;
dart.defineLazy(_debugger, {
  get _devtoolsFormatter() {
    return new _debugger.JsonMLFormatter(new _debugger.DartFormatter());
  },
  set _devtoolsFormatter(_) {}
});
_debugger._typeof = function(object) {
  return typeof object;
};
dart.lazyFn(_debugger._typeof, () => dynamicToString());
_debugger.getOwnPropertyNames = function(object) {
  return dart.list(Object.getOwnPropertyNames(object), core.String);
};
dart.lazyFn(_debugger.getOwnPropertyNames, () => dynamicToListOfString());
_debugger.getOwnPropertySymbols = function(object) {
  return Object.getOwnPropertySymbols(object);
};
dart.lazyFn(_debugger.getOwnPropertySymbols, () => dynamicToList());
_debugger.JSNative = class JSNative extends core.Object {
  static getProperty(object, name) {
    return object[name];
  }
  static setProperty(object, name, value) {
    return object[name] = value;
  }
};
dart.setSignature(_debugger.JSNative, {
  statics: () => ({
    getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['getProperty', 'setProperty']
});
_debugger.addMetadataChildren = function(object, ret) {
  ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
};
dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
_debugger.getObjectTypeName = function(object) {
  let reifiedType = dart.getReifiedType(object);
  if (reifiedType == null) {
    if (_debugger._typeof(object) == 'function') {
      return '[[Raw JavaScript Function]]';
    }
    return '<Error getting type name>';
  }
  return _debugger.getTypeName(core.Type._check(reifiedType));
};
dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
_debugger.getTypeName = function(type) {
  let name = dart.typeName(type);
  if (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
  return name;
};
dart.lazyFn(_debugger.getTypeName, () => TypeToString());
_debugger._getType = function(object) {
  return core.Type.is(object) ? object : dart.getReifiedType(object);
};
dart.fn(_debugger._getType, dynamicToObject());
const _simpleFormatter = Symbol('_simpleFormatter');
_debugger.safePreview = function(object, config) {
  try {
    let preview = _debugger._devtoolsFormatter[_simpleFormatter].preview(object, config);
    if (preview != null) return preview;
    return dart.toString(object);
  } catch (e) {
    return dart.str`<Exception thrown> ${e}`;
  }

};
dart.lazyFn(_debugger.safePreview, () => dynamicAnddynamicToString());
_debugger.symbolName = function(symbol) {
  let name = dart.toString(symbol);
  dart.assert(name[dartx.startsWith]('Symbol('));
  return name[dartx.substring]('Symbol('[dartx.length], dart.notNull(name[dartx.length]) - 1);
};
dart.lazyFn(_debugger.symbolName, () => dynamicToString());
_debugger.hasMethod = function(object, name) {
  try {
    return core.bool._check(dart.hasMethod(object, name));
  } catch (e) {
    return false;
  }

};
dart.lazyFn(_debugger.hasMethod, () => dynamicAndStringTobool());
_debugger.NameValuePair = class NameValuePair extends core.Object {
  new(opts) {
    let name = opts && 'name' in opts ? opts.name : null;
    let value = opts && 'value' in opts ? opts.value : null;
    let config = opts && 'config' in opts ? opts.config : _debugger.JsonMLConfig.none;
    let hideName = opts && 'hideName' in opts ? opts.hideName : false;
    this.name = name;
    this.value = value;
    this.config = config;
    this.hideName = hideName;
  }
  ['=='](other) {
    return _debugger.NameValuePair.is(other) && other.name == this.name;
  }
  get hashCode() {
    return dart.hashCode(this.name);
  }
  get displayName() {
    return dart.test(this.hideName) ? '' : this.name;
  }
};
dart.setSignature(_debugger.NameValuePair, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.NameValuePair, [], {name: core.String, value: core.Object, config: _debugger.JsonMLConfig, hideName: core.bool})}),
  fields: () => ({
    name: core.String,
    value: core.Object,
    config: _debugger.JsonMLConfig,
    hideName: core.bool
  }),
  getters: () => ({displayName: dart.definiteFunctionType(core.String, [])})
});
_debugger.MapEntry = class MapEntry extends core.Object {
  new(opts) {
    let key = opts && 'key' in opts ? opts.key : null;
    let value = opts && 'value' in opts ? opts.value : null;
    this.key = key;
    this.value = value;
  }
};
dart.setSignature(_debugger.MapEntry, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.MapEntry, [], {key: core.Object, value: core.Object})}),
  fields: () => ({
    key: core.Object,
    value: core.Object
  })
});
_debugger.IterableSpan = class IterableSpan extends core.Object {
  new(start, end, iterable) {
    this.start = start;
    this.end = end;
    this.iterable = iterable;
  }
  get length() {
    return dart.notNull(this.end) - dart.notNull(this.start);
  }
  get maxPowerOfSubsetSize() {
    return (dart.notNull(math.log(dart.notNull(this.length) - 0.5)) / dart.notNull(math.log(_debugger._maxSpanLength)))[dartx.truncate]();
  }
  get subsetSize() {
    return dart.asInt(math.pow(_debugger._maxSpanLength, this.maxPowerOfSubsetSize));
  }
  asMap() {
    return this.iterable[dartx.skip](this.start)[dartx.take](this.length)[dartx.toList]()[dartx.asMap]();
  }
  children() {
    let children = JSArrayOfNameValuePair().of([]);
    if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
      this.asMap()[dartx.forEach](dart.fn((i, element) => {
        children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
      }, intAnddynamicToNull()));
    } else {
      for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
        let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
        if (subSpan.length == 1) {
          children[dartx.add](new _debugger.NameValuePair({name: dart.toString(i), value: this.iterable[dartx.elementAt](i)}));
        } else {
          children[dartx.add](new _debugger.NameValuePair({name: dart.str`[${i}...${dart.notNull(subSpan.end) - 1}]`, value: subSpan, hideName: true}));
        }
      }
    }
    return children;
  }
};
dart.setSignature(_debugger.IterableSpan, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.IterableSpan, [core.int, core.int, core.Iterable])}),
  fields: () => ({
    start: core.int,
    end: core.int,
    iterable: core.Iterable
  }),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    maxPowerOfSubsetSize: dart.definiteFunctionType(core.int, []),
    subsetSize: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    asMap: dart.definiteFunctionType(core.Map$(core.int, dart.dynamic), []),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [])
  })
});
_debugger.Library = class Library extends core.Object {
  new(name, object) {
    this.name = name;
    this.object = object;
  }
};
dart.setSignature(_debugger.Library, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.Library, [core.String, core.Object])}),
  fields: () => ({
    name: core.String,
    object: core.Object
  })
});
_debugger.NamedConstructor = class NamedConstructor extends core.Object {
  new(object) {
    this.object = object;
  }
};
dart.setSignature(_debugger.NamedConstructor, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.NamedConstructor, [core.Object])}),
  fields: () => ({object: core.Object})
});
_debugger.HeritageClause = class HeritageClause extends core.Object {
  new(name, types) {
    this.name = name;
    this.types = types;
  }
};
dart.setSignature(_debugger.HeritageClause, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.HeritageClause, [core.String, core.List])}),
  fields: () => ({
    name: core.String,
    types: core.List
  })
});
_debugger.safeGetProperty = function(protoChain, name) {
  try {
    return _debugger.JSNative.getProperty(protoChain, name);
  } catch (e) {
    return dart.str`<Exception thrown> ${e}`;
  }

};
dart.fn(_debugger.safeGetProperty, ObjectAndObjectToObject());
_debugger.safeProperties = function(object) {
  return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[dartx.where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool$())), {key: dart.fn(name => name, dynamicTodynamic$()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
};
dart.fn(_debugger.safeProperties, dynamicTodynamic$());
const _attributes = Symbol('_attributes');
const _jsonML = Symbol('_jsonML');
_debugger.JsonMLElement = class JsonMLElement extends core.Object {
  new(tagName) {
    this[_attributes] = null;
    this[_jsonML] = null;
    this[_attributes] = {};
    this[_jsonML] = [tagName, this[_attributes]];
  }
  appendChild(element) {
    this[_jsonML][dartx.add](dart.dsend(element, 'toJsonML'));
  }
  createChild(tagName) {
    let c = new _debugger.JsonMLElement(tagName);
    this[_jsonML][dartx.add](c.toJsonML());
    return c;
  }
  createObjectTag(object) {
    return (() => {
      let _ = this.createChild('object');
      _.addAttribute('object', object);
      return _;
    })();
  }
  setStyle(style) {
    dart.dput(this[_attributes], 'style', style);
  }
  addStyle(style) {
    if (dart.dload(this[_attributes], 'style') == null) {
      dart.dput(this[_attributes], 'style', style);
    } else {
      let o = this[_attributes];
      dart.dput(o, 'style', dart.dsend(dart.dload(o, 'style'), '+', style));
    }
  }
  addAttribute(key, value) {
    _debugger.JSNative.setProperty(this[_attributes], key, value);
  }
  createTextChild(text) {
    this[_jsonML][dartx.add](text);
  }
  toJsonML() {
    return this[_jsonML];
  }
};
dart.setSignature(_debugger.JsonMLElement, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic])}),
  fields: () => ({
    [_attributes]: dart.dynamic,
    [_jsonML]: core.List
  }),
  methods: () => ({
    appendChild: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    createChild: dart.definiteFunctionType(_debugger.JsonMLElement, [core.String]),
    createObjectTag: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic]),
    setStyle: dart.definiteFunctionType(dart.void, [core.String]),
    addStyle: dart.definiteFunctionType(dart.dynamic, [core.String]),
    addAttribute: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    createTextChild: dart.definiteFunctionType(dart.dynamic, [core.String]),
    toJsonML: dart.definiteFunctionType(dart.dynamic, [])
  })
});
_debugger.isNativeJavaScriptObject = function(object) {
  let type = _debugger._typeof(object);
  return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
};
dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
_debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
  new(simpleFormatter) {
    this[_simpleFormatter] = simpleFormatter;
    this.customFormattersOn = false;
  }
  setMaxSpanLengthForTestingOnly(spanLength) {
    _debugger._maxSpanLength = spanLength;
  }
  header(object, config) {
    this.customFormattersOn = true;
    if (dart.equals(config, _debugger.JsonMLConfig.skipDart) || dart.test(_debugger.isNativeJavaScriptObject(object))) {
      return null;
    }
    let c = this[_simpleFormatter].preview(object, config);
    if (c == null) return null;
    if (dart.equals(config, _debugger.JsonMLConfig.keyToString)) {
      c = dart.toString(object);
    }
    let element = new _debugger.JsonMLElement('span');
    element.setStyle('background-color: #d9edf7;');
    element.createTextChild(c);
    return element.toJsonML();
  }
  hasBody(object, config) {
    return this[_simpleFormatter].hasChildren(object, config);
  }
  body(object, config) {
    let body = new _debugger.JsonMLElement('ol');
    body.setStyle('list-style-type: none;' + 'padding-left: 0px;' + 'margin-top: 0px;' + 'margin-bottom: 0px;' + 'margin-left: 12px;');
    if (core.StackTrace.is(object)) {
      body.addStyle('color: rgb(196, 26, 22);');
    }
    let children = this[_simpleFormatter].children(object, config);
    for (let child of children) {
      let li = body.createChild('li');
      let nameSpan = new _debugger.JsonMLElement('span');
      nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
      nameSpan.setStyle('color: rgb(136, 19, 145);');
      if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
        nameSpan.addStyle("padding-left: 13px;");
        li.appendChild(nameSpan);
        let objectTag = li.createObjectTag(child.value);
        objectTag.addAttribute('config', child.config);
        if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
          li.setStyle("padding-left: 13px;");
        }
      } else {
        li.setStyle("padding-left: 13px;");
        let _ = li.createChild('span');
        _.appendChild(nameSpan);
        _.createTextChild(_debugger.safePreview(child.value, child.config));
      }
    }
    return body.toJsonML();
  }
};
dart.setSignature(_debugger.JsonMLFormatter, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLFormatter, [_debugger.DartFormatter])}),
  fields: () => ({
    [_simpleFormatter]: _debugger.DartFormatter,
    customFormattersOn: core.bool
  }),
  methods: () => ({
    setMaxSpanLengthForTestingOnly: dart.definiteFunctionType(dart.void, [core.int]),
    header: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    hasBody: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    body: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])
  })
});
_debugger.Formatter = class Formatter extends core.Object {};
const _formatters = Symbol('_formatters');
_debugger.DartFormatter = class DartFormatter extends core.Object {
  new() {
    this[_formatters] = null;
    this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
  }
  preview(object, config) {
    try {
      if (object == null || typeof object == 'number' || typeof object == 'string' || dart.test(_debugger.isNativeJavaScriptObject(object))) {
        return dart.toString(object);
      }
      for (let formatter of this[_formatters]) {
        if (dart.test(formatter.accept(object, config))) return formatter.preview(object);
      }
    } catch (e) {
      let trace = dart.stackTrace(e);
      html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
    }

    return null;
  }
  hasChildren(object, config) {
    if (object == null) return false;
    try {
      for (let formatter of this[_formatters]) {
        if (dart.test(formatter.accept(object, config))) return formatter.hasChildren(object);
      }
    } catch (e) {
      let trace = dart.stackTrace(e);
      html$.window[dartx.console].error(dart.str`[hasChildren] Caught exception ${e}\n trace:\n${trace}`);
    }

    return false;
  }
  children(object, config) {
    try {
      if (object != null) {
        for (let formatter of this[_formatters]) {
          if (dart.test(formatter.accept(object, config))) return formatter.children(object);
        }
      }
    } catch (e) {
      let trace = dart.stackTrace(e);
      html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
    }

    return JSArrayOfNameValuePair().of([]);
  }
};
dart.setSignature(_debugger.DartFormatter, {
  constructors: () => ({new: dart.definiteFunctionType(_debugger.DartFormatter, [])}),
  fields: () => ({[_formatters]: ListOfFormatter()}),
  methods: () => ({
    preview: dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic, dart.dynamic])
  })
});
_debugger.ObjectFormatter = class ObjectFormatter extends _debugger.Formatter {
  accept(object, config) {
    return !dart.test(_debugger.isNativeJavaScriptObject(object));
  }
  preview(object) {
    return _debugger.getObjectTypeName(object);
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    let properties = LinkedHashSetOfNameValuePair().new();
    _debugger.addMetadataChildren(object, properties);
    let current = object;
    let protoChain = JSArrayOfObject().of([]);
    while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
      protoChain[dartx.add](current);
      current = _debugger.safeGetProperty(current, '__proto__');
    }
    for (current of protoChain) {
      for (let symbol of _debugger.getOwnPropertySymbols(current)) {
        let dartName = _debugger.symbolName(symbol);
        if (dart.test(_debugger.hasMethod(object, dartName))) {
          continue;
        }
        let dartXPrefix = 'dartx.';
        if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
          dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
        } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
          continue;
        }
        let value = _debugger.safeGetProperty(object, symbol);
        properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
      }
    }
    for (current of protoChain) {
      let className = dart.dload(dart.getReifiedType(current), 'name');
      for (let name of _debugger.getOwnPropertyNames(current)) {
        if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
        if (dart.test(_debugger.hasMethod(object, name))) {
          continue;
        }
        let value = _debugger.safeGetProperty(object, name);
        properties.add(new _debugger.NameValuePair({name: name, value: value}));
      }
    }
    return properties.toList();
  }
};
dart.setSignature(_debugger.ObjectFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  }),
  sfields: () => ({_customNames: SetOfString()})
});
dart.defineLazy(_debugger.ObjectFormatter, {
  get _customNames() {
    return (() => {
      let _ = SetOfString().new();
      _.add('constructor');
      _.add('prototype');
      _.add('__proto__');
      return _;
    })();
  },
  set _customNames(_) {}
});
_debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
  accept(object, config) {
    return dart.getDartLibraryName(object) != null;
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
    if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
      dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
    }
    return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
  }
  children(object) {
    let children = LinkedHashSetOfNameValuePair().new();
    for (let name of _debugger.getOwnPropertyNames(object)) {
      let value = _debugger.safeGetProperty(object, name);
      name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
      children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
    }
    return children.toList();
  }
};
_debugger.LibraryModuleFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.LibraryModuleFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.LibraryFormatter = class LibraryFormatter extends core.Object {
  new() {
    this.genericParameters = HashMapOfString$String().new();
  }
  accept(object, config) {
    return _debugger.Library.is(object);
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    return core.String._check(dart.dload(object, 'name'));
  }
  children(object) {
    let children = LinkedHashSetOfNameValuePair().new();
    let nonGenericProperties = LinkedHashMapOfString$Object().new();
    let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
    dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
      let genericTypeConstructor = dart.getGenericTypeCtor(value);
      if (genericTypeConstructor != null) {
        this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
      } else {
        nonGenericProperties._set(core.String._check(name), value);
      }
    }, dynamicAnddynamicToNull()));
    nonGenericProperties.forEach(dart.fn((name, value) => {
      if (core.Type.is(value)) {
        children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
      } else {
        children.add(new _debugger.NameValuePair({name: name, value: value}));
      }
    }, StringAndObjectToNull()));
    return children.toList();
  }
  recordGenericParameters(name, genericTypeConstructor) {
    this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
  }
  classChild(name, child) {
    let typeName = _debugger.getTypeName(core.Type._check(child));
    let parameterName = dart.str`${name}\$`;
    if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
      typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
      _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
    }
    return new _debugger.NameValuePair({name: typeName, value: child});
  }
};
_debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.LibraryFormatter, {
  fields: () => ({genericParameters: HashMapOfString$String()}),
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
    recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
    classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
  })
});
_debugger.FunctionFormatter = class FunctionFormatter extends core.Object {
  accept(object, config) {
    if (_debugger._typeof(object) != 'function') return false;
    return dart.getReifiedType(object) != null;
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    return dart.typeName(dart.getReifiedType(object));
  }
  children(object) {
    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'signature', value: this.preview(object)}), new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
  }
};
_debugger.FunctionFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.FunctionFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.MapFormatter = class MapFormatter extends core.Object {
  accept(object, config) {
    return core.Map.is(object);
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    let map = core.Map._check(object);
    return dart.str`${_debugger.getObjectTypeName(map)} length ${map[dartx.length]}`;
  }
  children(object) {
    let map = core.Map._check(object);
    let entries = LinkedHashSetOfNameValuePair().new();
    map[dartx.forEach](dart.fn((key, value) => {
      let entryWrapper = new _debugger.MapEntry({key: key, value: value});
      entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
    }, dynamicAnddynamicToNull()));
    _debugger.addMetadataChildren(object, entries);
    return entries.toList();
  }
};
_debugger.MapFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.MapFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.IterableFormatter = class IterableFormatter extends core.Object {
  accept(object, config) {
    return core.Iterable.is(object);
  }
  preview(object) {
    let iterable = core.Iterable._check(object);
    try {
      let length = iterable[dartx.length];
      return dart.str`${_debugger.getObjectTypeName(iterable)} length ${length}`;
    } catch (_) {
      return dart.str`${_debugger.getObjectTypeName(iterable)}`;
    }

  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    let children = LinkedHashSetOfNameValuePair().new();
    children.addAll(new _debugger.IterableSpan(0, core.int._check(dart.dload(object, 'length')), core.Iterable._check(object)).children());
    _debugger.addMetadataChildren(object, children);
    return children.toList();
  }
};
_debugger.IterableFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.IterableFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.NamedConstructorFormatter = class NamedConstructorFormatter extends core.Object {
  accept(object, config) {
    return _debugger.NamedConstructor.is(object);
  }
  preview(object) {
    return 'Named Constructor';
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
  }
};
_debugger.NamedConstructorFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.NamedConstructorFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.MapEntryFormatter = class MapEntryFormatter extends core.Object {
  accept(object, config) {
    return _debugger.MapEntry.is(object);
  }
  preview(object) {
    let entry = _debugger.MapEntry._check(object);
    return dart.str`${_debugger.safePreview(entry.key, _debugger.JsonMLConfig.none)} => ${_debugger.safePreview(entry.value, _debugger.JsonMLConfig.none)}`;
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'key', value: dart.dload(object, 'key'), config: _debugger.JsonMLConfig.keyToString}), new _debugger.NameValuePair({name: 'value', value: dart.dload(object, 'value')})]);
  }
};
_debugger.MapEntryFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.MapEntryFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.HeritageClauseFormatter = class HeritageClauseFormatter extends core.Object {
  accept(object, config) {
    return _debugger.HeritageClause.is(object);
  }
  preview(object) {
    let clause = _debugger.HeritageClause._check(object);
    let typeNames = clause.types[dartx.map](core.String)(_debugger.getTypeName);
    return dart.str`${clause.name} ${typeNames[dartx.join](", ")}`;
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    let clause = _debugger.HeritageClause._check(object);
    let children = JSArrayOfNameValuePair().of([]);
    for (let type of clause.types) {
      children[dartx.add](new _debugger.NameValuePair({value: type, config: _debugger.JsonMLConfig.asClass}));
    }
    return children;
  }
};
_debugger.HeritageClauseFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.HeritageClauseFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.IterableSpanFormatter = class IterableSpanFormatter extends core.Object {
  accept(object, config) {
    return _debugger.IterableSpan.is(object);
  }
  preview(object) {
    return dart.str`[${dart.dload(object, 'start')}...${dart.dsend(dart.dload(object, 'end'), '-', 1)}]`;
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return ListOfNameValuePair()._check(dart.dsend(object, 'children'));
  }
};
_debugger.IterableSpanFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.IterableSpanFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.StackTraceFormatter = class StackTraceFormatter extends core.Object {
  accept(object, config) {
    return core.StackTrace.is(object);
  }
  preview(object) {
    return 'StackTrace';
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return dart.toString(object)[dartx.split]('\n')[dartx.map](_debugger.NameValuePair)(dart.fn(line => new _debugger.NameValuePair({value: line[dartx.replaceFirst](core.RegExp.new('^\\s+at\\s'), ''), hideName: true}), StringToNameValuePair()))[dartx.toList]();
  }
};
_debugger.StackTraceFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.StackTraceFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.ClassFormatter = class ClassFormatter extends core.Object {
  accept(object, config) {
    return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
  }
  preview(object) {
    let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
    if (typeName != null) return core.String._check(typeName);
    let type = _debugger._getType(object);
    let implements$ = dart.getImplements(type);
    typeName = _debugger.getTypeName(core.Type._check(type));
    if (implements$ != null) {
      let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
      return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
    } else {
      return core.String._check(typeName);
    }
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    let type = _debugger._getType(object);
    let children = JSArrayOfNameValuePair().of([]);
    let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
    let mixins = dart.getMixins(type);
    if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
      children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
    }
    let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
    for (let name of _debugger.getOwnPropertyNames(object)) {
      if (dart.test(hiddenProperties[dartx.contains](name))) continue;
      let value = _debugger.safeGetProperty(object, name);
      if (value != null && dart.getIsNamedConstructor(value) != null) {
        value = new _debugger.NamedConstructor(value);
        name = dart.str`${typeName}.${name}`;
      }
      children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
    }
    let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
    let prototype = object.prototype;
    if (prototype != null) {
      for (let name of _debugger.getOwnPropertyNames(prototype)) {
        if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
        let func = _debugger.safeGetProperty(prototype, name);
        let constructor = _debugger.safeGetProperty(prototype, 'constructor');
        let sigObj = dart.getMethodSig(constructor);
        if (sigObj != null) {
          let value = _debugger.safeGetProperty(sigObj, name);
          if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
            dart.tag(func, value);
            children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
          }
        }
      }
    }
    return children;
  }
};
_debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setSignature(_debugger.ClassFormatter, {
  methods: () => ({
    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
  })
});
_debugger.registerDevtoolsFormatter = function() {
  let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
  dart.global.devtoolsFormatters = formatters;
};
dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
_foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
  if (arg0 === void 0) arg0 = null;
  if (arg1 === void 0) arg1 = null;
  if (arg2 === void 0) arg2 = null;
  if (arg3 === void 0) arg3 = null;
  if (arg4 === void 0) arg4 = null;
  if (arg5 === void 0) arg5 = null;
  if (arg6 === void 0) arg6 = null;
  if (arg7 === void 0) arg7 = null;
  if (arg8 === void 0) arg8 = null;
  if (arg9 === void 0) arg9 = null;
  if (arg10 === void 0) arg10 = null;
  if (arg11 === void 0) arg11 = null;
};
dart.lazyFn(_foreign_helper.JS, () => StringAndString__Todynamic());
_foreign_helper.JSExportName = class JSExportName extends core.Object {
  new(name) {
    this.name = name;
  }
};
dart.setSignature(_foreign_helper.JSExportName, {
  constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JSExportName, [core.String])}),
  fields: () => ({name: core.String})
});
_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT = function() {
};
dart.lazyFn(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT, () => VoidToIsolateContext());
_foreign_helper.IsolateContext = class IsolateContext extends core.Object {};
_foreign_helper.JS_CALL_IN_ISOLATE = function(isolate, func) {
};
dart.lazyFn(_foreign_helper.JS_CALL_IN_ISOLATE, () => dynamicAndFunctionTodynamic());
_foreign_helper.JS_SET_CURRENT_ISOLATE = function(isolate) {
};
dart.fn(_foreign_helper.JS_SET_CURRENT_ISOLATE, dynamicTovoid$());
_foreign_helper.JS_CREATE_ISOLATE = function() {
};
dart.fn(_foreign_helper.JS_CREATE_ISOLATE, VoidTodynamic$());
_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR = function() {
};
dart.fn(_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR, VoidTodynamic$());
_foreign_helper.JS_INTERCEPTOR_CONSTANT = function(type) {
};
dart.fn(_foreign_helper.JS_INTERCEPTOR_CONSTANT, TypeTodynamic());
_foreign_helper.JS_OPERATOR_IS_PREFIX = function() {
};
dart.lazyFn(_foreign_helper.JS_OPERATOR_IS_PREFIX, () => VoidToString$());
_foreign_helper.JS_OPERATOR_AS_PREFIX = function() {
};
dart.lazyFn(_foreign_helper.JS_OPERATOR_AS_PREFIX, () => VoidToString$());
_foreign_helper.JS_OBJECT_CLASS_NAME = function() {
};
dart.lazyFn(_foreign_helper.JS_OBJECT_CLASS_NAME, () => VoidToString$());
_foreign_helper.JS_NULL_CLASS_NAME = function() {
};
dart.lazyFn(_foreign_helper.JS_NULL_CLASS_NAME, () => VoidToString$());
_foreign_helper.JS_FUNCTION_CLASS_NAME = function() {
};
dart.lazyFn(_foreign_helper.JS_FUNCTION_CLASS_NAME, () => VoidToString$());
_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME = function() {
};
dart.lazyFn(_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME, () => VoidToString$());
_foreign_helper.JS_CURRENT_ISOLATE = function() {
};
dart.fn(_foreign_helper.JS_CURRENT_ISOLATE, VoidTodynamic$());
_foreign_helper.JS_SIGNATURE_NAME = function() {
};
dart.lazyFn(_foreign_helper.JS_SIGNATURE_NAME, () => VoidToString$());
_foreign_helper.JS_TYPEDEF_TAG = function() {
};
dart.lazyFn(_foreign_helper.JS_TYPEDEF_TAG, () => VoidToString$());
_foreign_helper.JS_FUNCTION_TYPE_TAG = function() {
};
dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_TAG, () => VoidToString$());
_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG = function() {
};
dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG, () => VoidToString$());
_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG = function() {
};
dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG, () => VoidToString$());
_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG = function() {
};
dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG, () => VoidToString$());
_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG = function() {
};
dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG, () => VoidToString$());
_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG = function() {
};
dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG, () => VoidToString$());
_foreign_helper.JS_GET_NAME = function(name) {
};
dart.lazyFn(_foreign_helper.JS_GET_NAME, () => StringToString$());
_foreign_helper.JS_EMBEDDED_GLOBAL = function(typeDescription, name) {
};
dart.lazyFn(_foreign_helper.JS_EMBEDDED_GLOBAL, () => StringAndStringTodynamic());
_foreign_helper.JS_GET_FLAG = function(name) {
};
dart.lazyFn(_foreign_helper.JS_GET_FLAG, () => StringTobool$());
_foreign_helper.JS_EFFECT = function(code) {
  dart.dcall(code, null);
};
dart.lazyFn(_foreign_helper.JS_EFFECT, () => FunctionTovoid());
_foreign_helper.JS_CONST = class JS_CONST extends core.Object {
  new(code) {
    this.code = code;
  }
};
dart.setSignature(_foreign_helper.JS_CONST, {
  constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JS_CONST, [core.String])}),
  fields: () => ({code: core.String})
});
_foreign_helper.JS_STRING_CONCAT = function(a, b) {
  return a + b;
};
dart.lazyFn(_foreign_helper.JS_STRING_CONCAT, () => StringAndStringToString$());
_foreign_helper._Rest = class _Rest extends core.Object {
  new() {
  }
};
dart.setSignature(_foreign_helper._Rest, {
  constructors: () => ({new: dart.definiteFunctionType(_foreign_helper._Rest, [])})
});
_foreign_helper.rest = dart.const(new _foreign_helper._Rest());
_foreign_helper.spread = function(args) {
  dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
};
dart.fn(_foreign_helper.spread, dynamicTodynamic$());
_interceptors.Interceptor = class Interceptor extends core.Object {
  new() {
  }
};
dart.addTypeTests(_interceptors.Interceptor);
dart.setSignature(_interceptors.Interceptor, {
  constructors: () => ({new: dart.definiteFunctionType(_interceptors.Interceptor, [])})
});
_interceptors.getInterceptor = function(obj) {
  return obj;
};
dart.fn(_interceptors.getInterceptor, dynamicTodynamic$());
dart.defineExtensionNames([
  'toString',
  'hashCode',
  'runtimeType'
]);
_interceptors.JSBool = class JSBool extends _interceptors.Interceptor {
  new() {
    super.new();
  }
  [dartx.toString]() {
    return String(this);
  }
  get [dartx.hashCode]() {
    return this ? 2 * 3 * 23 * 3761 : 269 * 811;
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(core.bool);
  }
};
_interceptors.JSBool[dart.implements] = () => [core.bool];
dart.setSignature(_interceptors.JSBool, {
  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSBool, [])})
});
dart.registerExtension(dart.global.Boolean, _interceptors.JSBool);
_interceptors.JSIndexable$ = dart.generic(E => {
  class JSIndexable extends core.Object {}
  dart.addTypeTests(JSIndexable);
  return JSIndexable;
});
_interceptors.JSIndexable = JSIndexable();
_interceptors.JSObject = class JSObject extends core.Object {};
_interceptors.JavaScriptObject = class JavaScriptObject extends _interceptors.Interceptor {
  new() {
    super.new();
  }
  get hashCode() {
    return 0;
  }
  get runtimeType() {
    return dart.wrapType(_interceptors.JSObject);
  }
};
_interceptors.JavaScriptObject[dart.implements] = () => [_interceptors.JSObject];
dart.setSignature(_interceptors.JavaScriptObject, {
  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JavaScriptObject, [])})
});
_interceptors.PlainJavaScriptObject = class PlainJavaScriptObject extends _interceptors.JavaScriptObject {
  new() {
    super.new();
  }
};
dart.setSignature(_interceptors.PlainJavaScriptObject, {
  constructors: () => ({new: dart.definiteFunctionType(_interceptors.PlainJavaScriptObject, [])})
});
_interceptors.UnknownJavaScriptObject = class UnknownJavaScriptObject extends _interceptors.JavaScriptObject {
  new() {
    super.new();
  }
  toString() {
    return String(this);
  }
};
dart.setSignature(_interceptors.UnknownJavaScriptObject, {
  constructors: () => ({new: dart.definiteFunctionType(_interceptors.UnknownJavaScriptObject, [])})
});
_interceptors.findInterceptorConstructorForType = function(type) {
};
dart.fn(_interceptors.findInterceptorConstructorForType, TypeTodynamic());
_interceptors.findConstructorForNativeSubclassType = function(type, name) {
};
dart.lazyFn(_interceptors.findConstructorForNativeSubclassType, () => TypeAndStringTodynamic());
_interceptors.getNativeInterceptor = function(object) {
};
dart.fn(_interceptors.getNativeInterceptor, dynamicTodynamic$());
_interceptors.setDispatchProperty = function(object, value) {
};
dart.fn(_interceptors.setDispatchProperty, dynamicAnddynamicTodynamic$());
const _removeWhere = Symbol('_removeWhere');
_interceptors.JSArray$ = dart.generic(E => {
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let ArrayIteratorOfE = () => (ArrayIteratorOfE = dart.constFn(_interceptors.ArrayIterator$(E)))();
  let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
  let JSIndexableOfE = () => (JSIndexableOfE = dart.constFn(_interceptors.JSIndexable$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
  dart.defineExtensionNames([
    'checkMutable',
    'checkGrowable',
    'add',
    'removeAt',
    'insert',
    'insertAll',
    'setAll',
    'removeLast',
    'remove',
    'removeWhere',
    'retainWhere',
    'where',
    'expand',
    'addAll',
    'clear',
    'forEach',
    'map',
    'join',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'reduce',
    'fold',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'sublist',
    'getRange',
    'first',
    'last',
    'single',
    'removeRange',
    'setRange',
    'fillRange',
    'replaceRange',
    'any',
    'every',
    'reversed',
    'sort',
    'shuffle',
    'indexOf',
    'lastIndexOf',
    'contains',
    'isEmpty',
    'isNotEmpty',
    'toString',
    'toList',
    'toSet',
    'iterator',
    'hashCode',
    'length',
    'length',
    '_get',
    '_set',
    'asMap'
  ]);
  class JSArray extends core.Object {
    new() {
    }
    static typed(allocation) {
      return dart.list(allocation, E);
    }
    static of(allocation) {
      return dart.setType(allocation, JSArray);
    }
    static markFixed(allocation) {
      return JSArrayOfE().typed(_interceptors.JSArray.markFixedList(core.List._check(allocation)));
    }
    static markGrowable(allocation) {
      return JSArrayOfE().typed(allocation);
    }
    static markFixedList(list) {
      list.fixed$length = Array;
      return list;
    }
    static markUnmodifiableList(list) {
      list.fixed$length = Array;
      list.immutable$list = Array;
      return list;
    }
    [dartx.checkMutable](reason) {
      if (this.immutable$list) {
        dart.throw(new core.UnsupportedError(core.String._check(reason)));
      }
    }
    [dartx.checkGrowable](reason) {
      if (this.fixed$length) {
        dart.throw(new core.UnsupportedError(core.String._check(reason)));
      }
    }
    [dartx.add](value) {
      E._check(value);
      this[dartx.checkGrowable]('add');
      this.push(value);
    }
    [dartx.removeAt](index) {
      this[dartx.checkGrowable]('removeAt');
      if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
      if (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.value(index));
      }
      return this.splice(index, 1)[0];
    }
    [dartx.insert](index, value) {
      E._check(value);
      this[dartx.checkGrowable]('insert');
      if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.value(index));
      }
      this.splice(index, 0, value);
    }
    [dartx.insertAll](index, iterable) {
      IterableOfE()._check(iterable);
      this[dartx.checkGrowable]('insertAll');
      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
      if (!_internal.EfficientLength.is(iterable)) {
        iterable = iterable[dartx.toList]();
      }
      let insertionLength = iterable[dartx.length];
      this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
      let end = dart.notNull(index) + dart.notNull(insertionLength);
      this[dartx.setRange](end, this[dartx.length], this, index);
      this[dartx.setRange](index, end, iterable);
    }
    [dartx.setAll](index, iterable) {
      IterableOfE()._check(iterable);
      this[dartx.checkMutable]('setAll');
      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
      for (let element of iterable) {
        this[dartx._set]((() => {
          let x = index;
          index = dart.notNull(x) + 1;
          return x;
        })(), element);
      }
    }
    [dartx.removeLast]() {
      this[dartx.checkGrowable]('removeLast');
      if (this[dartx.length] == 0) dart.throw(_js_helper.diagnoseIndexError(this, -1));
      return this.pop();
    }
    [dartx.remove](element) {
      this[dartx.checkGrowable]('remove');
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        if (dart.equals(this[dartx._get](i), element)) {
          this.splice(i, 1);
          return true;
        }
      }
      return false;
    }
    [dartx.removeWhere](test) {
      this[dartx.checkGrowable]('removeWhere');
      this[_removeWhere](test, true);
    }
    [dartx.retainWhere](test) {
      this[dartx.checkGrowable]('retainWhere');
      this[_removeWhere](test, false);
    }
    [_removeWhere](test, removeMatching) {
      let retained = [];
      let end = this[dartx.length];
      for (let i = 0; i < dart.notNull(end); i++) {
        let element = this[i];
        if (!dart.test(test(E._check(element))) == removeMatching) {
          retained[dartx.add](element);
        }
        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
      }
      if (retained[dartx.length] == end) return;
      this[dartx.length] = retained[dartx.length];
      for (let i = 0; i < dart.notNull(retained[dartx.length]); i++) {
        this[dartx._set](i, E._check(retained[dartx._get](i)));
      }
    }
    [dartx.where](f) {
      return new (WhereIterableOfE())(this, f);
    }
    [dartx.expand](T) {
      return f => {
        return new (_internal.ExpandIterable$(E, T))(this, f);
      };
    }
    [dartx.addAll](collection) {
      IterableOfE()._check(collection);
      let i = this[dartx.length];
      this[dartx.checkGrowable]('addAll');
      for (let e of collection) {
        dart.assert(i == this[dartx.length] || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
        i = dart.notNull(i) + 1;
        this.push(e);
      }
    }
    [dartx.clear]() {
      this[dartx.length] = 0;
    }
    [dartx.forEach](f) {
      let end = this[dartx.length];
      for (let i = 0; i < dart.notNull(end); i++) {
        let element = this[i];
        f(element);
        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
      }
    }
    [dartx.map](T) {
      return f => {
        return new (_internal.MappedListIterable$(E, T))(this, f);
      };
    }
    [dartx.join](separator) {
      if (separator === void 0) separator = "";
      let list = core.List.new(this[dartx.length]);
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        list[dartx._set](i, dart.str`${this[dartx._get](i)}`);
      }
      return list.join(separator);
    }
    [dartx.take](n) {
      return new (SubListIterableOfE())(this, 0, n);
    }
    [dartx.takeWhile](test) {
      return new (TakeWhileIterableOfE())(this, test);
    }
    [dartx.skip](n) {
      return new (SubListIterableOfE())(this, n, null);
    }
    [dartx.skipWhile](test) {
      return new (SkipWhileIterableOfE())(this, test);
    }
    [dartx.reduce](combine) {
      EAndEToE()._check(combine);
      let length = this[dartx.length];
      if (length == 0) dart.throw(_internal.IterableElementError.noElement());
      let value = this[dartx._get](0);
      for (let i = 1; i < dart.notNull(length); i++) {
        let element = this[i];
        value = combine(value, element);
        if (length != this[dartx.length]) dart.throw(new core.ConcurrentModificationError(this));
      }
      return value;
    }
    [dartx.fold](T) {
      return (initialValue, combine) => {
        let value = initialValue;
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this[i];
          value = combine(value, element);
          if (this[dartx.length] != length) dart.throw(new core.ConcurrentModificationError(this));
        }
        return value;
      };
    }
    [dartx.firstWhere](test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let end = this[dartx.length];
      for (let i = 0; i < dart.notNull(end); ++i) {
        let element = this[i];
        if (dart.test(test(element))) return element;
        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    [dartx.lastWhere](test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[dartx.length];
      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
        let element = this[i];
        if (dart.test(test(element))) return element;
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    [dartx.singleWhere](test) {
      let length = this[dartx.length];
      let match = null;
      let matchFound = false;
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this[i];
        if (dart.test(test(E._check(element)))) {
          if (matchFound) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          matchFound = true;
          match = E._check(element);
        }
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (matchFound) return match;
      dart.throw(_internal.IterableElementError.noElement());
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      _js_helper.checkNull(start);
      if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, this[dartx.length], "start"));
      }
      if (end == null) {
        end = this[dartx.length];
      } else {
        if (!(typeof end == 'number')) dart.throw(_js_helper.argumentErrorValue(end));
        if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(this[dartx.length])) {
          dart.throw(new core.RangeError.range(end, start, this[dartx.length], "end"));
        }
      }
      if (start == end) return JSArrayOfE().of([]);
      return JSArrayOfE().typed(this.slice(start, end));
    }
    [dartx.getRange](start, end) {
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      return new (SubListIterableOfE())(this, start, end);
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](0);
      dart.throw(_internal.IterableElementError.noElement());
    }
    get [dartx.last]() {
      if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
      dart.throw(_internal.IterableElementError.noElement());
    }
    get [dartx.single]() {
      if (this[dartx.length] == 1) return this[dartx._get](0);
      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
      dart.throw(_internal.IterableElementError.tooMany());
    }
    [dartx.removeRange](start, end) {
      this[dartx.checkGrowable]('removeRange');
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      let deleteCount = dart.notNull(end) - dart.notNull(start);
      this.splice(start, deleteCount);
    }
    [dartx.setRange](start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      this[dartx.checkMutable]('set range');
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      let length = dart.notNull(end) - dart.notNull(start);
      if (length == 0) return;
      core.RangeError.checkNotNegative(skipCount, "skipCount");
      let otherList = null;
      let otherStart = null;
      if (core.List.is(iterable)) {
        otherList = ListOfE()._check(iterable);
        otherStart = skipCount;
      } else {
        otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
        otherStart = 0;
      }
      if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
        dart.throw(_internal.IterableElementError.tooFew());
      }
      if (dart.notNull(otherStart) < dart.notNull(start)) {
        for (let i = length - 1; i >= 0; i--) {
          let element = otherList[dartx._get](dart.notNull(otherStart) + i);
          this[dart.notNull(start) + i] = element;
        }
      } else {
        for (let i = 0; i < length; i++) {
          let element = otherList[dartx._get](dart.notNull(otherStart) + i);
          this[dart.notNull(start) + i] = element;
        }
      }
    }
    [dartx.fillRange](start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      this[dartx.checkMutable]('fill range');
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        this[i] = fillValue;
      }
    }
    [dartx.replaceRange](start, end, replacement) {
      IterableOfE()._check(replacement);
      this[dartx.checkGrowable]('replace range');
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      if (!_internal.EfficientLength.is(replacement)) {
        replacement = replacement[dartx.toList]();
      }
      let removeLength = dart.notNull(end) - dart.notNull(start);
      let insertLength = replacement[dartx.length];
      if (removeLength >= dart.notNull(insertLength)) {
        let delta = removeLength - dart.notNull(insertLength);
        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
        let newLength = dart.notNull(this[dartx.length]) - delta;
        this[dartx.setRange](start, insertEnd, replacement);
        if (delta != 0) {
          this[dartx.setRange](insertEnd, newLength, this, end);
          this[dartx.length] = newLength;
        }
      } else {
        let delta = dart.notNull(insertLength) - removeLength;
        let newLength = dart.notNull(this[dartx.length]) + delta;
        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
        this[dartx.length] = newLength;
        this[dartx.setRange](insertEnd, newLength, this, end);
        this[dartx.setRange](start, insertEnd, replacement);
      }
    }
    [dartx.any](test) {
      let end = this[dartx.length];
      for (let i = 0; i < dart.notNull(end); i++) {
        let element = this[i];
        if (dart.test(test(element))) return true;
        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
      }
      return false;
    }
    [dartx.every](test) {
      let end = this[dartx.length];
      for (let i = 0; i < dart.notNull(end); i++) {
        let element = this[i];
        if (!dart.test(test(element))) return false;
        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
      }
      return true;
    }
    get [dartx.reversed]() {
      return new (ReversedListIterableOfE())(this);
    }
    [dartx.sort](compare) {
      if (compare === void 0) compare = null;
      this[dartx.checkMutable]('sort');
      if (compare == null) {
        _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
      } else {
        _internal.Sort.sort(E)(this, compare);
      }
    }
    [dartx.shuffle](random) {
      if (random === void 0) random = null;
      this[dartx.checkMutable]('shuffle');
      if (random == null) random = math.Random.new();
      let length = this[dartx.length];
      while (dart.notNull(length) > 1) {
        let pos = random.nextInt(length);
        length = dart.notNull(length) - 1;
        let tmp = this[dartx._get](length);
        this[dartx._set](length, this[dartx._get](pos));
        this[dartx._set](pos, tmp);
      }
    }
    [dartx.indexOf](element, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) >= dart.notNull(this[dartx.length])) {
        return -1;
      }
      if (dart.notNull(start) < 0) {
        start = 0;
      }
      for (let i = start; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
        if (dart.equals(this[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    [dartx.lastIndexOf](element, startIndex) {
      if (startIndex === void 0) startIndex = null;
      if (startIndex == null) {
        startIndex = dart.notNull(this[dartx.length]) - 1;
      } else {
        if (dart.notNull(startIndex) < 0) {
          return -1;
        }
        if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
          startIndex = dart.notNull(this[dartx.length]) - 1;
        }
      }
      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.equals(this[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    [dartx.contains](other) {
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        if (dart.equals(this[dartx._get](i), other)) return true;
      }
      return false;
    }
    get [dartx.isEmpty]() {
      return this[dartx.length] == 0;
    }
    get [dartx.isNotEmpty]() {
      return !dart.test(this[dartx.isEmpty]);
    }
    [dartx.toString]() {
      return collection.ListBase.listToString(this);
    }
    [dartx.toList](opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let list = this.slice();
      if (!dart.test(growable)) _interceptors.JSArray.markFixedList(core.List._check(list));
      return JSArrayOfE().typed(list);
    }
    [dartx.toSet]() {
      return SetOfE().from(this);
    }
    get [dartx.iterator]() {
      return new (ArrayIteratorOfE())(this);
    }
    get [dartx.hashCode]() {
      return _js_helper.Primitives.objectHashCode(this);
    }
    get [dartx.length]() {
      return this.length;
    }
    set [dartx.length](newLength) {
      this[dartx.checkGrowable]('set length');
      if (!(typeof newLength == 'number')) {
        dart.throw(new core.ArgumentError.value(newLength, 'newLength'));
      }
      if (dart.notNull(newLength) < 0) {
        dart.throw(new core.RangeError.range(newLength, 0, null, 'newLength'));
      }
      this.length = newLength;
    }
    [dartx._get](index) {
      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
      return this[index];
    }
    [dartx._set](index, value) {
      E._check(value);
      this[dartx.checkMutable]('indexed set');
      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
      this[index] = value;
      return value;
    }
    [dartx.asMap]() {
      return new (ListMapViewOfE())(this);
    }
  }
  dart.setExtensionBaseClass(JSArray, dart.global.Array);
  dart.addTypeTests(JSArray);
  JSArray[dart.implements] = () => [ListOfE(), JSIndexableOfE()];
  dart.setSignature(JSArray, {
    constructors: () => ({
      new: dart.definiteFunctionType(_interceptors.JSArray$(E), []),
      typed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
      of: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
      markFixed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
      markGrowable: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic])
    }),
    getters: () => ({
      [dartx.first]: dart.definiteFunctionType(E, []),
      [dartx.last]: dart.definiteFunctionType(E, []),
      [dartx.single]: dart.definiteFunctionType(E, []),
      [dartx.reversed]: dart.definiteFunctionType(core.Iterable$(E), []),
      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.iterator]: dart.definiteFunctionType(core.Iterator$(E), []),
      [dartx.length]: dart.definiteFunctionType(core.int, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx.checkMutable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      [dartx.checkGrowable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      [dartx.add]: dart.definiteFunctionType(dart.void, [E]),
      [dartx.removeAt]: dart.definiteFunctionType(E, [core.int]),
      [dartx.insert]: dart.definiteFunctionType(dart.void, [core.int, E]),
      [dartx.insertAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      [dartx.setAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      [dartx.removeLast]: dart.definiteFunctionType(E, []),
      [dartx.remove]: dart.definiteFunctionType(core.bool, [core.Object]),
      [dartx.removeWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
      [dartx.retainWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
      [_removeWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
      [dartx.where]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      [dartx.expand]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
      [dartx.addAll]: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.forEach]: dart.definiteFunctionType(dart.void, [ETovoid()]),
      [dartx.map]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
      [dartx.join]: dart.definiteFunctionType(core.String, [], [core.String]),
      [dartx.take]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      [dartx.takeWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      [dartx.skip]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      [dartx.skipWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      [dartx.reduce]: dart.definiteFunctionType(E, [EAndEToE()]),
      [dartx.fold]: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
      [dartx.firstWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      [dartx.lastWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      [dartx.singleWhere]: dart.definiteFunctionType(E, [ETobool()]),
      [dartx.elementAt]: dart.definiteFunctionType(E, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
      [dartx.getRange]: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
      [dartx.removeRange]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.setRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
      [dartx.fillRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
      [dartx.replaceRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
      [dartx.any]: dart.definiteFunctionType(core.bool, [ETobool()]),
      [dartx.every]: dart.definiteFunctionType(core.bool, [ETobool()]),
      [dartx.sort]: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
      [dartx.shuffle]: dart.definiteFunctionType(dart.void, [], [math.Random]),
      [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Object]),
      [dartx.toList]: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
      [dartx.toSet]: dart.definiteFunctionType(core.Set$(E), []),
      [dartx._get]: dart.definiteFunctionType(E, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, E]),
      [dartx.asMap]: dart.definiteFunctionType(core.Map$(core.int, E), [])
    }),
    statics: () => ({
      markFixedList: dart.definiteFunctionType(core.List, [core.List]),
      markUnmodifiableList: dart.definiteFunctionType(core.List, [core.List])
    }),
    names: ['markFixedList', 'markUnmodifiableList']
  });
  return JSArray;
});
_interceptors.JSArray = JSArray();
dart.registerExtension(dart.global.Array, _interceptors.JSArray);
_interceptors.JSMutableArray$ = dart.generic(E => {
  class JSMutableArray extends _interceptors.JSArray$(E) {
    new() {
      super.new();
    }
  }
  return JSMutableArray;
});
_interceptors.JSMutableArray = JSMutableArray();
_interceptors.JSFixedArray$ = dart.generic(E => {
  class JSFixedArray extends _interceptors.JSMutableArray$(E) {
    new() {
      super.new();
    }
  }
  return JSFixedArray;
});
_interceptors.JSFixedArray = JSFixedArray();
_interceptors.JSExtendableArray$ = dart.generic(E => {
  class JSExtendableArray extends _interceptors.JSMutableArray$(E) {
    new() {
      super.new();
    }
  }
  return JSExtendableArray;
});
_interceptors.JSExtendableArray = JSExtendableArray();
_interceptors.JSUnmodifiableArray$ = dart.generic(E => {
  class JSUnmodifiableArray extends _interceptors.JSArray$(E) {
    new() {
      super.new();
    }
  }
  return JSUnmodifiableArray;
});
_interceptors.JSUnmodifiableArray = JSUnmodifiableArray();
const _iterable = Symbol('_iterable');
const _length = Symbol('_length');
const _index = Symbol('_index');
const _current = Symbol('_current');
_interceptors.ArrayIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  class ArrayIterator extends core.Object {
    new(iterable) {
      this[_iterable] = iterable;
      this[_length] = iterable[dartx.length];
      this[_index] = 0;
      this[_current] = null;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      let length = this[_iterable][dartx.length];
      if (this[_length] != length) {
        dart.throw(_js_helper.throwConcurrentModificationError(this[_iterable]));
      }
      if (dart.notNull(this[_index]) >= dart.notNull(length)) {
        this[_current] = null;
        return false;
      }
      this[_current] = this[_iterable][dartx._get](this[_index]);
      this[_index] = dart.notNull(this[_index]) + 1;
      return true;
    }
  }
  dart.addTypeTests(ArrayIterator);
  ArrayIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(ArrayIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.ArrayIterator$(E), [JSArrayOfE()])}),
    fields: () => ({
      [_iterable]: JSArrayOfE(),
      [_length]: core.int,
      [_index]: core.int,
      [_current]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return ArrayIterator;
});
_interceptors.ArrayIterator = ArrayIterator();
const _isInt32 = Symbol('_isInt32');
const _tdivSlow = Symbol('_tdivSlow');
const _shlPositive = Symbol('_shlPositive');
const _shrOtherPositive = Symbol('_shrOtherPositive');
const _shrBothPositive = Symbol('_shrBothPositive');
dart.defineExtensionNames([
  'compareTo',
  'isNegative',
  'isNaN',
  'isInfinite',
  'isFinite',
  'remainder',
  'abs',
  'sign',
  'toInt',
  'truncate',
  'ceil',
  'floor',
  'round',
  'ceilToDouble',
  'floorToDouble',
  'roundToDouble',
  'truncateToDouble',
  'clamp',
  'toDouble',
  'toStringAsFixed',
  'toStringAsExponential',
  'toStringAsPrecision',
  'toRadixString',
  'toString',
  'hashCode',
  '_negate',
  '+',
  '-',
  '/',
  '*',
  '%',
  '~/',
  '<<',
  '>>',
  '&',
  '|',
  '^',
  '<',
  '>',
  '<=',
  '>=',
  'isEven',
  'isOdd',
  'toUnsigned',
  'toSigned',
  'bitLength',
  'modPow',
  'modInverse',
  'gcd',
  '~'
]);
_interceptors.JSNumber = class JSNumber extends _interceptors.Interceptor {
  new() {
    super.new();
  }
  [dartx.compareTo](b) {
    if (this < dart.notNull(b)) {
      return -1;
    } else if (this > dart.notNull(b)) {
      return 1;
    } else if (this == b) {
      if (this == 0) {
        let bIsNegative = b[dartx.isNegative];
        if (this[dartx.isNegative] == bIsNegative) return 0;
        if (dart.test(this[dartx.isNegative])) return -1;
        return 1;
      }
      return 0;
    } else if (dart.test(this[dartx.isNaN])) {
      if (dart.test(b[dartx.isNaN])) {
        return 0;
      }
      return 1;
    } else {
      return -1;
    }
  }
  get [dartx.isNegative]() {
    return this == 0 ? 1 / this < 0 : this < 0;
  }
  get [dartx.isNaN]() {
    return isNaN(this);
  }
  get [dartx.isInfinite]() {
    return this == 1 / 0 || this == -1 / 0;
  }
  get [dartx.isFinite]() {
    return isFinite(this);
  }
  [dartx.remainder](b) {
    if (!(typeof b == 'number')) dart.throw(_js_helper.argumentErrorValue(b));
    return this % b;
  }
  [dartx.abs]() {
    return Math.abs(this);
  }
  get [dartx.sign]() {
    return this > 0 ? 1 : this < 0 ? -1 : this;
  }
  [dartx.toInt]() {
    if (this >= _interceptors.JSNumber._MIN_INT32 && this <= _interceptors.JSNumber._MAX_INT32) {
      return this | 0;
    }
    if (isFinite(this)) {
      return this[dartx.truncateToDouble]() + 0;
    }
    dart.throw(new core.UnsupportedError("" + this));
  }
  [dartx.truncate]() {
    return this[dartx.toInt]();
  }
  [dartx.ceil]() {
    return this[dartx.ceilToDouble]()[dartx.toInt]();
  }
  [dartx.floor]() {
    return this[dartx.floorToDouble]()[dartx.toInt]();
  }
  [dartx.round]() {
    if (this > 0) {
      if (this !== 1 / 0) {
        return Math.round(this);
      }
    } else if (this > -1 / 0) {
      return 0 - Math.round(0 - this);
    }
    dart.throw(new core.UnsupportedError("" + this));
  }
  [dartx.ceilToDouble]() {
    return Math.ceil(this);
  }
  [dartx.floorToDouble]() {
    return Math.floor(this);
  }
  [dartx.roundToDouble]() {
    if (this < 0) {
      return -Math.round(-this);
    } else {
      return Math.round(this);
    }
  }
  [dartx.truncateToDouble]() {
    return this < 0 ? this[dartx.ceilToDouble]() : this[dartx.floorToDouble]();
  }
  [dartx.clamp](lowerLimit, upperLimit) {
    if (dart.notNull(lowerLimit[dartx.compareTo](upperLimit)) > 0) {
      dart.throw(_js_helper.argumentErrorValue(lowerLimit));
    }
    if (dart.notNull(this[dartx.compareTo](lowerLimit)) < 0) return lowerLimit;
    if (dart.notNull(this[dartx.compareTo](upperLimit)) > 0) return upperLimit;
    return this;
  }
  [dartx.toDouble]() {
    return this;
  }
  [dartx.toStringAsFixed](fractionDigits) {
    _js_helper.checkInt(fractionDigits);
    if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
      dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
    }
    let result = this.toFixed(fractionDigits);
    if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
    return result;
  }
  [dartx.toStringAsExponential](fractionDigits) {
    if (fractionDigits === void 0) fractionDigits = null;
    let result = null;
    if (fractionDigits != null) {
      _js_helper.checkInt(fractionDigits);
      if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
        dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
      }
      result = this.toExponential(fractionDigits);
    } else {
      result = this.toExponential();
    }
    if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
    return result;
  }
  [dartx.toStringAsPrecision](precision) {
    _js_helper.checkInt(precision);
    if (dart.notNull(precision) < 1 || dart.notNull(precision) > 21) {
      dart.throw(new core.RangeError.range(precision, 1, 21, "precision"));
    }
    let result = this.toPrecision(precision);
    if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
    return result;
  }
  [dartx.toRadixString](radix) {
    _js_helper.checkInt(radix);
    if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
      dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
    }
    let result = this.toString(radix);
    let rightParenCode = 41;
    if (result[dartx.codeUnitAt](dart.notNull(result[dartx.length]) - 1) != rightParenCode) {
      return result;
    }
    return _interceptors.JSNumber._handleIEtoString(result);
  }
  static _handleIEtoString(result) {
    let match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
    if (match == null) {
      dart.throw(new core.UnsupportedError(dart.str`Unexpected toString result: ${result}`));
    }
    result = dart.dindex(match, 1);
    let exponent = +dart.dindex(match, 3);
    if (dart.dindex(match, 2) != null) {
      result = result + dart.dindex(match, 2);
      exponent = exponent - dart.dindex(match, 2).length;
    }
    return dart.notNull(result) + "0"[dartx['*']](exponent);
  }
  [dartx.toString]() {
    if (this == 0 && 1 / this < 0) {
      return '-0.0';
    } else {
      return "" + this;
    }
  }
  get [dartx.hashCode]() {
    return this & 0x1FFFFFFF;
  }
  [dartx._negate]() {
    return -this;
  }
  [dartx['+']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this + other;
  }
  [dartx['-']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this - other;
  }
  [dartx['/']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this / other;
  }
  [dartx['*']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this * other;
  }
  [dartx['%']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    let result = this % other;
    if (result == 0) return 0;
    if (result > 0) return result;
    if (other < 0) {
      return result - other;
    } else {
      return result + other;
    }
  }
  [_isInt32](value) {
    return (value | 0) === value;
  }
  [dartx['~/']](other) {
    if (dart.test(this[_isInt32](this)) && dart.test(this[_isInt32](other)) && 0 != other && -1 != other) {
      return this / other | 0;
    } else {
      return this[_tdivSlow](other);
    }
  }
  [_tdivSlow](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return (this / other)[dartx.toInt]();
  }
  [dartx['<<']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
    return this[_shlPositive](other);
  }
  [_shlPositive](other) {
    return other > 31 ? 0 : this << other >>> 0;
  }
  [dartx['>>']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
    return this[_shrOtherPositive](other);
  }
  [_shrOtherPositive](other) {
    return this > 0 ? this[_shrBothPositive](other) : this >> (dart.notNull(other) > 31 ? 31 : other) >>> 0;
  }
  [_shrBothPositive](other) {
    return other > 31 ? 0 : this >>> other;
  }
  [dartx['&']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return (this & other) >>> 0;
  }
  [dartx['|']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return (this | other) >>> 0;
  }
  [dartx['^']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return (this ^ other) >>> 0;
  }
  [dartx['<']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this < other;
  }
  [dartx['>']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this > other;
  }
  [dartx['<=']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this <= other;
  }
  [dartx['>=']](other) {
    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
    return this >= other;
  }
  get [dartx.isEven]() {
    return (this & 1) == 0;
  }
  get [dartx.isOdd]() {
    return (this & 1) == 1;
  }
  [dartx.toUnsigned](width) {
    return (this & (1)[dartx['<<']](width) - 1) >>> 0;
  }
  [dartx.toSigned](width) {
    let signMask = (1)[dartx['<<']](dart.notNull(width) - 1);
    return ((this & signMask - 1) >>> 0) - ((this & signMask) >>> 0);
  }
  get [dartx.bitLength]() {
    let nonneg = this < 0 ? -this - 1 : this;
    if (nonneg >= 4294967296) {
      nonneg = (nonneg / 4294967296)[dartx.truncate]();
      return dart.notNull(_interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg))) + 32;
    }
    return _interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg));
  }
  [dartx.modPow](e, m) {
    if (!(typeof e == 'number')) {
      dart.throw(new core.ArgumentError.value(e, "exponent", "not an integer"));
    }
    if (!(typeof m == 'number')) {
      dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
    }
    if (dart.notNull(e) < 0) dart.throw(new core.RangeError.range(e, 0, null, "exponent"));
    if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
    if (e == 0) return 1;
    let b = this;
    if (dart.notNull(b) < 0 || dart.notNull(b) > dart.notNull(m)) {
      b = b[dartx['%']](m);
    }
    let r = 1;
    while (dart.notNull(e) > 0) {
      if (dart.test(e[dartx.isOdd])) {
        r = (r * dart.notNull(b))[dartx['%']](m);
      }
      e = (dart.notNull(e) / 2)[dartx.truncate]();
      b = (dart.notNull(b) * dart.notNull(b))[dartx['%']](m);
    }
    return r;
  }
  static _binaryGcd(x, y, inv) {
    let s = 1;
    if (!dart.test(inv)) {
      while (dart.test(x[dartx.isEven]) && dart.test(y[dartx.isEven])) {
        x = (dart.notNull(x) / 2)[dartx.truncate]();
        y = (dart.notNull(y) / 2)[dartx.truncate]();
        s = s * 2;
      }
      if (dart.test(y[dartx.isOdd])) {
        let t = x;
        x = y;
        y = t;
      }
    }
    let ac = x[dartx.isEven];
    let u = x;
    let v = y;
    let a = 1, b = 0, c = 0, d = 1;
    do {
      while (dart.test(u[dartx.isEven])) {
        u = (dart.notNull(u) / 2)[dartx.truncate]();
        if (dart.test(ac)) {
          if (!dart.test(a[dartx.isEven]) || !dart.test(b[dartx.isEven])) {
            a = dart.notNull(a) + dart.notNull(y);
            b = dart.notNull(b) - dart.notNull(x);
          }
          a = (dart.notNull(a) / 2)[dartx.truncate]();
        } else if (!dart.test(b[dartx.isEven])) {
          b = dart.notNull(b) - dart.notNull(x);
        }
        b = (dart.notNull(b) / 2)[dartx.truncate]();
      }
      while (dart.test(v[dartx.isEven])) {
        v = (dart.notNull(v) / 2)[dartx.truncate]();
        if (dart.test(ac)) {
          if (!dart.test(c[dartx.isEven]) || !dart.test(d[dartx.isEven])) {
            c = dart.notNull(c) + dart.notNull(y);
            d = dart.notNull(d) - dart.notNull(x);
          }
          c = (dart.notNull(c) / 2)[dartx.truncate]();
        } else if (!dart.test(d[dartx.isEven])) {
          d = dart.notNull(d) - dart.notNull(x);
        }
        d = (dart.notNull(d) / 2)[dartx.truncate]();
      }
      if (dart.notNull(u) >= dart.notNull(v)) {
        u = dart.notNull(u) - dart.notNull(v);
        if (dart.test(ac)) {
          a = dart.notNull(a) - dart.notNull(c);
        }
        b = dart.notNull(b) - dart.notNull(d);
      } else {
        v = dart.notNull(v) - dart.notNull(u);
        if (dart.test(ac)) {
          c = dart.notNull(c) - dart.notNull(a);
        }
        d = dart.notNull(d) - dart.notNull(b);
      }
    } while (u != 0);
    if (!dart.test(inv)) return s * dart.notNull(v);
    if (v != 1) dart.throw(core.Exception.new("Not coprime"));
    if (dart.notNull(d) < 0) {
      d = dart.notNull(d) + dart.notNull(x);
      if (dart.notNull(d) < 0) {
        d = dart.notNull(d) + dart.notNull(x);
      }
    } else if (dart.notNull(d) > dart.notNull(x)) {
      d = dart.notNull(d) - dart.notNull(x);
      if (dart.notNull(d) > dart.notNull(x)) {
        d = dart.notNull(d) - dart.notNull(x);
      }
    }
    return d;
  }
  [dartx.modInverse](m) {
    if (!(typeof m == 'number')) {
      dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
    }
    if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
    if (m == 1) return 0;
    let t = this;
    if (dart.notNull(t) < 0 || dart.notNull(t) >= dart.notNull(m)) {
      t = t[dartx['%']](m);
    }
    if (t == 1) return 1;
    if (t == 0 || dart.test(t[dartx.isEven]) && dart.test(m[dartx.isEven])) {
      dart.throw(core.Exception.new("Not coprime"));
    }
    return _interceptors.JSNumber._binaryGcd(m, t, true);
  }
  [dartx.gcd](other) {
    if (!(typeof other == 'number')) {
      dart.throw(new core.ArgumentError.value(other, "other", "not an integer"));
    }
    let x = this[dartx.abs]();
    let y = other[dartx.abs]();
    if (x == 0) return y;
    if (y == 0) return x;
    if (x == 1 || y == 1) return 1;
    return _interceptors.JSNumber._binaryGcd(x, y, false);
  }
  static _bitCount(i) {
    i = dart.notNull(_interceptors.JSNumber._shru(i, 0)) - (dart.notNull(_interceptors.JSNumber._shru(i, 1)) & 1431655765);
    i = (dart.notNull(i) & 858993459) + (dart.notNull(_interceptors.JSNumber._shru(i, 2)) & 858993459);
    i = 252645135 & dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 4));
    i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 8));
    i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 16));
    return dart.notNull(i) & 63;
  }
  static _shru(value, shift) {
    return value >>> shift;
  }
  static _shrs(value, shift) {
    return value >> shift;
  }
  static _ors(a, b) {
    return a | b;
  }
  static _spread(i) {
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 1));
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 2));
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 4));
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 8));
    i = _interceptors.JSNumber._shru(_interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 16)), 0);
    return i;
  }
  [dartx['~']]() {
    return ~this >>> 0;
  }
};
_interceptors.JSNumber[dart.implements] = () => [core.int, core.double];
dart.setSignature(_interceptors.JSNumber, {
  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSNumber, [])}),
  getters: () => ({
    [dartx.isNegative]: dart.definiteFunctionType(core.bool, []),
    [dartx.isNaN]: dart.definiteFunctionType(core.bool, []),
    [dartx.isInfinite]: dart.definiteFunctionType(core.bool, []),
    [dartx.isFinite]: dart.definiteFunctionType(core.bool, []),
    [dartx.sign]: dart.definiteFunctionType(_interceptors.JSNumber, []),
    [dartx.isEven]: dart.definiteFunctionType(core.bool, []),
    [dartx.isOdd]: dart.definiteFunctionType(core.bool, []),
    [dartx.bitLength]: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx.remainder]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
    [dartx.abs]: dart.definiteFunctionType(_interceptors.JSNumber, []),
    [dartx.toInt]: dart.definiteFunctionType(core.int, []),
    [dartx.truncate]: dart.definiteFunctionType(core.int, []),
    [dartx.ceil]: dart.definiteFunctionType(core.int, []),
    [dartx.floor]: dart.definiteFunctionType(core.int, []),
    [dartx.round]: dart.definiteFunctionType(core.int, []),
    [dartx.ceilToDouble]: dart.definiteFunctionType(core.double, []),
    [dartx.floorToDouble]: dart.definiteFunctionType(core.double, []),
    [dartx.roundToDouble]: dart.definiteFunctionType(core.double, []),
    [dartx.truncateToDouble]: dart.definiteFunctionType(core.double, []),
    [dartx.clamp]: dart.definiteFunctionType(core.num, [core.num, core.num]),
    [dartx.toDouble]: dart.definiteFunctionType(core.double, []),
    [dartx.toStringAsFixed]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.toStringAsExponential]: dart.definiteFunctionType(core.String, [], [core.int]),
    [dartx.toStringAsPrecision]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.toRadixString]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx._negate]: dart.definiteFunctionType(_interceptors.JSNumber, []),
    [dartx['+']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
    [dartx['-']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
    [dartx['/']]: dart.definiteFunctionType(core.double, [core.num]),
    [dartx['*']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
    [dartx['%']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
    [_isInt32]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [dartx['~/']]: dart.definiteFunctionType(core.int, [core.num]),
    [_tdivSlow]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx['<<']]: dart.definiteFunctionType(core.int, [core.num]),
    [_shlPositive]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx['>>']]: dart.definiteFunctionType(core.int, [core.num]),
    [_shrOtherPositive]: dart.definiteFunctionType(core.int, [core.num]),
    [_shrBothPositive]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx['&']]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx['|']]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx['^']]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx['<']]: dart.definiteFunctionType(core.bool, [core.num]),
    [dartx['>']]: dart.definiteFunctionType(core.bool, [core.num]),
    [dartx['<=']]: dart.definiteFunctionType(core.bool, [core.num]),
    [dartx['>=']]: dart.definiteFunctionType(core.bool, [core.num]),
    [dartx.toUnsigned]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.toSigned]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.modPow]: dart.definiteFunctionType(core.int, [core.int, core.int]),
    [dartx.modInverse]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.gcd]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx['~']]: dart.definiteFunctionType(core.int, [])
  }),
  sfields: () => ({
    _MIN_INT32: core.int,
    _MAX_INT32: core.int
  }),
  statics: () => ({
    _handleIEtoString: dart.definiteFunctionType(core.String, [core.String]),
    _binaryGcd: dart.definiteFunctionType(core.int, [core.int, core.int, core.bool]),
    _bitCount: dart.definiteFunctionType(core.int, [core.int]),
    _shru: dart.definiteFunctionType(core.int, [core.int, core.int]),
    _shrs: dart.definiteFunctionType(core.int, [core.int, core.int]),
    _ors: dart.definiteFunctionType(core.int, [core.int, core.int]),
    _spread: dart.definiteFunctionType(core.int, [core.int])
  }),
  names: ['_handleIEtoString', '_binaryGcd', '_bitCount', '_shru', '_shrs', '_ors', '_spread']
});
_interceptors.JSNumber._MIN_INT32 = -2147483648;
_interceptors.JSNumber._MAX_INT32 = 2147483647;
dart.registerExtension(dart.global.Number, _interceptors.JSNumber);
const _defaultSplit = Symbol('_defaultSplit');
let const$;
dart.defineExtensionNames([
  'codeUnitAt',
  'allMatches',
  'matchAsPrefix',
  '+',
  'endsWith',
  'replaceAll',
  'replaceAllMapped',
  'splitMapJoin',
  'replaceFirst',
  'replaceFirstMapped',
  'split',
  'replaceRange',
  'startsWith',
  'substring',
  'toLowerCase',
  'toUpperCase',
  'trim',
  'trimLeft',
  'trimRight',
  '*',
  'padLeft',
  'padRight',
  'codeUnits',
  'runes',
  'indexOf',
  'lastIndexOf',
  'contains',
  'isEmpty',
  'isNotEmpty',
  'compareTo',
  'toString',
  'hashCode',
  'runtimeType',
  'length',
  '_get'
]);
_interceptors.JSString = class JSString extends _interceptors.Interceptor {
  new() {
    super.new();
  }
  [dartx.codeUnitAt](index) {
    if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
    if (dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
    if (dart.notNull(index) >= dart.notNull(this[dartx.length])) dart.throw(_js_helper.diagnoseIndexError(this, index));
    return this.charCodeAt(index);
  }
  [dartx.allMatches](string, start) {
    if (start === void 0) start = 0;
    _js_helper.checkString(string);
    _js_helper.checkInt(start);
    if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(string[dartx.length])) {
      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
    }
    return _js_helper.allMatchesInStringUnchecked(this, string, start);
  }
  [dartx.matchAsPrefix](string, start) {
    if (start === void 0) start = 0;
    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
    }
    if (dart.notNull(start) + dart.notNull(this[dartx.length]) > dart.notNull(string[dartx.length])) return null;
    for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
      if (string[dartx.codeUnitAt](dart.notNull(start) + i) != this[dartx.codeUnitAt](i)) {
        return null;
      }
    }
    return new _js_helper.StringMatch(start, string, this);
  }
  [dartx['+']](other) {
    if (!(typeof other == 'string')) dart.throw(new core.ArgumentError.value(other));
    return this + other;
  }
  [dartx.endsWith](other) {
    _js_helper.checkString(other);
    let otherLength = other[dartx.length];
    if (dart.notNull(otherLength) > dart.notNull(this[dartx.length])) return false;
    return other == this[dartx.substring](dart.notNull(this[dartx.length]) - dart.notNull(otherLength));
  }
  [dartx.replaceAll](from, to) {
    _js_helper.checkString(to);
    return _js_helper.stringReplaceAllUnchecked(this, from, to);
  }
  [dartx.replaceAllMapped](from, convert) {
    return this[dartx.splitMapJoin](from, {onMatch: convert});
  }
  [dartx.splitMapJoin](from, opts) {
    let onMatch = opts && 'onMatch' in opts ? opts.onMatch : null;
    let onNonMatch = opts && 'onNonMatch' in opts ? opts.onNonMatch : null;
    return _js_helper.stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
  }
  [dartx.replaceFirst](from, to, startIndex) {
    if (startIndex === void 0) startIndex = 0;
    _js_helper.checkString(to);
    _js_helper.checkInt(startIndex);
    core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
    return _js_helper.stringReplaceFirstUnchecked(this, from, to, startIndex);
  }
  [dartx.replaceFirstMapped](from, replace, startIndex) {
    if (startIndex === void 0) startIndex = 0;
    _js_helper.checkNull(replace);
    _js_helper.checkInt(startIndex);
    core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
    return _js_helper.stringReplaceFirstMappedUnchecked(this, from, replace, startIndex);
  }
  [dartx.split](pattern) {
    _js_helper.checkNull(pattern);
    if (typeof pattern == 'string') {
      return this.split(pattern);
    } else if (_js_helper.JSSyntaxRegExp.is(pattern) && _js_helper.regExpCaptureCount(pattern) == 0) {
      let re = _js_helper.regExpGetNative(pattern);
      return this.split(re);
    } else {
      return this[_defaultSplit](pattern);
    }
  }
  [dartx.replaceRange](start, end, replacement) {
    _js_helper.checkString(replacement);
    _js_helper.checkInt(start);
    end = core.RangeError.checkValidRange(start, end, this[dartx.length]);
    _js_helper.checkInt(end);
    return _js_helper.stringReplaceRangeUnchecked(this, start, end, replacement);
  }
  [_defaultSplit](pattern) {
    let result = JSArrayOfString().of([]);
    let start = 0;
    let length = 1;
    for (let match of pattern[dartx.allMatches](this)) {
      let matchStart = match.start;
      let matchEnd = match.end;
      length = dart.notNull(matchEnd) - dart.notNull(matchStart);
      if (length == 0 && start == matchStart) {
        continue;
      }
      let end = matchStart;
      result[dartx.add](this[dartx.substring](start, end));
      start = matchEnd;
    }
    if (dart.notNull(start) < dart.notNull(this[dartx.length]) || length > 0) {
      result[dartx.add](this[dartx.substring](start));
    }
    return result;
  }
  [dartx.startsWith](pattern, index) {
    if (index === void 0) index = 0;
    _js_helper.checkInt(index);
    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
      dart.throw(new core.RangeError.range(index, 0, this[dartx.length]));
    }
    if (typeof pattern == 'string') {
      let other = pattern;
      let otherLength = other[dartx.length];
      let endIndex = dart.notNull(index) + dart.notNull(otherLength);
      if (endIndex > dart.notNull(this[dartx.length])) return false;
      return other == this.substring(index, endIndex);
    }
    return pattern[dartx.matchAsPrefix](this, index) != null;
  }
  [dartx.substring](startIndex, endIndex) {
    if (endIndex === void 0) endIndex = null;
    _js_helper.checkInt(startIndex);
    if (endIndex == null) endIndex = this[dartx.length];
    _js_helper.checkInt(endIndex);
    if (dart.notNull(startIndex) < 0) dart.throw(new core.RangeError.value(startIndex));
    if (dart.notNull(startIndex) > dart.notNull(endIndex)) dart.throw(new core.RangeError.value(startIndex));
    if (dart.notNull(endIndex) > dart.notNull(this[dartx.length])) dart.throw(new core.RangeError.value(endIndex));
    return this.substring(startIndex, endIndex);
  }
  [dartx.toLowerCase]() {
    return this.toLowerCase();
  }
  [dartx.toUpperCase]() {
    return this.toUpperCase();
  }
  static _isWhitespace(codeUnit) {
    if (dart.notNull(codeUnit) < 256) {
      switch (codeUnit) {
        case 9:
        case 10:
        case 11:
        case 12:
        case 13:
        case 32:
        case 133:
        case 160:
        {
          return true;
        }
        default:
        {
          return false;
        }
      }
    }
    switch (codeUnit) {
      case 5760:
      case 6158:
      case 8192:
      case 8193:
      case 8194:
      case 8195:
      case 8196:
      case 8197:
      case 8198:
      case 8199:
      case 8200:
      case 8201:
      case 8202:
      case 8232:
      case 8233:
      case 8239:
      case 8287:
      case 12288:
      case 65279:
      {
        return true;
      }
      default:
      {
        return false;
      }
    }
  }
  static _skipLeadingWhitespace(string, index) {
    let SPACE = 32;
    let CARRIAGE_RETURN = 13;
    while (dart.notNull(index) < dart.notNull(string[dartx.length])) {
      let codeUnit = string[dartx.codeUnitAt](index);
      if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
        break;
      }
      index = dart.notNull(index) + 1;
    }
    return index;
  }
  static _skipTrailingWhitespace(string, index) {
    let SPACE = 32;
    let CARRIAGE_RETURN = 13;
    while (dart.notNull(index) > 0) {
      let codeUnit = string[dartx.codeUnitAt](dart.notNull(index) - 1);
      if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
        break;
      }
      index = dart.notNull(index) - 1;
    }
    return index;
  }
  [dartx.trim]() {
    let NEL = 133;
    let result = this.trim();
    if (result[dartx.length] == 0) return result;
    let firstCode = result[dartx.codeUnitAt](0);
    let startIndex = 0;
    if (firstCode == NEL) {
      startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
      if (startIndex == result[dartx.length]) return "";
    }
    let endIndex = result[dartx.length];
    let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
    if (lastCode == NEL) {
      endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
    }
    if (startIndex == 0 && endIndex == result[dartx.length]) return result;
    return result.substring(startIndex, endIndex);
  }
  [dartx.trimLeft]() {
    let NEL = 133;
    let result = null;
    let startIndex = 0;
    if (typeof this.trimLeft != "undefined") {
      result = this.trimLeft();
      if (result[dartx.length] == 0) return result;
      let firstCode = result[dartx.codeUnitAt](0);
      if (firstCode == NEL) {
        startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
      }
    } else {
      result = this;
      startIndex = _interceptors.JSString._skipLeadingWhitespace(this, 0);
    }
    if (startIndex == 0) return result;
    if (startIndex == result[dartx.length]) return "";
    return result.substring(startIndex);
  }
  [dartx.trimRight]() {
    let NEL = 133;
    let result = null;
    let endIndex = null;
    if (typeof this.trimRight != "undefined") {
      result = this.trimRight();
      endIndex = result[dartx.length];
      if (endIndex == 0) return result;
      let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
      if (lastCode == NEL) {
        endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
      }
    } else {
      result = this;
      endIndex = _interceptors.JSString._skipTrailingWhitespace(this, this[dartx.length]);
    }
    if (endIndex == result[dartx.length]) return result;
    if (endIndex == 0) return "";
    return result.substring(0, endIndex);
  }
  [dartx['*']](times) {
    if (0 >= dart.notNull(times)) return '';
    if (times == 1 || this[dartx.length] == 0) return this;
    if (times != times >>> 0) {
      dart.throw(const$ || (const$ = dart.const(new core.OutOfMemoryError())));
    }
    let result = '';
    let s = this;
    while (true) {
      if ((dart.notNull(times) & 1) == 1) result = s + result;
      times = times >>> 1;
      if (times == 0) break;
      s = s + s;
    }
    return result;
  }
  [dartx.padLeft](width, padding) {
    if (padding === void 0) padding = ' ';
    let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
    if (delta <= 0) return this;
    return padding[dartx['*']](delta) + this;
  }
  [dartx.padRight](width, padding) {
    if (padding === void 0) padding = ' ';
    let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
    if (delta <= 0) return this;
    return this[dartx['+']](padding[dartx['*']](delta));
  }
  get [dartx.codeUnits]() {
    return new _internal.CodeUnits(this);
  }
  get [dartx.runes]() {
    return new core.Runes(this);
  }
  [dartx.indexOf](pattern, start) {
    if (start === void 0) start = 0;
    _js_helper.checkNull(pattern);
    if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
      dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
    }
    if (typeof pattern == 'string') {
      return _js_helper.stringIndexOfStringUnchecked(this, pattern, start);
    }
    if (_js_helper.JSSyntaxRegExp.is(pattern)) {
      let re = pattern;
      let match = _js_helper.firstMatchAfter(re, this, start);
      return match == null ? -1 : match.start;
    }
    for (let i = start; dart.notNull(i) <= dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
      if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
    }
    return -1;
  }
  [dartx.lastIndexOf](pattern, start) {
    if (start === void 0) start = null;
    _js_helper.checkNull(pattern);
    if (start == null) {
      start = this[dartx.length];
    } else if (!(typeof start == 'number')) {
      dart.throw(_js_helper.argumentErrorValue(start));
    } else if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
      dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
    }
    if (typeof pattern == 'string') {
      let other = pattern;
      if (dart.notNull(start) + dart.notNull(other[dartx.length]) > dart.notNull(this[dartx.length])) {
        start = dart.notNull(this[dartx.length]) - dart.notNull(other[dartx.length]);
      }
      return core.int._check(_js_helper.stringLastIndexOfUnchecked(this, other, start));
    }
    for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
      if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
    }
    return -1;
  }
  [dartx.contains](other, startIndex) {
    if (startIndex === void 0) startIndex = 0;
    _js_helper.checkNull(other);
    if (dart.notNull(startIndex) < 0 || dart.notNull(startIndex) > dart.notNull(this[dartx.length])) {
      dart.throw(new core.RangeError.range(startIndex, 0, this[dartx.length]));
    }
    return _js_helper.stringContainsUnchecked(this, other, startIndex);
  }
  get [dartx.isEmpty]() {
    return this[dartx.length] == 0;
  }
  get [dartx.isNotEmpty]() {
    return !dart.test(this[dartx.isEmpty]);
  }
  [dartx.compareTo](other) {
    if (!(typeof other == 'string')) dart.throw(_js_helper.argumentErrorValue(other));
    return dart.equals(this, other) ? 0 : this < other ? -1 : 1;
  }
  [dartx.toString]() {
    return this;
  }
  get [dartx.hashCode]() {
    let hash = 0;
    for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
      hash = 536870911 & hash + this.charCodeAt(i);
      hash = 536870911 & hash + ((524287 & hash) << 10);
      hash = hash ^ hash >> 6;
    }
    hash = 536870911 & hash + ((67108863 & hash) << 3);
    hash = hash ^ hash >> 11;
    return 536870911 & hash + ((16383 & hash) << 15);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(core.String);
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
    if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
    return this[index];
  }
};
_interceptors.JSString[dart.implements] = () => [core.String, JSIndexableOfString()];
dart.setSignature(_interceptors.JSString, {
  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSString, [])}),
  getters: () => ({
    [dartx.codeUnits]: dart.definiteFunctionType(core.List$(core.int), []),
    [dartx.runes]: dart.definiteFunctionType(core.Runes, []),
    [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
    [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
    [dartx.length]: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    [dartx.codeUnitAt]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.allMatches]: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
    [dartx.matchAsPrefix]: dart.definiteFunctionType(core.Match, [core.String], [core.int]),
    [dartx['+']]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.endsWith]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.replaceAll]: dart.definiteFunctionType(core.String, [core.Pattern, core.String]),
    [dartx.replaceAllMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()]),
    [dartx.splitMapJoin]: dart.definiteFunctionType(core.String, [core.Pattern], {onMatch: MatchToString(), onNonMatch: StringToString()}),
    [dartx.replaceFirst]: dart.definiteFunctionType(core.String, [core.Pattern, core.String], [core.int]),
    [dartx.replaceFirstMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()], [core.int]),
    [dartx.split]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
    [dartx.replaceRange]: dart.definiteFunctionType(core.String, [core.int, core.int, core.String]),
    [_defaultSplit]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
    [dartx.startsWith]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
    [dartx.substring]: dart.definiteFunctionType(core.String, [core.int], [core.int]),
    [dartx.toLowerCase]: dart.definiteFunctionType(core.String, []),
    [dartx.toUpperCase]: dart.definiteFunctionType(core.String, []),
    [dartx.trim]: dart.definiteFunctionType(core.String, []),
    [dartx.trimLeft]: dart.definiteFunctionType(core.String, []),
    [dartx.trimRight]: dart.definiteFunctionType(core.String, []),
    [dartx['*']]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.padLeft]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
    [dartx.padRight]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
    [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
    [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
    [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
    [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.String]),
    [dartx._get]: dart.definiteFunctionType(core.String, [core.int])
  }),
  statics: () => ({
    _isWhitespace: dart.definiteFunctionType(core.bool, [core.int]),
    _skipLeadingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int]),
    _skipTrailingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int])
  }),
  names: ['_isWhitespace', '_skipLeadingWhitespace', '_skipTrailingWhitespace']
});
dart.registerExtension(dart.global.String, _interceptors.JSString);
core.num = class num extends core.Object {
  static parse(input, onError) {
    if (onError === void 0) onError = null;
    let source = input[dartx.trim]();
    let result = core.int.parse(source, {onError: core.num._returnIntNull});
    if (result != null) return result;
    result = core.double.parse(source, core.num._returnDoubleNull);
    if (result != null) return result;
    if (onError == null) dart.throw(new core.FormatException(input));
    return onError(input);
  }
  static _returnIntNull(_) {
    return null;
  }
  static _returnDoubleNull(_) {
    return null;
  }
};
core.num.is = function is_num(o) {
  return typeof o == "number";
};
core.num.as = function as_num(o) {
  if (typeof o == "number" || o == null) return o;
  return dart.as(o, core.num);
};
core.num._check = function check_num(o) {
  if (typeof o == "number" || o == null) return o;
  return dart.check(o, core.num);
};
core.num[dart.implements] = () => [ComparableOfnum()];
dart.setSignature(core.num, {
  statics: () => ({
    parse: dart.definiteFunctionType(core.num, [core.String], [StringTonum()]),
    _returnIntNull: dart.definiteFunctionType(core.int, [core.String]),
    _returnDoubleNull: dart.definiteFunctionType(core.double, [core.String])
  }),
  names: ['parse', '_returnIntNull', '_returnDoubleNull']
});
core.double = class double extends core.num {
  static parse(source, onError) {
    if (onError === void 0) onError = null;
    return _js_helper.Primitives.parseDouble(source, onError);
  }
};
dart.setSignature(core.double, {
  sfields: () => ({
    NAN: core.double,
    INFINITY: core.double,
    NEGATIVE_INFINITY: core.double,
    MIN_POSITIVE: core.double,
    MAX_FINITE: core.double
  }),
  statics: () => ({parse: dart.definiteFunctionType(core.double, [core.String], [StringTodouble()])}),
  names: ['parse']
});
core.double.NAN = 0.0 / 0.0;
core.double.INFINITY = 1.0 / 0.0;
core.double.MIN_POSITIVE = 5e-324;
core.double.MAX_FINITE = 1.7976931348623157e+308;
dart.defineLazy(core.double, {
  get NEGATIVE_INFINITY() {
    return -core.double.INFINITY;
  }
});
_internal.POWERS_OF_TEN = dart.constList([1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0, 1e+21, 1e+22], core.double);
const _string = Symbol('_string');
const _filter = Symbol('_filter');
collection.ListMixin$ = dart.generic(E => {
  let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
  let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
  dart.defineExtensionNames([
    'iterator',
    'elementAt',
    'forEach',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single',
    'contains',
    'every',
    'any',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'join',
    'where',
    'map',
    'expand',
    'reduce',
    'fold',
    'skip',
    'skipWhile',
    'take',
    'takeWhile',
    'toList',
    'toSet',
    'add',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    'removeLast',
    'sort',
    'shuffle',
    'asMap',
    'sublist',
    'getRange',
    'removeRange',
    'fillRange',
    'setRange',
    'replaceRange',
    'indexOf',
    'lastIndexOf',
    'insert',
    'removeAt',
    'insertAll',
    'setAll',
    'reversed',
    'toString'
  ]);
  class ListMixin extends core.Object {
    get iterator() {
      return new (ListIteratorOfE())(this);
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this[dartx.iterator]);
    }
    elementAt(index) {
      return this[dartx._get](index);
    }
    forEach(action) {
      let length = this[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        action(this[dartx._get](i));
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
    }
    get isEmpty() {
      return this[dartx.length] == 0;
    }
    get isNotEmpty() {
      return !dart.test(this[dartx.isEmpty]);
    }
    get first() {
      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
      return this[dartx._get](0);
    }
    get last() {
      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
      return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
    }
    get single() {
      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this[dartx.length]) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this[dartx._get](0);
    }
    contains(element) {
      let length = this[dartx.length];
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        if (dart.equals(this[dartx._get](i), element)) return true;
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return false;
    }
    every(test) {
      let length = this[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (!dart.test(test(this[dartx._get](i)))) return false;
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return true;
    }
    any(test) {
      let length = this[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.test(test(this[dartx._get](i)))) return true;
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return false;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this[dartx._get](i);
        if (dart.test(test(element))) return element;
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[dartx.length];
      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
        let element = this[dartx._get](i);
        if (dart.test(test(element))) return element;
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test) {
      let length = this[dartx.length];
      let match = null;
      let matchFound = false;
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this[dartx._get](i);
        if (dart.test(test(element))) {
          if (matchFound) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          matchFound = true;
          match = element;
        }
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (matchFound) return match;
      dart.throw(_internal.IterableElementError.noElement());
    }
    join(separator) {
      if (separator === void 0) separator = "";
      if (this[dartx.length] == 0) return "";
      let buffer = new core.StringBuffer();
      buffer.writeAll(this, separator);
      return buffer.toString();
    }
    where(test) {
      return new (WhereIterableOfE())(this, test);
    }
    map(T) {
      return f => {
        return new (_internal.MappedListIterable$(E, T))(this, f);
      };
    }
    expand(T) {
      return f => {
        return new (_internal.ExpandIterable$(E, T))(this, f);
      };
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let length = this[dartx.length];
      if (length == 0) dart.throw(_internal.IterableElementError.noElement());
      let value = this[dartx._get](0);
      for (let i = 1; i < dart.notNull(length); i++) {
        value = combine(value, this[dartx._get](i));
        if (length != this[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return value;
    }
    fold(T) {
      return (initialValue, combine) => {
        let value = initialValue;
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          value = combine(value, this[dartx._get](i));
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return value;
      };
    }
    skip(count) {
      return new (SubListIterableOfE())(this, count, null);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE())(this, test);
    }
    take(count) {
      return new (SubListIterableOfE())(this, 0, count);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE())(this, test);
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = null;
      if (dart.test(growable)) {
        result = ListOfE().new();
        result[dartx.length] = this[dartx.length];
      } else {
        result = ListOfE().new(this[dartx.length]);
      }
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        result[dartx._set](i, this[dartx._get](i));
      }
      return result;
    }
    toSet() {
      let result = SetOfE().new();
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        result.add(this[dartx._get](i));
      }
      return result;
    }
    add(element) {
      E._check(element);
      this[dartx._set]((() => {
        let x = this[dartx.length];
        this[dartx.length] = dart.notNull(x) + 1;
        return x;
      })(), element);
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      let i = this[dartx.length];
      for (let element of iterable) {
        dart.assert(this[dartx.length] == i || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
        this[dartx.length] = dart.notNull(i) + 1;
        this[dartx._set](i, element);
        i = dart.notNull(i) + 1;
      }
    }
    remove(element) {
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        if (dart.equals(this[dartx._get](i), element)) {
          this[dartx.setRange](i, dart.notNull(this[dartx.length]) - 1, this, i + 1);
          this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
          return true;
        }
      }
      return false;
    }
    removeWhere(test) {
      this[_filter](test, false);
    }
    retainWhere(test) {
      this[_filter](test, true);
    }
    [_filter](test, retainMatching) {
      let source = this;
      let retained = JSArrayOfE().of([]);
      let length = source[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = source[dartx._get](i);
        if (dart.dcall(test, element) == retainMatching) {
          retained[dartx.add](element);
        }
        if (length != source[dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(source));
        }
      }
      if (retained[dartx.length] != source[dartx.length]) {
        source[dartx.setRange](0, retained[dartx.length], retained);
        source[dartx.length] = retained[dartx.length];
      }
    }
    clear() {
      this[dartx.length] = 0;
    }
    removeLast() {
      if (this[dartx.length] == 0) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = this[dartx._get](dart.notNull(this[dartx.length]) - 1);
      this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
      return result;
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      if (compare == null) {
        _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
      } else {
        _internal.Sort.sort(E)(this, compare);
      }
    }
    shuffle(random) {
      if (random === void 0) random = null;
      if (random == null) random = math.Random.new();
      let length = this[dartx.length];
      while (dart.notNull(length) > 1) {
        let pos = random.nextInt(length);
        length = dart.notNull(length) - 1;
        let tmp = this[dartx._get](length);
        this[dartx._set](length, this[dartx._get](pos));
        this[dartx._set](pos, tmp);
      }
    }
    asMap() {
      return new (ListMapViewOfE())(this);
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      let listLength = this[dartx.length];
      if (end == null) end = listLength;
      core.RangeError.checkValidRange(start, end, listLength);
      let length = dart.notNull(end) - dart.notNull(start);
      let result = ListOfE().new();
      result[dartx.length] = length;
      for (let i = 0; i < length; i++) {
        result[dartx._set](i, this[dartx._get](dart.notNull(start) + i));
      }
      return result;
    }
    getRange(start, end) {
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      return new (SubListIterableOfE())(this, start, end);
    }
    removeRange(start, end) {
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      let length = dart.notNull(end) - dart.notNull(start);
      this[dartx.setRange](start, dart.notNull(this[dartx.length]) - length, this, end);
      this[dartx.length] = dart.notNull(this[dartx.length]) - length;
    }
    fillRange(start, end, fill) {
      if (fill === void 0) fill = null;
      E._check(fill);
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        this[dartx._set](i, fill);
      }
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      let length = dart.notNull(end) - dart.notNull(start);
      if (length == 0) return;
      core.RangeError.checkNotNegative(skipCount, "skipCount");
      let otherList = null;
      let otherStart = null;
      if (ListOfE().is(iterable)) {
        otherList = iterable;
        otherStart = skipCount;
      } else {
        otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
        otherStart = 0;
      }
      if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
        dart.throw(_internal.IterableElementError.tooFew());
      }
      if (dart.notNull(otherStart) < dart.notNull(start)) {
        for (let i = length - 1; i >= 0; i--) {
          this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
        }
      } else {
        for (let i = 0; i < length; i++) {
          this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
        }
      }
    }
    replaceRange(start, end, newContents) {
      IterableOfE()._check(newContents);
      core.RangeError.checkValidRange(start, end, this[dartx.length]);
      if (!_internal.EfficientLength.is(newContents)) {
        newContents = newContents[dartx.toList]();
      }
      let removeLength = dart.notNull(end) - dart.notNull(start);
      let insertLength = newContents[dartx.length];
      if (removeLength >= dart.notNull(insertLength)) {
        let delta = removeLength - dart.notNull(insertLength);
        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
        let newLength = dart.notNull(this[dartx.length]) - delta;
        this[dartx.setRange](start, insertEnd, newContents);
        if (delta != 0) {
          this[dartx.setRange](insertEnd, newLength, this, end);
          this[dartx.length] = newLength;
        }
      } else {
        let delta = dart.notNull(insertLength) - removeLength;
        let newLength = dart.notNull(this[dartx.length]) + delta;
        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
        this[dartx.length] = newLength;
        this[dartx.setRange](insertEnd, newLength, this, end);
        this[dartx.setRange](start, insertEnd, newContents);
      }
    }
    indexOf(element, startIndex) {
      if (startIndex === void 0) startIndex = 0;
      if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
        return -1;
      }
      if (dart.notNull(startIndex) < 0) {
        startIndex = 0;
      }
      for (let i = startIndex; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
        if (dart.equals(this[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    lastIndexOf(element, startIndex) {
      if (startIndex === void 0) startIndex = null;
      if (startIndex == null) {
        startIndex = dart.notNull(this[dartx.length]) - 1;
      } else {
        if (dart.notNull(startIndex) < 0) {
          return -1;
        }
        if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
          startIndex = dart.notNull(this[dartx.length]) - 1;
        }
      }
      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.equals(this[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    insert(index, element) {
      E._check(element);
      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
      if (index == this[dartx.length]) {
        this[dartx.add](element);
        return;
      }
      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError(index));
      this[dartx.length] = dart.notNull(this[dartx.length]) + 1;
      this[dartx.setRange](dart.notNull(index) + 1, this[dartx.length], this, index);
      this[dartx._set](index, element);
    }
    removeAt(index) {
      let result = this[dartx._get](index);
      this[dartx.setRange](index, dart.notNull(this[dartx.length]) - 1, this, dart.notNull(index) + 1);
      this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
      return result;
    }
    insertAll(index, iterable) {
      IterableOfE()._check(iterable);
      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
      if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
        iterable = iterable[dartx.toList]();
      }
      let insertionLength = iterable[dartx.length];
      this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
      if (iterable[dartx.length] != insertionLength) {
        this[dartx.length] = dart.notNull(this[dartx.length]) - dart.notNull(insertionLength);
        dart.throw(new core.ConcurrentModificationError(iterable));
      }
      this[dartx.setRange](dart.notNull(index) + dart.notNull(insertionLength), this[dartx.length], this, index);
      this[dartx.setAll](index, iterable);
    }
    setAll(index, iterable) {
      IterableOfE()._check(iterable);
      if (core.List.is(iterable)) {
        this[dartx.setRange](index, dart.notNull(index) + dart.notNull(iterable[dartx.length]), iterable);
      } else {
        for (let element of iterable) {
          this[dartx._set]((() => {
            let x = index;
            index = dart.notNull(x) + 1;
            return x;
          })(), element);
        }
      }
    }
    get reversed() {
      return new (ReversedListIterableOfE())(this);
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, '[', ']');
    }
  }
  dart.addTypeTests(ListMixin);
  ListMixin[dart.implements] = () => [ListOfE()];
  dart.setSignature(ListMixin, {
    getters: () => ({
      iterator: dart.definiteFunctionType(core.Iterator$(E), []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      first: dart.definiteFunctionType(E, []),
      last: dart.definiteFunctionType(E, []),
      single: dart.definiteFunctionType(E, []),
      reversed: dart.definiteFunctionType(core.Iterable$(E), [])
    }),
    methods: () => ({
      elementAt: dart.definiteFunctionType(E, [core.int]),
      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
      contains: dart.definiteFunctionType(core.bool, [core.Object]),
      every: dart.definiteFunctionType(core.bool, [ETobool()]),
      any: dart.definiteFunctionType(core.bool, [ETobool()]),
      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
      join: dart.definiteFunctionType(core.String, [], [core.String]),
      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
      toSet: dart.definiteFunctionType(core.Set$(E), []),
      add: dart.definiteFunctionType(dart.void, [E]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      [_filter]: dart.definiteFunctionType(dart.void, [dynamicTobool(), core.bool]),
      clear: dart.definiteFunctionType(dart.void, []),
      removeLast: dart.definiteFunctionType(E, []),
      sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
      shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
      asMap: dart.definiteFunctionType(core.Map$(core.int, E), []),
      sublist: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
      getRange: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
      indexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      lastIndexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
      removeAt: dart.definiteFunctionType(E, [core.int]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
    })
  });
  dart.defineExtensionMembers(ListMixin, [
    'elementAt',
    'forEach',
    'contains',
    'every',
    'any',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'join',
    'where',
    'map',
    'expand',
    'reduce',
    'fold',
    'skip',
    'skipWhile',
    'take',
    'takeWhile',
    'toList',
    'toSet',
    'add',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    'removeLast',
    'sort',
    'shuffle',
    'asMap',
    'sublist',
    'getRange',
    'removeRange',
    'fillRange',
    'setRange',
    'replaceRange',
    'indexOf',
    'lastIndexOf',
    'insert',
    'removeAt',
    'insertAll',
    'setAll',
    'toString',
    'iterator',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single',
    'reversed'
  ]);
  return ListMixin;
});
collection.ListMixin = ListMixin();
collection.ListBase$ = dart.generic(E => {
  class ListBase extends dart.mixin(core.Object, collection.ListMixin$(E)) {
    static listToString(list) {
      return collection.IterableBase.iterableToFullString(list, '[', ']');
    }
  }
  dart.addTypeTests(ListBase);
  dart.setSignature(ListBase, {
    statics: () => ({listToString: dart.definiteFunctionType(core.String, [core.List])}),
    names: ['listToString']
  });
  return ListBase;
});
collection.ListBase = ListBase();
_internal.UnmodifiableListMixin$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
  class UnmodifiableListMixin extends core.Object {
    _set(index, value) {
      E._check(value);
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      return value;
    }
    set length(newLength) {
      dart.throw(new core.UnsupportedError("Cannot change the length of an unmodifiable list"));
    }
    setAll(at, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
    }
    add(value) {
      E._check(value);
      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
    }
    insert(index, element) {
      E._check(element);
      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
    }
    insertAll(at, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
    }
    remove(element) {
      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
    }
    retainWhere(test) {
      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
    }
    clear() {
      dart.throw(new core.UnsupportedError("Cannot clear an unmodifiable list"));
    }
    removeAt(index) {
      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
    }
    removeLast() {
      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
    }
    removeRange(start, end) {
      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
    }
  }
  dart.addTypeTests(UnmodifiableListMixin);
  UnmodifiableListMixin[dart.implements] = () => [ListOfE()];
  dart.setSignature(UnmodifiableListMixin, {
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      _set: dart.definiteFunctionType(dart.void, [core.int, E]),
      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      add: dart.definiteFunctionType(dart.void, [E]),
      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfE()]),
      shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
      clear: dart.definiteFunctionType(dart.void, []),
      removeAt: dart.definiteFunctionType(E, [core.int]),
      removeLast: dart.definiteFunctionType(E, []),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
    })
  });
  dart.defineExtensionMembers(UnmodifiableListMixin, [
    '_set',
    'setAll',
    'add',
    'insert',
    'insertAll',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'sort',
    'shuffle',
    'clear',
    'removeAt',
    'removeLast',
    'setRange',
    'removeRange',
    'replaceRange',
    'fillRange',
    'length'
  ]);
  return UnmodifiableListMixin;
});
_internal.UnmodifiableListMixin = UnmodifiableListMixin();
_internal.UnmodifiableListBase$ = dart.generic(E => {
  class UnmodifiableListBase extends dart.mixin(collection.ListBase$(E), _internal.UnmodifiableListMixin$(E)) {
    new() {
      super.new();
    }
  }
  return UnmodifiableListBase;
});
_internal.UnmodifiableListBase = UnmodifiableListBase();
core.int = class int extends core.num {
  static fromEnvironment(name, opts) {
    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
    dart.throw(new core.UnsupportedError('int.fromEnvironment can only be used as a const constructor'));
  }
  static parse(source, opts) {
    let radix = opts && 'radix' in opts ? opts.radix : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    return _js_helper.Primitives.parseInt(source, radix, onError);
  }
};
core.int.is = function is_int(o) {
  return typeof o == "number" && Math.floor(o) == o;
};
core.int.as = function as_int(o) {
  if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
  return dart.as(o, core.int);
};
core.int._check = function check_int(o) {
  if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
  return dart.check(o, core.int);
};
dart.setSignature(core.int, {
  constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.int, [core.String], {defaultValue: core.int})}),
  statics: () => ({parse: dart.definiteFunctionType(core.int, [core.String], {radix: core.int, onError: StringToint()})}),
  names: ['parse']
});
_internal.CodeUnits = class CodeUnits extends _internal.UnmodifiableListBase$(core.int) {
  new(string) {
    this[_string] = string;
  }
  get length() {
    return this[_string][dartx.length];
  }
  set length(value) {
    super.length = value;
  }
  _get(i) {
    return this[_string][dartx.codeUnitAt](i);
  }
  static stringOf(u) {
    return u[_string];
  }
};
dart.addSimpleTypeTests(_internal.CodeUnits);
dart.setSignature(_internal.CodeUnits, {
  constructors: () => ({new: dart.definiteFunctionType(_internal.CodeUnits, [core.String])}),
  fields: () => ({[_string]: core.String}),
  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({_get: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({stringOf: dart.definiteFunctionType(core.String, [_internal.CodeUnits])}),
  names: ['stringOf']
});
dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
_internal.EfficientLength = class EfficientLength extends core.Object {};
core.Iterable$ = dart.generic(E => {
  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
  let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
  dart.defineExtensionNames([
    'map',
    'where',
    'expand',
    'contains',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'toList',
    'toSet',
    'length',
    'isEmpty',
    'isNotEmpty',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'first',
    'last',
    'single',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'toString'
  ]);
  class Iterable extends core.Object {
    new() {
    }
    static generate(count, generator) {
      if (generator === void 0) generator = null;
      if (dart.notNull(count) <= 0) return new (EmptyIterableOfE())();
      return new (_GeneratorIterableOfE())(count, generator);
    }
    static empty() {
      return new (EmptyIterableOfE())();
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this[dartx.iterator]);
    }
    map(T) {
      return f => {
        return _internal.MappedIterable$(E, T).new(this, f);
      };
    }
    where(test) {
      return new (WhereIterableOfE())(this, test);
    }
    expand(T) {
      return f => {
        return new (_internal.ExpandIterable$(E, T))(this, f);
      };
    }
    contains(element) {
      for (let e of this) {
        if (dart.equals(e, element)) return true;
      }
      return false;
    }
    forEach(f) {
      for (let element of this)
        f(element);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let iterator = this[dartx.iterator];
      if (!dart.test(iterator.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let value = iterator.current;
      while (dart.test(iterator.moveNext())) {
        value = combine(value, iterator.current);
      }
      return value;
    }
    fold(T) {
      return (initialValue, combine) => {
        let value = initialValue;
        for (let element of this)
          value = combine(value, element);
        return value;
      };
    }
    every(f) {
      for (let element of this) {
        if (!dart.test(f(element))) return false;
      }
      return true;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let iterator = this[dartx.iterator];
      if (!dart.test(iterator.moveNext())) return "";
      let buffer = new core.StringBuffer();
      if (separator == null || separator == "") {
        do {
          buffer.write(dart.str`${iterator.current}`);
        } while (dart.test(iterator.moveNext()));
      } else {
        buffer.write(dart.str`${iterator.current}`);
        while (dart.test(iterator.moveNext())) {
          buffer.write(separator);
          buffer.write(dart.str`${iterator.current}`);
        }
      }
      return buffer.toString();
    }
    any(f) {
      for (let element of this) {
        if (dart.test(f(element))) return true;
      }
      return false;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return ListOfE().from(this, {growable: growable});
    }
    toSet() {
      return SetOfE().from(this);
    }
    get length() {
      dart.assert(!_internal.EfficientLength.is(this));
      let count = 0;
      let it = this[dartx.iterator];
      while (dart.test(it.moveNext())) {
        count++;
      }
      return count;
    }
    get isEmpty() {
      return !dart.test(this[dartx.iterator].moveNext());
    }
    get isNotEmpty() {
      return !dart.test(this[dartx.isEmpty]);
    }
    take(count) {
      return TakeIterableOfE().new(this, count);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE())(this, test);
    }
    skip(count) {
      return SkipIterableOfE().new(this, count);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE())(this, test);
    }
    get first() {
      let it = this[dartx.iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      return it.current;
    }
    get last() {
      let it = this[dartx.iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = null;
      do {
        result = it.current;
      } while (dart.test(it.moveNext()));
      return result;
    }
    get single() {
      let it = this[dartx.iterator];
      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
      let result = it.current;
      if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
      return result;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      for (let element of this) {
        if (dart.test(test(element))) return element;
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test) {
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          if (foundMatching) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
      core.RangeError.checkNotNegative(index, "index");
      let elementIndex = 0;
      for (let element of this) {
        if (index == elementIndex) return element;
        elementIndex++;
      }
      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
    }
    toString() {
      return collection.IterableBase.iterableToShortString(this, '(', ')');
    }
  }
  dart.addTypeTests(Iterable);
  dart.setSignature(Iterable, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.Iterable$(E), []),
      generate: dart.definiteFunctionType(core.Iterable$(E), [core.int], [intToE()]),
      empty: dart.definiteFunctionType(core.Iterable$(E), [])
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      first: dart.definiteFunctionType(E, []),
      last: dart.definiteFunctionType(E, []),
      single: dart.definiteFunctionType(E, [])
    }),
    methods: () => ({
      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
      contains: dart.definiteFunctionType(core.bool, [core.Object]),
      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
      every: dart.definiteFunctionType(core.bool, [ETobool()]),
      join: dart.definiteFunctionType(core.String, [], [core.String]),
      any: dart.definiteFunctionType(core.bool, [ETobool()]),
      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
      toSet: dart.definiteFunctionType(core.Set$(E), []),
      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
      elementAt: dart.definiteFunctionType(E, [core.int])
    })
  });
  dart.defineExtensionMembers(Iterable, [
    'map',
    'where',
    'expand',
    'contains',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'toList',
    'toSet',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'toString',
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single'
  ]);
  return Iterable;
});
core.Iterable = Iterable();
_internal.ListIterable$ = dart.generic(E => {
  let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let dynamicAndEToE = () => (dynamicAndEToE = dart.constFn(dart.functionType(E, [dart.dynamic, E])))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  class ListIterable extends core.Iterable$(E) {
    new() {
      super.new();
    }
    get iterator() {
      return new (ListIteratorOfE())(this);
    }
    forEach(action) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        action(this.elementAt(i));
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
    }
    get isEmpty() {
      return this.length == 0;
    }
    get first() {
      if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
      return this.elementAt(0);
    }
    get last() {
      if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
      return this.elementAt(dart.notNull(this.length) - 1);
    }
    get single() {
      if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this.elementAt(0);
    }
    contains(element) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.equals(this.elementAt(i), element)) return true;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return false;
    }
    every(test) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (!dart.test(test(this.elementAt(i)))) return false;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return true;
    }
    any(test) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.test(test(this.elementAt(i)))) return true;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return false;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this.elementAt(i);
        if (dart.test(test(element))) return element;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this.length;
      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
        let element = this.elementAt(i);
        if (dart.test(test(element))) return element;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test) {
      let length = this.length;
      let match = null;
      let matchFound = false;
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this.elementAt(i);
        if (dart.test(test(element))) {
          if (matchFound) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          matchFound = true;
          match = element;
        }
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      if (matchFound) return match;
      dart.throw(_internal.IterableElementError.noElement());
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let length = this.length;
      if (!dart.test(separator[dartx.isEmpty])) {
        if (length == 0) return "";
        let first = dart.str`${this.elementAt(0)}`;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        let buffer = new core.StringBuffer(first);
        for (let i = 1; i < dart.notNull(length); i++) {
          buffer.write(separator);
          buffer.write(this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return buffer.toString();
      } else {
        let buffer = new core.StringBuffer();
        for (let i = 0; i < dart.notNull(length); i++) {
          buffer.write(this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return buffer.toString();
      }
    }
    where(test) {
      return super.where(test);
    }
    map(T) {
      return f => {
        return new (_internal.MappedListIterable$(E, T))(this, f);
      };
    }
    reduce(combine) {
      dynamicAndEToE()._check(combine);
      let length = this.length;
      if (length == 0) dart.throw(_internal.IterableElementError.noElement());
      let value = this.elementAt(0);
      for (let i = 1; i < dart.notNull(length); i++) {
        value = dart.dcall(combine, value, this.elementAt(i));
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      return value;
    }
    fold(T) {
      return (initialValue, combine) => {
        let value = initialValue;
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          value = combine(value, this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return value;
      };
    }
    skip(count) {
      return new (SubListIterableOfE())(this, count, null);
    }
    skipWhile(test) {
      return super.skipWhile(test);
    }
    take(count) {
      return new (SubListIterableOfE())(this, 0, count);
    }
    takeWhile(test) {
      return super.takeWhile(test);
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = null;
      if (dart.test(growable)) {
        result = ListOfE().new();
        result[dartx.length] = this.length;
      } else {
        result = ListOfE().new(this.length);
      }
      for (let i = 0; i < dart.notNull(this.length); i++) {
        result[dartx._set](i, this.elementAt(i));
      }
      return result;
    }
    toSet() {
      let result = SetOfE().new();
      for (let i = 0; i < dart.notNull(this.length); i++) {
        result.add(this.elementAt(i));
      }
      return result;
    }
  }
  ListIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(ListIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterable$(E), [])}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
  });
  dart.defineExtensionMembers(ListIterable, [
    'forEach',
    'contains',
    'every',
    'any',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'join',
    'where',
    'map',
    'reduce',
    'fold',
    'skip',
    'skipWhile',
    'take',
    'takeWhile',
    'toList',
    'toSet',
    'iterator',
    'isEmpty',
    'first',
    'last',
    'single'
  ]);
  return ListIterable;
});
_internal.ListIterable = ListIterable();
const _iterable$ = Symbol('_iterable');
const _start = Symbol('_start');
const _endOrLength = Symbol('_endOrLength');
const _endIndex = Symbol('_endIndex');
const _startIndex = Symbol('_startIndex');
_internal.SubListIterable$ = dart.generic(E => {
  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class SubListIterable extends _internal.ListIterable$(E) {
    new(iterable, start, endOrLength) {
      this[_iterable$] = iterable;
      this[_start] = start;
      this[_endOrLength] = endOrLength;
      super.new();
      core.RangeError.checkNotNegative(this[_start], "start");
      if (this[_endOrLength] != null) {
        core.RangeError.checkNotNegative(this[_endOrLength], "end");
        if (dart.notNull(this[_start]) > dart.notNull(this[_endOrLength])) {
          dart.throw(new core.RangeError.range(this[_start], 0, this[_endOrLength], "start"));
        }
      }
    }
    get [_endIndex]() {
      let length = this[_iterable$][dartx.length];
      if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) > dart.notNull(length)) return length;
      return this[_endOrLength];
    }
    get [_startIndex]() {
      let length = this[_iterable$][dartx.length];
      if (dart.notNull(this[_start]) > dart.notNull(length)) return length;
      return this[_start];
    }
    get length() {
      let length = this[_iterable$][dartx.length];
      if (dart.notNull(this[_start]) >= dart.notNull(length)) return 0;
      if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) >= dart.notNull(length)) {
        return dart.notNull(length) - dart.notNull(this[_start]);
      }
      return dart.notNull(this[_endOrLength]) - dart.notNull(this[_start]);
    }
    elementAt(index) {
      let realIndex = dart.notNull(this[_startIndex]) + dart.notNull(index);
      if (dart.notNull(index) < 0 || realIndex >= dart.notNull(this[_endIndex])) {
        dart.throw(core.RangeError.index(index, this, "index"));
      }
      return this[_iterable$][dartx.elementAt](realIndex);
    }
    skip(count) {
      core.RangeError.checkNotNegative(count, "count");
      let newStart = dart.notNull(this[_start]) + dart.notNull(count);
      if (this[_endOrLength] != null && newStart >= dart.notNull(this[_endOrLength])) {
        return new (EmptyIterableOfE())();
      }
      return new (SubListIterableOfE())(this[_iterable$], newStart, this[_endOrLength]);
    }
    take(count) {
      core.RangeError.checkNotNegative(count, "count");
      if (this[_endOrLength] == null) {
        return new (SubListIterableOfE())(this[_iterable$], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
      } else {
        let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
        if (dart.notNull(this[_endOrLength]) < newEnd) return this;
        return new (SubListIterableOfE())(this[_iterable$], this[_start], newEnd);
      }
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let start = this[_start];
      let end = this[_iterable$][dartx.length];
      if (this[_endOrLength] != null && dart.notNull(this[_endOrLength]) < dart.notNull(end)) end = this[_endOrLength];
      let length = dart.notNull(end) - dart.notNull(start);
      if (length < 0) length = 0;
      let result = dart.test(growable) ? (() => {
        let _ = ListOfE().new();
        _[dartx.length] = length;
        return _;
      })() : ListOfE().new(length);
      for (let i = 0; i < length; i++) {
        result[dartx._set](i, this[_iterable$][dartx.elementAt](dart.notNull(start) + i));
        if (dart.notNull(this[_iterable$][dartx.length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError(this));
      }
      return result;
    }
  }
  dart.setSignature(SubListIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.SubListIterable$(E), [IterableOfE(), core.int, core.int])}),
    fields: () => ({
      [_iterable$]: IterableOfE(),
      [_start]: core.int,
      [_endOrLength]: core.int
    }),
    getters: () => ({
      [_endIndex]: dart.definiteFunctionType(core.int, []),
      [_startIndex]: dart.definiteFunctionType(core.int, [])
    })
  });
  dart.defineExtensionMembers(SubListIterable, [
    'elementAt',
    'skip',
    'take',
    'toList',
    'length'
  ]);
  return SubListIterable;
});
_internal.SubListIterable = SubListIterable();
const _length$ = Symbol('_length');
const _index$ = Symbol('_index');
const _current$ = Symbol('_current');
_internal.ListIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class ListIterator extends core.Object {
    new(iterable) {
      this[_iterable$] = iterable;
      this[_length$] = iterable[dartx.length];
      this[_index$] = 0;
      this[_current$] = null;
    }
    get current() {
      return this[_current$];
    }
    moveNext() {
      let length = this[_iterable$][dartx.length];
      if (this[_length$] != length) {
        dart.throw(new core.ConcurrentModificationError(this[_iterable$]));
      }
      if (dart.notNull(this[_index$]) >= dart.notNull(length)) {
        this[_current$] = null;
        return false;
      }
      this[_current$] = this[_iterable$][dartx.elementAt](this[_index$]);
      this[_index$] = dart.notNull(this[_index$]) + 1;
      return true;
    }
  }
  dart.addTypeTests(ListIterator);
  ListIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(ListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterator$(E), [IterableOfE()])}),
    fields: () => ({
      [_iterable$]: IterableOfE(),
      [_length$]: core.int,
      [_index$]: core.int,
      [_current$]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return ListIterator;
});
_internal.ListIterator = ListIterator();
_internal._Transformation$ = dart.generic((S, T) => {
  const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
  return _Transformation;
});
_internal._Transformation = _Transformation();
const _f = Symbol('_f');
_internal.MappedIterable$ = dart.generic((S, T) => {
  let EfficientLengthMappedIterableOfS$T = () => (EfficientLengthMappedIterableOfS$T = dart.constFn(_internal.EfficientLengthMappedIterable$(S, T)))();
  let MappedIterableOfS$T = () => (MappedIterableOfS$T = dart.constFn(_internal.MappedIterable$(S, T)))();
  let MappedIteratorOfS$T = () => (MappedIteratorOfS$T = dart.constFn(_internal.MappedIterator$(S, T)))();
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
  class MappedIterable extends core.Iterable$(T) {
    static new(iterable, func) {
      if (_internal.EfficientLength.is(iterable)) {
        return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
      }
      return new (MappedIterableOfS$T())._(iterable, func);
    }
    _(iterable, f) {
      this[_iterable$] = iterable;
      this[_f] = f;
      super.new();
    }
    get iterator() {
      return new (MappedIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
    }
    get length() {
      return this[_iterable$][dartx.length];
    }
    get isEmpty() {
      return this[_iterable$][dartx.isEmpty];
    }
    get first() {
      return this[_f](this[_iterable$][dartx.first]);
    }
    get last() {
      return this[_f](this[_iterable$][dartx.last]);
    }
    get single() {
      return this[_f](this[_iterable$][dartx.single]);
    }
    elementAt(index) {
      return this[_f](this[_iterable$][dartx.elementAt](index));
    }
  }
  dart.defineNamedConstructor(MappedIterable, '_');
  dart.setSignature(MappedIterable, {
    constructors: () => ({
      new: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()]),
      _: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])
    }),
    fields: () => ({
      [_iterable$]: IterableOfS(),
      [_f]: _TransformationOfS$T()
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
  });
  dart.defineExtensionMembers(MappedIterable, [
    'elementAt',
    'iterator',
    'length',
    'isEmpty',
    'first',
    'last',
    'single'
  ]);
  return MappedIterable;
});
_internal.MappedIterable = MappedIterable();
_internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  let SToT = () => (SToT = dart.constFn(dart.functionType(T, [S])))();
  class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
    new(iterable, func) {
      super._(iterable, func);
    }
  }
  EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(EfficientLengthMappedIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthMappedIterable$(S, T), [IterableOfS(), SToT()])})
  });
  return EfficientLengthMappedIterable;
});
_internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
const _iterator = Symbol('_iterator');
core.Iterator$ = dart.generic(E => {
  class Iterator extends core.Object {}
  dart.addTypeTests(Iterator);
  return Iterator;
});
core.Iterator = Iterator();
_internal.MappedIterator$ = dart.generic((S, T) => {
  let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
  class MappedIterator extends core.Iterator$(T) {
    new(iterator, f) {
      this[_iterator] = iterator;
      this[_f] = f;
      this[_current$] = null;
    }
    moveNext() {
      if (dart.test(this[_iterator].moveNext())) {
        this[_current$] = this[_f](this[_iterator].current);
        return true;
      }
      this[_current$] = null;
      return false;
    }
    get current() {
      return this[_current$];
    }
  }
  dart.setSignature(MappedIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.MappedIterator$(S, T), [IteratorOfS(), _TransformationOfS$T()])}),
    fields: () => ({
      [_current$]: T,
      [_iterator]: IteratorOfS(),
      [_f]: _TransformationOfS$T()
    }),
    getters: () => ({current: dart.definiteFunctionType(T, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return MappedIterator;
});
_internal.MappedIterator = MappedIterator();
const _source = Symbol('_source');
_internal.MappedListIterable$ = dart.generic((S, T) => {
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
  class MappedListIterable extends _internal.ListIterable$(T) {
    new(source, f) {
      this[_source] = source;
      this[_f] = f;
      super.new();
    }
    get length() {
      return this[_source][dartx.length];
    }
    elementAt(index) {
      return this[_f](this[_source][dartx.elementAt](index));
    }
  }
  MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(MappedListIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.MappedListIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])}),
    fields: () => ({
      [_source]: IterableOfS(),
      [_f]: _TransformationOfS$T()
    })
  });
  dart.defineExtensionMembers(MappedListIterable, ['elementAt', 'length']);
  return MappedListIterable;
});
_internal.MappedListIterable = MappedListIterable();
_internal._ElementPredicate$ = dart.generic(E => {
  const _ElementPredicate = dart.typedef('_ElementPredicate', () => dart.functionType(core.bool, [E]));
  return _ElementPredicate;
});
_internal._ElementPredicate = _ElementPredicate();
_internal.WhereIterable$ = dart.generic(E => {
  let WhereIteratorOfE = () => (WhereIteratorOfE = dart.constFn(_internal.WhereIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
  class WhereIterable extends core.Iterable$(E) {
    new(iterable, f) {
      this[_iterable$] = iterable;
      this[_f] = f;
      super.new();
    }
    get iterator() {
      return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
    }
  }
  dart.setSignature(WhereIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
    fields: () => ({
      [_iterable$]: IterableOfE(),
      [_f]: _ElementPredicateOfE()
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(WhereIterable, ['iterator']);
  return WhereIterable;
});
_internal.WhereIterable = WhereIterable();
_internal.WhereIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
  class WhereIterator extends core.Iterator$(E) {
    new(iterator, f) {
      this[_iterator] = iterator;
      this[_f] = f;
    }
    moveNext() {
      while (dart.test(this[_iterator].moveNext())) {
        if (dart.test(this[_f](this[_iterator].current))) {
          return true;
        }
      }
      return false;
    }
    get current() {
      return this[_iterator].current;
    }
  }
  dart.setSignature(WhereIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
    fields: () => ({
      [_iterator]: IteratorOfE(),
      [_f]: _ElementPredicateOfE()
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return WhereIterator;
});
_internal.WhereIterator = WhereIterator();
_internal._ExpandFunction$ = dart.generic((S, T) => {
  const _ExpandFunction = dart.typedef('_ExpandFunction', () => dart.functionType(core.Iterable$(T), [S]));
  return _ExpandFunction;
});
_internal._ExpandFunction = _ExpandFunction();
_internal.ExpandIterable$ = dart.generic((S, T) => {
  let ExpandIteratorOfS$T = () => (ExpandIteratorOfS$T = dart.constFn(_internal.ExpandIterator$(S, T)))();
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  class ExpandIterable extends core.Iterable$(T) {
    new(iterable, f) {
      this[_iterable$] = iterable;
      this[_f] = f;
      super.new();
    }
    get iterator() {
      return new (ExpandIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
    }
  }
  dart.setSignature(ExpandIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterable$(S, T), [IterableOfS(), _ExpandFunctionOfS$T()])}),
    fields: () => ({
      [_iterable$]: IterableOfS(),
      [_f]: _ExpandFunctionOfS$T()
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
  });
  dart.defineExtensionMembers(ExpandIterable, ['iterator']);
  return ExpandIterable;
});
_internal.ExpandIterable = ExpandIterable();
const _currentExpansion = Symbol('_currentExpansion');
_internal.ExpandIterator$ = dart.generic((S, T) => {
  let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
  let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
  let EmptyIteratorOfT = () => (EmptyIteratorOfT = dart.constFn(_internal.EmptyIterator$(T)))();
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  class ExpandIterator extends core.Object {
    new(iterator, f) {
      this[_iterator] = iterator;
      this[_f] = f;
      this[_currentExpansion] = dart.const(new (EmptyIteratorOfT())());
      this[_current$] = null;
    }
    get current() {
      return this[_current$];
    }
    moveNext() {
      if (this[_currentExpansion] == null) return false;
      while (!dart.test(this[_currentExpansion].moveNext())) {
        this[_current$] = null;
        if (dart.test(this[_iterator].moveNext())) {
          this[_currentExpansion] = null;
          this[_currentExpansion] = this[_f](this[_iterator].current)[dartx.iterator];
        } else {
          return false;
        }
      }
      this[_current$] = this[_currentExpansion].current;
      return true;
    }
  }
  dart.addTypeTests(ExpandIterator);
  ExpandIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(ExpandIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterator$(S, T), [IteratorOfS(), _ExpandFunctionOfS$T()])}),
    fields: () => ({
      [_iterator]: IteratorOfS(),
      [_f]: _ExpandFunctionOfS$T(),
      [_currentExpansion]: IteratorOfT(),
      [_current$]: T
    }),
    getters: () => ({current: dart.definiteFunctionType(T, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return ExpandIterator;
});
_internal.ExpandIterator = ExpandIterator();
const _takeCount = Symbol('_takeCount');
_internal.TakeIterable$ = dart.generic(E => {
  let EfficientLengthTakeIterableOfE = () => (EfficientLengthTakeIterableOfE = dart.constFn(_internal.EfficientLengthTakeIterable$(E)))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeIteratorOfE = () => (TakeIteratorOfE = dart.constFn(_internal.TakeIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class TakeIterable extends core.Iterable$(E) {
    static new(iterable, takeCount) {
      if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
        dart.throw(new core.ArgumentError(takeCount));
      }
      if (_internal.EfficientLength.is(iterable)) {
        return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
      }
      return new (TakeIterableOfE())._(iterable, takeCount);
    }
    _(iterable, takeCount) {
      this[_iterable$] = iterable;
      this[_takeCount] = takeCount;
      super.new();
    }
    get iterator() {
      return new (TakeIteratorOfE())(this[_iterable$][dartx.iterator], this[_takeCount]);
    }
  }
  dart.defineNamedConstructor(TakeIterable, '_');
  dart.setSignature(TakeIterable, {
    constructors: () => ({
      new: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int]),
      _: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int])
    }),
    fields: () => ({
      [_iterable$]: IterableOfE(),
      [_takeCount]: core.int
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(TakeIterable, ['iterator']);
  return TakeIterable;
});
_internal.TakeIterable = TakeIterable();
_internal.EfficientLengthTakeIterable$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
    new(iterable, takeCount) {
      super._(iterable, takeCount);
    }
    get length() {
      let iterableLength = this[_iterable$][dartx.length];
      if (dart.notNull(iterableLength) > dart.notNull(this[_takeCount])) return this[_takeCount];
      return iterableLength;
    }
  }
  EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(EfficientLengthTakeIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthTakeIterable$(E), [IterableOfE(), core.int])})
  });
  dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
  return EfficientLengthTakeIterable;
});
_internal.EfficientLengthTakeIterable = EfficientLengthTakeIterable();
const _remaining = Symbol('_remaining');
_internal.TakeIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class TakeIterator extends core.Iterator$(E) {
    new(iterator, remaining) {
      this[_iterator] = iterator;
      this[_remaining] = remaining;
      dart.assert(typeof this[_remaining] == 'number' && dart.notNull(this[_remaining]) >= 0);
    }
    moveNext() {
      this[_remaining] = dart.notNull(this[_remaining]) - 1;
      if (dart.notNull(this[_remaining]) >= 0) {
        return this[_iterator].moveNext();
      }
      this[_remaining] = -1;
      return false;
    }
    get current() {
      if (dart.notNull(this[_remaining]) < 0) return null;
      return this[_iterator].current;
    }
  }
  dart.setSignature(TakeIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.TakeIterator$(E), [IteratorOfE(), core.int])}),
    fields: () => ({
      [_iterator]: IteratorOfE(),
      [_remaining]: core.int
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return TakeIterator;
});
_internal.TakeIterator = TakeIterator();
_internal.TakeWhileIterable$ = dart.generic(E => {
  let TakeWhileIteratorOfE = () => (TakeWhileIteratorOfE = dart.constFn(_internal.TakeWhileIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
  class TakeWhileIterable extends core.Iterable$(E) {
    new(iterable, f) {
      this[_iterable$] = iterable;
      this[_f] = f;
      super.new();
    }
    get iterator() {
      return new (TakeWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
    }
  }
  dart.setSignature(TakeWhileIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
    fields: () => ({
      [_iterable$]: IterableOfE(),
      [_f]: _ElementPredicateOfE()
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(TakeWhileIterable, ['iterator']);
  return TakeWhileIterable;
});
_internal.TakeWhileIterable = TakeWhileIterable();
const _isFinished = Symbol('_isFinished');
_internal.TakeWhileIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
  class TakeWhileIterator extends core.Iterator$(E) {
    new(iterator, f) {
      this[_iterator] = iterator;
      this[_f] = f;
      this[_isFinished] = false;
    }
    moveNext() {
      if (dart.test(this[_isFinished])) return false;
      if (!dart.test(this[_iterator].moveNext()) || !dart.test(this[_f](this[_iterator].current))) {
        this[_isFinished] = true;
        return false;
      }
      return true;
    }
    get current() {
      if (dart.test(this[_isFinished])) return null;
      return this[_iterator].current;
    }
  }
  dart.setSignature(TakeWhileIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
    fields: () => ({
      [_iterator]: IteratorOfE(),
      [_f]: _ElementPredicateOfE(),
      [_isFinished]: core.bool
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return TakeWhileIterator;
});
_internal.TakeWhileIterator = TakeWhileIterator();
const _skipCount = Symbol('_skipCount');
_internal.SkipIterable$ = dart.generic(E => {
  let EfficientLengthSkipIterableOfE = () => (EfficientLengthSkipIterableOfE = dart.constFn(_internal.EfficientLengthSkipIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipIteratorOfE = () => (SkipIteratorOfE = dart.constFn(_internal.SkipIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class SkipIterable extends core.Iterable$(E) {
    static new(iterable, count) {
      if (_internal.EfficientLength.is(iterable)) {
        return new (EfficientLengthSkipIterableOfE())(iterable, count);
      }
      return new (SkipIterableOfE())._(iterable, count);
    }
    _(iterable, skipCount) {
      this[_iterable$] = iterable;
      this[_skipCount] = skipCount;
      super.new();
      if (!(typeof this[_skipCount] == 'number')) {
        dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
      }
      core.RangeError.checkNotNegative(this[_skipCount], "count");
    }
    skip(count) {
      if (!(typeof this[_skipCount] == 'number')) {
        dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
      }
      core.RangeError.checkNotNegative(this[_skipCount], "count");
      return new (SkipIterableOfE())._(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(count));
    }
    get iterator() {
      return new (SkipIteratorOfE())(this[_iterable$][dartx.iterator], this[_skipCount]);
    }
  }
  dart.defineNamedConstructor(SkipIterable, '_');
  dart.setSignature(SkipIterable, {
    constructors: () => ({
      new: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int]),
      _: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int])
    }),
    fields: () => ({
      [_iterable$]: IterableOfE(),
      [_skipCount]: core.int
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(SkipIterable, ['skip', 'iterator']);
  return SkipIterable;
});
_internal.SkipIterable = SkipIterable();
_internal.EfficientLengthSkipIterable$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
    new(iterable, skipCount) {
      super._(iterable, skipCount);
    }
    get length() {
      let length = dart.notNull(this[_iterable$][dartx.length]) - dart.notNull(this[_skipCount]);
      if (length >= 0) return length;
      return 0;
    }
  }
  EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(EfficientLengthSkipIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthSkipIterable$(E), [IterableOfE(), core.int])})
  });
  dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
  return EfficientLengthSkipIterable;
});
_internal.EfficientLengthSkipIterable = EfficientLengthSkipIterable();
_internal.SkipIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class SkipIterator extends core.Iterator$(E) {
    new(iterator, skipCount) {
      this[_iterator] = iterator;
      this[_skipCount] = skipCount;
      dart.assert(typeof this[_skipCount] == 'number' && dart.notNull(this[_skipCount]) >= 0);
    }
    moveNext() {
      for (let i = 0; i < dart.notNull(this[_skipCount]); i++)
        this[_iterator].moveNext();
      this[_skipCount] = 0;
      return this[_iterator].moveNext();
    }
    get current() {
      return this[_iterator].current;
    }
  }
  dart.setSignature(SkipIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.SkipIterator$(E), [IteratorOfE(), core.int])}),
    fields: () => ({
      [_iterator]: IteratorOfE(),
      [_skipCount]: core.int
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return SkipIterator;
});
_internal.SkipIterator = SkipIterator();
_internal.SkipWhileIterable$ = dart.generic(E => {
  let SkipWhileIteratorOfE = () => (SkipWhileIteratorOfE = dart.constFn(_internal.SkipWhileIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
  class SkipWhileIterable extends core.Iterable$(E) {
    new(iterable, f) {
      this[_iterable$] = iterable;
      this[_f] = f;
      super.new();
    }
    get iterator() {
      return new (SkipWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
    }
  }
  dart.setSignature(SkipWhileIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
    fields: () => ({
      [_iterable$]: IterableOfE(),
      [_f]: _ElementPredicateOfE()
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(SkipWhileIterable, ['iterator']);
  return SkipWhileIterable;
});
_internal.SkipWhileIterable = SkipWhileIterable();
const _hasSkipped = Symbol('_hasSkipped');
_internal.SkipWhileIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
  class SkipWhileIterator extends core.Iterator$(E) {
    new(iterator, f) {
      this[_iterator] = iterator;
      this[_f] = f;
      this[_hasSkipped] = false;
    }
    moveNext() {
      if (!dart.test(this[_hasSkipped])) {
        this[_hasSkipped] = true;
        while (dart.test(this[_iterator].moveNext())) {
          if (!dart.test(this[_f](this[_iterator].current))) return true;
        }
      }
      return this[_iterator].moveNext();
    }
    get current() {
      return this[_iterator].current;
    }
  }
  dart.setSignature(SkipWhileIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
    fields: () => ({
      [_iterator]: IteratorOfE(),
      [_f]: _ElementPredicateOfE(),
      [_hasSkipped]: core.bool
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return SkipWhileIterator;
});
_internal.SkipWhileIterator = SkipWhileIterator();
_internal.EmptyIterable$ = dart.generic(E => {
  let EmptyIteratorOfE = () => (EmptyIteratorOfE = dart.constFn(_internal.EmptyIterator$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  class EmptyIterable extends core.Iterable$(E) {
    new() {
      super.new();
    }
    get iterator() {
      return dart.const(new (EmptyIteratorOfE())());
    }
    forEach(action) {}
    get isEmpty() {
      return true;
    }
    get length() {
      return 0;
    }
    get first() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    get last() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    get single() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      dart.throw(new core.RangeError.range(index, 0, 0, "index"));
    }
    contains(element) {
      return false;
    }
    every(test) {
      return true;
    }
    any(test) {
      return false;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    join(separator) {
      if (separator === void 0) separator = "";
      return "";
    }
    where(test) {
      return this;
    }
    map(T) {
      return f => {
        return dart.const(new (_internal.EmptyIterable$(T))());
      };
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      dart.throw(_internal.IterableElementError.noElement());
    }
    fold(T) {
      return (initialValue, combine) => {
        return initialValue;
      };
    }
    skip(count) {
      core.RangeError.checkNotNegative(count, "count");
      return this;
    }
    skipWhile(test) {
      return this;
    }
    take(count) {
      core.RangeError.checkNotNegative(count, "count");
      return this;
    }
    takeWhile(test) {
      return this;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return dart.test(growable) ? JSArrayOfE().of([]) : ListOfE().new(0);
    }
    toSet() {
      return SetOfE().new();
    }
  }
  EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(EmptyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterable$(E), [])}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
  });
  dart.defineExtensionMembers(EmptyIterable, [
    'forEach',
    'elementAt',
    'contains',
    'every',
    'any',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'join',
    'where',
    'map',
    'reduce',
    'fold',
    'skip',
    'skipWhile',
    'take',
    'takeWhile',
    'toList',
    'toSet',
    'iterator',
    'isEmpty',
    'length',
    'first',
    'last',
    'single'
  ]);
  return EmptyIterable;
});
_internal.EmptyIterable = EmptyIterable();
_internal.EmptyIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class EmptyIterator extends core.Object {
    new() {
    }
    moveNext() {
      return false;
    }
    get current() {
      return null;
    }
  }
  dart.addTypeTests(EmptyIterator);
  EmptyIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(EmptyIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterator$(E), [])}),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return EmptyIterator;
});
_internal.EmptyIterator = EmptyIterator();
_internal.IterableElementError = class IterableElementError extends core.Object {
  static noElement() {
    return new core.StateError("No element");
  }
  static tooMany() {
    return new core.StateError("Too many elements");
  }
  static tooFew() {
    return new core.StateError("Too few elements");
  }
};
dart.setSignature(_internal.IterableElementError, {
  statics: () => ({
    noElement: dart.definiteFunctionType(core.StateError, []),
    tooMany: dart.definiteFunctionType(core.StateError, []),
    tooFew: dart.definiteFunctionType(core.StateError, [])
  }),
  names: ['noElement', 'tooMany', 'tooFew']
});
_internal.FixedLengthListMixin$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  dart.defineExtensionNames([
    'length',
    'add',
    'insert',
    'insertAll',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    'removeAt',
    'removeLast',
    'removeRange',
    'replaceRange'
  ]);
  class FixedLengthListMixin extends core.Object {
    set length(newLength) {
      dart.throw(new core.UnsupportedError("Cannot change the length of a fixed-length list"));
    }
    add(value) {
      E._check(value);
      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
    }
    insert(index, value) {
      E._check(value);
      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
    }
    insertAll(at, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
    }
    remove(element) {
      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
    }
    retainWhere(test) {
      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
    }
    clear() {
      dart.throw(new core.UnsupportedError("Cannot clear a fixed-length list"));
    }
    removeAt(index) {
      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
    }
    removeLast() {
      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
    }
    removeRange(start, end) {
      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
    }
  }
  dart.addTypeTests(FixedLengthListMixin);
  dart.setSignature(FixedLengthListMixin, {
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [E]),
      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      clear: dart.definiteFunctionType(dart.void, []),
      removeAt: dart.definiteFunctionType(E, [core.int]),
      removeLast: dart.definiteFunctionType(E, []),
      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()])
    })
  });
  dart.defineExtensionMembers(FixedLengthListMixin, [
    'add',
    'insert',
    'insertAll',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    'removeAt',
    'removeLast',
    'removeRange',
    'replaceRange',
    'length'
  ]);
  return FixedLengthListMixin;
});
_internal.FixedLengthListMixin = FixedLengthListMixin();
_internal.FixedLengthListBase$ = dart.generic(E => {
  class FixedLengthListBase extends dart.mixin(collection.ListBase$(E), _internal.FixedLengthListMixin$(E)) {
    new() {
      super.new();
    }
  }
  return FixedLengthListBase;
});
_internal.FixedLengthListBase = FixedLengthListBase();
const _backedList = Symbol('_backedList');
_internal._ListIndicesIterable = class _ListIndicesIterable extends _internal.ListIterable$(core.int) {
  new(backedList) {
    this[_backedList] = backedList;
    super.new();
  }
  get length() {
    return this[_backedList][dartx.length];
  }
  elementAt(index) {
    core.RangeError.checkValidIndex(index, this);
    return index;
  }
};
dart.addSimpleTypeTests(_internal._ListIndicesIterable);
dart.setSignature(_internal._ListIndicesIterable, {
  constructors: () => ({new: dart.definiteFunctionType(_internal._ListIndicesIterable, [core.List])}),
  fields: () => ({[_backedList]: core.List})
});
dart.defineExtensionMembers(_internal._ListIndicesIterable, ['elementAt', 'length']);
const _values = Symbol('_values');
_internal.ListMapView$ = dart.generic(E => {
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let MapOfint$E = () => (MapOfint$E = dart.constFn(core.Map$(core.int, E)))();
  let intAndETovoid = () => (intAndETovoid = dart.constFn(dart.functionType(dart.void, [core.int, E])))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  class ListMapView extends core.Object {
    new(values) {
      this[_values] = values;
    }
    _get(key) {
      return dart.test(this.containsKey(key)) ? this[_values][dartx._get](core.int._check(key)) : null;
    }
    get length() {
      return this[_values][dartx.length];
    }
    get values() {
      return new (SubListIterableOfE())(this[_values], 0, null);
    }
    get keys() {
      return new _internal._ListIndicesIterable(this[_values]);
    }
    get isEmpty() {
      return this[_values][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_values][dartx.isNotEmpty];
    }
    containsValue(value) {
      return this[_values][dartx.contains](value);
    }
    containsKey(key) {
      return typeof key == 'number' && dart.notNull(key) >= 0 && dart.notNull(key) < dart.notNull(this.length);
    }
    forEach(f) {
      let length = this[_values][dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        f(i, this[_values][dartx._get](i));
        if (length != this[_values][dartx.length]) {
          dart.throw(new core.ConcurrentModificationError(this[_values]));
        }
      }
    }
    _set(key, value) {
      E._check(value);
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      VoidToE()._check(ifAbsent);
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
    }
    remove(key) {
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
    }
    clear() {
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
    }
    addAll(other) {
      MapOfint$E()._check(other);
      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
  }
  dart.addTypeTests(ListMapView);
  ListMapView[dart.implements] = () => [MapOfint$E()];
  dart.setSignature(ListMapView, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.ListMapView$(E), [ListOfE()])}),
    fields: () => ({[_values]: ListOfE()}),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      values: dart.definiteFunctionType(core.Iterable$(E), []),
      keys: dart.definiteFunctionType(core.Iterable$(core.int), []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(E, [core.Object]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      forEach: dart.definiteFunctionType(dart.void, [intAndETovoid()]),
      _set: dart.definiteFunctionType(dart.void, [core.int, E]),
      putIfAbsent: dart.definiteFunctionType(E, [core.int, VoidToE()]),
      remove: dart.definiteFunctionType(E, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      addAll: dart.definiteFunctionType(dart.void, [MapOfint$E()])
    })
  });
  dart.defineExtensionMembers(ListMapView, [
    '_get',
    'containsValue',
    'containsKey',
    'forEach',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'addAll',
    'length',
    'values',
    'keys',
    'isEmpty',
    'isNotEmpty'
  ]);
  return ListMapView;
});
_internal.ListMapView = ListMapView();
_internal.ReversedListIterable$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class ReversedListIterable extends _internal.ListIterable$(E) {
    new(source) {
      this[_source] = source;
      super.new();
    }
    get length() {
      return this[_source][dartx.length];
    }
    elementAt(index) {
      return this[_source][dartx.elementAt](dart.notNull(this[_source][dartx.length]) - 1 - dart.notNull(index));
    }
  }
  dart.setSignature(ReversedListIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.ReversedListIterable$(E), [IterableOfE()])}),
    fields: () => ({[_source]: IterableOfE()})
  });
  dart.defineExtensionMembers(ReversedListIterable, ['elementAt', 'length']);
  return ReversedListIterable;
});
_internal.ReversedListIterable = ReversedListIterable();
_internal.UnmodifiableListError = class UnmodifiableListError extends core.Object {
  static add() {
    return new core.UnsupportedError("Cannot add to unmodifiable List");
  }
  static change() {
    return new core.UnsupportedError("Cannot change the content of an unmodifiable List");
  }
  static length() {
    return new core.UnsupportedError("Cannot change length of unmodifiable List");
  }
  static remove() {
    return new core.UnsupportedError("Cannot remove from unmodifiable List");
  }
};
dart.setSignature(_internal.UnmodifiableListError, {
  statics: () => ({
    add: dart.definiteFunctionType(core.UnsupportedError, []),
    change: dart.definiteFunctionType(core.UnsupportedError, []),
    length: dart.definiteFunctionType(core.UnsupportedError, []),
    remove: dart.definiteFunctionType(core.UnsupportedError, [])
  }),
  names: ['add', 'change', 'length', 'remove']
});
_internal.NonGrowableListError = class NonGrowableListError extends core.Object {
  static add() {
    return new core.UnsupportedError("Cannot add to non-growable List");
  }
  static length() {
    return new core.UnsupportedError("Cannot change length of non-growable List");
  }
  static remove() {
    return new core.UnsupportedError("Cannot remove from non-growable List");
  }
};
dart.setSignature(_internal.NonGrowableListError, {
  statics: () => ({
    add: dart.definiteFunctionType(core.UnsupportedError, []),
    length: dart.definiteFunctionType(core.UnsupportedError, []),
    remove: dart.definiteFunctionType(core.UnsupportedError, [])
  }),
  names: ['add', 'length', 'remove']
});
_internal.makeListFixedLength = function(E) {
  return growableList => {
    _interceptors.JSArray.markFixedList(growableList);
    return growableList;
  };
};
dart.lazyFn(_internal.makeListFixedLength, () => ListOfEToListOfE());
_internal.makeFixedListUnmodifiable = function(E) {
  return fixedLengthList => {
    _interceptors.JSArray.markUnmodifiableList(fixedLengthList);
    return fixedLengthList;
  };
};
dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
_internal.Lists = class Lists extends core.Object {
  static copy(src, srcStart, dst, dstStart, count) {
    if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
      for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
        dst[dartx._set](j, src[dartx._get](i));
      }
    } else {
      for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
        dst[dartx._set](j, src[dartx._get](i));
      }
    }
  }
  static areEqual(a, b) {
    if (core.identical(a, b)) return true;
    if (!core.List.is(b)) return false;
    let length = a[dartx.length];
    if (!dart.equals(length, dart.dload(b, 'length'))) return false;
    for (let i = 0; i < dart.notNull(length); i++) {
      if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
    }
    return true;
  }
  static indexOf(a, element, startIndex, endIndex) {
    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
      return -1;
    }
    if (dart.notNull(startIndex) < 0) {
      startIndex = 0;
    }
    for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
      if (dart.equals(a[dartx._get](i), element)) {
        return i;
      }
    }
    return -1;
  }
  static lastIndexOf(a, element, startIndex) {
    if (dart.notNull(startIndex) < 0) {
      return -1;
    }
    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
      startIndex = dart.notNull(a[dartx.length]) - 1;
    }
    for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
      if (dart.equals(a[dartx._get](i), element)) {
        return i;
      }
    }
    return -1;
  }
  static indicesCheck(a, start, end) {
    core.RangeError.checkValidRange(start, end, a[dartx.length]);
  }
  static rangeCheck(a, start, length) {
    core.RangeError.checkNotNegative(length);
    core.RangeError.checkNotNegative(start);
    if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
      let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
      dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
    }
  }
};
dart.setSignature(_internal.Lists, {
  statics: () => ({
    copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
    areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
    indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
    lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
    indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
    rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
  }),
  names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
});
_internal.printToZone = null;
_internal.printToConsole = function(line) {
  _js_primitives.printString(dart.str`${line}`);
};
dart.lazyFn(_internal.printToConsole, () => StringTovoid$());
_internal.Sort = class Sort extends core.Object {
  static sort(E) {
    return (a, compare) => {
      _internal.Sort._doSort(E)(a, 0, dart.notNull(a[dartx.length]) - 1, compare);
    };
  }
  static sortRange(E) {
    return (a, from, to, compare) => {
      if (dart.notNull(from) < 0 || dart.notNull(to) > dart.notNull(a[dartx.length]) || dart.notNull(to) < dart.notNull(from)) {
        dart.throw("OutOfRange");
      }
      _internal.Sort._doSort(E)(a, from, dart.notNull(to) - 1, compare);
    };
  }
  static _doSort(E) {
    return (a, left, right, compare) => {
      if (dart.notNull(right) - dart.notNull(left) <= _internal.Sort._INSERTION_SORT_THRESHOLD) {
        _internal.Sort._insertionSort(E)(a, left, right, compare);
      } else {
        _internal.Sort._dualPivotQuicksort(E)(a, left, right, compare);
      }
    };
  }
  static _insertionSort(E) {
    return (a, left, right, compare) => {
      for (let i = dart.notNull(left) + 1; i <= dart.notNull(right); i++) {
        let el = a[dartx._get](i);
        let j = i;
        while (j > dart.notNull(left) && dart.notNull(compare(a[dartx._get](j - 1), el)) > 0) {
          a[dartx._set](j, a[dartx._get](j - 1));
          j--;
        }
        a[dartx._set](j, el);
      }
    };
  }
  static _dualPivotQuicksort(E) {
    return (a, left, right, compare) => {
      dart.assert(dart.notNull(right) - dart.notNull(left) > _internal.Sort._INSERTION_SORT_THRESHOLD);
      let sixth = ((dart.notNull(right) - dart.notNull(left) + 1) / 6)[dartx.truncate]();
      let index1 = dart.notNull(left) + sixth;
      let index5 = dart.notNull(right) - sixth;
      let index3 = ((dart.notNull(left) + dart.notNull(right)) / 2)[dartx.truncate]();
      let index2 = index3 - sixth;
      let index4 = index3 + sixth;
      let el1 = a[dartx._get](index1);
      let el2 = a[dartx._get](index2);
      let el3 = a[dartx._get](index3);
      let el4 = a[dartx._get](index4);
      let el5 = a[dartx._get](index5);
      if (dart.notNull(compare(el1, el2)) > 0) {
        let t = el1;
        el1 = el2;
        el2 = t;
      }
      if (dart.notNull(compare(el4, el5)) > 0) {
        let t = el4;
        el4 = el5;
        el5 = t;
      }
      if (dart.notNull(compare(el1, el3)) > 0) {
        let t = el1;
        el1 = el3;
        el3 = t;
      }
      if (dart.notNull(compare(el2, el3)) > 0) {
        let t = el2;
        el2 = el3;
        el3 = t;
      }
      if (dart.notNull(compare(el1, el4)) > 0) {
        let t = el1;
        el1 = el4;
        el4 = t;
      }
      if (dart.notNull(compare(el3, el4)) > 0) {
        let t = el3;
        el3 = el4;
        el4 = t;
      }
      if (dart.notNull(compare(el2, el5)) > 0) {
        let t = el2;
        el2 = el5;
        el5 = t;
      }
      if (dart.notNull(compare(el2, el3)) > 0) {
        let t = el2;
        el2 = el3;
        el3 = t;
      }
      if (dart.notNull(compare(el4, el5)) > 0) {
        let t = el4;
        el4 = el5;
        el5 = t;
      }
      let pivot1 = el2;
      let pivot2 = el4;
      a[dartx._set](index1, el1);
      a[dartx._set](index3, el3);
      a[dartx._set](index5, el5);
      a[dartx._set](index2, a[dartx._get](left));
      a[dartx._set](index4, a[dartx._get](right));
      let less = dart.notNull(left) + 1;
      let great = dart.notNull(right) - 1;
      let pivots_are_equal = compare(pivot1, pivot2) == 0;
      if (pivots_are_equal) {
        let pivot = pivot1;
        for (let k = less; k <= great; k++) {
          let ak = a[dartx._get](k);
          let comp = compare(ak, pivot);
          if (comp == 0) continue;
          if (dart.notNull(comp) < 0) {
            if (k != less) {
              a[dartx._set](k, a[dartx._get](less));
              a[dartx._set](less, ak);
            }
            less++;
          } else {
            while (true) {
              comp = compare(a[dartx._get](great), pivot);
              if (dart.notNull(comp) > 0) {
                great--;
                continue;
              } else if (dart.notNull(comp) < 0) {
                a[dartx._set](k, a[dartx._get](less));
                a[dartx._set](less++, a[dartx._get](great));
                a[dartx._set](great--, ak);
                break;
              } else {
                a[dartx._set](k, a[dartx._get](great));
                a[dartx._set](great--, ak);
                break;
              }
            }
          }
        }
      } else {
        for (let k = less; k <= great; k++) {
          let ak = a[dartx._get](k);
          let comp_pivot1 = compare(ak, pivot1);
          if (dart.notNull(comp_pivot1) < 0) {
            if (k != less) {
              a[dartx._set](k, a[dartx._get](less));
              a[dartx._set](less, ak);
            }
            less++;
          } else {
            let comp_pivot2 = compare(ak, pivot2);
            if (dart.notNull(comp_pivot2) > 0) {
              while (true) {
                let comp = compare(a[dartx._get](great), pivot2);
                if (dart.notNull(comp) > 0) {
                  great--;
                  if (great < k) break;
                  continue;
                } else {
                  comp = compare(a[dartx._get](great), pivot1);
                  if (dart.notNull(comp) < 0) {
                    a[dartx._set](k, a[dartx._get](less));
                    a[dartx._set](less++, a[dartx._get](great));
                    a[dartx._set](great--, ak);
                  } else {
                    a[dartx._set](k, a[dartx._get](great));
                    a[dartx._set](great--, ak);
                  }
                  break;
                }
              }
            }
          }
        }
      }
      a[dartx._set](left, a[dartx._get](less - 1));
      a[dartx._set](less - 1, pivot1);
      a[dartx._set](right, a[dartx._get](great + 1));
      a[dartx._set](great + 1, pivot2);
      _internal.Sort._doSort(E)(a, left, less - 2, compare);
      _internal.Sort._doSort(E)(a, great + 2, right, compare);
      if (pivots_are_equal) {
        return;
      }
      if (less < index1 && great > index5) {
        while (compare(a[dartx._get](less), pivot1) == 0) {
          less++;
        }
        while (compare(a[dartx._get](great), pivot2) == 0) {
          great--;
        }
        for (let k = less; k <= great; k++) {
          let ak = a[dartx._get](k);
          let comp_pivot1 = compare(ak, pivot1);
          if (comp_pivot1 == 0) {
            if (k != less) {
              a[dartx._set](k, a[dartx._get](less));
              a[dartx._set](less, ak);
            }
            less++;
          } else {
            let comp_pivot2 = compare(ak, pivot2);
            if (comp_pivot2 == 0) {
              while (true) {
                let comp = compare(a[dartx._get](great), pivot2);
                if (comp == 0) {
                  great--;
                  if (great < k) break;
                  continue;
                } else {
                  comp = compare(a[dartx._get](great), pivot1);
                  if (dart.notNull(comp) < 0) {
                    a[dartx._set](k, a[dartx._get](less));
                    a[dartx._set](less++, a[dartx._get](great));
                    a[dartx._set](great--, ak);
                  } else {
                    a[dartx._set](k, a[dartx._get](great));
                    a[dartx._set](great--, ak);
                  }
                  break;
                }
              }
            }
          }
        }
        _internal.Sort._doSort(E)(a, less, great, compare);
      } else {
        _internal.Sort._doSort(E)(a, less, great, compare);
      }
    };
  }
};
dart.setSignature(_internal.Sort, {
  sfields: () => ({_INSERTION_SORT_THRESHOLD: core.int}),
  statics: () => ({
    sort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), dart.functionType(core.int, [E, E])]]),
    sortRange: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
    _doSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
    _insertionSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
    _dualPivotQuicksort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]])
  }),
  names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
});
_internal.Sort._INSERTION_SORT_THRESHOLD = 32;
const _name$ = Symbol('_name');
const _nativeSymbol = Symbol('_nativeSymbol');
_internal.Symbol = class Symbol extends core.Object {
  new(name) {
    this[_name$] = name;
    this[_nativeSymbol] = null;
  }
  es6(name, nativeSymbol) {
    this[_name$] = name;
    this[_nativeSymbol] = nativeSymbol;
  }
  unvalidated(name) {
    this[_name$] = name;
    this[_nativeSymbol] = null;
  }
  validated(name) {
    this[_name$] = _internal.Symbol.validatePublicSymbol(name);
    this[_nativeSymbol] = null;
  }
  ['=='](other) {
    return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
  }
  get hashCode() {
    let hash = this._hashCode;
    if (hash != null) return hash;
    let arbitraryPrime = 664597;
    hash = 536870911 & arbitraryPrime * dart.notNull(dart.hashCode(this[_name$]));
    this._hashCode = hash;
    return hash;
  }
  toString() {
    return dart.str`Symbol("${this[_name$]}")`;
  }
  static getName(symbol) {
    return symbol[_name$];
  }
  static getNativeSymbol(symbol) {
    return symbol[_nativeSymbol];
  }
  static validatePublicSymbol(name) {
    if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
    if (dart.test(name[dartx.startsWith]('_'))) {
      dart.throw(new core.ArgumentError(dart.str`"${name}" is a private identifier`));
    }
    dart.throw(new core.ArgumentError(dart.str`"${name}" is not a valid (qualified) symbol name`));
  }
  static isValidSymbol(name) {
    return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
  }
};
dart.defineNamedConstructor(_internal.Symbol, 'es6');
dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
dart.defineNamedConstructor(_internal.Symbol, 'validated');
_internal.Symbol[dart.implements] = () => [core.Symbol];
dart.setSignature(_internal.Symbol, {
  constructors: () => ({
    new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
    es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
    unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
    validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
  }),
  fields: () => ({
    [_name$]: core.String,
    [_nativeSymbol]: dart.dynamic
  }),
  methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
  sfields: () => ({
    reservedWordRE: core.String,
    publicIdentifierRE: core.String,
    identifierRE: core.String,
    operatorRE: core.String,
    publicSymbolPattern: core.RegExp,
    symbolPattern: core.RegExp
  }),
  statics: () => ({
    getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
    getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
    validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
    isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
  }),
  names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
});
_internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
_internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
dart.defineLazy(_internal.Symbol, {
  get publicIdentifierRE() {
    return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$][\\w$]*';
  },
  get identifierRE() {
    return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$_][\\w$]*';
  },
  get publicSymbolPattern() {
    return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.publicIdentifierRE}(?:=?\$|[.](?!\$)))+?\$`);
  },
  get symbolPattern() {
    return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.identifierRE}(?:=?\$|[.](?!\$)))+?\$`);
  }
});
_isolate_helper._callInIsolate = function(isolate, func) {
  let result = isolate.eval(func);
  _isolate_helper._globalState.topEventLoop.run();
  return result;
};
dart.lazyFn(_isolate_helper._callInIsolate, () => _IsolateContextAndFunctionTodynamic());
const _activeJsAsyncCount = Symbol('_activeJsAsyncCount');
_isolate_helper.enterJsAsync = function() {
  let o = _isolate_helper._globalState.topEventLoop;
  o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) + 1;
};
dart.fn(_isolate_helper.enterJsAsync, VoidTodynamic$());
_isolate_helper.leaveJsAsync = function() {
  let o = _isolate_helper._globalState.topEventLoop;
  o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) - 1;
  dart.assert(dart.notNull(_isolate_helper._globalState.topEventLoop[_activeJsAsyncCount]) >= 0);
};
dart.fn(_isolate_helper.leaveJsAsync, VoidTodynamic$());
_isolate_helper.isWorker = function() {
  return _isolate_helper._globalState.isWorker;
};
dart.lazyFn(_isolate_helper.isWorker, () => VoidTobool());
_isolate_helper._currentIsolate = function() {
  return _isolate_helper._globalState.currentContext;
};
dart.lazyFn(_isolate_helper._currentIsolate, () => VoidTo_IsolateContext());
_isolate_helper.startRootIsolate = function(entry, args) {
  args = args;
  if (args == null) args = [];
  if (!core.List.is(args)) {
    dart.throw(new core.ArgumentError(dart.str`Arguments to main must be a List: ${args}`));
  }
  _isolate_helper._globalState = new _isolate_helper._Manager(core.Function._check(entry));
  if (dart.test(_isolate_helper._globalState.isWorker)) return;
  let rootContext = new _isolate_helper._IsolateContext();
  _isolate_helper._globalState.rootContext = rootContext;
  _isolate_helper._globalState.currentContext = rootContext;
  if (_isolate_helper._MainFunctionArgs.is(entry)) {
    rootContext.eval(dart.fn(() => {
      dart.dcall(entry, args);
    }, VoidToNull()));
  } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
    rootContext.eval(dart.fn(() => {
      dart.dcall(entry, args, null);
    }, VoidToNull()));
  } else {
    rootContext.eval(core.Function._check(entry));
  }
  _isolate_helper._globalState.topEventLoop.run();
};
dart.fn(_isolate_helper.startRootIsolate, dynamicAnddynamicTovoid$());
dart.copyProperties(_isolate_helper, {
  get _globalState() {
    return dart.globalState;
  },
  set _globalState(val) {
    dart.globalState = val;
  }
});
const _nativeDetectEnvironment = Symbol('_nativeDetectEnvironment');
const _nativeInitWorkerMessageHandler = Symbol('_nativeInitWorkerMessageHandler');
_isolate_helper._Manager = class _Manager extends core.Object {
  get useWorkers() {
    return this.supportsWorkers;
  }
  new(entry) {
    this.entry = entry;
    this.nextIsolateId = 0;
    this.currentManagerId = 0;
    this.nextManagerId = 1;
    this.currentContext = null;
    this.rootContext = null;
    this.topEventLoop = null;
    this.fromCommandLine = null;
    this.isWorker = null;
    this.supportsWorkers = null;
    this.isolates = null;
    this.mainManager = null;
    this.managers = null;
    this[_nativeDetectEnvironment]();
    this.topEventLoop = new _isolate_helper._EventLoop();
    this.isolates = MapOfint$_IsolateContext().new();
    this.managers = MapOfint$dynamic().new();
    if (dart.test(this.isWorker)) {
      this.mainManager = new _isolate_helper._MainManagerStub();
      this[_nativeInitWorkerMessageHandler]();
    }
  }
  [_nativeDetectEnvironment]() {
    let isWindowDefined = _isolate_helper.globalWindow != null;
    let isWorkerDefined = _isolate_helper.globalWorker != null;
    this.isWorker = !isWindowDefined && dart.test(_isolate_helper.globalPostMessageDefined);
    this.supportsWorkers = dart.test(this.isWorker) || isWorkerDefined && _isolate_helper.IsolateNatives.thisScript != null;
    this.fromCommandLine = !isWindowDefined && !dart.test(this.isWorker);
  }
  [_nativeInitWorkerMessageHandler]() {
    let func = (function(f, a) {
      return function(e) {
        f(a, e);
      };
    })(_isolate_helper.IsolateNatives._processWorkerMessage, this.mainManager);
    _isolate_helper.global.onmessage = func;
    _isolate_helper.global.dartPrint = _isolate_helper.global.dartPrint || (function(serialize) {
      return function(object) {
        var _self = _isolate_helper.global;
        if (_self.console && _self.console.log) {
          _self.console.log(object);
        } else {
          _self.postMessage(serialize(object));
        }
      };
    })(_isolate_helper._Manager._serializePrintMessage);
  }
  static _serializePrintMessage(object) {
    return _isolate_helper._serializeMessage(dart.map({command: "print", msg: object}, core.String, dart.dynamic));
  }
  maybeCloseWorker() {
    if (dart.test(this.isWorker) && dart.test(this.isolates[dartx.isEmpty]) && this.topEventLoop[_activeJsAsyncCount] == 0) {
      this.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'close'}, core.String, core.String)));
    }
  }
};
dart.setSignature(_isolate_helper._Manager, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Manager, [core.Function])}),
  fields: () => ({
    nextIsolateId: core.int,
    currentManagerId: core.int,
    nextManagerId: core.int,
    currentContext: _isolate_helper._IsolateContext,
    rootContext: _isolate_helper._IsolateContext,
    topEventLoop: _isolate_helper._EventLoop,
    fromCommandLine: core.bool,
    isWorker: core.bool,
    supportsWorkers: core.bool,
    isolates: MapOfint$_IsolateContext(),
    mainManager: _isolate_helper._MainManagerStub,
    managers: MapOfint$dynamic(),
    entry: core.Function
  }),
  getters: () => ({useWorkers: dart.definiteFunctionType(core.bool, [])}),
  methods: () => ({
    [_nativeDetectEnvironment]: dart.definiteFunctionType(dart.void, []),
    [_nativeInitWorkerMessageHandler]: dart.definiteFunctionType(dart.void, []),
    maybeCloseWorker: dart.definiteFunctionType(dart.void, [])
  }),
  statics: () => ({_serializePrintMessage: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
  names: ['_serializePrintMessage']
});
const _scheduledControlEvents = Symbol('_scheduledControlEvents');
const _isExecutingEvent = Symbol('_isExecutingEvent');
const _id = Symbol('_id');
const _updateGlobalState = Symbol('_updateGlobalState');
const _setGlobals = Symbol('_setGlobals');
const _addRegistration = Symbol('_addRegistration');
const _close = Symbol('_close');
_isolate_helper._IsolateContext = class _IsolateContext extends core.Object {
  new() {
    this.id = (() => {
      let o = _isolate_helper._globalState, x = o.nextIsolateId;
      o.nextIsolateId = dart.notNull(x) + 1;
      return x;
    })();
    this.ports = MapOfint$RawReceivePortImpl().new();
    this.weakPorts = SetOfint().new();
    this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
    this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
    this.pauseCapability = isolate.Capability.new();
    this.terminateCapability = isolate.Capability.new();
    this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
    this.pauseTokens = SetOfCapability().new();
    this.errorPorts = SetOfSendPort().new();
    this.initialized = false;
    this.isPaused = false;
    this.doneHandlers = null;
    this[_scheduledControlEvents] = null;
    this[_isExecutingEvent] = false;
    this.errorsAreFatal = true;
    this.registerWeak(this.controlPort[_id], this.controlPort);
  }
  addPause(authentification, resume) {
    if (!dart.equals(this.pauseCapability, authentification)) return;
    if (dart.test(this.pauseTokens.add(resume)) && !dart.test(this.isPaused)) {
      this.isPaused = true;
    }
    this[_updateGlobalState]();
  }
  removePause(resume) {
    if (!dart.test(this.isPaused)) return;
    this.pauseTokens.remove(resume);
    if (dart.test(this.pauseTokens.isEmpty)) {
      while (dart.test(this.delayedEvents[dartx.isNotEmpty])) {
        let event = this.delayedEvents[dartx.removeLast]();
        _isolate_helper._globalState.topEventLoop.prequeue(event);
      }
      this.isPaused = false;
    }
    this[_updateGlobalState]();
  }
  addDoneListener(responsePort) {
    if (this.doneHandlers == null) {
      this.doneHandlers = [];
    }
    if (dart.test(dart.dsend(this.doneHandlers, 'contains', responsePort))) return;
    dart.dsend(this.doneHandlers, 'add', responsePort);
  }
  removeDoneListener(responsePort) {
    if (this.doneHandlers == null) return;
    dart.dsend(this.doneHandlers, 'remove', responsePort);
  }
  setErrorsFatal(authentification, errorsAreFatal) {
    if (!dart.equals(this.terminateCapability, authentification)) return;
    this.errorsAreFatal = errorsAreFatal;
  }
  handlePing(responsePort, pingType) {
    if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
      responsePort.send(null);
      return;
    }
    function respond() {
      responsePort.send(null);
    }
    dart.fn(respond, VoidTovoid$());
    if (pingType == isolate.Isolate.AS_EVENT) {
      _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
      return;
    }
    dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
    if (this[_scheduledControlEvents] == null) {
      this[_scheduledControlEvents] = collection.Queue.new();
    }
    dart.dsend(this[_scheduledControlEvents], 'addLast', respond);
  }
  handleKill(authentification, priority) {
    if (!dart.equals(this.terminateCapability, authentification)) return;
    if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
      this.kill();
      return;
    }
    if (priority == isolate.Isolate.AS_EVENT) {
      _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
      return;
    }
    dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
    if (this[_scheduledControlEvents] == null) {
      this[_scheduledControlEvents] = collection.Queue.new();
    }
    dart.dsend(this[_scheduledControlEvents], 'addLast', dart.bind(this, 'kill'));
  }
  addErrorListener(port) {
    this.errorPorts.add(port);
  }
  removeErrorListener(port) {
    this.errorPorts.remove(port);
  }
  handleUncaughtError(error, stackTrace) {
    if (dart.test(this.errorPorts.isEmpty)) {
      if (dart.test(this.errorsAreFatal) && core.identical(this, _isolate_helper._globalState.rootContext)) {
        return;
      }
      if (_isolate_helper.global.console && _isolate_helper.global.console.error) {
        _isolate_helper.global.console.error(error, stackTrace);
      } else {
        core.print(error);
        if (stackTrace != null) core.print(stackTrace);
      }
      return;
    }
    let message = core.List.new(2);
    message[dartx._set](0, dart.toString(error));
    message[dartx._set](1, stackTrace == null ? null : dart.toString(stackTrace));
    for (let port of this.errorPorts)
      port.send(message);
  }
  eval(code) {
    let old = _isolate_helper._globalState.currentContext;
    _isolate_helper._globalState.currentContext = this;
    this[_setGlobals]();
    let result = null;
    this[_isExecutingEvent] = true;
    try {
      result = dart.dcall(code);
    } catch (e) {
      let s = dart.stackTrace(e);
      this.handleUncaughtError(e, s);
      if (dart.test(this.errorsAreFatal)) {
        this.kill();
        if (core.identical(this, _isolate_helper._globalState.rootContext)) {
          throw e;
        }
      }
    }
 finally {
      this[_isExecutingEvent] = false;
      _isolate_helper._globalState.currentContext = old;
      if (old != null) old[_setGlobals]();
      if (this[_scheduledControlEvents] != null) {
        while (dart.test(dart.dload(this[_scheduledControlEvents], 'isNotEmpty'))) {
          dart.dcall(dart.dsend(this[_scheduledControlEvents], 'removeFirst'));
        }
      }
    }
    return result;
  }
  [_setGlobals]() {
    _foreign_helper.JS_SET_CURRENT_ISOLATE(this.isolateStatics);
  }
  handleControlMessage(message) {
    switch (dart.dindex(message, 0)) {
      case "pause":
      {
        this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
        break;
      }
      case "resume":
      {
        this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
        break;
      }
      case 'add-ondone':
      {
        this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
        break;
      }
      case 'remove-ondone':
      {
        this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
        break;
      }
      case 'set-errors-fatal':
      {
        this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
        break;
      }
      case "ping":
      {
        this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
        break;
      }
      case "kill":
      {
        this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
        break;
      }
      case "getErrors":
      {
        this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
        break;
      }
      case "stopErrors":
      {
        this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
        break;
      }
      default:
    }
  }
  lookup(portId) {
    return this.ports[dartx._get](portId);
  }
  [_addRegistration](portId, port) {
    if (dart.test(this.ports[dartx.containsKey](portId))) {
      dart.throw(core.Exception.new("Registry: ports must be registered only once."));
    }
    this.ports[dartx._set](portId, port);
  }
  register(portId, port) {
    this[_addRegistration](portId, port);
    this[_updateGlobalState]();
  }
  registerWeak(portId, port) {
    this.weakPorts.add(portId);
    this[_addRegistration](portId, port);
  }
  [_updateGlobalState]() {
    if (dart.notNull(this.ports[dartx.length]) - dart.notNull(this.weakPorts.length) > 0 || dart.test(this.isPaused) || !dart.test(this.initialized)) {
      _isolate_helper._globalState.isolates[dartx._set](this.id, this);
    } else {
      this.kill();
    }
  }
  kill() {
    if (this[_scheduledControlEvents] != null) {
      dart.dsend(this[_scheduledControlEvents], 'clear');
    }
    for (let port of this.ports[dartx.values]) {
      port[_close]();
    }
    this.ports[dartx.clear]();
    this.weakPorts.clear();
    _isolate_helper._globalState.isolates[dartx.remove](this.id);
    this.errorPorts.clear();
    if (this.doneHandlers != null) {
      for (let port of core.Iterable._check(this.doneHandlers)) {
        isolate.SendPort._check(port);
        port.send(null);
      }
      this.doneHandlers = null;
    }
  }
  unregister(portId) {
    this.ports[dartx.remove](portId);
    this.weakPorts.remove(portId);
    this[_updateGlobalState]();
  }
};
_isolate_helper._IsolateContext[dart.implements] = () => [_foreign_helper.IsolateContext];
dart.setSignature(_isolate_helper._IsolateContext, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateContext, [])}),
  fields: () => ({
    id: core.int,
    ports: MapOfint$RawReceivePortImpl(),
    weakPorts: SetOfint(),
    isolateStatics: dart.dynamic,
    controlPort: _isolate_helper.RawReceivePortImpl,
    pauseCapability: isolate.Capability,
    terminateCapability: isolate.Capability,
    initialized: core.bool,
    isPaused: core.bool,
    delayedEvents: ListOf_IsolateEvent(),
    pauseTokens: SetOfCapability(),
    doneHandlers: dart.dynamic,
    [_scheduledControlEvents]: dart.dynamic,
    [_isExecutingEvent]: core.bool,
    errorsAreFatal: core.bool,
    errorPorts: SetOfSendPort()
  }),
  methods: () => ({
    addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
    removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
    addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
    removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
    setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
    handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
    handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
    handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
    eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
    [_setGlobals]: dart.definiteFunctionType(dart.void, []),
    handleControlMessage: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    lookup: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.int]),
    [_addRegistration]: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
    register: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
    registerWeak: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
    [_updateGlobalState]: dart.definiteFunctionType(dart.void, []),
    kill: dart.definiteFunctionType(dart.void, []),
    unregister: dart.definiteFunctionType(dart.void, [core.int])
  })
});
const _runHelper = Symbol('_runHelper');
_isolate_helper._EventLoop = class _EventLoop extends core.Object {
  new() {
    this.events = QueueOf_IsolateEvent().new();
    this[_activeJsAsyncCount] = 0;
  }
  enqueue(isolate, fn, msg) {
    this.events.addLast(new _isolate_helper._IsolateEvent(_isolate_helper._IsolateContext._check(isolate), core.Function._check(fn), core.String._check(msg)));
  }
  prequeue(event) {
    this.events.addFirst(event);
  }
  dequeue() {
    if (dart.test(this.events.isEmpty)) return null;
    return this.events.removeFirst();
  }
  checkOpenReceivePortsFromCommandLine() {
    if (_isolate_helper._globalState.rootContext != null && dart.test(_isolate_helper._globalState.isolates[dartx.containsKey](_isolate_helper._globalState.rootContext.id)) && dart.test(_isolate_helper._globalState.fromCommandLine) && dart.test(_isolate_helper._globalState.rootContext.ports[dartx.isEmpty])) {
      dart.throw(core.Exception.new("Program exited with open ReceivePorts."));
    }
  }
  runIteration() {
    let event = this.dequeue();
    if (event == null) {
      this.checkOpenReceivePortsFromCommandLine();
      _isolate_helper._globalState.maybeCloseWorker();
      return false;
    }
    event.process();
    return true;
  }
  [_runHelper]() {
    if (_isolate_helper.globalWindow != null) {
      const next = (function() {
        if (!dart.test(this.runIteration())) return;
        async.Timer.run(next);
      }).bind(this);
      dart.fn(next, VoidToNull());
      next();
    } else {
      while (dart.test(this.runIteration())) {
      }
    }
  }
  run() {
    if (!dart.test(_isolate_helper._globalState.isWorker)) {
      this[_runHelper]();
    } else {
      try {
        this[_runHelper]();
      } catch (e) {
        let trace = dart.stackTrace(e);
        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'error', msg: dart.str`${e}\n${trace}`}, core.String, core.String)));
      }

    }
  }
};
dart.setSignature(_isolate_helper._EventLoop, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._EventLoop, [])}),
  fields: () => ({
    events: QueueOf_IsolateEvent(),
    [_activeJsAsyncCount]: core.int
  }),
  methods: () => ({
    enqueue: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
    prequeue: dart.definiteFunctionType(dart.void, [_isolate_helper._IsolateEvent]),
    dequeue: dart.definiteFunctionType(_isolate_helper._IsolateEvent, []),
    checkOpenReceivePortsFromCommandLine: dart.definiteFunctionType(dart.void, []),
    runIteration: dart.definiteFunctionType(core.bool, []),
    [_runHelper]: dart.definiteFunctionType(dart.void, []),
    run: dart.definiteFunctionType(dart.void, [])
  })
});
_isolate_helper._IsolateEvent = class _IsolateEvent extends core.Object {
  new(isolate, fn, message) {
    this.isolate = isolate;
    this.fn = fn;
    this.message = message;
  }
  process() {
    if (dart.test(this.isolate.isPaused)) {
      this.isolate.delayedEvents[dartx.add](this);
      return;
    }
    this.isolate.eval(this.fn);
  }
};
dart.setSignature(_isolate_helper._IsolateEvent, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateEvent, [_isolate_helper._IsolateContext, core.Function, core.String])}),
  fields: () => ({
    isolate: _isolate_helper._IsolateContext,
    fn: core.Function,
    message: core.String
  }),
  methods: () => ({process: dart.definiteFunctionType(dart.void, [])})
});
dart.defineLazy(_isolate_helper, {
  get global() {
    return typeof global == 'undefined' ? self : global;
  }
});
_isolate_helper._MainManagerStub = class _MainManagerStub extends core.Object {
  postMessage(msg) {
    _isolate_helper.global.postMessage(msg);
  }
};
dart.setSignature(_isolate_helper._MainManagerStub, {
  methods: () => ({postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic])})
});
_isolate_helper._SPAWNED_SIGNAL = "spawned";
_isolate_helper._SPAWN_FAILED_SIGNAL = "spawn failed";
dart.copyProperties(_isolate_helper, {
  get globalWindow() {
    return _isolate_helper.global.window;
  }
});
dart.copyProperties(_isolate_helper, {
  get globalWorker() {
    return _isolate_helper.global.Worker;
  }
});
dart.copyProperties(_isolate_helper, {
  get globalPostMessageDefined() {
    return !!_isolate_helper.global.postMessage;
  }
});
_isolate_helper._MainFunction = dart.typedef('_MainFunction', () => dart.functionType(dart.dynamic, []));
_isolate_helper._MainFunctionArgs = dart.typedef('_MainFunctionArgs', () => dart.functionType(dart.dynamic, [dart.dynamic]));
_isolate_helper._MainFunctionArgsMessage = dart.typedef('_MainFunctionArgsMessage', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
_isolate_helper.IsolateNatives = class IsolateNatives extends core.Object {
  static computeThisScript() {
    let currentScript = document.currentScript;
    if (currentScript != null) {
      return String(currentScript.src);
    }
    if (dart.test(_js_helper.Primitives.isD8)) return _isolate_helper.IsolateNatives.computeThisScriptD8();
    if (dart.test(_js_helper.Primitives.isJsshell)) return _isolate_helper.IsolateNatives.computeThisScriptJsshell();
    if (_isolate_helper._globalState != null && dart.test(_isolate_helper._globalState.isWorker)) {
      return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
    }
    return null;
  }
  static computeThisScriptJsshell() {
    return thisFilename();
  }
  static computeThisScriptD8() {
    return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
  }
  static computeThisScriptFromTrace() {
    let stack = new Error().stack;
    if (stack == null) {
      stack = (function() {
        try {
          throw new Error();
        } catch (e) {
          return e.stack;
        }

      })();
      if (stack == null) dart.throw(new core.UnsupportedError('No stack trace'));
    }
    let pattern = null, matches = null;
    pattern = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m");
    matches = stack.match(pattern);
    if (matches != null) return matches[1];
    pattern = new RegExp("^[^@]*@(.*):[0-9]*$", "m");
    matches = stack.match(pattern);
    if (matches != null) return matches[1];
    dart.throw(new core.UnsupportedError(dart.str`Cannot extract URI from "${stack}"`));
  }
  static _getEventData(e) {
    return e.data;
  }
  static _processWorkerMessage(sender, e) {
    let msg = _isolate_helper._deserializeMessage(_isolate_helper.IsolateNatives._getEventData(e));
    switch (dart.dindex(msg, 'command')) {
      case 'start':
      {
        _isolate_helper._globalState.currentManagerId = core.int._check(dart.dindex(msg, 'id'));
        let functionName = core.String._check(dart.dindex(msg, 'functionName'));
        let entryPoint = core.Function._check(functionName == null ? _isolate_helper._globalState.entry : _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName));
        let args = dart.dindex(msg, 'args');
        let message = _isolate_helper._deserializeMessage(dart.dindex(msg, 'msg'));
        let isSpawnUri = dart.dindex(msg, 'isSpawnUri');
        let startPaused = dart.dindex(msg, 'startPaused');
        let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
        let context = new _isolate_helper._IsolateContext();
        _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
          _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
        }, VoidToNull()), 'worker-start');
        _isolate_helper._globalState.currentContext = context;
        _isolate_helper._globalState.topEventLoop.run();
        break;
      }
      case 'spawn-worker':
      {
        if (_isolate_helper.IsolateNatives.enableSpawnWorker != null) _isolate_helper.IsolateNatives.handleSpawnWorkerRequest(msg);
        break;
      }
      case 'message':
      {
        let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
        if (port != null) {
          dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
        }
        _isolate_helper._globalState.topEventLoop.run();
        break;
      }
      case 'close':
      {
        _isolate_helper._globalState.managers[dartx.remove](_isolate_helper.IsolateNatives.workerIds._get(sender));
        sender.terminate();
        _isolate_helper._globalState.topEventLoop.run();
        break;
      }
      case 'log':
      {
        _isolate_helper.IsolateNatives._log(dart.dindex(msg, 'msg'));
        break;
      }
      case 'print':
      {
        if (dart.test(_isolate_helper._globalState.isWorker)) {
          _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'print', msg: msg}, core.String, dart.dynamic)));
        } else {
          core.print(dart.dindex(msg, 'msg'));
        }
        break;
      }
      case 'error':
      {
        dart.throw(dart.dindex(msg, 'msg'));
      }
    }
  }
  static handleSpawnWorkerRequest(msg) {
    let replyPort = dart.dindex(msg, 'replyPort');
    _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
      dart.dsend(replyPort, 'send', msg);
    }, ListToNull()), {onError: dart.fn(errorMessage => {
        dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
      }, StringToNull())});
  }
  static _log(msg) {
    if (dart.test(_isolate_helper._globalState.isWorker)) {
      _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'log', msg: msg}, core.String, dart.dynamic)));
    } else {
      try {
        _isolate_helper.IsolateNatives._consoleLog(msg);
      } catch (e) {
        let trace = dart.stackTrace(e);
        dart.throw(core.Exception.new(trace));
      }

    }
  }
  static _consoleLog(msg) {
    _isolate_helper.global.console.log(msg);
  }
  static _getJSFunctionFromName(functionName) {
    let globalFunctionsContainer = _foreign_helper.JS_EMBEDDED_GLOBAL("", _js_embedded_names.GLOBAL_FUNCTIONS);
    return globalFunctionsContainer[functionName]();
  }
  static _getJSFunctionName(f) {
    return f.$name;
  }
  static _allocate(ctor) {
    return new ctor();
  }
  static spawnFunction(topLevelFunction, message, startPaused) {
    _isolate_helper.IsolateNatives.enableSpawnWorker = true;
    let name = _isolate_helper.IsolateNatives._getJSFunctionName(topLevelFunction);
    if (name == null) {
      dart.throw(new core.UnsupportedError("only top-level functions can be spawned."));
    }
    let isLight = false;
    let isSpawnUri = false;
    return _isolate_helper.IsolateNatives.spawn(name, null, null, message, isLight, isSpawnUri, startPaused);
  }
  static spawnUri(uri, args, message, startPaused) {
    _isolate_helper.IsolateNatives.enableSpawnWorker = true;
    let isLight = false;
    let isSpawnUri = true;
    return _isolate_helper.IsolateNatives.spawn(null, dart.toString(uri), args, message, isLight, isSpawnUri, startPaused);
  }
  static spawn(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
    if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
      uri = dart.notNull(uri) + ".js";
    }
    let port = isolate.ReceivePort.new();
    let completer = CompleterOfList().new();
    port.first.then(dart.dynamic)(dart.fn(msg => {
      if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
        completer.complete(msg);
      } else {
        dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
        completer.completeError(dart.dindex(msg, 1));
      }
    }, dynamicToNull$()));
    let signalReply = port.sendPort;
    if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
      _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
    } else {
      _isolate_helper.IsolateNatives._startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
    }
    return completer.future;
  }
  static _startWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
    if (args != null) args = ListOfString().from(args);
    if (dart.test(_isolate_helper._globalState.isWorker)) {
      _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'spawn-worker', functionName: functionName, args: args, msg: message, uri: uri, isSpawnUri: isSpawnUri, startPaused: startPaused, replyPort: replyPort}, core.String, core.Object)));
    } else {
      _isolate_helper.IsolateNatives._spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError);
    }
  }
  static _startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
    if (uri != null) {
      dart.throw(new core.UnsupportedError("Currently spawnUri is not supported without web workers."));
    }
    message = _isolate_helper._clone(message);
    if (args != null) args = ListOfString().from(args);
    _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
      let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
      _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
    }, VoidToNull()), 'nonworker start');
  }
  static get currentIsolate() {
    let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
    return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
  }
  static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
    let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
    _js_helper.Primitives.initializeStatics(context.id);
    replyTo.send(JSArrayOfObject().of([_isolate_helper._SPAWNED_SIGNAL, context.controlPort.sendPort, context.pauseCapability, context.terminateCapability]));
    function runStartFunction() {
      context.initialized = true;
      if (!dart.test(isSpawnUri)) {
        dart.dcall(topLevel, message);
      } else if (_isolate_helper._MainFunctionArgsMessage.is(topLevel)) {
        dart.dcall(topLevel, args, message);
      } else if (_isolate_helper._MainFunctionArgs.is(topLevel)) {
        dart.dcall(topLevel, args);
      } else {
        dart.dcall(topLevel);
      }
    }
    dart.fn(runStartFunction, VoidTovoid$());
    if (dart.test(startPaused)) {
      context.addPause(context.pauseCapability, context.pauseCapability);
      _isolate_helper._globalState.topEventLoop.enqueue(context, runStartFunction, 'start isolate');
    } else {
      runStartFunction();
    }
  }
  static _spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
    if (uri == null) uri = _isolate_helper.IsolateNatives.thisScript;
    let worker = new Worker(uri);
    let onerrorTrampoline = (function(f, u, c) {
      return function(e) {
        return f(e, u, c);
      };
    })(_isolate_helper.IsolateNatives.workerOnError, uri, onError);
    worker.onerror = onerrorTrampoline;
    let processWorkerMessageTrampoline = (function(f, a) {
      return function(e) {
        e.onerror = null;
        return f(a, e);
      };
    })(_isolate_helper.IsolateNatives._processWorkerMessage, worker);
    worker.onmessage = processWorkerMessageTrampoline;
    let o = _isolate_helper._globalState;
    let workerId = o.nextManagerId;
    o.nextManagerId = dart.notNull(workerId) + 1;
    _isolate_helper.IsolateNatives.workerIds._set(worker, workerId);
    _isolate_helper._globalState.managers[dartx._set](workerId, worker);
    worker.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'start', id: workerId, replyTo: _isolate_helper._serializeMessage(replyPort), args: args, msg: _isolate_helper._serializeMessage(message), isSpawnUri: isSpawnUri, startPaused: startPaused, functionName: functionName}, core.String, core.Object)));
  }
  static workerOnError(event, uri, onError) {
    event.preventDefault();
    let message = event.message;
    if (message == null) {
      message = dart.str`Error spawning worker for ${uri}`;
    } else {
      message = dart.str`Error spawning worker for ${uri} (${message})`;
    }
    onError(message);
    return true;
  }
};
dart.setSignature(_isolate_helper.IsolateNatives, {
  sfields: () => ({
    enableSpawnWorker: dart.dynamic,
    thisScript: core.String,
    workerIds: ExpandoOfint()
  }),
  sgetters: () => ({currentIsolate: dart.definiteFunctionType(isolate.Isolate, [])}),
  statics: () => ({
    computeThisScript: dart.definiteFunctionType(core.String, []),
    computeThisScriptJsshell: dart.definiteFunctionType(core.String, []),
    computeThisScriptD8: dart.definiteFunctionType(core.String, []),
    computeThisScriptFromTrace: dart.definiteFunctionType(core.String, []),
    _getEventData: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _processWorkerMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    handleSpawnWorkerRequest: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _log: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _consoleLog: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    _getJSFunctionFromName: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _getJSFunctionName: dart.definiteFunctionType(core.String, [core.Function]),
    _allocate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
    spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
    spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
    _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
    _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
    _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
    _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
    workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
  }),
  names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
});
_isolate_helper.IsolateNatives.enableSpawnWorker = null;
dart.defineLazy(_isolate_helper.IsolateNatives, {
  get thisScript() {
    return _isolate_helper.IsolateNatives.computeThisScript();
  },
  set thisScript(_) {},
  get workerIds() {
    return new (ExpandoOfint())();
  }
});
const _isolateId = Symbol('_isolateId');
const _checkReplyTo = Symbol('_checkReplyTo');
_isolate_helper._BaseSendPort = class _BaseSendPort extends core.Object {
  new(isolateId) {
    this[_isolateId] = isolateId;
  }
  [_checkReplyTo](replyTo) {
    if (replyTo != null && !_isolate_helper._NativeJsSendPort.is(replyTo) && !_isolate_helper._WorkerSendPort.is(replyTo)) {
      dart.throw(core.Exception.new("SendPort.send: Illegal replyTo port type"));
    }
  }
};
_isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
dart.setSignature(_isolate_helper._BaseSendPort, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._BaseSendPort, [core.int])}),
  fields: () => ({[_isolateId]: core.int}),
  methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
});
const _receivePort = Symbol('_receivePort');
const _isClosed = Symbol('_isClosed');
const _add = Symbol('_add');
_isolate_helper._NativeJsSendPort = class _NativeJsSendPort extends _isolate_helper._BaseSendPort {
  new(receivePort, isolateId) {
    this[_receivePort] = receivePort;
    super.new(isolateId);
  }
  send(message) {
    let isolate = _isolate_helper._globalState.isolates[dartx._get](this[_isolateId]);
    if (isolate == null) return;
    if (dart.test(this[_receivePort][_isClosed])) return;
    let msg = _isolate_helper._clone(message);
    if (dart.equals(isolate.controlPort, this[_receivePort])) {
      isolate.handleControlMessage(msg);
      return;
    }
    _isolate_helper._globalState.topEventLoop.enqueue(isolate, dart.fn(() => {
      if (!dart.test(this[_receivePort][_isClosed])) {
        this[_receivePort][_add](msg);
      }
    }, VoidToNull()), dart.str`receive ${message}`);
  }
  ['=='](other) {
    return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
  }
  get hashCode() {
    return this[_receivePort][_id];
  }
};
_isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
dart.setSignature(_isolate_helper._NativeJsSendPort, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._NativeJsSendPort, [_isolate_helper.RawReceivePortImpl, core.int])}),
  fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
  methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
});
const _workerId = Symbol('_workerId');
const _receivePortId = Symbol('_receivePortId');
_isolate_helper._WorkerSendPort = class _WorkerSendPort extends _isolate_helper._BaseSendPort {
  new(workerId, isolateId, receivePortId) {
    this[_workerId] = workerId;
    this[_receivePortId] = receivePortId;
    super.new(isolateId);
  }
  send(message) {
    let workerMessage = _isolate_helper._serializeMessage(dart.map({command: 'message', port: this, msg: message}, core.String, core.Object));
    if (dart.test(_isolate_helper._globalState.isWorker)) {
      _isolate_helper._globalState.mainManager.postMessage(workerMessage);
    } else {
      let manager = _isolate_helper._globalState.managers[dartx._get](this[_workerId]);
      if (manager != null) {
        manager.postMessage(workerMessage);
      }
    }
  }
  ['=='](other) {
    return _isolate_helper._WorkerSendPort.is(other) && this[_workerId] == other[_workerId] && this[_isolateId] == other[_isolateId] && this[_receivePortId] == other[_receivePortId];
  }
  get hashCode() {
    return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
  }
};
_isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
dart.setSignature(_isolate_helper._WorkerSendPort, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._WorkerSendPort, [core.int, core.int, core.int])}),
  fields: () => ({
    [_workerId]: core.int,
    [_receivePortId]: core.int
  }),
  methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
});
const _handler = Symbol('_handler');
_isolate_helper.RawReceivePortImpl = class RawReceivePortImpl extends core.Object {
  new(handler) {
    this[_handler] = handler;
    this[_id] = (() => {
      let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
      _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
      return x;
    })();
    this[_isClosed] = false;
    _isolate_helper._globalState.currentContext.register(this[_id], this);
  }
  weak(handler) {
    this[_handler] = handler;
    this[_id] = (() => {
      let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
      _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
      return x;
    })();
    this[_isClosed] = false;
    _isolate_helper._globalState.currentContext.registerWeak(this[_id], this);
  }
  _controlPort() {
    this[_handler] = null;
    this[_id] = 0;
    this[_isClosed] = false;
  }
  set handler(newHandler) {
    this[_handler] = newHandler;
  }
  [_close]() {
    this[_isClosed] = true;
    this[_handler] = null;
  }
  close() {
    if (dart.test(this[_isClosed])) return;
    this[_isClosed] = true;
    this[_handler] = null;
    _isolate_helper._globalState.currentContext.unregister(this[_id]);
  }
  [_add](dataEvent) {
    if (dart.test(this[_isClosed])) return;
    dart.dcall(this[_handler], dataEvent);
  }
  get sendPort() {
    return new _isolate_helper._NativeJsSendPort(this, _isolate_helper._globalState.currentContext.id);
  }
};
dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
_isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
dart.setSignature(_isolate_helper.RawReceivePortImpl, {
  constructors: () => ({
    new: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
    weak: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
    _controlPort: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [])
  }),
  fields: () => ({
    [_id]: core.int,
    [_handler]: core.Function,
    [_isClosed]: core.bool
  }),
  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
  setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
  methods: () => ({
    [_close]: dart.definiteFunctionType(dart.void, []),
    close: dart.definiteFunctionType(dart.void, []),
    [_add]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  sfields: () => ({_nextFreeId: core.int})
});
_isolate_helper.RawReceivePortImpl._nextFreeId = 1;
const _rawPort = Symbol('_rawPort');
const _controller = Symbol('_controller');
const _add$ = Symbol('_add');
const _closeUnchecked = Symbol('_closeUnchecked');
const _addError = Symbol('_addError');
const _completeError = Symbol('_completeError');
const _complete = Symbol('_complete');
const _sink = Symbol('_sink');
async.Stream$ = dart.generic(T => {
  let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
  let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
  let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
  let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
  let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
  let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
  let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
  let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  let _FutureOfListOfT = () => (_FutureOfListOfT = dart.constFn(async._Future$(ListOfT())))();
  let SetOfT = () => (SetOfT = dart.constFn(core.Set$(T)))();
  let _FutureOfSetOfT = () => (_FutureOfSetOfT = dart.constFn(async._Future$(SetOfT())))();
  let _TakeStreamOfT = () => (_TakeStreamOfT = dart.constFn(async._TakeStream$(T)))();
  let _TakeWhileStreamOfT = () => (_TakeWhileStreamOfT = dart.constFn(async._TakeWhileStream$(T)))();
  let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
  let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
  let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
  let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
  let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
  let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
  let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
  let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
  let IterableOfFutureOfT = () => (IterableOfFutureOfT = dart.constFn(core.Iterable$(FutureOfT())))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
  let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
  let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
  let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
  let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
  let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
  class Stream extends core.Object {
    new() {
    }
    _internal() {
    }
    static empty() {
      return new (_EmptyStreamOfT())();
    }
    static fromFuture(future) {
      let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
      future.then(dart.dynamic)(dart.fn(value => {
        controller[_add$](value);
        controller[_closeUnchecked]();
      }, TToNull()), {onError: dart.fn((error, stackTrace) => {
          controller[_addError](error, core.StackTrace._check(stackTrace));
          controller[_closeUnchecked]();
        }, dynamicAnddynamicToNull())});
      return controller.stream;
    }
    static fromFutures(futures) {
      let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
      let count = 0;
      let onValue = dart.fn(value => {
        if (!dart.test(controller.isClosed)) {
          controller[_add$](value);
          if (--count == 0) controller[_closeUnchecked]();
        }
      }, TToNull());
      let onError = dart.fn((error, stack) => {
        if (!dart.test(controller.isClosed)) {
          controller[_addError](error, core.StackTrace._check(stack));
          if (--count == 0) controller[_closeUnchecked]();
        }
      }, dynamicAnddynamicToNull());
      for (let future of futures) {
        count++;
        future.then(dart.dynamic)(onValue, {onError: onError});
      }
      if (count == 0) async.scheduleMicrotask(dart.bind(controller, 'close'));
      return controller.stream;
    }
    static fromIterable(data) {
      return new (_GeneratedStreamImplOfT())(dart.fn(() => new (_IterablePendingEventsOfT())(data), VoidTo_IterablePendingEventsOfT()));
    }
    static periodic(period, computation) {
      if (computation === void 0) computation = null;
      let timer = null;
      let computationCount = 0;
      let controller = null;
      let watch = new core.Stopwatch();
      function sendEvent() {
        watch.reset();
        let data = null;
        if (computation != null) {
          try {
            data = computation(computationCount++);
          } catch (e) {
            let s = dart.stackTrace(e);
            controller.addError(e, s);
            return;
          }

        }
        controller.add(data);
      }
      dart.fn(sendEvent, VoidTovoid$());
      function startPeriodicTimer() {
        dart.assert(timer == null);
        timer = async.Timer.periodic(period, dart.fn(timer => {
          sendEvent();
        }, TimerToNull()));
      }
      dart.fn(startPeriodicTimer, VoidTovoid$());
      controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
          watch.start();
          startPeriodicTimer();
        }, VoidToNull()), onPause: dart.fn(() => {
          timer.cancel();
          timer = null;
          watch.stop();
        }, VoidToNull()), onResume: dart.fn(() => {
          dart.assert(timer == null);
          let elapsed = watch.elapsed;
          watch.start();
          timer = async.Timer.new(period['-'](elapsed), dart.fn(() => {
            timer = null;
            startPeriodicTimer();
            sendEvent();
          }, VoidToNull()));
        }, VoidToNull()), onCancel: dart.fn(() => {
          if (timer != null) timer.cancel();
          timer = null;
        }, VoidToNull())});
      return controller.stream;
    }
    static eventTransformed(source, mapSink) {
      return new (_BoundSinkStreamOfdynamic$T())(source, mapSink);
    }
    get isBroadcast() {
      return false;
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return new (_AsBroadcastStreamOfT())(this, onListen, onCancel);
    }
    where(test) {
      return new (_WhereStreamOfT())(this, test);
    }
    map(S) {
      return convert => {
        return new (async._MapStream$(T, S))(this, convert);
      };
    }
    asyncMap(E) {
      return convert => {
        let controller = null;
        let subscription = null;
        const onListen = (function() {
          let add = dart.bind(controller, 'add');
          dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
          let eventSink = async._EventSink$(E).as(controller);
          let addError = dart.bind(eventSink, _addError);
          subscription = this.listen(dart.fn(event => {
            let newValue = null;
            try {
              newValue = convert(event);
            } catch (e) {
              let s = dart.stackTrace(e);
              controller.addError(e, s);
              return;
            }

            if (async.Future.is(newValue)) {
              subscription.pause();
              newValue.then(dart.void)(add, {onError: addError}).whenComplete(dart.bind(subscription, 'resume'));
            } else {
              controller.add(E.as(newValue));
            }
          }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
        }).bind(this);
        dart.fn(onListen, VoidTovoid$());
        if (dart.test(this.isBroadcast)) {
          controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
              subscription.cancel();
            }, VoidToNull()), sync: true});
        } else {
          controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
              subscription.pause();
            }, VoidToNull()), onResume: dart.fn(() => {
              subscription.resume();
            }, VoidToNull()), onCancel: dart.fn(() => {
              subscription.cancel();
            }, VoidToNull()), sync: true});
        }
        return controller.stream;
      };
    }
    asyncExpand(E) {
      return convert => {
        let controller = null;
        let subscription = null;
        const onListen = (function() {
          dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
          let eventSink = async._EventSink$(E).as(controller);
          subscription = this.listen(dart.fn(event => {
            let newStream = null;
            try {
              newStream = convert(event);
            } catch (e) {
              let s = dart.stackTrace(e);
              controller.addError(e, s);
              return;
            }

            if (newStream != null) {
              subscription.pause();
              controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
            }
          }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
        }).bind(this);
        dart.fn(onListen, VoidTovoid$());
        if (dart.test(this.isBroadcast)) {
          controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
              subscription.cancel();
            }, VoidToNull()), sync: true});
        } else {
          controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
              subscription.pause();
            }, VoidToNull()), onResume: dart.fn(() => {
              subscription.resume();
            }, VoidToNull()), onCancel: dart.fn(() => {
              subscription.cancel();
            }, VoidToNull()), sync: true});
        }
        return controller.stream;
      };
    }
    handleError(onError, opts) {
      let test = opts && 'test' in opts ? opts.test : null;
      return new (_HandleErrorStreamOfT())(this, onError, test);
    }
    expand(S) {
      return convert => {
        return new (async._ExpandStream$(T, S))(this, convert);
      };
    }
    pipe(streamConsumer) {
      StreamConsumerOfT()._check(streamConsumer);
      return streamConsumer.addStream(this).then(dart.dynamic)(dart.fn(_ => streamConsumer.close(), dynamicToFuture()));
    }
    transform(S) {
      return streamTransformer => {
        async.StreamTransformer$(T, S)._check(streamTransformer);
        return streamTransformer.bind(this);
      };
    }
    reduce(combine) {
      TAndTToT()._check(combine);
      let result = new (_FutureOfT())();
      let seenFirst = false;
      let value = null;
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        if (seenFirst) {
          async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
            value = newValue;
          }, TToNull()), async._cancelAndErrorClosure(subscription, result));
        } else {
          value = element;
          seenFirst = true;
        }
      }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
          if (!seenFirst) {
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(result, e, s);
            }

          } else {
            result[_complete](value);
          }
        }, VoidToNull()), cancelOnError: true});
      return result;
    }
    fold(S) {
      return (initialValue, combine) => {
        let result = new (async._Future$(S))();
        let value = initialValue;
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
            value = newValue;
          }, dart.definiteFunctionType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
        }, TToNull()), {onError: dart.fn((e, st) => {
            result[_completeError](e, core.StackTrace._check(st));
          }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
            result[_complete](value);
          }, VoidToNull()), cancelOnError: true});
        return result;
      };
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let result = new (_FutureOfString())();
      let buffer = new core.StringBuffer();
      let subscription = null;
      let first = true;
      subscription = this.listen(dart.fn(element => {
        if (!first) {
          buffer.write(separator);
        }
        first = false;
        try {
          buffer.write(element);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._cancelAndErrorWithReplacement(subscription, result, e, s);
        }

      }, TToNull()), {onError: dart.fn(e => {
          result[_completeError](e);
        }, dynamicToNull$()), onDone: dart.fn(() => {
          result[_complete](buffer.toString());
        }, VoidToNull()), cancelOnError: true});
      return result;
    }
    contains(needle) {
      let future = new (_FutureOfbool())();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(dart.fn(() => dart.equals(element, needle), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, true);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](false);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    forEach(action) {
      let future = new async._Future();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
        }, dynamicToNull$()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](null);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    every(test) {
      let future = new (_FutureOfbool())();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
          if (!dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, false);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](true);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    any(test) {
      let future = new (_FutureOfbool())();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, true);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](false);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get length() {
      let future = new (_FutureOfint())();
      let count = 0;
      this.listen(dart.fn(_ => {
        count++;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](count);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get isEmpty() {
      let future = new (_FutureOfbool())();
      let subscription = null;
      subscription = this.listen(dart.fn(_ => {
        async._cancelAndValue(subscription, future, false);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](true);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    toList() {
      let result = JSArrayOfT().of([]);
      let future = new (_FutureOfListOfT())();
      this.listen(dart.fn(data => {
        result[dartx.add](data);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](result);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    toSet() {
      let result = SetOfT().new();
      let future = new (_FutureOfSetOfT())();
      this.listen(dart.fn(data => {
        result.add(data);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](result);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    drain(E) {
      return futureValue => {
        if (futureValue === void 0) futureValue = null;
        return this.listen(null, {cancelOnError: true}).asFuture(E)(futureValue);
      };
    }
    take(count) {
      return new (_TakeStreamOfT())(this, count);
    }
    takeWhile(test) {
      return new (_TakeWhileStreamOfT())(this, test);
    }
    skip(count) {
      return new (_SkipStreamOfT())(this, count);
    }
    skipWhile(test) {
      return new (_SkipWhileStreamOfT())(this, test);
    }
    distinct(equals) {
      if (equals === void 0) equals = null;
      return new (_DistinctStreamOfT())(this, equals);
    }
    get first() {
      let future = new (_FutureOfT())();
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._cancelAndValue(subscription, future, value);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(future, e, s);
          }

        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get last() {
      let future = new (_FutureOfT())();
      let result = null;
      let foundResult = false;
      this.listen(dart.fn(value => {
        foundResult = true;
        result = value;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(future, e, s);
          }

        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get single() {
      let future = new (_FutureOfT())();
      let result = null;
      let foundResult = false;
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        if (foundResult) {
          try {
            dart.throw(_internal.IterableElementError.tooMany());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._cancelAndErrorWithReplacement(subscription, future, e, s);
          }

          return;
        }
        foundResult = true;
        result = value;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(future, e, s);
          }

        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    firstWhere(test, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
      let future = new async._Future();
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._runUserCode(dart.fn(() => test(value), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, value);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (defaultValue != null) {
            async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(future, e, s);
          }

        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    lastWhere(test, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
      let future = new async._Future();
      let result = null;
      let foundResult = false;
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            foundResult = true;
            result = value;
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          if (defaultValue != null) {
            async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(future, e, s);
          }

        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    singleWhere(test) {
      let future = new (_FutureOfT())();
      let result = null;
      let foundResult = false;
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            if (foundResult) {
              try {
                dart.throw(_internal.IterableElementError.tooMany());
              } catch (e) {
                let s = dart.stackTrace(e);
                async._cancelAndErrorWithReplacement(subscription, future, e, s);
              }

              return;
            }
            foundResult = true;
            result = value;
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(future, e, s);
          }

        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    elementAt(index) {
      if (!(typeof index == 'number') || dart.notNull(index) < 0) dart.throw(new core.ArgumentError(index));
      let future = new (_FutureOfT())();
      let subscription = null;
      let elementIndex = 0;
      subscription = this.listen(dart.fn(value => {
        if (index == elementIndex) {
          async._cancelAndValue(subscription, future, value);
          return;
        }
        elementIndex = elementIndex + 1;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    timeout(timeLimit, opts) {
      let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
      let controller = null;
      let subscription = null;
      let timer = null;
      let zone = null;
      let timeout = null;
      function onData(event) {
        timer.cancel();
        controller.add(event);
        timer = zone.createTimer(timeLimit, timeout);
      }
      dart.fn(onData, TTovoid$());
      function onError(error, stackTrace) {
        timer.cancel();
        dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
        let eventSink = controller;
        dart.dsend(eventSink, _addError, error, stackTrace);
        timer = zone.createTimer(timeLimit, timeout);
      }
      dart.fn(onError, dynamicAndStackTraceTovoid());
      function onDone() {
        timer.cancel();
        controller.close();
      }
      dart.fn(onDone, VoidTovoid$());
      const onListen = (function() {
        zone = async.Zone.current;
        if (onTimeout == null) {
          timeout = dart.fn(() => {
            controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
          }, VoidToNull());
        } else {
          let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
          let wrapper = new async._ControllerEventSinkWrapper(null);
          timeout = dart.fn(() => {
            wrapper[_sink] = controller;
            zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
            wrapper[_sink] = null;
          }, VoidToNull());
        }
        subscription = this.listen(onData, {onError: onError, onDone: onDone});
        timer = zone.createTimer(timeLimit, timeout);
      }).bind(this);
      dart.fn(onListen, VoidTovoid$());
      function onCancel() {
        timer.cancel();
        let result = subscription.cancel();
        subscription = null;
        return result;
      }
      dart.fn(onCancel, VoidToFuture());
      controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
        timer.cancel();
        subscription.pause();
      }, VoidToNull()), dart.fn(() => {
        subscription.resume();
        timer = zone.createTimer(timeLimit, timeout);
      }, VoidToNull()), onCancel);
      return controller.stream;
    }
  }
  dart.addTypeTests(Stream);
  dart.defineNamedConstructor(Stream, '_internal');
  dart.setSignature(Stream, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.Stream$(T), []),
      _internal: dart.definiteFunctionType(async.Stream$(T), []),
      empty: dart.definiteFunctionType(async.Stream$(T), []),
      fromFuture: dart.definiteFunctionType(async.Stream$(T), [FutureOfT()]),
      fromFutures: dart.definiteFunctionType(async.Stream$(T), [IterableOfFutureOfT()]),
      fromIterable: dart.definiteFunctionType(async.Stream$(T), [IterableOfT()]),
      periodic: dart.definiteFunctionType(async.Stream$(T), [core.Duration], [intToT()]),
      eventTransformed: dart.definiteFunctionType(async.Stream$(T), [async.Stream, EventSinkOfTToEventSink()])
    }),
    getters: () => ({
      isBroadcast: dart.definiteFunctionType(core.bool, []),
      length: dart.definiteFunctionType(async.Future$(core.int), []),
      isEmpty: dart.definiteFunctionType(async.Future$(core.bool), []),
      first: dart.definiteFunctionType(async.Future$(T), []),
      last: dart.definiteFunctionType(async.Future$(T), []),
      single: dart.definiteFunctionType(async.Future$(T), [])
    }),
    methods: () => ({
      asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
      where: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
      map: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(S, [T])]]),
      asyncMap: dart.definiteFunctionType(E => [async.Stream$(E), [TTodynamic()]]),
      asyncExpand: dart.definiteFunctionType(E => [async.Stream$(E), [dart.functionType(async.Stream$(E), [T])]]),
      handleError: dart.definiteFunctionType(async.Stream$(T), [core.Function], {test: dynamicTobool()}),
      expand: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(core.Iterable$(S), [T])]]),
      pipe: dart.definiteFunctionType(async.Future, [StreamConsumerOfT()]),
      transform: dart.definiteFunctionType(S => [async.Stream$(S), [async.StreamTransformer$(T, S)]]),
      reduce: dart.definiteFunctionType(async.Future$(T), [TAndTToT()]),
      fold: dart.definiteFunctionType(S => [async.Future$(S), [S, dart.functionType(S, [S, T])]]),
      join: dart.definiteFunctionType(async.Future$(core.String), [], [core.String]),
      contains: dart.definiteFunctionType(async.Future$(core.bool), [core.Object]),
      forEach: dart.definiteFunctionType(async.Future, [TTovoid()]),
      every: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
      any: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
      toList: dart.definiteFunctionType(async.Future$(core.List$(T)), []),
      toSet: dart.definiteFunctionType(async.Future$(core.Set$(T)), []),
      drain: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
      take: dart.definiteFunctionType(async.Stream$(T), [core.int]),
      takeWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
      skip: dart.definiteFunctionType(async.Stream$(T), [core.int]),
      skipWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
      distinct: dart.definiteFunctionType(async.Stream$(T), [], [TAndTTobool()]),
      firstWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
      lastWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
      singleWhere: dart.definiteFunctionType(async.Future$(T), [TTobool()]),
      elementAt: dart.definiteFunctionType(async.Future$(T), [core.int]),
      timeout: dart.definiteFunctionType(async.Stream$(T), [core.Duration], {onTimeout: EventSinkOfTTovoid()})
    })
  });
  return Stream;
});
async.Stream = Stream();
_isolate_helper.ReceivePortImpl = class ReceivePortImpl extends async.Stream {
  new() {
    ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl(null));
  }
  weak() {
    ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl.weak(null));
  }
  fromRawReceivePort(rawPort) {
    this[_rawPort] = rawPort;
    this[_controller] = null;
    super.new();
    this[_controller] = async.StreamController.new({onCancel: dart.bind(this, 'close'), sync: true});
    this[_rawPort].handler = dart.bind(this[_controller], 'add');
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  close() {
    this[_rawPort].close();
    this[_controller].close();
  }
  get sendPort() {
    return this[_rawPort].sendPort;
  }
};
dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
_isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
dart.setSignature(_isolate_helper.ReceivePortImpl, {
  constructors: () => ({
    new: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
    weak: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
    fromRawReceivePort: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, [isolate.RawReceivePort])
  }),
  fields: () => ({
    [_rawPort]: isolate.RawReceivePort,
    [_controller]: async.StreamController
  }),
  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
const _once = Symbol('_once');
const _inEventLoop = Symbol('_inEventLoop');
const _handle = Symbol('_handle');
_isolate_helper.TimerImpl = class TimerImpl extends core.Object {
  new(milliseconds, callback) {
    this[_once] = true;
    this[_inEventLoop] = false;
    this[_handle] = null;
    if (milliseconds == 0 && (!dart.test(_isolate_helper.hasTimer()) || dart.test(_isolate_helper._globalState.isWorker))) {
      const internalCallback = (function() {
        this[_handle] = null;
        callback();
      }).bind(this);
      dart.fn(internalCallback, VoidTovoid$());
      this[_handle] = 1;
      _isolate_helper._globalState.topEventLoop.enqueue(_isolate_helper._globalState.currentContext, internalCallback, 'timer');
      this[_inEventLoop] = true;
    } else if (dart.test(_isolate_helper.hasTimer())) {
      const internalCallback = (function() {
        this[_handle] = null;
        _isolate_helper.leaveJsAsync();
        callback();
      }).bind(this);
      dart.fn(internalCallback, VoidTovoid$());
      _isolate_helper.enterJsAsync();
      this[_handle] = _isolate_helper.global.setTimeout(internalCallback, milliseconds);
    } else {
      dart.assert(dart.notNull(milliseconds) > 0);
      dart.throw(new core.UnsupportedError("Timer greater than 0."));
    }
  }
  periodic(milliseconds, callback) {
    this[_once] = false;
    this[_inEventLoop] = false;
    this[_handle] = null;
    if (dart.test(_isolate_helper.hasTimer())) {
      _isolate_helper.enterJsAsync();
      this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
        callback(this);
      }, VoidToNull()), milliseconds);
    } else {
      dart.throw(new core.UnsupportedError("Periodic timer."));
    }
  }
  cancel() {
    if (dart.test(_isolate_helper.hasTimer())) {
      if (dart.test(this[_inEventLoop])) {
        dart.throw(new core.UnsupportedError("Timer in event loop cannot be canceled."));
      }
      if (this[_handle] == null) return;
      _isolate_helper.leaveJsAsync();
      if (dart.test(this[_once])) {
        _isolate_helper.global.clearTimeout(this[_handle]);
      } else {
        _isolate_helper.global.clearInterval(this[_handle]);
      }
      this[_handle] = null;
    } else {
      dart.throw(new core.UnsupportedError("Canceling a timer."));
    }
  }
  get isActive() {
    return this[_handle] != null;
  }
};
dart.defineNamedConstructor(_isolate_helper.TimerImpl, 'periodic');
_isolate_helper.TimerImpl[dart.implements] = () => [async.Timer];
dart.setSignature(_isolate_helper.TimerImpl, {
  constructors: () => ({
    new: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, VoidTovoid()]),
    periodic: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, TimerTovoid()])
  }),
  fields: () => ({
    [_once]: core.bool,
    [_inEventLoop]: core.bool,
    [_handle]: core.int
  }),
  getters: () => ({isActive: dart.definiteFunctionType(core.bool, [])}),
  methods: () => ({cancel: dart.definiteFunctionType(dart.void, [])})
});
_isolate_helper.hasTimer = function() {
  return _isolate_helper.global.setTimeout != null;
};
dart.lazyFn(_isolate_helper.hasTimer, () => VoidTobool());
_isolate_helper.CapabilityImpl = class CapabilityImpl extends core.Object {
  new() {
    CapabilityImpl.prototype._internal.call(this, _js_helper.random64());
  }
  _internal(id) {
    this[_id] = id;
  }
  get hashCode() {
    let hash = this[_id];
    hash = (hash[dartx['>>']](0) ^ (dart.notNull(hash) / 4294967296)[dartx.truncate]()) >>> 0;
    hash = ((~dart.notNull(hash) >>> 0) + (dart.notNull(hash) << 15 >>> 0) & 4294967295) >>> 0;
    hash = (dart.notNull(hash) ^ hash[dartx['>>']](12)) >>> 0;
    hash = (dart.notNull(hash) * 5 & 4294967295) >>> 0;
    hash = (dart.notNull(hash) ^ hash[dartx['>>']](4)) >>> 0;
    hash = (dart.notNull(hash) * 2057 & 4294967295) >>> 0;
    hash = (dart.notNull(hash) ^ hash[dartx['>>']](16)) >>> 0;
    return hash;
  }
  ['=='](other) {
    if (core.identical(other, this)) return true;
    if (_isolate_helper.CapabilityImpl.is(other)) {
      return core.identical(this[_id], other[_id]);
    }
    return false;
  }
};
dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
_isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
dart.setSignature(_isolate_helper.CapabilityImpl, {
  constructors: () => ({
    new: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, []),
    _internal: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, [core.int])
  }),
  fields: () => ({[_id]: core.int}),
  methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
});
_isolate_helper._serializeMessage = function(message) {
  return new _isolate_helper._Serializer().serialize(message);
};
dart.fn(_isolate_helper._serializeMessage, dynamicTodynamic$());
_isolate_helper._deserializeMessage = function(message) {
  return new _isolate_helper._Deserializer().deserialize(message);
};
dart.fn(_isolate_helper._deserializeMessage, dynamicTodynamic$());
_isolate_helper._clone = function(message) {
  let serializer = new _isolate_helper._Serializer({serializeSendPorts: false});
  let deserializer = new _isolate_helper._Deserializer();
  return deserializer.deserialize(serializer.serialize(message));
};
dart.fn(_isolate_helper._clone, dynamicTodynamic$());
const _serializeSendPorts = Symbol('_serializeSendPorts');
_isolate_helper._Serializer = class _Serializer extends core.Object {
  new(opts) {
    let serializeSendPorts = opts && 'serializeSendPorts' in opts ? opts.serializeSendPorts : true;
    this.serializedObjectIds = MapOfdynamic$int().identity();
    this[_serializeSendPorts] = core.bool._check(serializeSendPorts);
  }
  serialize(x) {
    if (dart.test(this.isPrimitive(x))) return this.serializePrimitive(x);
    let serializationId = this.serializedObjectIds[dartx._get](x);
    if (serializationId != null) return this.makeRef(serializationId);
    serializationId = this.serializedObjectIds[dartx.length];
    this.serializedObjectIds[dartx._set](x, serializationId);
    if (_native_typed_data.NativeByteBuffer.is(x)) return this.serializeByteBuffer(x);
    if (_native_typed_data.NativeTypedData.is(x)) return this.serializeTypedData(x);
    if (_interceptors.JSIndexable.is(x)) return this.serializeJSIndexable(x);
    if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
    if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
    if (_interceptors.Interceptor.is(x)) this.unsupported(x);
    if (isolate.RawReceivePort.is(x)) {
      this.unsupported(x, "RawReceivePorts can't be transmitted:");
    }
    if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
    if (_isolate_helper._WorkerSendPort.is(x)) return this.serializeWorkerSendPort(x);
    if (core.Function.is(x)) return this.serializeClosure(x);
    return this.serializeDartObject(x);
  }
  unsupported(x, message) {
    if (message === void 0) message = null;
    if (message == null) message = "Can't transmit:";
    dart.throw(new core.UnsupportedError(dart.str`${message} ${x}`));
  }
  makeRef(serializationId) {
    return JSArrayOfObject().of(["ref", serializationId]);
  }
  isPrimitive(x) {
    return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
  }
  serializePrimitive(primitive) {
    return primitive;
  }
  serializeByteBuffer(buffer) {
    return JSArrayOfObject().of(["buffer", buffer]);
  }
  serializeTypedData(data) {
    return JSArrayOfObject().of(["typed", data]);
  }
  serializeJSIndexable(indexable) {
    dart.assert(!(typeof indexable == 'string'));
    let serialized = core.List._check(this.serializeArray(_interceptors.JSArray._check(indexable)));
    if (_interceptors.JSFixedArray.is(indexable)) return JSArrayOfObject().of(["fixed", serialized]);
    if (_interceptors.JSExtendableArray.is(indexable)) return JSArrayOfObject().of(["extendable", serialized]);
    if (_interceptors.JSMutableArray.is(indexable)) return JSArrayOfObject().of(["mutable", serialized]);
    if (_interceptors.JSArray.is(indexable)) return JSArrayOfObject().of(["const", serialized]);
    this.unsupported(indexable, "Can't serialize indexable: ");
    return null;
  }
  serializeArray(x) {
    let serialized = [];
    serialized[dartx.length] = x[dartx.length];
    for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
      serialized[dartx._set](i, this.serialize(x[dartx._get](i)));
    }
    return serialized;
  }
  serializeArrayInPlace(x) {
    for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
      x[dartx._set](i, this.serialize(x[dartx._get](i)));
    }
    return x;
  }
  serializeMap(x) {
    let serializeTearOff = dart.bind(this, 'serialize');
    return JSArrayOfObject().of(['map', x.keys[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList](), x.values[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList]()]);
  }
  serializeJSObject(x) {
    if (!!x.constructor && x.constructor !== Object) {
      this.unsupported(x, "Only plain JS Objects are supported:");
    }
    let keys = Object.keys(x);
    let values = [];
    values[dartx.length] = keys[dartx.length];
    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
      values[dartx._set](i, this.serialize(x[keys[dartx._get](i)]));
    }
    return JSArrayOfObject().of(['js-object', keys, values]);
  }
  serializeWorkerSendPort(x) {
    if (dart.test(this[_serializeSendPorts])) {
      return JSArrayOfObject().of(['sendport', x[_workerId], x[_isolateId], x[_receivePortId]]);
    }
    return JSArrayOfObject().of(['raw sendport', x]);
  }
  serializeJsSendPort(x) {
    if (dart.test(this[_serializeSendPorts])) {
      let workerId = _isolate_helper._globalState.currentManagerId;
      return JSArrayOfObject().of(['sendport', workerId, x[_isolateId], x[_receivePort][_id]]);
    }
    return JSArrayOfObject().of(['raw sendport', x]);
  }
  serializeCapability(x) {
    return JSArrayOfObject().of(['capability', x[_id]]);
  }
  serializeClosure(x) {
    let name = _isolate_helper.IsolateNatives._getJSFunctionName(x);
    if (name == null) {
      this.unsupported(x, "Closures can't be transmitted:");
    }
    return JSArrayOfString().of(['function', name]);
  }
  serializeDartObject(x) {
    let classExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_ID_EXTRACTOR);
    let fieldsExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_FIELDS_EXTRACTOR);
    let classId = classExtractor(x);
    let fields = fieldsExtractor(x);
    return ['dart', classId, this.serializeArrayInPlace(_interceptors.JSArray._check(fields))];
  }
};
dart.setSignature(_isolate_helper._Serializer, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Serializer, [], {serializeSendPorts: dart.dynamic})}),
  fields: () => ({
    [_serializeSendPorts]: core.bool,
    serializedObjectIds: MapOfdynamic$int()
  }),
  methods: () => ({
    serialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    unsupported: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
    makeRef: dart.definiteFunctionType(dart.dynamic, [core.int]),
    isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    serializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    serializeByteBuffer: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeByteBuffer]),
    serializeTypedData: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeTypedData]),
    serializeJSIndexable: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSIndexable]),
    serializeArray: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
    serializeArrayInPlace: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
    serializeMap: dart.definiteFunctionType(dart.dynamic, [_js_helper.InternalMap]),
    serializeJSObject: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSObject]),
    serializeWorkerSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._WorkerSendPort]),
    serializeJsSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._NativeJsSendPort]),
    serializeCapability: dart.definiteFunctionType(dart.dynamic, [_isolate_helper.CapabilityImpl]),
    serializeClosure: dart.definiteFunctionType(dart.dynamic, [core.Function]),
    serializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
  })
});
const _adjustSendPorts = Symbol('_adjustSendPorts');
_isolate_helper._Deserializer = class _Deserializer extends core.Object {
  new(opts) {
    let adjustSendPorts = opts && 'adjustSendPorts' in opts ? opts.adjustSendPorts : true;
    this.deserializedObjects = core.List.new();
    this[_adjustSendPorts] = core.bool._check(adjustSendPorts);
  }
  deserialize(x) {
    if (dart.test(this.isPrimitive(x))) return this.deserializePrimitive(x);
    if (!_interceptors.JSArray.is(x)) dart.throw(new core.ArgumentError(dart.str`Bad serialized message: ${x}`));
    switch (dart.dload(x, 'first')) {
      case "ref":
      {
        return this.deserializeRef(x);
      }
      case "buffer":
      {
        return this.deserializeByteBuffer(x);
      }
      case "typed":
      {
        return this.deserializeTypedData(x);
      }
      case "fixed":
      {
        return this.deserializeFixed(x);
      }
      case "extendable":
      {
        return this.deserializeExtendable(x);
      }
      case "mutable":
      {
        return this.deserializeMutable(x);
      }
      case "const":
      {
        return this.deserializeConst(x);
      }
      case "map":
      {
        return this.deserializeMap(_js_helper.InternalMap._check(x));
      }
      case "sendport":
      {
        return this.deserializeSendPort(x);
      }
      case "raw sendport":
      {
        return this.deserializeRawSendPort(x);
      }
      case "js-object":
      {
        return this.deserializeJSObject(x);
      }
      case "function":
      {
        return this.deserializeClosure(x);
      }
      case "dart":
      {
        return this.deserializeDartObject(x);
      }
      default:
      {
        dart.throw(dart.str`couldn't deserialize: ${x}`);
      }
    }
  }
  isPrimitive(x) {
    return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
  }
  deserializePrimitive(x) {
    return x;
  }
  deserializeRef(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'ref'));
    let serializationId = core.int._check(dart.dindex(x, 1));
    return this.deserializedObjects[dartx._get](serializationId);
  }
  deserializeByteBuffer(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'buffer'));
    let result = _native_typed_data.NativeByteBuffer._check(dart.dindex(x, 1));
    this.deserializedObjects[dartx.add](result);
    return result;
  }
  deserializeTypedData(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'typed'));
    let result = _native_typed_data.NativeTypedData._check(dart.dindex(x, 1));
    this.deserializedObjects[dartx.add](result);
    return result;
  }
  deserializeArrayInPlace(x) {
    for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
      x[dartx._set](i, this.deserialize(x[dartx._get](i)));
    }
    return x;
  }
  deserializeFixed(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'fixed'));
    let result = core.List._check(dart.dindex(x, 1));
    this.deserializedObjects[dartx.add](result);
    return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
  }
  deserializeExtendable(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'extendable'));
    let result = core.List._check(dart.dindex(x, 1));
    this.deserializedObjects[dartx.add](result);
    return _interceptors.JSArray.markGrowable(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
  }
  deserializeMutable(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'mutable'));
    let result = core.List._check(dart.dindex(x, 1));
    this.deserializedObjects[dartx.add](result);
    return this.deserializeArrayInPlace(_interceptors.JSArray._check(result));
  }
  deserializeConst(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'const'));
    let result = core.List._check(dart.dindex(x, 1));
    this.deserializedObjects[dartx.add](result);
    return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
  }
  deserializeMap(x) {
    dart.assert(dart.equals(x._get(0), 'map'));
    let keys = core.List._check(x._get(1));
    let values = core.List._check(x._get(2));
    let result = dart.map();
    this.deserializedObjects[dartx.add](result);
    keys = keys[dartx.map](dart.dynamic)(dart.bind(this, 'deserialize'))[dartx.toList]();
    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
      result[dartx._set](keys[dartx._get](i), this.deserialize(values[dartx._get](i)));
    }
    return result;
  }
  deserializeSendPort(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'sendport'));
    let managerId = core.int._check(dart.dindex(x, 1));
    let isolateId = core.int._check(dart.dindex(x, 2));
    let receivePortId = core.int._check(dart.dindex(x, 3));
    let result = null;
    if (managerId == _isolate_helper._globalState.currentManagerId) {
      let isolate = _isolate_helper._globalState.isolates[dartx._get](isolateId);
      if (isolate == null) return null;
      let receivePort = isolate.lookup(receivePortId);
      if (receivePort == null) return null;
      result = new _isolate_helper._NativeJsSendPort(receivePort, isolateId);
    } else {
      result = new _isolate_helper._WorkerSendPort(managerId, isolateId, receivePortId);
    }
    this.deserializedObjects[dartx.add](result);
    return result;
  }
  deserializeRawSendPort(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
    let result = isolate.SendPort._check(dart.dindex(x, 1));
    this.deserializedObjects[dartx.add](result);
    return result;
  }
  deserializeJSObject(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'js-object'));
    let keys = core.List._check(dart.dindex(x, 1));
    let values = core.List._check(dart.dindex(x, 2));
    let o = {};
    this.deserializedObjects[dartx.add](o);
    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
      o[keys[dartx._get](i)] = this.deserialize(values[dartx._get](i));
    }
    return o;
  }
  deserializeClosure(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'function'));
    let name = core.String._check(dart.dindex(x, 1));
    let result = core.Function._check(_isolate_helper.IsolateNatives._getJSFunctionFromName(name));
    this.deserializedObjects[dartx.add](result);
    return result;
  }
  deserializeDartObject(x) {
    dart.assert(dart.equals(dart.dindex(x, 0), 'dart'));
    let classId = core.String._check(dart.dindex(x, 1));
    let fields = core.List._check(dart.dindex(x, 2));
    let instanceFromClassId = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INSTANCE_FROM_CLASS_ID);
    let initializeObject = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INITIALIZE_EMPTY_INSTANCE);
    let emptyInstance = instanceFromClassId(classId);
    this.deserializedObjects[dartx.add](emptyInstance);
    this.deserializeArrayInPlace(_interceptors.JSArray._check(fields));
    return initializeObject(classId, emptyInstance, fields);
  }
};
dart.setSignature(_isolate_helper._Deserializer, {
  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Deserializer, [], {adjustSendPorts: dart.dynamic})}),
  fields: () => ({
    [_adjustSendPorts]: core.bool,
    deserializedObjects: core.List
  }),
  methods: () => ({
    deserialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    deserializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    deserializeRef: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    deserializeByteBuffer: dart.definiteFunctionType(_native_typed_data.NativeByteBuffer, [dart.dynamic]),
    deserializeTypedData: dart.definiteFunctionType(_native_typed_data.NativeTypedData, [dart.dynamic]),
    deserializeArrayInPlace: dart.definiteFunctionType(core.List, [_interceptors.JSArray]),
    deserializeFixed: dart.definiteFunctionType(core.List, [dart.dynamic]),
    deserializeExtendable: dart.definiteFunctionType(core.List, [dart.dynamic]),
    deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
    deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
    deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
    deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
    deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
    deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
    deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
  })
});
_js_embedded_names.DISPATCH_PROPERTY_NAME = "dispatchPropertyName";
_js_embedded_names.TYPE_INFORMATION = 'typeInformation';
_js_embedded_names.GLOBAL_FUNCTIONS = 'globalFunctions';
_js_embedded_names.STATICS = 'statics';
_js_embedded_names.INTERCEPTED_NAMES = 'interceptedNames';
_js_embedded_names.MANGLED_GLOBAL_NAMES = 'mangledGlobalNames';
_js_embedded_names.MANGLED_NAMES = 'mangledNames';
_js_embedded_names.LIBRARIES = 'libraries';
_js_embedded_names.FINISHED_CLASSES = 'finishedClasses';
_js_embedded_names.ALL_CLASSES = 'allClasses';
_js_embedded_names.METADATA = 'metadata';
_js_embedded_names.INTERCEPTORS_BY_TAG = 'interceptorsByTag';
_js_embedded_names.LEAF_TAGS = 'leafTags';
_js_embedded_names.LAZIES = 'lazies';
_js_embedded_names.GET_ISOLATE_TAG = 'getIsolateTag';
_js_embedded_names.ISOLATE_TAG = 'isolateTag';
_js_embedded_names.CURRENT_SCRIPT = 'currentScript';
_js_embedded_names.DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
_js_embedded_names.DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
_js_embedded_names.INITIALIZE_LOADED_HUNK = 'initializeLoadedHunk';
_js_embedded_names.IS_HUNK_LOADED = 'isHunkLoaded';
_js_embedded_names.IS_HUNK_INITIALIZED = 'isHunkInitialized';
_js_embedded_names.DEFERRED_INITIALIZED = 'deferredInitialized';
_js_embedded_names.CLASS_ID_EXTRACTOR = 'classIdExtractor';
_js_embedded_names.CLASS_FIELDS_EXTRACTOR = 'classFieldsExtractor';
_js_embedded_names.INSTANCE_FROM_CLASS_ID = "instanceFromClassId";
_js_embedded_names.INITIALIZE_EMPTY_INSTANCE = "initializeEmptyInstance";
_js_embedded_names.TYPEDEF_TYPE_PROPERTY_NAME = "$typedefType";
_js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
_js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
_js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
_js_helper._Patch = class _Patch extends core.Object {
  new() {
  }
};
dart.setSignature(_js_helper._Patch, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper._Patch, [])})
});
_js_helper.patch = dart.const(new _js_helper._Patch());
_js_helper.InternalMap$ = dart.generic((K, V) => {
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  class InternalMap extends core.Object {}
  dart.addTypeTests(InternalMap);
  InternalMap[dart.implements] = () => [MapOfK$V()];
  return InternalMap;
});
_js_helper.InternalMap = InternalMap();
_js_helper.Primitives = class Primitives extends core.Object {
  static initializeStatics(id) {
    _js_helper.Primitives.mirrorFunctionCacheName = dart.notNull(_js_helper.Primitives.mirrorFunctionCacheName) + dart.str`_${id}`;
    _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
  }
  static objectHashCode(object) {
    let hash = object.$identityHash;
    if (hash == null) {
      hash = Math.random() * 0x3fffffff | 0;
      object.$identityHash = hash;
    }
    return hash;
  }
  static _parseIntError(source, handleError) {
    if (handleError == null) dart.throw(new core.FormatException(source));
    return handleError(source);
  }
  static parseInt(source, radix, handleError) {
    _js_helper.checkString(source);
    let re = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i;
    let match = re.exec(source);
    let digitsIndex = 1;
    let hexIndex = 2;
    let decimalIndex = 3;
    let nonDecimalHexIndex = 4;
    if (match == null) {
      return _js_helper.Primitives._parseIntError(source, handleError);
    }
    let decimalMatch = match[dartx._get](decimalIndex);
    if (radix == null) {
      if (decimalMatch != null) {
        return parseInt(source, 10);
      }
      if (match[dartx._get](hexIndex) != null) {
        return parseInt(source, 16);
      }
      return _js_helper.Primitives._parseIntError(source, handleError);
    }
    if (!(typeof radix == 'number')) {
      dart.throw(new core.ArgumentError.value(radix, 'radix', 'is not an integer'));
    }
    if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
      dart.throw(new core.RangeError.range(radix, 2, 36, 'radix'));
    }
    if (radix == 10 && decimalMatch != null) {
      return parseInt(source, 10);
    }
    if (dart.notNull(radix) < 10 || decimalMatch == null) {
      let maxCharCode = null;
      if (dart.notNull(radix) <= 10) {
        maxCharCode = 48 - 1 + dart.notNull(radix);
      } else {
        maxCharCode = 97 - 10 - 1 + dart.notNull(radix);
      }
      dart.assert(typeof match[dartx._get](digitsIndex) == 'string');
      let digitsPart = match[digitsIndex];
      for (let i = 0; i < dart.notNull(digitsPart[dartx.length]); i++) {
        let characterCode = (dart.notNull(digitsPart[dartx.codeUnitAt](i)) | 32) >>> 0;
        if (characterCode > dart.notNull(maxCharCode)) {
          return _js_helper.Primitives._parseIntError(source, handleError);
        }
      }
    }
    return parseInt(source, radix);
  }
  static _parseDoubleError(source, handleError) {
    if (handleError == null) {
      dart.throw(new core.FormatException('Invalid double', source));
    }
    return handleError(source);
  }
  static parseDouble(source, handleError) {
    _js_helper.checkString(source);
    if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source)) {
      return _js_helper.Primitives._parseDoubleError(source, handleError);
    }
    let result = parseFloat(source);
    if (dart.test(result[dartx.isNaN])) {
      let trimmed = source[dartx.trim]();
      if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
        return result;
      }
      return _js_helper.Primitives._parseDoubleError(source, handleError);
    }
    return result;
  }
  static objectTypeName(object) {
    return dart.toString(_js_helper.getRuntimeType(object));
  }
  static objectToString(object) {
    let name = dart.typeName(dart.getReifiedType(object));
    return dart.str`Instance of '${name}'`;
  }
  static dateNow() {
    return Date.now();
  }
  static initTicker() {
    if (_js_helper.Primitives.timerFrequency != null) return;
    _js_helper.Primitives.timerFrequency = 1000;
    _js_helper.Primitives.timerTicks = _js_helper.Primitives.dateNow;
    if (typeof window == "undefined") return;
    let jsWindow = window;
    if (jsWindow == null) return;
    let performance = jsWindow.performance;
    if (performance == null) return;
    if (typeof performance.now != "function") return;
    _js_helper.Primitives.timerFrequency = 1000000;
    _js_helper.Primitives.timerTicks = dart.fn(() => (1000 * performance.now())[dartx.floor](), VoidToint());
  }
  static get isD8() {
    return typeof version == "function" && typeof os == "object" && "system" in os;
  }
  static get isJsshell() {
    return typeof version == "function" && typeof system == "function";
  }
  static currentUri() {
    if (!!self.location) {
      return self.location.href;
    }
    return null;
  }
  static _fromCharCodeApply(array) {
    let kMaxApply = 500;
    let end = array[dartx.length];
    if (dart.notNull(end) <= kMaxApply) {
      return String.fromCharCode.apply(null, array);
    }
    let result = '';
    for (let i = 0; i < dart.notNull(end); i = i + kMaxApply) {
      let chunkEnd = i + kMaxApply < dart.notNull(end) ? i + kMaxApply : end;
      result = result + String.fromCharCode.apply(null, array.slice(i, chunkEnd));
    }
    return result;
  }
  static stringFromCodePoints(codePoints) {
    let a = JSArrayOfint().of([]);
    for (let i of codePoints) {
      if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
      if (dart.notNull(i) <= 65535) {
        a[dartx.add](i);
      } else if (dart.notNull(i) <= 1114111) {
        a[dartx.add](55296 + (dart.notNull(i) - 65536 >> 10 & 1023));
        a[dartx.add](56320 + (dart.notNull(i) & 1023));
      } else {
        dart.throw(_js_helper.argumentErrorValue(i));
      }
    }
    return _js_helper.Primitives._fromCharCodeApply(a);
  }
  static stringFromCharCodes(charCodes) {
    for (let i of charCodes) {
      if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
      if (dart.notNull(i) < 0) dart.throw(_js_helper.argumentErrorValue(i));
      if (dart.notNull(i) > 65535) return _js_helper.Primitives.stringFromCodePoints(charCodes);
    }
    return _js_helper.Primitives._fromCharCodeApply(charCodes);
  }
  static stringFromNativeUint8List(charCodes, start, end) {
    let kMaxApply = 500;
    if (dart.notNull(end) <= kMaxApply && start == 0 && end == charCodes[dartx.length]) {
      return String.fromCharCode.apply(null, charCodes);
    }
    let result = '';
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + kMaxApply) {
      let chunkEnd = dart.notNull(i) + kMaxApply < dart.notNull(end) ? dart.notNull(i) + kMaxApply : end;
      result = result + String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
    }
    return result;
  }
  static stringFromCharCode(charCode) {
    if (0 <= dart.notNull(charCode)) {
      if (dart.notNull(charCode) <= 65535) {
        return String.fromCharCode(charCode);
      }
      if (dart.notNull(charCode) <= 1114111) {
        let bits = dart.notNull(charCode) - 65536;
        let low = 56320 | bits & 1023;
        let high = (55296 | bits[dartx['>>']](10)) >>> 0;
        return String.fromCharCode(high, low);
      }
    }
    dart.throw(new core.RangeError.range(charCode, 0, 1114111));
  }
  static stringConcatUnchecked(string1, string2) {
    return _foreign_helper.JS_STRING_CONCAT(string1, string2);
  }
  static flattenString(str) {
    return str.charCodeAt(0) == 0 ? str : str;
  }
  static getTimeZoneName(receiver) {
    let d = _js_helper.Primitives.lazyAsJsDate(receiver);
    let match = /\((.*)\)/.exec(d.toString());
    if (match != null) return core.String._check(match[dartx._get](1));
    match = /^[A-Z,a-z]{3}\s[A-Z,a-z]{3}\s\d+\s\d{2}:\d{2}:\d{2}\s([A-Z]{3,5})\s\d{4}$/.exec(d.toString());
    if (match != null) return core.String._check(match[dartx._get](1));
    match = /(?:GMT|UTC)[+-]\d{4}/.exec(d.toString());
    if (match != null) return core.String._check(match[dartx._get](0));
    return "";
  }
  static getTimeZoneOffsetInMinutes(receiver) {
    return -_js_helper.Primitives.lazyAsJsDate(receiver).getTimezoneOffset();
  }
  static valueFromDecomposedDate(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
    let MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
    _js_helper.checkInt(years);
    _js_helper.checkInt(month);
    _js_helper.checkInt(day);
    _js_helper.checkInt(hours);
    _js_helper.checkInt(minutes);
    _js_helper.checkInt(seconds);
    _js_helper.checkInt(milliseconds);
    _js_helper.checkBool(isUtc);
    let jsMonth = dart.notNull(month) - 1;
    let value = null;
    if (dart.test(isUtc)) {
      value = Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds);
    } else {
      value = new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
    }
    if (dart.test(value[dartx.isNaN]) || dart.notNull(value) < -MAX_MILLISECONDS_SINCE_EPOCH || dart.notNull(value) > MAX_MILLISECONDS_SINCE_EPOCH) {
      return null;
    }
    if (dart.notNull(years) <= 0 || dart.notNull(years) < 100) return core.num._check(_js_helper.Primitives.patchUpY2K(value, years, isUtc));
    return value;
  }
  static patchUpY2K(value, years, isUtc) {
    let date = new Date(value);
    if (dart.test(isUtc)) {
      date.setUTCFullYear(years);
    } else {
      date.setFullYear(years);
    }
    return date.valueOf();
  }
  static lazyAsJsDate(receiver) {
    if (receiver.date === void 0) {
      receiver.date = new Date(receiver.millisecondsSinceEpoch);
    }
    return receiver.date;
  }
  static getYear(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCFullYear() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getFullYear() + 0;
  }
  static getMonth(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMonth() + 1 : _js_helper.Primitives.lazyAsJsDate(receiver).getMonth() + 1;
  }
  static getDay(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDate() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDate() + 0;
  }
  static getHours(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCHours() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getHours() + 0;
  }
  static getMinutes(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMinutes() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMinutes() + 0;
  }
  static getSeconds(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCSeconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getSeconds() + 0;
  }
  static getMilliseconds(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMilliseconds() + 0;
  }
  static getWeekday(receiver) {
    let weekday = dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDay() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDay() + 0;
    return (weekday + 6)[dartx['%']](7) + 1;
  }
  static valueFromDateString(str) {
    if (!(typeof str == 'string')) dart.throw(_js_helper.argumentErrorValue(str));
    let value = Date.parse(str);
    if (dart.test(value[dartx.isNaN])) dart.throw(_js_helper.argumentErrorValue(str));
    return value;
  }
  static getProperty(object, key) {
    if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
      dart.throw(_js_helper.argumentErrorValue(object));
    }
    return object[key];
  }
  static setProperty(object, key, value) {
    if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
      dart.throw(_js_helper.argumentErrorValue(object));
    }
    object[key] = value;
  }
  static extractStackTrace(error) {
    return _js_helper.getTraceFromException(error.$thrownJsError);
  }
};
dart.setSignature(_js_helper.Primitives, {
  sfields: () => ({
    mirrorFunctionCacheName: core.String,
    mirrorInvokeCacheName: core.String,
    DOLLAR_CHAR_VALUE: core.int,
    timerFrequency: core.int,
    timerTicks: core.Function
  }),
  sgetters: () => ({
    isD8: dart.definiteFunctionType(core.bool, []),
    isJsshell: dart.definiteFunctionType(core.bool, [])
  }),
  statics: () => ({
    initializeStatics: dart.definiteFunctionType(dart.void, [core.int]),
    objectHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
    _parseIntError: dart.definiteFunctionType(core.int, [core.String, StringToint()]),
    parseInt: dart.definiteFunctionType(core.int, [core.String, core.int, StringToint()]),
    _parseDoubleError: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
    parseDouble: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
    objectTypeName: dart.definiteFunctionType(core.String, [core.Object]),
    objectToString: dart.definiteFunctionType(core.String, [core.Object]),
    dateNow: dart.definiteFunctionType(core.int, []),
    initTicker: dart.definiteFunctionType(dart.void, []),
    currentUri: dart.definiteFunctionType(core.String, []),
    _fromCharCodeApply: dart.definiteFunctionType(core.String, [ListOfint()]),
    stringFromCodePoints: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
    stringFromCharCodes: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
    stringFromNativeUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
    stringFromCharCode: dart.definiteFunctionType(core.String, [core.int]),
    stringConcatUnchecked: dart.definiteFunctionType(core.String, [core.String, core.String]),
    flattenString: dart.definiteFunctionType(core.String, [core.String]),
    getTimeZoneName: dart.definiteFunctionType(core.String, [core.DateTime]),
    getTimeZoneOffsetInMinutes: dart.definiteFunctionType(core.int, [core.DateTime]),
    valueFromDecomposedDate: dart.definiteFunctionType(core.num, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
    patchUpY2K: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic]),
    lazyAsJsDate: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getYear: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getMonth: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getDay: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getHours: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getMinutes: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getSeconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getMilliseconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    getWeekday: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
    valueFromDateString: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    setProperty: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
    extractStackTrace: dart.definiteFunctionType(core.StackTrace, [core.Error])
  }),
  names: ['initializeStatics', 'objectHashCode', '_parseIntError', 'parseInt', '_parseDoubleError', 'parseDouble', 'objectTypeName', 'objectToString', 'dateNow', 'initTicker', 'currentUri', '_fromCharCodeApply', 'stringFromCodePoints', 'stringFromCharCodes', 'stringFromNativeUint8List', 'stringFromCharCode', 'stringConcatUnchecked', 'flattenString', 'getTimeZoneName', 'getTimeZoneOffsetInMinutes', 'valueFromDecomposedDate', 'patchUpY2K', 'lazyAsJsDate', 'getYear', 'getMonth', 'getDay', 'getHours', 'getMinutes', 'getSeconds', 'getMilliseconds', 'getWeekday', 'valueFromDateString', 'getProperty', 'setProperty', 'extractStackTrace']
});
_js_helper.Primitives.mirrorFunctionCacheName = '$cachedFunction';
_js_helper.Primitives.mirrorInvokeCacheName = '$cachedInvocation';
_js_helper.Primitives.DOLLAR_CHAR_VALUE = 36;
_js_helper.Primitives.timerFrequency = null;
_js_helper.Primitives.timerTicks = null;
_js_helper.diagnoseIndexError = function(indexable, index) {
  if (!(typeof index == 'number')) return new core.ArgumentError.value(index, 'index');
  let length = core.int._check(dart.dload(indexable, 'length'));
  if (dart.test(dart.dsend(index, '<', 0)) || dart.test(dart.dsend(index, '>=', length))) {
    return core.RangeError.index(core.int._check(index), indexable, 'index', null, length);
  }
  return new core.RangeError.value(core.num._check(index), 'index');
};
dart.lazyFn(_js_helper.diagnoseIndexError, () => dynamicAnddynamicToError());
_js_helper.diagnoseRangeError = function(start, end, length) {
  if (!(typeof start == 'number')) {
    return new core.ArgumentError.value(start, 'start');
  }
  if (dart.test(dart.dsend(start, '<', 0)) || dart.test(dart.dsend(start, '>', length))) {
    return new core.RangeError.range(core.num._check(start), 0, core.int._check(length), 'start');
  }
  if (end != null) {
    if (!(typeof end == 'number')) {
      return new core.ArgumentError.value(end, 'end');
    }
    if (dart.test(dart.dsend(end, '<', start)) || dart.test(dart.dsend(end, '>', length))) {
      return new core.RangeError.range(core.num._check(end), core.int._check(start), core.int._check(length), 'end');
    }
  }
  return new core.ArgumentError.value(end, "end");
};
dart.lazyFn(_js_helper.diagnoseRangeError, () => dynamicAnddynamicAnddynamicToError());
_js_helper.stringLastIndexOfUnchecked = function(receiver, element, start) {
  return receiver.lastIndexOf(element, start);
};
dart.fn(_js_helper.stringLastIndexOfUnchecked, dynamicAnddynamicAnddynamicTodynamic());
_js_helper.argumentErrorValue = function(object) {
  return new core.ArgumentError.value(object);
};
dart.lazyFn(_js_helper.argumentErrorValue, () => dynamicToArgumentError());
_js_helper.checkNull = function(object) {
  if (object == null) dart.throw(_js_helper.argumentErrorValue(object));
  return object;
};
dart.fn(_js_helper.checkNull, dynamicTodynamic$());
_js_helper.checkNum = function(value) {
  if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
  return value;
};
dart.fn(_js_helper.checkNum, dynamicTodynamic$());
_js_helper.checkInt = function(value) {
  if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
  return value;
};
dart.fn(_js_helper.checkInt, dynamicTodynamic$());
_js_helper.checkBool = function(value) {
  if (!(typeof value == 'boolean')) dart.throw(_js_helper.argumentErrorValue(value));
  return value;
};
dart.fn(_js_helper.checkBool, dynamicTodynamic$());
_js_helper.checkString = function(value) {
  if (!(typeof value == 'string')) dart.throw(_js_helper.argumentErrorValue(value));
  return value;
};
dart.fn(_js_helper.checkString, dynamicTodynamic$());
_js_helper.throwRuntimeError = function(message) {
  dart.throw(new _js_helper.RuntimeError(message));
};
dart.fn(_js_helper.throwRuntimeError, dynamicTodynamic$());
_js_helper.throwAbstractClassInstantiationError = function(className) {
  dart.throw(new core.AbstractClassInstantiationError(core.String._check(className)));
};
dart.fn(_js_helper.throwAbstractClassInstantiationError, dynamicTodynamic$());
_js_helper.throwConcurrentModificationError = function(collection) {
  dart.throw(new core.ConcurrentModificationError(collection));
};
dart.fn(_js_helper.throwConcurrentModificationError, dynamicTodynamic$());
const _message = Symbol('_message');
const _method = Symbol('_method');
core.Error = class Error extends core.Object {
  new() {
  }
  static safeToString(object) {
    if (typeof object == 'number' || typeof object == 'boolean' || null == object) {
      return dart.toString(object);
    }
    if (typeof object == 'string') {
      return core.Error._stringToSafeString(object);
    }
    return core.Error._objectToString(object);
  }
  static _stringToSafeString(string) {
    return _js_helper.jsonEncodeNative(string);
  }
  static _objectToString(object) {
    return _js_helper.Primitives.objectToString(object);
  }
  get stackTrace() {
    return _js_helper.Primitives.extractStackTrace(this);
  }
};
dart.setSignature(core.Error, {
  constructors: () => ({new: dart.definiteFunctionType(core.Error, [])}),
  getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])}),
  statics: () => ({
    safeToString: dart.definiteFunctionType(core.String, [core.Object]),
    _stringToSafeString: dart.definiteFunctionType(core.String, [core.String]),
    _objectToString: dart.definiteFunctionType(core.String, [core.Object])
  }),
  names: ['safeToString', '_stringToSafeString', '_objectToString']
});
_js_helper.NullError = class NullError extends core.Error {
  new(message, match) {
    this[_message] = message;
    this[_method] = core.String._check(match == null ? null : match.method);
    super.new();
  }
  toString() {
    if (this[_method] == null) return dart.str`NullError: ${this[_message]}`;
    return dart.str`NullError: method not found: '${this[_method]}' on null`;
  }
};
_js_helper.NullError[dart.implements] = () => [core.NoSuchMethodError];
dart.setSignature(_js_helper.NullError, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.NullError, [core.String, dart.dynamic])}),
  fields: () => ({
    [_message]: core.String,
    [_method]: core.String
  })
});
const _receiver = Symbol('_receiver');
_js_helper.JsNoSuchMethodError = class JsNoSuchMethodError extends core.Error {
  new(message, match) {
    this[_message] = message;
    this[_method] = core.String._check(match == null ? null : match.method);
    this[_receiver] = core.String._check(match == null ? null : match.receiver);
    super.new();
  }
  toString() {
    if (this[_method] == null) return dart.str`NoSuchMethodError: ${this[_message]}`;
    if (this[_receiver] == null) {
      return dart.str`NoSuchMethodError: method not found: '${this[_method]}' (${this[_message]})`;
    }
    return "NoSuchMethodError: " + dart.str`method not found: '${this[_method]}' on '${this[_receiver]}' (${this[_message]})`;
  }
};
_js_helper.JsNoSuchMethodError[dart.implements] = () => [core.NoSuchMethodError];
dart.setSignature(_js_helper.JsNoSuchMethodError, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsNoSuchMethodError, [core.String, dart.dynamic])}),
  fields: () => ({
    [_message]: core.String,
    [_method]: core.String,
    [_receiver]: core.String
  })
});
_js_helper.UnknownJsTypeError = class UnknownJsTypeError extends core.Error {
  new(message) {
    this[_message] = message;
    super.new();
  }
  toString() {
    return dart.test(this[_message][dartx.isEmpty]) ? 'Error' : dart.str`Error: ${this[_message]}`;
  }
};
dart.setSignature(_js_helper.UnknownJsTypeError, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.UnknownJsTypeError, [core.String])}),
  fields: () => ({[_message]: core.String})
});
_js_helper.getTraceFromException = function(exception) {
  return new _js_helper._StackTrace(exception);
};
dart.lazyFn(_js_helper.getTraceFromException, () => dynamicToStackTrace());
const _exception = Symbol('_exception');
const _trace = Symbol('_trace');
_js_helper._StackTrace = class _StackTrace extends core.Object {
  new(exception) {
    this[_exception] = exception;
    this[_trace] = null;
  }
  toString() {
    if (this[_trace] != null) return this[_trace];
    let trace = null;
    if (this[_exception] !== null && typeof this[_exception] === "object") {
      trace = this[_exception].stack;
    }
    return this[_trace] = trace == null ? '' : trace;
  }
};
_js_helper._StackTrace[dart.implements] = () => [core.StackTrace];
dart.setSignature(_js_helper._StackTrace, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper._StackTrace, [dart.dynamic])}),
  fields: () => ({
    [_exception]: dart.dynamic,
    [_trace]: core.String
  })
});
_js_helper.objectHashCode = function(object) {
  if (object == null || typeof object != 'object') {
    return dart.hashCode(object);
  } else {
    return _js_helper.Primitives.objectHashCode(object);
  }
};
dart.fn(_js_helper.objectHashCode, dynamicToint());
_js_helper.fillLiteralMap = function(keyValuePairs, result) {
  let index = 0;
  let length = _js_helper.getLength(keyValuePairs);
  while (index < dart.notNull(length)) {
    let key = _js_helper.getIndex(keyValuePairs, index++);
    let value = _js_helper.getIndex(keyValuePairs, index++);
    result[dartx._set](key, value);
  }
  return result;
};
dart.lazyFn(_js_helper.fillLiteralMap, () => dynamicAndMapTodynamic());
_js_helper.jsHasOwnProperty = function(jsObject, property) {
  return jsObject.hasOwnProperty(property);
};
dart.lazyFn(_js_helper.jsHasOwnProperty, () => dynamicAndStringTobool());
_js_helper.jsPropertyAccess = function(jsObject, property) {
  return jsObject[property];
};
dart.lazyFn(_js_helper.jsPropertyAccess, () => dynamicAndStringTodynamic());
_js_helper.getFallThroughError = function() {
  return new _js_helper.FallThroughErrorImplementation();
};
dart.fn(_js_helper.getFallThroughError, VoidTodynamic$());
_js_helper.Creates = class Creates extends core.Object {
  new(types) {
    this.types = types;
  }
};
dart.setSignature(_js_helper.Creates, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.Creates, [core.String])}),
  fields: () => ({types: core.String})
});
_js_helper.Returns = class Returns extends core.Object {
  new(types) {
    this.types = types;
  }
};
dart.setSignature(_js_helper.Returns, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.Returns, [core.String])}),
  fields: () => ({types: core.String})
});
_js_helper.JSName = class JSName extends core.Object {
  new(name) {
    this.name = name;
  }
};
dart.setSignature(_js_helper.JSName, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSName, [core.String])}),
  fields: () => ({name: core.String})
});
_js_helper.JavaScriptIndexingBehavior = class JavaScriptIndexingBehavior extends core.Object {};
_js_helper.TypeErrorImplementation = class TypeErrorImplementation extends core.Error {
  new(value, actualType, expectedType) {
    this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}'`;
    super.new();
  }
  fromMessage(message) {
    this.message = message;
    super.new();
  }
  toString() {
    return this.message;
  }
};
dart.defineNamedConstructor(_js_helper.TypeErrorImplementation, 'fromMessage');
_js_helper.TypeErrorImplementation[dart.implements] = () => [core.TypeError];
dart.setSignature(_js_helper.TypeErrorImplementation, {
  constructors: () => ({
    new: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.Object, core.Object, core.Object]),
    fromMessage: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.String])
  }),
  fields: () => ({message: core.String})
});
_js_helper.CastErrorImplementation = class CastErrorImplementation extends core.Error {
  new(value, actualType, expectedType) {
    this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` incompatible type '${expectedType}'`;
    super.new();
  }
  toString() {
    return this.message;
  }
};
_js_helper.CastErrorImplementation[dart.implements] = () => [core.CastError];
dart.setSignature(_js_helper.CastErrorImplementation, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.CastErrorImplementation, [core.Object, core.Object, core.Object])}),
  fields: () => ({message: core.String})
});
_js_helper.StrongModeTypeError = class StrongModeTypeError extends core.Error {
  new(value, actualType, expectedType) {
    this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}' in strong mode`;
    super.new();
  }
  toString() {
    return this.message;
  }
};
_js_helper.StrongModeTypeError[dart.implements] = () => [core.TypeError, core.StrongModeError];
dart.setSignature(_js_helper.StrongModeTypeError, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeTypeError, [core.Object, core.Object, core.Object])}),
  fields: () => ({message: core.String})
});
_js_helper.StrongModeCastError = class StrongModeCastError extends core.Error {
  new(value, actualType, expectedType) {
    this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` type '${expectedType}' which is incompatible in strong mode`;
    super.new();
  }
  toString() {
    return this.message;
  }
};
_js_helper.StrongModeCastError[dart.implements] = () => [core.CastError, core.StrongModeError];
dart.setSignature(_js_helper.StrongModeCastError, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeCastError, [core.Object, core.Object, core.Object])}),
  fields: () => ({message: core.String})
});
_js_helper.StrongModeErrorImplementation = class StrongModeErrorImplementation extends core.Error {
  new(message) {
    this.message = message;
    super.new();
  }
  toString() {
    return this.message;
  }
};
_js_helper.StrongModeErrorImplementation[dart.implements] = () => [core.StrongModeError];
dart.setSignature(_js_helper.StrongModeErrorImplementation, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeErrorImplementation, [core.String])}),
  fields: () => ({message: core.String})
});
core.FallThroughError = class FallThroughError extends core.Error {
  new() {
    super.new();
  }
};
dart.setSignature(core.FallThroughError, {
  constructors: () => ({new: dart.definiteFunctionType(core.FallThroughError, [])})
});
_js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
  new() {
    super.new();
  }
  toString() {
    return "Switch case fall-through.";
  }
};
dart.setSignature(_js_helper.FallThroughErrorImplementation, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.FallThroughErrorImplementation, [])})
});
_js_helper.RuntimeError = class RuntimeError extends core.Error {
  new(message) {
    this.message = message;
    super.new();
  }
  toString() {
    return dart.str`RuntimeError: ${this.message}`;
  }
};
dart.setSignature(_js_helper.RuntimeError, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.RuntimeError, [dart.dynamic])}),
  fields: () => ({message: dart.dynamic})
});
core.AssertionError = class AssertionError extends core.Error {
  new() {
    super.new();
  }
  toString() {
    return "Assertion failed";
  }
};
dart.setSignature(core.AssertionError, {
  constructors: () => ({new: dart.definiteFunctionType(core.AssertionError, [])})
});
_js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
  new(message) {
    this[_message] = message;
    super.new();
  }
  toString() {
    return dart.str`Assertion failed: ${this[_message]}`;
  }
};
dart.setSignature(_js_helper.AssertionErrorWithMessage, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.AssertionErrorWithMessage, [core.Object])}),
  fields: () => ({[_message]: core.Object})
});
_js_helper.random64 = function() {
  let int32a = Math.random() * 0x100000000 >>> 0;
  let int32b = Math.random() * 0x100000000 >>> 0;
  return int32a + int32b * 4294967296;
};
dart.fn(_js_helper.random64, VoidToint());
_js_helper.jsonEncodeNative = function(string) {
  return JSON.stringify(string);
};
dart.lazyFn(_js_helper.jsonEncodeNative, () => StringToString$());
const _jsIterator = Symbol('_jsIterator');
const _current$0 = Symbol('_current');
_js_helper.SyncIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class SyncIterator extends core.Object {
    new(jsIterator) {
      this[_jsIterator] = jsIterator;
      this[_current$0] = null;
    }
    get current() {
      return this[_current$0];
    }
    moveNext() {
      let ret = this[_jsIterator].next();
      this[_current$0] = ret.value;
      return !ret.done;
    }
  }
  dart.addTypeTests(SyncIterator);
  SyncIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(SyncIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterator$(E), [dart.dynamic])}),
    fields: () => ({
      [_jsIterator]: dart.dynamic,
      [_current$0]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return SyncIterator;
});
_js_helper.SyncIterator = SyncIterator();
const _generator = Symbol('_generator');
const _args = Symbol('_args');
collection.IterableBase$ = dart.generic(E => {
  class IterableBase extends core.Iterable$(E) {
    new() {
      super.new();
    }
    static iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
      if (leftDelimiter === void 0) leftDelimiter = '(';
      if (rightDelimiter === void 0) rightDelimiter = ')';
      if (dart.test(collection._isToStringVisiting(iterable))) {
        if (leftDelimiter == "(" && rightDelimiter == ")") {
          return "(...)";
        }
        return dart.str`${leftDelimiter}...${rightDelimiter}`;
      }
      let parts = [];
      collection._toStringVisiting[dartx.add](iterable);
      try {
        collection._iterablePartsToStrings(iterable, parts);
      } finally {
        dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
        collection._toStringVisiting[dartx.removeLast]();
      }
      return (() => {
        let _ = new core.StringBuffer(leftDelimiter);
        _.writeAll(parts, ", ");
        _.write(rightDelimiter);
        return _;
      })().toString();
    }
    static iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
      if (leftDelimiter === void 0) leftDelimiter = '(';
      if (rightDelimiter === void 0) rightDelimiter = ')';
      if (dart.test(collection._isToStringVisiting(iterable))) {
        return dart.str`${leftDelimiter}...${rightDelimiter}`;
      }
      let buffer = new core.StringBuffer(leftDelimiter);
      collection._toStringVisiting[dartx.add](iterable);
      try {
        buffer.writeAll(iterable, ", ");
      } finally {
        dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
        collection._toStringVisiting[dartx.removeLast]();
      }
      buffer.write(rightDelimiter);
      return buffer.toString();
    }
  }
  dart.setSignature(IterableBase, {
    constructors: () => ({new: dart.definiteFunctionType(collection.IterableBase$(E), [])}),
    statics: () => ({
      iterableToShortString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String]),
      iterableToFullString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String])
    }),
    names: ['iterableToShortString', 'iterableToFullString']
  });
  return IterableBase;
});
collection.IterableBase = IterableBase();
_js_helper.SyncIterable$ = dart.generic(E => {
  let SyncIteratorOfE = () => (SyncIteratorOfE = dart.constFn(_js_helper.SyncIterator$(E)))();
  class SyncIterable extends collection.IterableBase$(E) {
    new(generator, args) {
      this[_generator] = generator;
      this[_args] = args;
      super.new();
    }
    [_jsIterator]() {
      return this[_generator](...this[_args]);
    }
    get iterator() {
      return new (SyncIteratorOfE())(this[_jsIterator]());
    }
  }
  dart.setSignature(SyncIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterable$(E), [dart.dynamic, dart.dynamic])}),
    fields: () => ({
      [_generator]: dart.dynamic,
      [_args]: dart.dynamic
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    methods: () => ({[_jsIterator]: dart.definiteFunctionType(dart.dynamic, [])})
  });
  dart.defineExtensionMembers(SyncIterable, ['iterator']);
  return SyncIterable;
});
_js_helper.SyncIterable = SyncIterable();
_js_helper.BooleanConversionAssertionError = class BooleanConversionAssertionError extends core.AssertionError {
  new() {
    super.new();
  }
  toString() {
    return 'Failed assertion: boolean expression must not be null';
  }
};
_js_helper.NoThrows = class NoThrows extends core.Object {
  new() {
  }
};
dart.setSignature(_js_helper.NoThrows, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoThrows, [])})
});
_js_helper.NoInline = class NoInline extends core.Object {
  new() {
  }
};
dart.setSignature(_js_helper.NoInline, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoInline, [])})
});
_js_helper.Native = class Native extends core.Object {
  new(name) {
    this.name = name;
  }
};
dart.setSignature(_js_helper.Native, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.Native, [core.String])}),
  fields: () => ({name: core.String})
});
_js_helper.JsPeerInterface = class JsPeerInterface extends core.Object {
  new(opts) {
    let name = opts && 'name' in opts ? opts.name : null;
    this.name = name;
  }
};
dart.setSignature(_js_helper.JsPeerInterface, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsPeerInterface, [], {name: core.String})}),
  fields: () => ({name: core.String})
});
_js_helper.SupportJsExtensionMethods = class SupportJsExtensionMethods extends core.Object {
  new() {
  }
};
dart.setSignature(_js_helper.SupportJsExtensionMethods, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.SupportJsExtensionMethods, [])})
});
const _length$0 = Symbol('_length');
const _strings = Symbol('_strings');
const _nums = Symbol('_nums');
const _rest = Symbol('_rest');
const _first = Symbol('_first');
const _last = Symbol('_last');
const _modifications = Symbol('_modifications');
const _containsTableEntry = Symbol('_containsTableEntry');
const _getBucket = Symbol('_getBucket');
const _getTableCell = Symbol('_getTableCell');
const _newHashTable = Symbol('_newHashTable');
const _addHashTableEntry = Symbol('_addHashTableEntry');
const _getTableBucket = Symbol('_getTableBucket');
const _newLinkedCell = Symbol('_newLinkedCell');
const _setTableEntry = Symbol('_setTableEntry');
const _removeHashTableEntry = Symbol('_removeHashTableEntry');
const _unlinkCell = Symbol('_unlinkCell');
const _modified = Symbol('_modified');
const _next = Symbol('_next');
const _deleteTableEntry = Symbol('_deleteTableEntry');
const _previous = Symbol('_previous');
_js_helper.JsLinkedHashMap$ = dart.generic((K, V) => {
  let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
  let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
  let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
  let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
  let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
  class JsLinkedHashMap extends core.Object {
    new() {
      this[_length$0] = 0;
      this[_strings] = null;
      this[_nums] = null;
      this[_rest] = null;
      this[_first] = null;
      this[_last] = null;
      this[_modifications] = 0;
    }
    static es6() {
      return new (JsLinkedHashMapOfK$V())();
    }
    get length() {
      return this[_length$0];
    }
    get isEmpty() {
      return this[_length$0] == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    get keys() {
      return new (LinkedHashMapKeyIterableOfK())(this);
    }
    get values() {
      return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
    }
    containsKey(key) {
      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
        let strings = this[_strings];
        if (strings == null) return false;
        return this[_containsTableEntry](strings, key);
      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
        let nums = this[_nums];
        if (nums == null) return false;
        return this[_containsTableEntry](nums, key);
      } else {
        return this.internalContainsKey(key);
      }
    }
    internalContainsKey(key) {
      let rest = this[_rest];
      if (rest == null) return false;
      let bucket = this[_getBucket](rest, key);
      return dart.notNull(this.internalFindBucketIndex(bucket, key)) >= 0;
    }
    containsValue(value) {
      return this.keys[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
    }
    addAll(other) {
      MapOfK$V()._check(other);
      other[dartx.forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, KAndVToNull()));
    }
    _get(key) {
      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
        let strings = this[_strings];
        if (strings == null) return null;
        let cell = this[_getTableCell](strings, key);
        return cell == null ? null : cell.hashMapCellValue;
      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
        let nums = this[_nums];
        if (nums == null) return null;
        let cell = this[_getTableCell](nums, key);
        return cell == null ? null : cell.hashMapCellValue;
      } else {
        return this.internalGet(key);
      }
    }
    internalGet(key) {
      let rest = this[_rest];
      if (rest == null) return null;
      let bucket = this[_getBucket](rest, key);
      let index = this.internalFindBucketIndex(bucket, key);
      if (dart.notNull(index) < 0) return null;
      let cell = bucket[index];
      return cell.hashMapCellValue;
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
        let strings = this[_strings];
        if (strings == null) this[_strings] = strings = this[_newHashTable]();
        this[_addHashTableEntry](strings, key, value);
      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
        let nums = this[_nums];
        if (nums == null) this[_nums] = nums = this[_newHashTable]();
        this[_addHashTableEntry](nums, key, value);
      } else {
        this.internalSet(key, value);
      }
      return value;
    }
    internalSet(key, value) {
      K._check(key);
      V._check(value);
      let rest = this[_rest];
      if (rest == null) this[_rest] = rest = this[_newHashTable]();
      let hash = this.internalComputeHashCode(key);
      let bucket = this[_getTableBucket](rest, hash);
      if (bucket == null) {
        let cell = this[_newLinkedCell](key, value);
        this[_setTableEntry](rest, hash, [cell]);
      } else {
        let index = this.internalFindBucketIndex(bucket, key);
        if (dart.notNull(index) >= 0) {
          let cell = bucket[index];
          cell.hashMapCellValue = value;
        } else {
          let cell = this[_newLinkedCell](key, value);
          bucket.push(cell);
        }
      }
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (dart.test(this.containsKey(key))) return this._get(key);
      let value = ifAbsent();
      this._set(key, value);
      return value;
    }
    remove(key) {
      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
        return this[_removeHashTableEntry](this[_strings], key);
      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
        return this[_removeHashTableEntry](this[_nums], key);
      } else {
        return this.internalRemove(key);
      }
    }
    internalRemove(key) {
      let rest = this[_rest];
      if (rest == null) return null;
      let bucket = this[_getBucket](rest, key);
      let index = this.internalFindBucketIndex(bucket, key);
      if (dart.notNull(index) < 0) return null;
      let cell = bucket.splice(index, 1)[0];
      this[_unlinkCell](cell);
      return cell.hashMapCellValue;
    }
    clear() {
      if (dart.notNull(this[_length$0]) > 0) {
        this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
        this[_length$0] = 0;
        this[_modified]();
      }
    }
    forEach(action) {
      let cell = this[_first];
      let modifications = this[_modifications];
      while (cell != null) {
        action(cell.hashMapCellKey, cell.hashMapCellValue);
        if (modifications != this[_modifications]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        cell = cell[_next];
      }
    }
    [_addHashTableEntry](table, key, value) {
      K._check(key);
      V._check(value);
      let cell = this[_getTableCell](table, key);
      if (cell == null) {
        this[_setTableEntry](table, key, this[_newLinkedCell](key, value));
      } else {
        cell.hashMapCellValue = value;
      }
    }
    [_removeHashTableEntry](table, key) {
      if (table == null) return null;
      let cell = this[_getTableCell](table, key);
      if (cell == null) return null;
      this[_unlinkCell](cell);
      this[_deleteTableEntry](table, key);
      return cell.hashMapCellValue;
    }
    [_modified]() {
      this[_modifications] = dart.notNull(this[_modifications]) + 1 & 67108863;
    }
    [_newLinkedCell](key, value) {
      K._check(key);
      V._check(value);
      let cell = new (LinkedHashMapCellOfK$V())(key, value);
      if (this[_first] == null) {
        this[_first] = this[_last] = cell;
      } else {
        let last = this[_last];
        cell[_previous] = last;
        this[_last] = last[_next] = cell;
      }
      this[_length$0] = dart.notNull(this[_length$0]) + 1;
      this[_modified]();
      return cell;
    }
    [_unlinkCell](cell) {
      LinkedHashMapCellOfK$V()._check(cell);
      let previous = cell[_previous];
      let next = cell[_next];
      if (previous == null) {
        dart.assert(dart.equals(cell, this[_first]));
        this[_first] = next;
      } else {
        previous[_next] = next;
      }
      if (next == null) {
        dart.assert(dart.equals(cell, this[_last]));
        this[_last] = previous;
      } else {
        next[_previous] = previous;
      }
      this[_length$0] = dart.notNull(this[_length$0]) - 1;
      this[_modified]();
    }
    static _isStringKey(key) {
      return typeof key == 'string';
    }
    static _isNumericKey(key) {
      return typeof key == 'number' && (key & 0x3ffffff) === key;
    }
    internalComputeHashCode(key) {
      return dart.hashCode(key) & 0x3ffffff;
    }
    [_getBucket](table, key) {
      let hash = this.internalComputeHashCode(key);
      return this[_getTableBucket](table, hash);
    }
    internalFindBucketIndex(bucket, key) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        let cell = bucket[i];
        if (dart.equals(cell.hashMapCellKey, key)) return i;
      }
      return -1;
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
    [_getTableCell](table, key) {
      return table[key];
    }
    [_getTableBucket](table, key) {
      return table[key];
    }
    [_setTableEntry](table, key, value) {
      dart.assert(value != null);
      table[key] = value;
    }
    [_deleteTableEntry](table, key) {
      delete table[key];
    }
    [_containsTableEntry](table, key) {
      let cell = this[_getTableCell](table, key);
      return cell != null;
    }
    [_newHashTable]() {
      let table = Object.create(null);
      let temporaryKey = '<non-identifier-key>';
      this[_setTableEntry](table, temporaryKey, table);
      this[_deleteTableEntry](table, temporaryKey);
      return table;
    }
  }
  dart.addTypeTests(JsLinkedHashMap);
  JsLinkedHashMap[dart.implements] = () => [LinkedHashMapOfK$V(), InternalMapOfK$V()];
  dart.setSignature(JsLinkedHashMap, {
    constructors: () => ({
      new: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), []),
      es6: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), [])
    }),
    fields: () => ({
      [_length$0]: core.int,
      [_strings]: dart.dynamic,
      [_nums]: dart.dynamic,
      [_rest]: dart.dynamic,
      [_first]: LinkedHashMapCellOfK$V(),
      [_last]: LinkedHashMapCellOfK$V(),
      [_modifications]: core.int
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      keys: dart.definiteFunctionType(core.Iterable$(K), []),
      values: dart.definiteFunctionType(core.Iterable$(V), [])
    }),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      internalContainsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
      _get: dart.definiteFunctionType(V, [core.Object]),
      internalGet: dart.definiteFunctionType(V, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [K, V]),
      internalSet: dart.definiteFunctionType(dart.void, [K, V]),
      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
      remove: dart.definiteFunctionType(V, [core.Object]),
      internalRemove: dart.definiteFunctionType(V, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
      [_addHashTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
      [_removeHashTableEntry]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
      [_modified]: dart.definiteFunctionType(dart.void, []),
      [_newLinkedCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V]),
      [_unlinkCell]: dart.definiteFunctionType(dart.void, [LinkedHashMapCellOfK$V()]),
      internalComputeHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
      [_getBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
      internalFindBucketIndex: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
      [_getTableCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [dart.dynamic, dart.dynamic]),
      [_getTableBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
      [_setTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [_deleteTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [_containsTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      [_newHashTable]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    statics: () => ({
      _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic])
    }),
    names: ['_isStringKey', '_isNumericKey']
  });
  dart.defineExtensionMembers(JsLinkedHashMap, [
    'containsKey',
    'containsValue',
    'addAll',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  return JsLinkedHashMap;
});
_js_helper.JsLinkedHashMap = JsLinkedHashMap();
_js_helper.Es6LinkedHashMap$ = dart.generic((K, V) => {
  class Es6LinkedHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
    new() {
      super.new();
    }
    [_getTableCell](table, key) {
      return table.get(key);
    }
    [_getTableBucket](table, key) {
      return table.get(key);
    }
    [_setTableEntry](table, key, value) {
      table.set(key, value);
    }
    [_deleteTableEntry](table, key) {
      table.delete(key);
    }
    [_containsTableEntry](table, key) {
      return table.has(key);
    }
    [_newHashTable]() {
      return new Map();
    }
  }
  return Es6LinkedHashMap;
});
_js_helper.Es6LinkedHashMap = Es6LinkedHashMap();
_js_helper.LinkedHashMapCell$ = dart.generic((K, V) => {
  let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
  class LinkedHashMapCell extends core.Object {
    new(hashMapCellKey, hashMapCellValue) {
      this.hashMapCellKey = hashMapCellKey;
      this.hashMapCellValue = hashMapCellValue;
      this[_next] = null;
      this[_previous] = null;
    }
  }
  dart.addTypeTests(LinkedHashMapCell);
  dart.setSignature(LinkedHashMapCell, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V])}),
    fields: () => ({
      hashMapCellKey: K,
      hashMapCellValue: V,
      [_next]: LinkedHashMapCellOfK$V(),
      [_previous]: LinkedHashMapCellOfK$V()
    })
  });
  return LinkedHashMapCell;
});
_js_helper.LinkedHashMapCell = LinkedHashMapCell();
const _map = Symbol('_map');
_js_helper.LinkedHashMapKeyIterable$ = dart.generic(E => {
  let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
  class LinkedHashMapKeyIterable extends core.Iterable$(E) {
    new(map) {
      this[_map] = map;
      super.new();
    }
    get length() {
      return this[_map][_length$0];
    }
    get isEmpty() {
      return this[_map][_length$0] == 0;
    }
    get iterator() {
      return new (LinkedHashMapKeyIteratorOfE())(this[_map], this[_map][_modifications]);
    }
    contains(element) {
      return this[_map].containsKey(element);
    }
    forEach(f) {
      let cell = this[_map][_first];
      let modifications = this[_map][_modifications];
      while (cell != null) {
        f(cell.hashMapCellKey);
        if (modifications != this[_map][_modifications]) {
          dart.throw(new core.ConcurrentModificationError(this[_map]));
        }
        cell = cell[_next];
      }
    }
  }
  LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(LinkedHashMapKeyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterable$(E), [JsLinkedHashMapOfE$dynamic()])}),
    fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(LinkedHashMapKeyIterable, [
    'contains',
    'forEach',
    'length',
    'isEmpty',
    'iterator'
  ]);
  return LinkedHashMapKeyIterable;
});
_js_helper.LinkedHashMapKeyIterable = LinkedHashMapKeyIterable();
const _cell = Symbol('_cell');
_js_helper.LinkedHashMapKeyIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
  let LinkedHashMapCellOfE$dynamic = () => (LinkedHashMapCellOfE$dynamic = dart.constFn(_js_helper.LinkedHashMapCell$(E, dart.dynamic)))();
  class LinkedHashMapKeyIterator extends core.Object {
    new(map, modifications) {
      this[_map] = map;
      this[_modifications] = modifications;
      this[_cell] = null;
      this[_current$0] = null;
      this[_cell] = this[_map][_first];
    }
    get current() {
      return this[_current$0];
    }
    moveNext() {
      if (this[_modifications] != this[_map][_modifications]) {
        dart.throw(new core.ConcurrentModificationError(this[_map]));
      } else if (this[_cell] == null) {
        this[_current$0] = null;
        return false;
      } else {
        this[_current$0] = this[_cell].hashMapCellKey;
        this[_cell] = this[_cell][_next];
        return true;
      }
    }
  }
  dart.addTypeTests(LinkedHashMapKeyIterator);
  LinkedHashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(LinkedHashMapKeyIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterator$(E), [JsLinkedHashMapOfE$dynamic(), core.int])}),
    fields: () => ({
      [_map]: JsLinkedHashMapOfE$dynamic(),
      [_modifications]: core.int,
      [_cell]: LinkedHashMapCellOfE$dynamic(),
      [_current$0]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return LinkedHashMapKeyIterator;
});
_js_helper.LinkedHashMapKeyIterator = LinkedHashMapKeyIterator();
_js_helper.defineProperty = function(obj, property, value) {
  Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
};
dart.lazyFn(_js_helper.defineProperty, () => dynamicAndStringAnddynamicTovoid());
_js_helper.convertDartClosureToJS = function(F) {
  return (closure, arity) => {
    return closure;
  };
};
dart.fn(_js_helper.convertDartClosureToJS, FAndintToF());
_js_helper.setNativeSubclassDispatchRecord = function(proto, interceptor) {
};
dart.fn(_js_helper.setNativeSubclassDispatchRecord, dynamicAnddynamicTodynamic$());
_js_helper.findDispatchTagForInterceptorClass = function(interceptorClassConstructor) {
};
dart.fn(_js_helper.findDispatchTagForInterceptorClass, dynamicTodynamic$());
_js_helper.makeLeafDispatchRecord = function(interceptor) {
};
dart.fn(_js_helper.makeLeafDispatchRecord, dynamicTodynamic$());
const _nativeRegExp = Symbol('_nativeRegExp');
_js_helper.regExpGetNative = function(regexp) {
  return regexp[_nativeRegExp];
};
dart.lazyFn(_js_helper.regExpGetNative, () => JSSyntaxRegExpTodynamic());
const _nativeGlobalVersion = Symbol('_nativeGlobalVersion');
_js_helper.regExpGetGlobalNative = function(regexp) {
  let nativeRegexp = regexp[_nativeGlobalVersion];
  nativeRegexp.lastIndex = 0;
  return nativeRegexp;
};
dart.lazyFn(_js_helper.regExpGetGlobalNative, () => JSSyntaxRegExpTodynamic());
const _nativeAnchoredVersion = Symbol('_nativeAnchoredVersion');
_js_helper.regExpCaptureCount = function(regexp) {
  let nativeAnchoredRegExp = regexp[_nativeAnchoredVersion];
  let match = nativeAnchoredRegExp.exec('');
  return core.int._check(dart.dsend(dart.dload(match, 'length'), '-', 2));
};
dart.lazyFn(_js_helper.regExpCaptureCount, () => JSSyntaxRegExpToint());
const _nativeGlobalRegExp = Symbol('_nativeGlobalRegExp');
const _nativeAnchoredRegExp = Symbol('_nativeAnchoredRegExp');
const _isMultiLine = Symbol('_isMultiLine');
const _isCaseSensitive = Symbol('_isCaseSensitive');
const _execGlobal = Symbol('_execGlobal');
const _execAnchored = Symbol('_execAnchored');
_js_helper.JSSyntaxRegExp = class JSSyntaxRegExp extends core.Object {
  toString() {
    return dart.str`RegExp/${this.pattern}/`;
  }
  new(source, opts) {
    let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
    let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
    this.pattern = source;
    this[_nativeRegExp] = _js_helper.JSSyntaxRegExp.makeNative(source, multiLine, caseSensitive, false);
    this[_nativeGlobalRegExp] = null;
    this[_nativeAnchoredRegExp] = null;
  }
  get [_nativeGlobalVersion]() {
    if (this[_nativeGlobalRegExp] != null) return this[_nativeGlobalRegExp];
    return this[_nativeGlobalRegExp] = _js_helper.JSSyntaxRegExp.makeNative(this.pattern, this[_isMultiLine], this[_isCaseSensitive], true);
  }
  get [_nativeAnchoredVersion]() {
    if (this[_nativeAnchoredRegExp] != null) return this[_nativeAnchoredRegExp];
    return this[_nativeAnchoredRegExp] = _js_helper.JSSyntaxRegExp.makeNative(dart.str`${this.pattern}|()`, this[_isMultiLine], this[_isCaseSensitive], true);
  }
  get [_isMultiLine]() {
    return this[_nativeRegExp].multiline;
  }
  get [_isCaseSensitive]() {
    return !this[_nativeRegExp].ignoreCase;
  }
  static makeNative(source, multiLine, caseSensitive, global) {
    _js_helper.checkString(source);
    let m = dart.test(multiLine) ? 'm' : '';
    let i = dart.test(caseSensitive) ? '' : 'i';
    let g = dart.test(global) ? 'g' : '';
    let regexp = (function() {
      try {
        return new RegExp(source, m + i + g);
      } catch (e) {
        return e;
      }

    })();
    if (regexp instanceof RegExp) return regexp;
    let errorMessage = String(regexp);
    dart.throw(new core.FormatException(dart.str`Illegal RegExp pattern: ${source}, ${errorMessage}`));
  }
  firstMatch(string) {
    let m = this[_nativeRegExp].exec(_js_helper.checkString(string));
    if (m == null) return null;
    return new _js_helper._MatchImplementation(this, m);
  }
  hasMatch(string) {
    return this[_nativeRegExp].test(_js_helper.checkString(string));
  }
  stringMatch(string) {
    let match = this.firstMatch(string);
    if (match != null) return match.group(0);
    return null;
  }
  allMatches(string, start) {
    if (start === void 0) start = 0;
    _js_helper.checkString(string);
    _js_helper.checkInt(start);
    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
    }
    return new _js_helper._AllMatchesIterable(this, string, start);
  }
  [_execGlobal](string, start) {
    let regexp = this[_nativeGlobalVersion];
    regexp.lastIndex = start;
    let match = regexp.exec(string);
    if (match == null) return null;
    return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
  }
  [_execAnchored](string, start) {
    let regexp = this[_nativeAnchoredVersion];
    regexp.lastIndex = start;
    let match = regexp.exec(string);
    if (match == null) return null;
    if (match[dartx._get](dart.notNull(match[dartx.length]) - 1) != null) return null;
    match[dartx.length] = dart.notNull(match[dartx.length]) - 1;
    return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
  }
  matchAsPrefix(string, start) {
    if (start === void 0) start = 0;
    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
    }
    return this[_execAnchored](string, start);
  }
  get isMultiLine() {
    return this[_isMultiLine];
  }
  get isCaseSensitive() {
    return this[_isCaseSensitive];
  }
};
_js_helper.JSSyntaxRegExp[dart.implements] = () => [core.RegExp];
dart.setSignature(_js_helper.JSSyntaxRegExp, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSSyntaxRegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})}),
  fields: () => ({
    pattern: core.String,
    [_nativeRegExp]: dart.dynamic,
    [_nativeGlobalRegExp]: dart.dynamic,
    [_nativeAnchoredRegExp]: dart.dynamic
  }),
  getters: () => ({
    [_nativeGlobalVersion]: dart.definiteFunctionType(dart.dynamic, []),
    [_nativeAnchoredVersion]: dart.definiteFunctionType(dart.dynamic, []),
    [_isMultiLine]: dart.definiteFunctionType(core.bool, []),
    [_isCaseSensitive]: dart.definiteFunctionType(core.bool, []),
    isMultiLine: dart.definiteFunctionType(core.bool, []),
    isCaseSensitive: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    firstMatch: dart.definiteFunctionType(core.Match, [core.String]),
    hasMatch: dart.definiteFunctionType(core.bool, [core.String]),
    stringMatch: dart.definiteFunctionType(core.String, [core.String]),
    allMatches: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
    [_execGlobal]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
    [_execAnchored]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
    matchAsPrefix: dart.definiteFunctionType(core.Match, [core.String], [core.int])
  }),
  statics: () => ({makeNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool, core.bool, core.bool])}),
  names: ['makeNative']
});
dart.defineExtensionMembers(_js_helper.JSSyntaxRegExp, ['allMatches', 'matchAsPrefix']);
const _match = Symbol('_match');
_js_helper._MatchImplementation = class _MatchImplementation extends core.Object {
  new(pattern, match) {
    this.pattern = pattern;
    this[_match] = match;
    dart.assert(typeof this[_match].input == 'string');
    dart.assert(typeof this[_match].index == 'number');
  }
  get input() {
    return this[_match].input;
  }
  get start() {
    return this[_match].index;
  }
  get end() {
    return dart.notNull(this.start) + dart.notNull(this[_match][dartx._get](0)[dartx.length]);
  }
  group(index) {
    return this[_match][dartx._get](index);
  }
  _get(index) {
    return this.group(index);
  }
  get groupCount() {
    return dart.notNull(this[_match][dartx.length]) - 1;
  }
  groups(groups) {
    let out = JSArrayOfString().of([]);
    for (let i of groups) {
      out[dartx.add](this.group(i));
    }
    return out;
  }
};
_js_helper._MatchImplementation[dart.implements] = () => [core.Match];
dart.setSignature(_js_helper._MatchImplementation, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper._MatchImplementation, [core.Pattern, ListOfString()])}),
  fields: () => ({
    pattern: core.Pattern,
    [_match]: ListOfString()
  }),
  getters: () => ({
    input: dart.definiteFunctionType(core.String, []),
    start: dart.definiteFunctionType(core.int, []),
    end: dart.definiteFunctionType(core.int, []),
    groupCount: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    group: dart.definiteFunctionType(core.String, [core.int]),
    _get: dart.definiteFunctionType(core.String, [core.int]),
    groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
  })
});
const _re = Symbol('_re');
const _string$ = Symbol('_string');
const _start$ = Symbol('_start');
core.Match = class Match extends core.Object {};
_js_helper._AllMatchesIterable = class _AllMatchesIterable extends collection.IterableBase$(core.Match) {
  new(re, string, start) {
    this[_re] = re;
    this[_string$] = string;
    this[_start$] = start;
    super.new();
  }
  get iterator() {
    return new _js_helper._AllMatchesIterator(this[_re], this[_string$], this[_start$]);
  }
};
dart.addSimpleTypeTests(_js_helper._AllMatchesIterable);
dart.setSignature(_js_helper._AllMatchesIterable, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterable, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
  fields: () => ({
    [_re]: _js_helper.JSSyntaxRegExp,
    [_string$]: core.String,
    [_start$]: core.int
  }),
  getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
});
dart.defineExtensionMembers(_js_helper._AllMatchesIterable, ['iterator']);
const _regExp = Symbol('_regExp');
const _nextIndex = Symbol('_nextIndex');
_js_helper._AllMatchesIterator = class _AllMatchesIterator extends core.Object {
  new(regExp, string, nextIndex) {
    this[_regExp] = regExp;
    this[_string$] = string;
    this[_nextIndex] = nextIndex;
    this[_current$0] = null;
  }
  get current() {
    return this[_current$0];
  }
  moveNext() {
    if (this[_string$] == null) return false;
    if (dart.notNull(this[_nextIndex]) <= dart.notNull(this[_string$][dartx.length])) {
      let match = this[_regExp][_execGlobal](this[_string$], this[_nextIndex]);
      if (match != null) {
        this[_current$0] = match;
        let nextIndex = match.end;
        if (match.start == nextIndex) {
          nextIndex = dart.notNull(nextIndex) + 1;
        }
        this[_nextIndex] = nextIndex;
        return true;
      }
    }
    this[_current$0] = null;
    this[_string$] = null;
    return false;
  }
};
_js_helper._AllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
dart.setSignature(_js_helper._AllMatchesIterator, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterator, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
  fields: () => ({
    [_regExp]: _js_helper.JSSyntaxRegExp,
    [_string$]: core.String,
    [_nextIndex]: core.int,
    [_current$0]: core.Match
  }),
  getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
  methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
});
_js_helper.firstMatchAfter = function(regExp, string, start) {
  return regExp[_execGlobal](string, start);
};
dart.lazyFn(_js_helper.firstMatchAfter, () => JSSyntaxRegExpAndStringAndintToMatch());
_js_helper.stringIndexOfStringUnchecked = function(receiver, other, startIndex) {
  return receiver.indexOf(other, startIndex);
};
dart.fn(_js_helper.stringIndexOfStringUnchecked, dynamicAnddynamicAnddynamicToint());
_js_helper.substring1Unchecked = function(receiver, startIndex) {
  return receiver.substring(startIndex);
};
dart.lazyFn(_js_helper.substring1Unchecked, () => dynamicAnddynamicToString());
_js_helper.substring2Unchecked = function(receiver, startIndex, endIndex) {
  return receiver.substring(startIndex, endIndex);
};
dart.lazyFn(_js_helper.substring2Unchecked, () => dynamicAnddynamicAnddynamicToString());
_js_helper.stringContainsStringUnchecked = function(receiver, other, startIndex) {
  return dart.notNull(_js_helper.stringIndexOfStringUnchecked(receiver, other, startIndex)) >= 0;
};
dart.lazyFn(_js_helper.stringContainsStringUnchecked, () => dynamicAnddynamicAnddynamicTobool());
_js_helper.StringMatch = class StringMatch extends core.Object {
  new(start, input, pattern) {
    this.start = start;
    this.input = input;
    this.pattern = pattern;
  }
  get end() {
    return dart.notNull(this.start) + dart.notNull(this.pattern[dartx.length]);
  }
  _get(g) {
    return this.group(g);
  }
  get groupCount() {
    return 0;
  }
  group(group_) {
    if (group_ != 0) {
      dart.throw(new core.RangeError.value(group_));
    }
    return this.pattern;
  }
  groups(groups_) {
    let result = ListOfString().new();
    for (let g of groups_) {
      result[dartx.add](this.group(g));
    }
    return result;
  }
};
_js_helper.StringMatch[dart.implements] = () => [core.Match];
dart.setSignature(_js_helper.StringMatch, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StringMatch, [core.int, core.String, core.String])}),
  fields: () => ({
    start: core.int,
    input: core.String,
    pattern: core.String
  }),
  getters: () => ({
    end: dart.definiteFunctionType(core.int, []),
    groupCount: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    _get: dart.definiteFunctionType(core.String, [core.int]),
    group: dart.definiteFunctionType(core.String, [core.int]),
    groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
  })
});
_js_helper.allMatchesInStringUnchecked = function(pattern, string, startIndex) {
  return new _js_helper._StringAllMatchesIterable(string, pattern, startIndex);
};
dart.lazyFn(_js_helper.allMatchesInStringUnchecked, () => StringAndStringAndintToIterableOfMatch());
const _input = Symbol('_input');
const _pattern = Symbol('_pattern');
const _index$0 = Symbol('_index');
_js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
  new(input, pattern, index) {
    this[_input] = input;
    this[_pattern] = pattern;
    this[_index$0] = index;
    super.new();
  }
  get iterator() {
    return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index$0]);
  }
  get first() {
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
    if (dart.notNull(index) >= 0) {
      return new _js_helper.StringMatch(index, this[_input], this[_pattern]);
    }
    dart.throw(_internal.IterableElementError.noElement());
  }
};
dart.addSimpleTypeTests(_js_helper._StringAllMatchesIterable);
dart.setSignature(_js_helper._StringAllMatchesIterable, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterable, [core.String, core.String, core.int])}),
  fields: () => ({
    [_input]: core.String,
    [_pattern]: core.String,
    [_index$0]: core.int
  }),
  getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
});
dart.defineExtensionMembers(_js_helper._StringAllMatchesIterable, ['iterator', 'first']);
_js_helper._StringAllMatchesIterator = class _StringAllMatchesIterator extends core.Object {
  new(input, pattern, index) {
    this[_input] = input;
    this[_pattern] = pattern;
    this[_index$0] = index;
    this[_current$0] = null;
  }
  moveNext() {
    if (dart.notNull(this[_index$0]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
      this[_current$0] = null;
      return false;
    }
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
    if (dart.notNull(index) < 0) {
      this[_index$0] = dart.notNull(this[_input][dartx.length]) + 1;
      this[_current$0] = null;
      return false;
    }
    let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
    this[_current$0] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
    if (end == this[_index$0]) end++;
    this[_index$0] = end;
    return true;
  }
  get current() {
    return this[_current$0];
  }
};
_js_helper._StringAllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
dart.setSignature(_js_helper._StringAllMatchesIterator, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterator, [core.String, core.String, core.int])}),
  fields: () => ({
    [_input]: core.String,
    [_pattern]: core.String,
    [_index$0]: core.int,
    [_current$0]: core.Match
  }),
  getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
  methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
});
_js_helper.stringContainsUnchecked = function(receiver, other, startIndex) {
  if (typeof other == 'string') {
    return _js_helper.stringContainsStringUnchecked(receiver, other, startIndex);
  } else if (_js_helper.JSSyntaxRegExp.is(other)) {
    return other.hasMatch(receiver[dartx.substring](startIndex));
  } else {
    let substr = receiver[dartx.substring](startIndex);
    return core.bool._check(dart.dload(dart.dsend(other, 'allMatches', substr), 'isNotEmpty'));
  }
};
dart.lazyFn(_js_helper.stringContainsUnchecked, () => StringAnddynamicAndintTobool());
_js_helper.stringReplaceJS = function(receiver, replacer, replacement) {
  replacement = replacement.replace(/\$/g, "$$$$");
  return receiver.replace(replacer, replacement);
};
dart.lazyFn(_js_helper.stringReplaceJS, () => dynamicAnddynamicAnddynamicToString());
_js_helper.stringReplaceFirstRE = function(receiver, regexp, replacement, startIndex) {
  let match = regexp[_execGlobal](receiver, startIndex);
  if (match == null) return receiver;
  let start = match.start;
  let end = match.end;
  return _js_helper.stringReplaceRangeUnchecked(receiver, start, end, replacement);
};
dart.lazyFn(_js_helper.stringReplaceFirstRE, () => StringAndJSSyntaxRegExpAndString__ToString());
_js_helper.quoteStringForRegExp = function(string) {
  return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
};
dart.lazyFn(_js_helper.quoteStringForRegExp, () => dynamicToString());
_js_helper.stringReplaceAllUnchecked = function(receiver, pattern, replacement) {
  _js_helper.checkString(replacement);
  if (typeof pattern == 'string') {
    if (pattern == "") {
      if (receiver == "") {
        return replacement;
      } else {
        let result = new core.StringBuffer();
        let length = receiver[dartx.length];
        result.write(replacement);
        for (let i = 0; i < dart.notNull(length); i++) {
          result.write(receiver[dartx._get](i));
          result.write(replacement);
        }
        return result.toString();
      }
    } else {
      let quoted = _js_helper.quoteStringForRegExp(pattern);
      let replacer = new RegExp(quoted, 'g');
      return _js_helper.stringReplaceJS(receiver, replacer, replacement);
    }
  } else if (_js_helper.JSSyntaxRegExp.is(pattern)) {
    let re = _js_helper.regExpGetGlobalNative(pattern);
    return _js_helper.stringReplaceJS(receiver, re, replacement);
  } else {
    _js_helper.checkNull(pattern);
    dart.throw("String.replaceAll(Pattern) UNIMPLEMENTED");
  }
};
dart.lazyFn(_js_helper.stringReplaceAllUnchecked, () => StringAndPatternAndStringToString());
_js_helper._matchString = function(match) {
  return match._get(0);
};
dart.lazyFn(_js_helper._matchString, () => MatchToString$());
_js_helper._stringIdentity = function(string) {
  return string;
};
dart.lazyFn(_js_helper._stringIdentity, () => StringToString$());
_js_helper.stringReplaceAllFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
  if (onMatch == null) onMatch = _js_helper._matchString;
  if (onNonMatch == null) onNonMatch = _js_helper._stringIdentity;
  if (typeof pattern == 'string') {
    return _js_helper.stringReplaceAllStringFuncUnchecked(receiver, pattern, onMatch, onNonMatch);
  }
  if (!core.Pattern.is(pattern)) {
    dart.throw(new core.ArgumentError.value(pattern, 'pattern', 'is not a Pattern'));
  }
  let buffer = new core.StringBuffer();
  let startIndex = 0;
  for (let match of pattern[dartx.allMatches](receiver)) {
    buffer.write(onNonMatch(receiver[dartx.substring](startIndex, match.start)));
    buffer.write(onMatch(match));
    startIndex = match.end;
  }
  buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
  return buffer.toString();
};
dart.lazyFn(_js_helper.stringReplaceAllFuncUnchecked, () => StringAndPatternAndFn__ToString());
_js_helper.stringReplaceAllEmptyFuncUnchecked = function(receiver, onMatch, onNonMatch) {
  let buffer = new core.StringBuffer();
  let length = receiver[dartx.length];
  let i = 0;
  buffer.write(onNonMatch(""));
  while (i < dart.notNull(length)) {
    buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
    let code = receiver[dartx.codeUnitAt](i);
    if ((dart.notNull(code) & ~1023) == 55296 && dart.notNull(length) > i + 1) {
      code = receiver[dartx.codeUnitAt](i + 1);
      if ((dart.notNull(code) & ~1023) == 56320) {
        buffer.write(onNonMatch(receiver[dartx.substring](i, i + 2)));
        i = i + 2;
        continue;
      }
    }
    buffer.write(onNonMatch(receiver[dartx._get](i)));
    i++;
  }
  buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
  buffer.write(onNonMatch(""));
  return buffer.toString();
};
dart.lazyFn(_js_helper.stringReplaceAllEmptyFuncUnchecked, () => StringAndFnAndFnToString());
_js_helper.stringReplaceAllStringFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
  let patternLength = pattern[dartx.length];
  if (patternLength == 0) {
    return _js_helper.stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
  }
  let length = receiver[dartx.length];
  let buffer = new core.StringBuffer();
  let startIndex = 0;
  while (startIndex < dart.notNull(length)) {
    let position = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
    if (position == -1) {
      break;
    }
    buffer.write(onNonMatch(receiver[dartx.substring](startIndex, position)));
    buffer.write(onMatch(new _js_helper.StringMatch(position, receiver, pattern)));
    startIndex = dart.notNull(position) + dart.notNull(patternLength);
  }
  buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
  return buffer.toString();
};
dart.lazyFn(_js_helper.stringReplaceAllStringFuncUnchecked, () => StringAndStringAndFn__ToString());
_js_helper.stringReplaceFirstUnchecked = function(receiver, pattern, replacement, startIndex) {
  if (typeof pattern == 'string') {
    let index = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
    if (dart.notNull(index) < 0) return receiver;
    let end = dart.notNull(index) + dart.notNull(pattern[dartx.length]);
    return _js_helper.stringReplaceRangeUnchecked(receiver, index, end, replacement);
  }
  if (_js_helper.JSSyntaxRegExp.is(pattern)) {
    return startIndex == 0 ? _js_helper.stringReplaceJS(receiver, _js_helper.regExpGetNative(pattern), replacement) : _js_helper.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
  }
  _js_helper.checkNull(pattern);
  let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
  if (!dart.test(matches.moveNext())) return receiver;
  let match = matches.current;
  return receiver[dartx.replaceRange](match.start, match.end, replacement);
};
dart.lazyFn(_js_helper.stringReplaceFirstUnchecked, () => StringAndPatternAndString__ToString());
_js_helper.stringReplaceFirstMappedUnchecked = function(receiver, pattern, replace, startIndex) {
  let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
  if (!dart.test(matches.moveNext())) return receiver;
  let match = matches.current;
  let replacement = dart.str`${replace(match)}`;
  return receiver[dartx.replaceRange](match.start, match.end, replacement);
};
dart.lazyFn(_js_helper.stringReplaceFirstMappedUnchecked, () => StringAndPatternAndFn__ToString$());
_js_helper.stringJoinUnchecked = function(array, separator) {
  return array.join(separator);
};
dart.lazyFn(_js_helper.stringJoinUnchecked, () => dynamicAnddynamicToString());
_js_helper.stringReplaceRangeUnchecked = function(receiver, start, end, replacement) {
  let prefix = receiver.substring(0, start);
  let suffix = receiver.substring(end);
  return dart.str`${prefix}${replacement}${suffix}`;
};
dart.lazyFn(_js_helper.stringReplaceRangeUnchecked, () => StringAndintAndint__ToString());
_js_helper.getRuntimeType = function(object) {
  return dart.getReifiedType(object);
};
dart.fn(_js_helper.getRuntimeType, dynamicToType());
_js_helper.getIndex = function(array, index) {
  dart.assert(_js_helper.isJsArray(array));
  return array[index];
};
dart.fn(_js_helper.getIndex, dynamicAndintTodynamic());
_js_helper.getLength = function(array) {
  dart.assert(_js_helper.isJsArray(array));
  return array.length;
};
dart.fn(_js_helper.getLength, dynamicToint());
_js_helper.isJsArray = function(value) {
  return _interceptors.JSArray.is(value);
};
dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
_js_mirrors.getName = function(symbol) {
  return _internal.Symbol.getName(_internal.Symbol.as(symbol));
};
dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
_js_mirrors.getSymbol = function(name, library) {
  return dart.throw(new core.UnimplementedError("MirrorSystem.getSymbol unimplemented"));
};
dart.lazyFn(_js_mirrors.getSymbol, () => dynamicAnddynamicToSymbol());
dart.defineLazy(_js_mirrors, {
  get currentJsMirrorSystem() {
    return dart.throw(new core.UnimplementedError("MirrorSystem.currentJsMirrorSystem unimplemented"));
  }
});
dart.defineLazy(_js_mirrors, {
  get _typeMirror() {
    return Symbol("_typeMirror");
  }
});
_js_mirrors.reflect = function(reflectee) {
  if (core.Function.is(reflectee)) {
    return new _js_mirrors.JsClosureMirror._(reflectee);
  } else {
    return new _js_mirrors.JsInstanceMirror._(reflectee);
  }
};
dart.lazyFn(_js_mirrors.reflect, () => dynamicToInstanceMirror());
_js_mirrors.reflectType = function(key) {
  let unwrapped = _js_mirrors._unwrap(key);
  let property = Object.getOwnPropertyDescriptor(unwrapped, _js_mirrors._typeMirror);
  if (property != null) {
    return property.value;
  }
  let mirror = new _js_mirrors.JsClassMirror._(key);
  unwrapped[_js_mirrors._typeMirror] = mirror;
  return mirror;
};
dart.lazyFn(_js_mirrors.reflectType, () => TypeToTypeMirror());
dart.defineLazy(_js_mirrors, {
  get _dart() {
    return dart;
  }
});
_js_mirrors._dload = function(obj, name) {
  return _js_mirrors._dart.dloadMirror(obj, name);
};
dart.lazyFn(_js_mirrors._dload, () => dynamicAndStringTodynamic());
_js_mirrors._dput = function(obj, name, val) {
  _js_mirrors._dart.dputMirror(obj, name, val);
};
dart.lazyFn(_js_mirrors._dput, () => dynamicAndStringAnddynamicTovoid());
_js_mirrors._dcall = function(obj, args) {
  return _js_mirrors._dart.dcall(obj, ...args);
};
dart.lazyFn(_js_mirrors._dcall, () => dynamicAndListTodynamic());
_js_mirrors._dsend = function(obj, name, args) {
  return _js_mirrors._dart.dsend(obj, name, ...args);
};
dart.lazyFn(_js_mirrors._dsend, () => dynamicAndStringAndListTodynamic());
_js_mirrors._getGenericClass = function(obj) {
  return _js_mirrors._dart.getGenericClass(obj);
};
dart.fn(_js_mirrors._getGenericClass, dynamicTodynamic$());
_js_mirrors._getGenericArgs = function(obj) {
  return _js_mirrors._dart.getGenericArgs(obj);
};
dart.fn(_js_mirrors._getGenericArgs, dynamicTodynamic$());
_js_mirrors._defaultConstructorType = function(type) {
  return _js_mirrors._dart.definiteFunctionType(type, []);
};
dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
_js_mirrors._getMixins = function(type) {
  return _js_mirrors._dart.getMixins(type, []);
};
dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
_js_mirrors._Lazy$ = dart.generic(T => {
  const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
  return _Lazy;
});
_js_mirrors._Lazy = _Lazy();
_js_mirrors._getESSymbol = function(symbol) {
  return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
};
dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
_js_mirrors._getMember = function(symbol) {
  let privateSymbol = _js_mirrors._getESSymbol(symbol);
  if (privateSymbol != null) {
    return privateSymbol;
  }
  let name = _js_mirrors.getName(symbol);
  switch (name) {
    case '[]':
    {
      name = '_get';
      break;
    }
    case '[]=':
    {
      name = '_set';
      break;
    }
    case 'unary-':
    {
      name = '_negate';
      break;
    }
    case 'constructor':
    case 'prototype':
    {
      name = dart.str`_${name}`;
      break;
    }
  }
  return name;
};
dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
_js_mirrors._getNameForESSymbol = function(member) {
  dart.assert(typeof member == "symbol");
  let str = dart.toString(member);
  dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
  return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
};
dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
_js_mirrors._getSymbolForESSymbol = function(member) {
  let name = _js_mirrors._getNameForESSymbol(member);
  return new _internal.Symbol.es6(name, member);
};
dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
_js_mirrors._getSymbolForMember = function(member) {
  if (typeof member == 'string') {
    return core.Symbol.new(member);
  } else {
    let name = _js_mirrors._getNameForESSymbol(member);
    return new _internal.Symbol.es6(name, member);
  }
};
dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
_js_mirrors._toDartMap = function(data) {
  if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
  let map = MapOfSymbol$dynamic().new();
  let publicMembers = Object.getOwnPropertyNames(data);
  for (let member of core.Iterable._check(publicMembers)) {
    let symbol = core.Symbol.new(core.String._check(member));
    map[dartx._set](symbol, data[member]);
  }
  let privateMembers = Object.getOwnPropertySymbols(data);
  for (let member of core.Iterable._check(privateMembers)) {
    let symbol = _js_mirrors._getSymbolForESSymbol(member);
    map[dartx._set](symbol, data[member]);
  }
  return map;
};
dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getConstructors = function(obj) {
  let sig = _js_mirrors._dart.getConstructorSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getFields = function(obj) {
  let sig = _js_mirrors._dart.getFieldSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getMethods = function(obj) {
  let sig = _js_mirrors._dart.getMethodSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getGetters = function(obj) {
  let sig = _js_mirrors._dart.getGetterSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getSetters = function(obj) {
  let sig = _js_mirrors._dart.getSetterSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getStaticFields = function(obj) {
  let sig = _js_mirrors._dart.getStaticFieldSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getStatics = function(obj) {
  let sig = _js_mirrors._dart.getStaticSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getStaticGetters = function(obj) {
  let sig = _js_mirrors._dart.getStaticGetterSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._getStaticSetters = function(obj) {
  let sig = _js_mirrors._dart.getStaticSetterSig(obj);
  return _js_mirrors._toDartMap(sig);
};
dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
_js_mirrors._unwrap = function(obj) {
  return _js_mirrors._dart.unwrapType(obj);
};
dart.fn(_js_mirrors._unwrap, dynamicTodynamic$());
_js_mirrors._wrap = function(obj) {
  return _js_mirrors._dart.wrapType(obj);
};
dart.fn(_js_mirrors._wrap, dynamicTodynamic$());
_js_mirrors._runtimeType = function(obj) {
  return _js_mirrors._wrap(_js_mirrors._dart.getReifiedType(obj));
};
dart.fn(_js_mirrors._runtimeType, dynamicTodynamic$());
_js_mirrors._unimplemented = function(t, i) {
  dart.throw(new core.UnimplementedError(dart.str`${t}.${_js_mirrors.getName(i.memberName)} unimplemented`));
};
dart.fn(_js_mirrors._unimplemented, TypeAndInvocationTodynamic());
_js_mirrors._toJsMap = function(map) {
  let obj = {};
  map[dartx.forEach](dart.fn((key, value) => {
    obj[_js_mirrors.getName(key)] = value;
  }, SymbolAnddynamicToNull()));
  return obj;
};
dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
_js_mirrors.JsMirror = class JsMirror extends core.Object {
  noSuchMethod(i) {
    _js_mirrors._unimplemented(this.runtimeType, i);
  }
};
_js_mirrors.JsMirror[dart.implements] = () => [mirrors.Mirror];
_js_mirrors.JsCombinatorMirror = class JsCombinatorMirror extends _js_mirrors.JsMirror {
  get identifiers() {
    return ListOfSymbol()._check(this.noSuchMethod(new dart.InvocationImpl('identifiers', [], {isGetter: true})));
  }
  get isShow() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isShow', [], {isGetter: true})));
  }
  get isHide() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isHide', [], {isGetter: true})));
  }
};
_js_mirrors.JsCombinatorMirror[dart.implements] = () => [mirrors.CombinatorMirror];
_js_mirrors.JsDeclarationMirror = class JsDeclarationMirror extends _js_mirrors.JsMirror {
  get simpleName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('simpleName', [], {isGetter: true})));
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
  }
  get metadata() {
    return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
  }
};
_js_mirrors.JsDeclarationMirror[dart.implements] = () => [mirrors.DeclarationMirror];
_js_mirrors.JsIsolateMirror = class JsIsolateMirror extends _js_mirrors.JsMirror {
  get debugName() {
    return core.String._check(this.noSuchMethod(new dart.InvocationImpl('debugName', [], {isGetter: true})));
  }
  get isCurrent() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isCurrent', [], {isGetter: true})));
  }
  get rootLibrary() {
    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('rootLibrary', [], {isGetter: true})));
  }
};
_js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
_js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
  get isImport() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
  }
  get isExport() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
  }
  get sourceLibrary() {
    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
  }
  get targetLibrary() {
    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('targetLibrary', [], {isGetter: true})));
  }
  get prefix() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('prefix', [], {isGetter: true})));
  }
  get combinators() {
    return ListOfCombinatorMirror()._check(this.noSuchMethod(new dart.InvocationImpl('combinators', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
  }
  get metadata() {
    return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
  }
};
_js_mirrors.JsLibraryDependencyMirror[dart.implements] = () => [mirrors.LibraryDependencyMirror];
_js_mirrors.JsObjectMirror = class JsObjectMirror extends _js_mirrors.JsMirror {
  invoke(...args) {
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('invoke', args, {isMethod: true})));
  }
  getField(...args) {
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('getField', args, {isMethod: true})));
  }
  setField(...args) {
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
  }
};
_js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
const _getAccessor = Symbol('_getAccessor');
_js_mirrors.JsInstanceMirror = class JsInstanceMirror extends _js_mirrors.JsObjectMirror {
  get hasReflectee() {
    return true;
  }
  get type() {
    if (this.reflectee == null) return mirrors.reflectClass(dart.wrapType(core.Null));
    return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._runtimeType(this.reflectee))));
  }
  _(reflectee) {
    this.reflectee = reflectee;
  }
  ['=='](other) {
    return _js_mirrors.JsInstanceMirror.is(other) && core.identical(this.reflectee, other.reflectee);
  }
  get hashCode() {
    return (dart.notNull(core.identityHashCode(this.reflectee)) ^ 909522486) >>> 0;
  }
  [_getAccessor](reflectee, symbol, args, namedArgs) {
    if (args === void 0) args = null;
    if (namedArgs === void 0) namedArgs = null;
    return _js_mirrors._getMember(symbol);
  }
  getField(symbol) {
    let name = this[_getAccessor](this.reflectee, symbol);
    let field = _js_mirrors._dload(this.reflectee, core.String._check(name));
    return _js_mirrors.reflect(field);
  }
  setField(symbol, value) {
    let name = this[_getAccessor](this.reflectee, symbol);
    _js_mirrors._dput(this.reflectee, core.String._check(name), value);
    return _js_mirrors.reflect(value);
  }
  invoke(symbol, args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    let name = this[_getAccessor](this.reflectee, symbol, args, namedArgs);
    if (namedArgs != null) {
      args = core.List.from(args);
      args[dartx.add](_js_mirrors._toJsMap(namedArgs));
    }
    let result = _js_mirrors._dsend(this.reflectee, core.String._check(name), args);
    return _js_mirrors.reflect(result);
  }
  toString() {
    return dart.str`InstanceMirror on '${this.reflectee}'`;
  }
  delegate(...args) {
    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
  }
};
dart.defineNamedConstructor(_js_mirrors.JsInstanceMirror, '_');
_js_mirrors.JsInstanceMirror[dart.implements] = () => [mirrors.InstanceMirror];
dart.setSignature(_js_mirrors.JsInstanceMirror, {
  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsInstanceMirror, [dart.dynamic])}),
  fields: () => ({reflectee: dart.dynamic}),
  getters: () => ({
    hasReflectee: dart.definiteFunctionType(core.bool, []),
    type: dart.definiteFunctionType(mirrors.ClassMirror, [])
  }),
  methods: () => ({
    '==': dart.definiteFunctionType(core.bool, [core.Object]),
    [_getAccessor]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Symbol], [core.List, MapOfSymbol$dynamic()]),
    getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
    setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
    invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
  })
});
_js_mirrors.JsClosureMirror = class JsClosureMirror extends _js_mirrors.JsInstanceMirror {
  _(reflectee) {
    super._(reflectee);
  }
  apply(args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    if (namedArgs != null) {
      args = core.List.from(args);
      args[dartx.add](_js_mirrors._toJsMap(namedArgs));
    }
    let result = _js_mirrors._dcall(this.reflectee, args);
    return _js_mirrors.reflect(result);
  }
  delegate(...args) {
    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
  }
  get function() {
    return mirrors.MethodMirror._check(this.noSuchMethod(new dart.InvocationImpl('function', [], {isGetter: true})));
  }
};
dart.defineNamedConstructor(_js_mirrors.JsClosureMirror, '_');
_js_mirrors.JsClosureMirror[dart.implements] = () => [mirrors.ClosureMirror];
dart.setSignature(_js_mirrors.JsClosureMirror, {
  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClosureMirror, [dart.dynamic])}),
  methods: () => ({apply: dart.definiteFunctionType(mirrors.InstanceMirror, [core.List], [MapOfSymbol$dynamic()])})
});
const _metadata$ = Symbol('_metadata');
const _cls = Symbol('_cls');
let const$0;
const _declarations = Symbol('_declarations');
const _raw = Symbol('_raw');
const _mixin = Symbol('_mixin');
const _typeArguments = Symbol('_typeArguments');
let const$1;
_js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
  get metadata() {
    if (this[_metadata$] == null) {
      let unwrapped = _js_mirrors._unwrap(this[_cls]);
      let fn = Object.hasOwnProperty.call(unwrapped, dart.metadata) ? unwrapped[dart.metadata] : null;
      this[_metadata$] = fn == null ? const$0 || (const$0 = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror()))));
    }
    return this[_metadata$];
  }
  get declarations() {
    if (this[_declarations] == null) {
      this[_declarations] = MapOfSymbol$DeclarationMirror().new();
      let unwrapped = _js_mirrors._unwrap(this[_cls]);
      let constructors = _js_mirrors._getConstructors(unwrapped);
      constructors[dartx.forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      if (dart.test(constructors[dartx.isEmpty])) {
        let name = 'new';
        let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
        let symbol = core.Symbol.new(name);
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
      }
      let fields = _js_mirrors._getFields(unwrapped);
      fields[dartx.forEach](dart.fn((symbol, t) => {
        let metadata = [];
        if (core.List.is(t)) {
          metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
          t = dart.dindex(t, 0);
        }
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
      }, SymbolAnddynamicToNull()));
      let methods = _js_mirrors._getMethods(unwrapped);
      methods[dartx.forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      let getters = _js_mirrors._getGetters(unwrapped);
      getters[dartx.forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      let setters = _js_mirrors._getSetters(unwrapped);
      setters[dartx.forEach](dart.fn((symbol, ft) => {
        let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
        symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      let staticFields = _js_mirrors._getStaticFields(unwrapped);
      staticFields[dartx.forEach](dart.fn((symbol, t) => {
        let name = _js_mirrors.getName(symbol);
        let metadata = [];
        if (core.List.is(t)) {
          metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
          t = dart.dindex(t, 0);
        }
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
      }, SymbolAnddynamicToNull()));
      let statics = _js_mirrors._getStatics(unwrapped);
      statics[dartx.forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
      staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
      staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
    }
    return this[_declarations];
  }
  _(cls) {
    this[_cls] = cls;
    this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
    this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
    this[_mixin] = null;
    this[_typeArguments] = null;
    this[_metadata$] = null;
    this[_declarations] = null;
    let typeArgs = _js_mirrors._getGenericArgs(_js_mirrors._unwrap(cls));
    if (typeArgs == null) {
      this[_typeArguments] = const$1 || (const$1 = dart.constList([], mirrors.TypeMirror));
    } else {
      this[_typeArguments] = ListOfTypeMirror().unmodifiable(core.Iterable._check(dart.dsend(typeArgs, 'map', dart.fn(t => _js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(t))), dynamicToTypeMirror()))));
    }
  }
  newInstance(constructorName, args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    let name = _js_mirrors.getName(constructorName);
    dart.assert(namedArgs == null || dart.test(namedArgs[dartx.isEmpty]));
    let instance = name == 'new' || name == '' ? new (_js_mirrors._unwrap(this[_cls]))(...args) : new (_js_mirrors._unwrap(this[_cls]))[name](...args);
    return _js_mirrors.reflect(instance);
  }
  getField(symbol) {
    let name = _js_mirrors.getName(symbol);
    return _js_mirrors.reflect(_js_mirrors._unwrap(this[_cls])[name]);
  }
  setField(symbol, value) {
    let name = _js_mirrors.getName(symbol);
    _js_mirrors._unwrap(this[_cls])[name] = value;
    return _js_mirrors.reflect(value);
  }
  invoke(symbol, args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    let name = _js_mirrors.getName(symbol);
    if (namedArgs != null) {
      args = core.List.from(args);
      args[dartx.add](_js_mirrors._toJsMap(namedArgs));
    }
    let result = _js_mirrors._unwrap(this[_cls])[name](...args);
    return _js_mirrors.reflect(result);
  }
  get superinterfaces() {
    let interfaceThunk = _js_mirrors._unwrap(this[_cls])[dart.implements];
    if (interfaceThunk == null) {
      return JSArrayOfClassMirror().of([]);
    } else {
      let interfaces = interfaceThunk();
      return ListOfClassMirror()._check(interfaces[dartx.map](mirrors.TypeMirror)(dart.fn(t => _js_mirrors.reflectType(t), TypeToTypeMirror()))[dartx.toList]());
    }
  }
  get hasReflectedType() {
    return true;
  }
  get reflectedType() {
    return this[_cls];
  }
  get isOriginalDeclaration() {
    return this[_raw] == null;
  }
  get typeArguments() {
    return this[_typeArguments];
  }
  get originalDeclaration() {
    if (this[_raw] == null) {
      return this;
    }
    dart.throw(new core.UnimplementedError("ClassMirror.originalDeclaration unimplemented"));
  }
  get superclass() {
    if (dart.equals(this[_cls], dart.wrapType(core.Object))) {
      return null;
    } else {
      return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
    }
  }
  get mixin() {
    if (this[_mixin] != null) {
      return this[_mixin];
    }
    let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
    if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
      this[_mixin] = this;
      return this[_mixin];
    }
    if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
      dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
    }
    this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
    return this[_mixin];
  }
  toString() {
    return dart.str`ClassMirror on '${this[_cls]}'`;
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
  }
  isSubtypeOf(...args) {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubtypeOf', args, {isMethod: true})));
  }
  isAssignableTo(...args) {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAssignableTo', args, {isMethod: true})));
  }
  get typeVariables() {
    return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
  }
  isSubclassOf(...args) {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
  }
  get isAbstract() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
  }
  get instanceMembers() {
    return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
  }
  get staticMembers() {
    return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('staticMembers', [], {isGetter: true})));
  }
};
dart.defineNamedConstructor(_js_mirrors.JsClassMirror, '_');
_js_mirrors.JsClassMirror[dart.implements] = () => [mirrors.ClassMirror];
dart.setSignature(_js_mirrors.JsClassMirror, {
  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClassMirror, [core.Type])}),
  fields: () => ({
    [_cls]: core.Type,
    simpleName: core.Symbol,
    [_raw]: dart.dynamic,
    [_mixin]: mirrors.ClassMirror,
    [_typeArguments]: ListOfTypeMirror(),
    [_metadata$]: ListOfInstanceMirror(),
    [_declarations]: MapOfSymbol$DeclarationMirror()
  }),
  getters: () => ({
    metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), []),
    declarations: dart.definiteFunctionType(core.Map$(core.Symbol, mirrors.DeclarationMirror), []),
    superinterfaces: dart.definiteFunctionType(core.List$(mirrors.ClassMirror), []),
    hasReflectedType: dart.definiteFunctionType(core.bool, []),
    reflectedType: dart.definiteFunctionType(core.Type, []),
    isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
    typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
    originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
    superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
    mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
  }),
  methods: () => ({
    newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
    getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
    setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
    invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
  })
});
const _symbol = Symbol('_symbol');
const _name$0 = Symbol('_name');
_js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
  get simpleName() {
    return this[_symbol];
  }
  _(symbol, t, annotations) {
    this[_symbol] = symbol;
    this[_name$0] = _js_mirrors.getName(symbol);
    this.type = _js_mirrors.reflectType(t);
    this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
    this.isStatic = false;
    this.isFinal = false;
  }
  toString() {
    return dart.str`VariableMirror on '${this[_name$0]}'`;
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
  }
  get isConst() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
  }
};
dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
_js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
dart.setSignature(_js_mirrors.JsVariableMirror, {
  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
  fields: () => ({
    [_symbol]: core.Symbol,
    [_name$0]: core.String,
    type: mirrors.TypeMirror,
    metadata: ListOfInstanceMirror(),
    isStatic: core.bool,
    isFinal: core.bool
  }),
  getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
});
_js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
  _(member, t, annotations) {
    super._(member, t, annotations);
  }
  toString() {
    return dart.str`ParameterMirror on '${this[_name$0]}'`;
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
  }
  get isConst() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
  }
  get isOptional() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOptional', [], {isGetter: true})));
  }
  get isNamed() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isNamed', [], {isGetter: true})));
  }
  get hasDefaultValue() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('hasDefaultValue', [], {isGetter: true})));
  }
  get defaultValue() {
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('defaultValue', [], {isGetter: true})));
  }
};
dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
_js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
dart.setSignature(_js_mirrors.JsParameterMirror, {
  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
});
const _params = Symbol('_params');
const _createParameterMirrorList = Symbol('_createParameterMirrorList');
let const$2;
let const$3;
let const$4;
_js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
  get isSetter() {
    return this[_name$0][dartx.endsWith]('=');
  }
  get isPrivate() {
    return this[_name$0][dartx.startsWith]('_');
  }
  get simpleName() {
    return this[_symbol];
  }
  _constructor(cls, symbol, ftype) {
    this[_symbol] = symbol;
    this[_name$0] = _js_mirrors.getName(symbol);
    this.isConstructor = true;
    this.isStatic = false;
    this[_params] = null;
    this[_metadata$] = null;
    this.isFinal = false;
    this[_createParameterMirrorList](ftype);
  }
  _instanceMethod(cls, symbol, ftype) {
    this[_symbol] = symbol;
    this[_name$0] = _js_mirrors.getName(symbol);
    this.isConstructor = false;
    this.isStatic = false;
    this[_params] = null;
    this[_metadata$] = null;
    this.isFinal = false;
    this[_createParameterMirrorList](ftype);
  }
  _staticMethod(cls, symbol, ftype) {
    this[_symbol] = symbol;
    this[_name$0] = _js_mirrors.getName(symbol);
    this.isConstructor = false;
    this.isStatic = true;
    this[_params] = null;
    this[_metadata$] = null;
    this.isFinal = false;
    this[_createParameterMirrorList](ftype);
  }
  get constructorName() {
    return dart.test(this.isConstructor) ? this[_symbol] : null;
  }
  get parameters() {
    return this[_params];
  }
  get metadata() {
    return this[_metadata$];
  }
  [_createParameterMirrorList](ftype) {
    if (ftype == null) {
      this[_params] = const$2 || (const$2 = dart.constList([], mirrors.ParameterMirror));
      this[_metadata$] = const$3 || (const$3 = dart.constList([], mirrors.InstanceMirror));
      return;
    }
    if (!core.Function.is(ftype) && core.List.is(ftype)) {
      this[_metadata$] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', 1), 'map', dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror()))));
      ftype = dart.dindex(ftype, 0);
    } else {
      this[_metadata$] = const$4 || (const$4 = dart.constList([], mirrors.InstanceMirror));
    }
    if (typeof ftype == "function") {
      ftype = ftype.apply(null, JSArrayOfType().of([dart.dynamic, dart.dynamic, dart.dynamic]));
    }
    let args = core.List._check(dart.dload(ftype, 'args'));
    let opts = core.List._check(dart.dload(ftype, 'optionals'));
    let params = ListOfParameterMirror().new(dart.notNull(args[dartx.length]) + dart.notNull(opts[dartx.length]));
    for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
      let type = args[dartx._get](i);
      let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
      let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
      params[dartx._set](i, param);
    }
    for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
      let type = opts[dartx._get](i);
      let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
      let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
      params[dartx._set](i + dart.notNull(args[dartx.length]), param);
    }
    this[_params] = ListOfParameterMirror().unmodifiable(params);
  }
  toString() {
    return dart.str`MethodMirror on '${this[_name$0]}'`;
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
  }
  get returnType() {
    return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl('returnType', [], {isGetter: true})));
  }
  get source() {
    return core.String._check(this.noSuchMethod(new dart.InvocationImpl('source', [], {isGetter: true})));
  }
  get isAbstract() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
  }
  get isSynthetic() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSynthetic', [], {isGetter: true})));
  }
  get isRegularMethod() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRegularMethod', [], {isGetter: true})));
  }
  get isOperator() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOperator', [], {isGetter: true})));
  }
  get isGetter() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGetter', [], {isGetter: true})));
  }
  get isConstConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConstConstructor', [], {isGetter: true})));
  }
  get isGenerativeConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGenerativeConstructor', [], {isGetter: true})));
  }
  get isRedirectingConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRedirectingConstructor', [], {isGetter: true})));
  }
  get isFactoryConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isFactoryConstructor', [], {isGetter: true})));
  }
};
dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_constructor');
dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_instanceMethod');
dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_staticMethod');
_js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
dart.setSignature(_js_mirrors.JsMethodMirror, {
  constructors: () => ({
    _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
    _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
    _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
  }),
  fields: () => ({
    [_symbol]: core.Symbol,
    [_name$0]: core.String,
    [_params]: ListOfParameterMirror(),
    [_metadata$]: ListOfInstanceMirror(),
    isConstructor: core.bool,
    isStatic: core.bool,
    isFinal: core.bool
  }),
  getters: () => ({
    isSetter: dart.definiteFunctionType(core.bool, []),
    isPrivate: dart.definiteFunctionType(core.bool, []),
    simpleName: dart.definiteFunctionType(core.Symbol, []),
    constructorName: dart.definiteFunctionType(core.Symbol, []),
    parameters: dart.definiteFunctionType(core.List$(mirrors.ParameterMirror), []),
    metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), [])
  }),
  methods: () => ({[_createParameterMirrorList]: dart.definiteFunctionType(dart.void, [dart.dynamic])})
});
_js_primitives.printString = function(string) {
  if (typeof dartPrint == "function") {
    dartPrint(string);
    return;
  }
  if (typeof console == "object" && typeof console.log != "undefined") {
    console.log(string);
    return;
  }
  if (typeof window == "object") {
    return;
  }
  if (typeof print == "function") {
    print(string);
    return;
  }
  throw "Unable to print message: " + String(string);
};
dart.lazyFn(_js_primitives.printString, () => StringTovoid$());
_metadata.SupportedBrowser = class SupportedBrowser extends core.Object {
  new(browserName, minimumVersion) {
    if (minimumVersion === void 0) minimumVersion = null;
    this.browserName = browserName;
    this.minimumVersion = minimumVersion;
  }
};
dart.setSignature(_metadata.SupportedBrowser, {
  constructors: () => ({new: dart.definiteFunctionType(_metadata.SupportedBrowser, [core.String], [core.String])}),
  fields: () => ({
    browserName: core.String,
    minimumVersion: core.String
  }),
  sfields: () => ({
    CHROME: core.String,
    FIREFOX: core.String,
    IE: core.String,
    OPERA: core.String,
    SAFARI: core.String
  })
});
_metadata.SupportedBrowser.CHROME = "Chrome";
_metadata.SupportedBrowser.FIREFOX = "Firefox";
_metadata.SupportedBrowser.IE = "Internet Explorer";
_metadata.SupportedBrowser.OPERA = "Opera";
_metadata.SupportedBrowser.SAFARI = "Safari";
_metadata.Experimental = class Experimental extends core.Object {
  new() {
  }
};
dart.setSignature(_metadata.Experimental, {
  constructors: () => ({new: dart.definiteFunctionType(_metadata.Experimental, [])})
});
_metadata.DomName = class DomName extends core.Object {
  new(name) {
    this.name = name;
  }
};
dart.setSignature(_metadata.DomName, {
  constructors: () => ({new: dart.definiteFunctionType(_metadata.DomName, [core.String])}),
  fields: () => ({name: core.String})
});
_metadata.DocsEditable = class DocsEditable extends core.Object {
  new() {
  }
};
dart.setSignature(_metadata.DocsEditable, {
  constructors: () => ({new: dart.definiteFunctionType(_metadata.DocsEditable, [])})
});
_metadata.Unstable = class Unstable extends core.Object {
  new() {
  }
};
dart.setSignature(_metadata.Unstable, {
  constructors: () => ({new: dart.definiteFunctionType(_metadata.Unstable, [])})
});
dart.defineExtensionNames([
  'lengthInBytes',
  'runtimeType',
  'asUint8List',
  'asInt8List',
  'asUint8ClampedList',
  'asUint16List',
  'asInt16List',
  'asUint32List',
  'asInt32List',
  'asUint64List',
  'asInt64List',
  'asInt32x4List',
  'asFloat32List',
  'asFloat64List',
  'asFloat32x4List',
  'asFloat64x2List',
  'asByteData'
]);
_native_typed_data.NativeByteBuffer = class NativeByteBuffer extends core.Object {
  get [dartx.lengthInBytes]() {
    return this.byteLength;
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.ByteBuffer);
  }
  [dartx.asUint8List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint8List.view(this, offsetInBytes, length);
  }
  [dartx.asInt8List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeInt8List.view(this, offsetInBytes, length);
  }
  [dartx.asUint8ClampedList](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint8ClampedList.view(this, offsetInBytes, length);
  }
  [dartx.asUint16List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint16List.view(this, offsetInBytes, length);
  }
  [dartx.asInt16List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeInt16List.view(this, offsetInBytes, length);
  }
  [dartx.asUint32List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint32List.view(this, offsetInBytes, length);
  }
  [dartx.asInt32List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeInt32List.view(this, offsetInBytes, length);
  }
  [dartx.asUint64List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
  }
  [dartx.asInt64List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
  }
  [dartx.asInt32x4List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    let storage = _native_typed_data.NativeInt32List._check(this[dartx.asInt32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
    return new _native_typed_data.NativeInt32x4List._externalStorage(storage);
  }
  [dartx.asFloat32List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeFloat32List.view(this, offsetInBytes, length);
  }
  [dartx.asFloat64List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeFloat64List.view(this, offsetInBytes, length);
  }
  [dartx.asFloat32x4List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    let storage = _native_typed_data.NativeFloat32List._check(this[dartx.asFloat32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
    return new _native_typed_data.NativeFloat32x4List._externalStorage(storage);
  }
  [dartx.asFloat64x2List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    let storage = _native_typed_data.NativeFloat64List._check(this[dartx.asFloat64List](offsetInBytes, length != null ? dart.notNull(length) * 2 : null));
    return new _native_typed_data.NativeFloat64x2List._externalStorage(storage);
  }
  [dartx.asByteData](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeByteData.view(this, offsetInBytes, length);
  }
};
_native_typed_data.NativeByteBuffer[dart.implements] = () => [typed_data.ByteBuffer];
dart.setSignature(_native_typed_data.NativeByteBuffer, {
  getters: () => ({[dartx.lengthInBytes]: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    [dartx.asUint8List]: dart.definiteFunctionType(typed_data.Uint8List, [], [core.int, core.int]),
    [dartx.asInt8List]: dart.definiteFunctionType(typed_data.Int8List, [], [core.int, core.int]),
    [dartx.asUint8ClampedList]: dart.definiteFunctionType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
    [dartx.asUint16List]: dart.definiteFunctionType(typed_data.Uint16List, [], [core.int, core.int]),
    [dartx.asInt16List]: dart.definiteFunctionType(typed_data.Int16List, [], [core.int, core.int]),
    [dartx.asUint32List]: dart.definiteFunctionType(typed_data.Uint32List, [], [core.int, core.int]),
    [dartx.asInt32List]: dart.definiteFunctionType(typed_data.Int32List, [], [core.int, core.int]),
    [dartx.asUint64List]: dart.definiteFunctionType(typed_data.Uint64List, [], [core.int, core.int]),
    [dartx.asInt64List]: dart.definiteFunctionType(typed_data.Int64List, [], [core.int, core.int]),
    [dartx.asInt32x4List]: dart.definiteFunctionType(typed_data.Int32x4List, [], [core.int, core.int]),
    [dartx.asFloat32List]: dart.definiteFunctionType(typed_data.Float32List, [], [core.int, core.int]),
    [dartx.asFloat64List]: dart.definiteFunctionType(typed_data.Float64List, [], [core.int, core.int]),
    [dartx.asFloat32x4List]: dart.definiteFunctionType(typed_data.Float32x4List, [], [core.int, core.int]),
    [dartx.asFloat64x2List]: dart.definiteFunctionType(typed_data.Float64x2List, [], [core.int, core.int]),
    [dartx.asByteData]: dart.definiteFunctionType(typed_data.ByteData, [], [core.int, core.int])
  })
});
dart.registerExtension(dart.global.ArrayBuffer, _native_typed_data.NativeByteBuffer);
const _storage = Symbol('_storage');
typed_data.Float32x4 = class Float32x4 extends core.Object {
  static new(x, y, z, w) {
    return new _native_typed_data.NativeFloat32x4(x, y, z, w);
  }
  static splat(v) {
    return new _native_typed_data.NativeFloat32x4.splat(v);
  }
  static zero() {
    return new _native_typed_data.NativeFloat32x4.zero();
  }
  static fromInt32x4Bits(x) {
    return _native_typed_data.NativeFloat32x4.fromInt32x4Bits(x);
  }
  static fromFloat64x2(v) {
    return new _native_typed_data.NativeFloat32x4.fromFloat64x2(v);
  }
};
dart.setSignature(typed_data.Float32x4, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Float32x4, [core.double, core.double, core.double, core.double]),
    splat: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
    zero: dart.definiteFunctionType(typed_data.Float32x4, []),
    fromInt32x4Bits: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Int32x4]),
    fromFloat64x2: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float64x2])
  }),
  sfields: () => ({
    XXXX: core.int,
    XXXY: core.int,
    XXXZ: core.int,
    XXXW: core.int,
    XXYX: core.int,
    XXYY: core.int,
    XXYZ: core.int,
    XXYW: core.int,
    XXZX: core.int,
    XXZY: core.int,
    XXZZ: core.int,
    XXZW: core.int,
    XXWX: core.int,
    XXWY: core.int,
    XXWZ: core.int,
    XXWW: core.int,
    XYXX: core.int,
    XYXY: core.int,
    XYXZ: core.int,
    XYXW: core.int,
    XYYX: core.int,
    XYYY: core.int,
    XYYZ: core.int,
    XYYW: core.int,
    XYZX: core.int,
    XYZY: core.int,
    XYZZ: core.int,
    XYZW: core.int,
    XYWX: core.int,
    XYWY: core.int,
    XYWZ: core.int,
    XYWW: core.int,
    XZXX: core.int,
    XZXY: core.int,
    XZXZ: core.int,
    XZXW: core.int,
    XZYX: core.int,
    XZYY: core.int,
    XZYZ: core.int,
    XZYW: core.int,
    XZZX: core.int,
    XZZY: core.int,
    XZZZ: core.int,
    XZZW: core.int,
    XZWX: core.int,
    XZWY: core.int,
    XZWZ: core.int,
    XZWW: core.int,
    XWXX: core.int,
    XWXY: core.int,
    XWXZ: core.int,
    XWXW: core.int,
    XWYX: core.int,
    XWYY: core.int,
    XWYZ: core.int,
    XWYW: core.int,
    XWZX: core.int,
    XWZY: core.int,
    XWZZ: core.int,
    XWZW: core.int,
    XWWX: core.int,
    XWWY: core.int,
    XWWZ: core.int,
    XWWW: core.int,
    YXXX: core.int,
    YXXY: core.int,
    YXXZ: core.int,
    YXXW: core.int,
    YXYX: core.int,
    YXYY: core.int,
    YXYZ: core.int,
    YXYW: core.int,
    YXZX: core.int,
    YXZY: core.int,
    YXZZ: core.int,
    YXZW: core.int,
    YXWX: core.int,
    YXWY: core.int,
    YXWZ: core.int,
    YXWW: core.int,
    YYXX: core.int,
    YYXY: core.int,
    YYXZ: core.int,
    YYXW: core.int,
    YYYX: core.int,
    YYYY: core.int,
    YYYZ: core.int,
    YYYW: core.int,
    YYZX: core.int,
    YYZY: core.int,
    YYZZ: core.int,
    YYZW: core.int,
    YYWX: core.int,
    YYWY: core.int,
    YYWZ: core.int,
    YYWW: core.int,
    YZXX: core.int,
    YZXY: core.int,
    YZXZ: core.int,
    YZXW: core.int,
    YZYX: core.int,
    YZYY: core.int,
    YZYZ: core.int,
    YZYW: core.int,
    YZZX: core.int,
    YZZY: core.int,
    YZZZ: core.int,
    YZZW: core.int,
    YZWX: core.int,
    YZWY: core.int,
    YZWZ: core.int,
    YZWW: core.int,
    YWXX: core.int,
    YWXY: core.int,
    YWXZ: core.int,
    YWXW: core.int,
    YWYX: core.int,
    YWYY: core.int,
    YWYZ: core.int,
    YWYW: core.int,
    YWZX: core.int,
    YWZY: core.int,
    YWZZ: core.int,
    YWZW: core.int,
    YWWX: core.int,
    YWWY: core.int,
    YWWZ: core.int,
    YWWW: core.int,
    ZXXX: core.int,
    ZXXY: core.int,
    ZXXZ: core.int,
    ZXXW: core.int,
    ZXYX: core.int,
    ZXYY: core.int,
    ZXYZ: core.int,
    ZXYW: core.int,
    ZXZX: core.int,
    ZXZY: core.int,
    ZXZZ: core.int,
    ZXZW: core.int,
    ZXWX: core.int,
    ZXWY: core.int,
    ZXWZ: core.int,
    ZXWW: core.int,
    ZYXX: core.int,
    ZYXY: core.int,
    ZYXZ: core.int,
    ZYXW: core.int,
    ZYYX: core.int,
    ZYYY: core.int,
    ZYYZ: core.int,
    ZYYW: core.int,
    ZYZX: core.int,
    ZYZY: core.int,
    ZYZZ: core.int,
    ZYZW: core.int,
    ZYWX: core.int,
    ZYWY: core.int,
    ZYWZ: core.int,
    ZYWW: core.int,
    ZZXX: core.int,
    ZZXY: core.int,
    ZZXZ: core.int,
    ZZXW: core.int,
    ZZYX: core.int,
    ZZYY: core.int,
    ZZYZ: core.int,
    ZZYW: core.int,
    ZZZX: core.int,
    ZZZY: core.int,
    ZZZZ: core.int,
    ZZZW: core.int,
    ZZWX: core.int,
    ZZWY: core.int,
    ZZWZ: core.int,
    ZZWW: core.int,
    ZWXX: core.int,
    ZWXY: core.int,
    ZWXZ: core.int,
    ZWXW: core.int,
    ZWYX: core.int,
    ZWYY: core.int,
    ZWYZ: core.int,
    ZWYW: core.int,
    ZWZX: core.int,
    ZWZY: core.int,
    ZWZZ: core.int,
    ZWZW: core.int,
    ZWWX: core.int,
    ZWWY: core.int,
    ZWWZ: core.int,
    ZWWW: core.int,
    WXXX: core.int,
    WXXY: core.int,
    WXXZ: core.int,
    WXXW: core.int,
    WXYX: core.int,
    WXYY: core.int,
    WXYZ: core.int,
    WXYW: core.int,
    WXZX: core.int,
    WXZY: core.int,
    WXZZ: core.int,
    WXZW: core.int,
    WXWX: core.int,
    WXWY: core.int,
    WXWZ: core.int,
    WXWW: core.int,
    WYXX: core.int,
    WYXY: core.int,
    WYXZ: core.int,
    WYXW: core.int,
    WYYX: core.int,
    WYYY: core.int,
    WYYZ: core.int,
    WYYW: core.int,
    WYZX: core.int,
    WYZY: core.int,
    WYZZ: core.int,
    WYZW: core.int,
    WYWX: core.int,
    WYWY: core.int,
    WYWZ: core.int,
    WYWW: core.int,
    WZXX: core.int,
    WZXY: core.int,
    WZXZ: core.int,
    WZXW: core.int,
    WZYX: core.int,
    WZYY: core.int,
    WZYZ: core.int,
    WZYW: core.int,
    WZZX: core.int,
    WZZY: core.int,
    WZZZ: core.int,
    WZZW: core.int,
    WZWX: core.int,
    WZWY: core.int,
    WZWZ: core.int,
    WZWW: core.int,
    WWXX: core.int,
    WWXY: core.int,
    WWXZ: core.int,
    WWXW: core.int,
    WWYX: core.int,
    WWYY: core.int,
    WWYZ: core.int,
    WWYW: core.int,
    WWZX: core.int,
    WWZY: core.int,
    WWZZ: core.int,
    WWZW: core.int,
    WWWX: core.int,
    WWWY: core.int,
    WWWZ: core.int,
    WWWW: core.int
  })
});
typed_data.Float32x4.XXXX = 0;
typed_data.Float32x4.XXXY = 64;
typed_data.Float32x4.XXXZ = 128;
typed_data.Float32x4.XXXW = 192;
typed_data.Float32x4.XXYX = 16;
typed_data.Float32x4.XXYY = 80;
typed_data.Float32x4.XXYZ = 144;
typed_data.Float32x4.XXYW = 208;
typed_data.Float32x4.XXZX = 32;
typed_data.Float32x4.XXZY = 96;
typed_data.Float32x4.XXZZ = 160;
typed_data.Float32x4.XXZW = 224;
typed_data.Float32x4.XXWX = 48;
typed_data.Float32x4.XXWY = 112;
typed_data.Float32x4.XXWZ = 176;
typed_data.Float32x4.XXWW = 240;
typed_data.Float32x4.XYXX = 4;
typed_data.Float32x4.XYXY = 68;
typed_data.Float32x4.XYXZ = 132;
typed_data.Float32x4.XYXW = 196;
typed_data.Float32x4.XYYX = 20;
typed_data.Float32x4.XYYY = 84;
typed_data.Float32x4.XYYZ = 148;
typed_data.Float32x4.XYYW = 212;
typed_data.Float32x4.XYZX = 36;
typed_data.Float32x4.XYZY = 100;
typed_data.Float32x4.XYZZ = 164;
typed_data.Float32x4.XYZW = 228;
typed_data.Float32x4.XYWX = 52;
typed_data.Float32x4.XYWY = 116;
typed_data.Float32x4.XYWZ = 180;
typed_data.Float32x4.XYWW = 244;
typed_data.Float32x4.XZXX = 8;
typed_data.Float32x4.XZXY = 72;
typed_data.Float32x4.XZXZ = 136;
typed_data.Float32x4.XZXW = 200;
typed_data.Float32x4.XZYX = 24;
typed_data.Float32x4.XZYY = 88;
typed_data.Float32x4.XZYZ = 152;
typed_data.Float32x4.XZYW = 216;
typed_data.Float32x4.XZZX = 40;
typed_data.Float32x4.XZZY = 104;
typed_data.Float32x4.XZZZ = 168;
typed_data.Float32x4.XZZW = 232;
typed_data.Float32x4.XZWX = 56;
typed_data.Float32x4.XZWY = 120;
typed_data.Float32x4.XZWZ = 184;
typed_data.Float32x4.XZWW = 248;
typed_data.Float32x4.XWXX = 12;
typed_data.Float32x4.XWXY = 76;
typed_data.Float32x4.XWXZ = 140;
typed_data.Float32x4.XWXW = 204;
typed_data.Float32x4.XWYX = 28;
typed_data.Float32x4.XWYY = 92;
typed_data.Float32x4.XWYZ = 156;
typed_data.Float32x4.XWYW = 220;
typed_data.Float32x4.XWZX = 44;
typed_data.Float32x4.XWZY = 108;
typed_data.Float32x4.XWZZ = 172;
typed_data.Float32x4.XWZW = 236;
typed_data.Float32x4.XWWX = 60;
typed_data.Float32x4.XWWY = 124;
typed_data.Float32x4.XWWZ = 188;
typed_data.Float32x4.XWWW = 252;
typed_data.Float32x4.YXXX = 1;
typed_data.Float32x4.YXXY = 65;
typed_data.Float32x4.YXXZ = 129;
typed_data.Float32x4.YXXW = 193;
typed_data.Float32x4.YXYX = 17;
typed_data.Float32x4.YXYY = 81;
typed_data.Float32x4.YXYZ = 145;
typed_data.Float32x4.YXYW = 209;
typed_data.Float32x4.YXZX = 33;
typed_data.Float32x4.YXZY = 97;
typed_data.Float32x4.YXZZ = 161;
typed_data.Float32x4.YXZW = 225;
typed_data.Float32x4.YXWX = 49;
typed_data.Float32x4.YXWY = 113;
typed_data.Float32x4.YXWZ = 177;
typed_data.Float32x4.YXWW = 241;
typed_data.Float32x4.YYXX = 5;
typed_data.Float32x4.YYXY = 69;
typed_data.Float32x4.YYXZ = 133;
typed_data.Float32x4.YYXW = 197;
typed_data.Float32x4.YYYX = 21;
typed_data.Float32x4.YYYY = 85;
typed_data.Float32x4.YYYZ = 149;
typed_data.Float32x4.YYYW = 213;
typed_data.Float32x4.YYZX = 37;
typed_data.Float32x4.YYZY = 101;
typed_data.Float32x4.YYZZ = 165;
typed_data.Float32x4.YYZW = 229;
typed_data.Float32x4.YYWX = 53;
typed_data.Float32x4.YYWY = 117;
typed_data.Float32x4.YYWZ = 181;
typed_data.Float32x4.YYWW = 245;
typed_data.Float32x4.YZXX = 9;
typed_data.Float32x4.YZXY = 73;
typed_data.Float32x4.YZXZ = 137;
typed_data.Float32x4.YZXW = 201;
typed_data.Float32x4.YZYX = 25;
typed_data.Float32x4.YZYY = 89;
typed_data.Float32x4.YZYZ = 153;
typed_data.Float32x4.YZYW = 217;
typed_data.Float32x4.YZZX = 41;
typed_data.Float32x4.YZZY = 105;
typed_data.Float32x4.YZZZ = 169;
typed_data.Float32x4.YZZW = 233;
typed_data.Float32x4.YZWX = 57;
typed_data.Float32x4.YZWY = 121;
typed_data.Float32x4.YZWZ = 185;
typed_data.Float32x4.YZWW = 249;
typed_data.Float32x4.YWXX = 13;
typed_data.Float32x4.YWXY = 77;
typed_data.Float32x4.YWXZ = 141;
typed_data.Float32x4.YWXW = 205;
typed_data.Float32x4.YWYX = 29;
typed_data.Float32x4.YWYY = 93;
typed_data.Float32x4.YWYZ = 157;
typed_data.Float32x4.YWYW = 221;
typed_data.Float32x4.YWZX = 45;
typed_data.Float32x4.YWZY = 109;
typed_data.Float32x4.YWZZ = 173;
typed_data.Float32x4.YWZW = 237;
typed_data.Float32x4.YWWX = 61;
typed_data.Float32x4.YWWY = 125;
typed_data.Float32x4.YWWZ = 189;
typed_data.Float32x4.YWWW = 253;
typed_data.Float32x4.ZXXX = 2;
typed_data.Float32x4.ZXXY = 66;
typed_data.Float32x4.ZXXZ = 130;
typed_data.Float32x4.ZXXW = 194;
typed_data.Float32x4.ZXYX = 18;
typed_data.Float32x4.ZXYY = 82;
typed_data.Float32x4.ZXYZ = 146;
typed_data.Float32x4.ZXYW = 210;
typed_data.Float32x4.ZXZX = 34;
typed_data.Float32x4.ZXZY = 98;
typed_data.Float32x4.ZXZZ = 162;
typed_data.Float32x4.ZXZW = 226;
typed_data.Float32x4.ZXWX = 50;
typed_data.Float32x4.ZXWY = 114;
typed_data.Float32x4.ZXWZ = 178;
typed_data.Float32x4.ZXWW = 242;
typed_data.Float32x4.ZYXX = 6;
typed_data.Float32x4.ZYXY = 70;
typed_data.Float32x4.ZYXZ = 134;
typed_data.Float32x4.ZYXW = 198;
typed_data.Float32x4.ZYYX = 22;
typed_data.Float32x4.ZYYY = 86;
typed_data.Float32x4.ZYYZ = 150;
typed_data.Float32x4.ZYYW = 214;
typed_data.Float32x4.ZYZX = 38;
typed_data.Float32x4.ZYZY = 102;
typed_data.Float32x4.ZYZZ = 166;
typed_data.Float32x4.ZYZW = 230;
typed_data.Float32x4.ZYWX = 54;
typed_data.Float32x4.ZYWY = 118;
typed_data.Float32x4.ZYWZ = 182;
typed_data.Float32x4.ZYWW = 246;
typed_data.Float32x4.ZZXX = 10;
typed_data.Float32x4.ZZXY = 74;
typed_data.Float32x4.ZZXZ = 138;
typed_data.Float32x4.ZZXW = 202;
typed_data.Float32x4.ZZYX = 26;
typed_data.Float32x4.ZZYY = 90;
typed_data.Float32x4.ZZYZ = 154;
typed_data.Float32x4.ZZYW = 218;
typed_data.Float32x4.ZZZX = 42;
typed_data.Float32x4.ZZZY = 106;
typed_data.Float32x4.ZZZZ = 170;
typed_data.Float32x4.ZZZW = 234;
typed_data.Float32x4.ZZWX = 58;
typed_data.Float32x4.ZZWY = 122;
typed_data.Float32x4.ZZWZ = 186;
typed_data.Float32x4.ZZWW = 250;
typed_data.Float32x4.ZWXX = 14;
typed_data.Float32x4.ZWXY = 78;
typed_data.Float32x4.ZWXZ = 142;
typed_data.Float32x4.ZWXW = 206;
typed_data.Float32x4.ZWYX = 30;
typed_data.Float32x4.ZWYY = 94;
typed_data.Float32x4.ZWYZ = 158;
typed_data.Float32x4.ZWYW = 222;
typed_data.Float32x4.ZWZX = 46;
typed_data.Float32x4.ZWZY = 110;
typed_data.Float32x4.ZWZZ = 174;
typed_data.Float32x4.ZWZW = 238;
typed_data.Float32x4.ZWWX = 62;
typed_data.Float32x4.ZWWY = 126;
typed_data.Float32x4.ZWWZ = 190;
typed_data.Float32x4.ZWWW = 254;
typed_data.Float32x4.WXXX = 3;
typed_data.Float32x4.WXXY = 67;
typed_data.Float32x4.WXXZ = 131;
typed_data.Float32x4.WXXW = 195;
typed_data.Float32x4.WXYX = 19;
typed_data.Float32x4.WXYY = 83;
typed_data.Float32x4.WXYZ = 147;
typed_data.Float32x4.WXYW = 211;
typed_data.Float32x4.WXZX = 35;
typed_data.Float32x4.WXZY = 99;
typed_data.Float32x4.WXZZ = 163;
typed_data.Float32x4.WXZW = 227;
typed_data.Float32x4.WXWX = 51;
typed_data.Float32x4.WXWY = 115;
typed_data.Float32x4.WXWZ = 179;
typed_data.Float32x4.WXWW = 243;
typed_data.Float32x4.WYXX = 7;
typed_data.Float32x4.WYXY = 71;
typed_data.Float32x4.WYXZ = 135;
typed_data.Float32x4.WYXW = 199;
typed_data.Float32x4.WYYX = 23;
typed_data.Float32x4.WYYY = 87;
typed_data.Float32x4.WYYZ = 151;
typed_data.Float32x4.WYYW = 215;
typed_data.Float32x4.WYZX = 39;
typed_data.Float32x4.WYZY = 103;
typed_data.Float32x4.WYZZ = 167;
typed_data.Float32x4.WYZW = 231;
typed_data.Float32x4.WYWX = 55;
typed_data.Float32x4.WYWY = 119;
typed_data.Float32x4.WYWZ = 183;
typed_data.Float32x4.WYWW = 247;
typed_data.Float32x4.WZXX = 11;
typed_data.Float32x4.WZXY = 75;
typed_data.Float32x4.WZXZ = 139;
typed_data.Float32x4.WZXW = 203;
typed_data.Float32x4.WZYX = 27;
typed_data.Float32x4.WZYY = 91;
typed_data.Float32x4.WZYZ = 155;
typed_data.Float32x4.WZYW = 219;
typed_data.Float32x4.WZZX = 43;
typed_data.Float32x4.WZZY = 107;
typed_data.Float32x4.WZZZ = 171;
typed_data.Float32x4.WZZW = 235;
typed_data.Float32x4.WZWX = 59;
typed_data.Float32x4.WZWY = 123;
typed_data.Float32x4.WZWZ = 187;
typed_data.Float32x4.WZWW = 251;
typed_data.Float32x4.WWXX = 15;
typed_data.Float32x4.WWXY = 79;
typed_data.Float32x4.WWXZ = 143;
typed_data.Float32x4.WWXW = 207;
typed_data.Float32x4.WWYX = 31;
typed_data.Float32x4.WWYY = 95;
typed_data.Float32x4.WWYZ = 159;
typed_data.Float32x4.WWYW = 223;
typed_data.Float32x4.WWZX = 47;
typed_data.Float32x4.WWZY = 111;
typed_data.Float32x4.WWZZ = 175;
typed_data.Float32x4.WWZW = 239;
typed_data.Float32x4.WWWX = 63;
typed_data.Float32x4.WWWY = 127;
typed_data.Float32x4.WWWZ = 191;
typed_data.Float32x4.WWWW = 255;
_native_typed_data.NativeFloat32x4List = class NativeFloat32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float32x4), _internal.FixedLengthListMixin$(typed_data.Float32x4)) {
  new(length) {
    this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(length) * 4);
  }
  _externalStorage(storage) {
    this[_storage] = storage;
  }
  _slowFromList(list) {
    this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(list[dartx.length]) * 4);
    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
      let e = list[dartx._get](i);
      this[_storage][dartx._set](i * 4 + 0, e.x);
      this[_storage][dartx._set](i * 4 + 1, e.y);
      this[_storage][dartx._set](i * 4 + 2, e.z);
      this[_storage][dartx._set](i * 4 + 3, e.w);
    }
  }
  get runtimeType() {
    return dart.wrapType(typed_data.Float32x4List);
  }
  static fromList(list) {
    if (_native_typed_data.NativeFloat32x4List.is(list)) {
      return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List.fromList(list[_storage]));
    } else {
      return new _native_typed_data.NativeFloat32x4List._slowFromList(list);
    }
  }
  get buffer() {
    return this[_storage][dartx.buffer];
  }
  get lengthInBytes() {
    return this[_storage][dartx.lengthInBytes];
  }
  get offsetInBytes() {
    return this[_storage][dartx.offsetInBytes];
  }
  get elementSizeInBytes() {
    return typed_data.Float32x4List.BYTES_PER_ELEMENT;
  }
  get length() {
    return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
    let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
    let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
    let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  _set(index, value) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
    return value;
  }
  sublist(start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this.length);
    return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
  }
};
dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_externalStorage');
dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_slowFromList');
_native_typed_data.NativeFloat32x4List[dart.implements] = () => [typed_data.Float32x4List];
dart.setSignature(_native_typed_data.NativeFloat32x4List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [core.int]),
    _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [_native_typed_data.NativeFloat32List]),
    _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()])
  }),
  fields: () => ({[_storage]: _native_typed_data.NativeFloat32List}),
  getters: () => ({
    buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
    lengthInBytes: dart.definiteFunctionType(core.int, []),
    offsetInBytes: dart.definiteFunctionType(core.int, []),
    elementSizeInBytes: dart.definiteFunctionType(core.int, []),
    length: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    _get: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
    _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32x4])
  })
});
dart.defineExtensionMembers(_native_typed_data.NativeFloat32x4List, [
  '_get',
  '_set',
  'sublist',
  'buffer',
  'lengthInBytes',
  'offsetInBytes',
  'elementSizeInBytes',
  'length'
]);
typed_data.Int32x4 = class Int32x4 extends core.Object {
  static new(x, y, z, w) {
    return new _native_typed_data.NativeInt32x4(x, y, z, w);
  }
  static bool(x, y, z, w) {
    return new _native_typed_data.NativeInt32x4.bool(x, y, z, w);
  }
  static fromFloat32x4Bits(x) {
    return _native_typed_data.NativeInt32x4.fromFloat32x4Bits(x);
  }
};
dart.setSignature(typed_data.Int32x4, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Int32x4, [core.int, core.int, core.int, core.int]),
    bool: dart.definiteFunctionType(typed_data.Int32x4, [core.bool, core.bool, core.bool, core.bool]),
    fromFloat32x4Bits: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4])
  }),
  sfields: () => ({
    XXXX: core.int,
    XXXY: core.int,
    XXXZ: core.int,
    XXXW: core.int,
    XXYX: core.int,
    XXYY: core.int,
    XXYZ: core.int,
    XXYW: core.int,
    XXZX: core.int,
    XXZY: core.int,
    XXZZ: core.int,
    XXZW: core.int,
    XXWX: core.int,
    XXWY: core.int,
    XXWZ: core.int,
    XXWW: core.int,
    XYXX: core.int,
    XYXY: core.int,
    XYXZ: core.int,
    XYXW: core.int,
    XYYX: core.int,
    XYYY: core.int,
    XYYZ: core.int,
    XYYW: core.int,
    XYZX: core.int,
    XYZY: core.int,
    XYZZ: core.int,
    XYZW: core.int,
    XYWX: core.int,
    XYWY: core.int,
    XYWZ: core.int,
    XYWW: core.int,
    XZXX: core.int,
    XZXY: core.int,
    XZXZ: core.int,
    XZXW: core.int,
    XZYX: core.int,
    XZYY: core.int,
    XZYZ: core.int,
    XZYW: core.int,
    XZZX: core.int,
    XZZY: core.int,
    XZZZ: core.int,
    XZZW: core.int,
    XZWX: core.int,
    XZWY: core.int,
    XZWZ: core.int,
    XZWW: core.int,
    XWXX: core.int,
    XWXY: core.int,
    XWXZ: core.int,
    XWXW: core.int,
    XWYX: core.int,
    XWYY: core.int,
    XWYZ: core.int,
    XWYW: core.int,
    XWZX: core.int,
    XWZY: core.int,
    XWZZ: core.int,
    XWZW: core.int,
    XWWX: core.int,
    XWWY: core.int,
    XWWZ: core.int,
    XWWW: core.int,
    YXXX: core.int,
    YXXY: core.int,
    YXXZ: core.int,
    YXXW: core.int,
    YXYX: core.int,
    YXYY: core.int,
    YXYZ: core.int,
    YXYW: core.int,
    YXZX: core.int,
    YXZY: core.int,
    YXZZ: core.int,
    YXZW: core.int,
    YXWX: core.int,
    YXWY: core.int,
    YXWZ: core.int,
    YXWW: core.int,
    YYXX: core.int,
    YYXY: core.int,
    YYXZ: core.int,
    YYXW: core.int,
    YYYX: core.int,
    YYYY: core.int,
    YYYZ: core.int,
    YYYW: core.int,
    YYZX: core.int,
    YYZY: core.int,
    YYZZ: core.int,
    YYZW: core.int,
    YYWX: core.int,
    YYWY: core.int,
    YYWZ: core.int,
    YYWW: core.int,
    YZXX: core.int,
    YZXY: core.int,
    YZXZ: core.int,
    YZXW: core.int,
    YZYX: core.int,
    YZYY: core.int,
    YZYZ: core.int,
    YZYW: core.int,
    YZZX: core.int,
    YZZY: core.int,
    YZZZ: core.int,
    YZZW: core.int,
    YZWX: core.int,
    YZWY: core.int,
    YZWZ: core.int,
    YZWW: core.int,
    YWXX: core.int,
    YWXY: core.int,
    YWXZ: core.int,
    YWXW: core.int,
    YWYX: core.int,
    YWYY: core.int,
    YWYZ: core.int,
    YWYW: core.int,
    YWZX: core.int,
    YWZY: core.int,
    YWZZ: core.int,
    YWZW: core.int,
    YWWX: core.int,
    YWWY: core.int,
    YWWZ: core.int,
    YWWW: core.int,
    ZXXX: core.int,
    ZXXY: core.int,
    ZXXZ: core.int,
    ZXXW: core.int,
    ZXYX: core.int,
    ZXYY: core.int,
    ZXYZ: core.int,
    ZXYW: core.int,
    ZXZX: core.int,
    ZXZY: core.int,
    ZXZZ: core.int,
    ZXZW: core.int,
    ZXWX: core.int,
    ZXWY: core.int,
    ZXWZ: core.int,
    ZXWW: core.int,
    ZYXX: core.int,
    ZYXY: core.int,
    ZYXZ: core.int,
    ZYXW: core.int,
    ZYYX: core.int,
    ZYYY: core.int,
    ZYYZ: core.int,
    ZYYW: core.int,
    ZYZX: core.int,
    ZYZY: core.int,
    ZYZZ: core.int,
    ZYZW: core.int,
    ZYWX: core.int,
    ZYWY: core.int,
    ZYWZ: core.int,
    ZYWW: core.int,
    ZZXX: core.int,
    ZZXY: core.int,
    ZZXZ: core.int,
    ZZXW: core.int,
    ZZYX: core.int,
    ZZYY: core.int,
    ZZYZ: core.int,
    ZZYW: core.int,
    ZZZX: core.int,
    ZZZY: core.int,
    ZZZZ: core.int,
    ZZZW: core.int,
    ZZWX: core.int,
    ZZWY: core.int,
    ZZWZ: core.int,
    ZZWW: core.int,
    ZWXX: core.int,
    ZWXY: core.int,
    ZWXZ: core.int,
    ZWXW: core.int,
    ZWYX: core.int,
    ZWYY: core.int,
    ZWYZ: core.int,
    ZWYW: core.int,
    ZWZX: core.int,
    ZWZY: core.int,
    ZWZZ: core.int,
    ZWZW: core.int,
    ZWWX: core.int,
    ZWWY: core.int,
    ZWWZ: core.int,
    ZWWW: core.int,
    WXXX: core.int,
    WXXY: core.int,
    WXXZ: core.int,
    WXXW: core.int,
    WXYX: core.int,
    WXYY: core.int,
    WXYZ: core.int,
    WXYW: core.int,
    WXZX: core.int,
    WXZY: core.int,
    WXZZ: core.int,
    WXZW: core.int,
    WXWX: core.int,
    WXWY: core.int,
    WXWZ: core.int,
    WXWW: core.int,
    WYXX: core.int,
    WYXY: core.int,
    WYXZ: core.int,
    WYXW: core.int,
    WYYX: core.int,
    WYYY: core.int,
    WYYZ: core.int,
    WYYW: core.int,
    WYZX: core.int,
    WYZY: core.int,
    WYZZ: core.int,
    WYZW: core.int,
    WYWX: core.int,
    WYWY: core.int,
    WYWZ: core.int,
    WYWW: core.int,
    WZXX: core.int,
    WZXY: core.int,
    WZXZ: core.int,
    WZXW: core.int,
    WZYX: core.int,
    WZYY: core.int,
    WZYZ: core.int,
    WZYW: core.int,
    WZZX: core.int,
    WZZY: core.int,
    WZZZ: core.int,
    WZZW: core.int,
    WZWX: core.int,
    WZWY: core.int,
    WZWZ: core.int,
    WZWW: core.int,
    WWXX: core.int,
    WWXY: core.int,
    WWXZ: core.int,
    WWXW: core.int,
    WWYX: core.int,
    WWYY: core.int,
    WWYZ: core.int,
    WWYW: core.int,
    WWZX: core.int,
    WWZY: core.int,
    WWZZ: core.int,
    WWZW: core.int,
    WWWX: core.int,
    WWWY: core.int,
    WWWZ: core.int,
    WWWW: core.int
  })
});
typed_data.Int32x4.XXXX = 0;
typed_data.Int32x4.XXXY = 64;
typed_data.Int32x4.XXXZ = 128;
typed_data.Int32x4.XXXW = 192;
typed_data.Int32x4.XXYX = 16;
typed_data.Int32x4.XXYY = 80;
typed_data.Int32x4.XXYZ = 144;
typed_data.Int32x4.XXYW = 208;
typed_data.Int32x4.XXZX = 32;
typed_data.Int32x4.XXZY = 96;
typed_data.Int32x4.XXZZ = 160;
typed_data.Int32x4.XXZW = 224;
typed_data.Int32x4.XXWX = 48;
typed_data.Int32x4.XXWY = 112;
typed_data.Int32x4.XXWZ = 176;
typed_data.Int32x4.XXWW = 240;
typed_data.Int32x4.XYXX = 4;
typed_data.Int32x4.XYXY = 68;
typed_data.Int32x4.XYXZ = 132;
typed_data.Int32x4.XYXW = 196;
typed_data.Int32x4.XYYX = 20;
typed_data.Int32x4.XYYY = 84;
typed_data.Int32x4.XYYZ = 148;
typed_data.Int32x4.XYYW = 212;
typed_data.Int32x4.XYZX = 36;
typed_data.Int32x4.XYZY = 100;
typed_data.Int32x4.XYZZ = 164;
typed_data.Int32x4.XYZW = 228;
typed_data.Int32x4.XYWX = 52;
typed_data.Int32x4.XYWY = 116;
typed_data.Int32x4.XYWZ = 180;
typed_data.Int32x4.XYWW = 244;
typed_data.Int32x4.XZXX = 8;
typed_data.Int32x4.XZXY = 72;
typed_data.Int32x4.XZXZ = 136;
typed_data.Int32x4.XZXW = 200;
typed_data.Int32x4.XZYX = 24;
typed_data.Int32x4.XZYY = 88;
typed_data.Int32x4.XZYZ = 152;
typed_data.Int32x4.XZYW = 216;
typed_data.Int32x4.XZZX = 40;
typed_data.Int32x4.XZZY = 104;
typed_data.Int32x4.XZZZ = 168;
typed_data.Int32x4.XZZW = 232;
typed_data.Int32x4.XZWX = 56;
typed_data.Int32x4.XZWY = 120;
typed_data.Int32x4.XZWZ = 184;
typed_data.Int32x4.XZWW = 248;
typed_data.Int32x4.XWXX = 12;
typed_data.Int32x4.XWXY = 76;
typed_data.Int32x4.XWXZ = 140;
typed_data.Int32x4.XWXW = 204;
typed_data.Int32x4.XWYX = 28;
typed_data.Int32x4.XWYY = 92;
typed_data.Int32x4.XWYZ = 156;
typed_data.Int32x4.XWYW = 220;
typed_data.Int32x4.XWZX = 44;
typed_data.Int32x4.XWZY = 108;
typed_data.Int32x4.XWZZ = 172;
typed_data.Int32x4.XWZW = 236;
typed_data.Int32x4.XWWX = 60;
typed_data.Int32x4.XWWY = 124;
typed_data.Int32x4.XWWZ = 188;
typed_data.Int32x4.XWWW = 252;
typed_data.Int32x4.YXXX = 1;
typed_data.Int32x4.YXXY = 65;
typed_data.Int32x4.YXXZ = 129;
typed_data.Int32x4.YXXW = 193;
typed_data.Int32x4.YXYX = 17;
typed_data.Int32x4.YXYY = 81;
typed_data.Int32x4.YXYZ = 145;
typed_data.Int32x4.YXYW = 209;
typed_data.Int32x4.YXZX = 33;
typed_data.Int32x4.YXZY = 97;
typed_data.Int32x4.YXZZ = 161;
typed_data.Int32x4.YXZW = 225;
typed_data.Int32x4.YXWX = 49;
typed_data.Int32x4.YXWY = 113;
typed_data.Int32x4.YXWZ = 177;
typed_data.Int32x4.YXWW = 241;
typed_data.Int32x4.YYXX = 5;
typed_data.Int32x4.YYXY = 69;
typed_data.Int32x4.YYXZ = 133;
typed_data.Int32x4.YYXW = 197;
typed_data.Int32x4.YYYX = 21;
typed_data.Int32x4.YYYY = 85;
typed_data.Int32x4.YYYZ = 149;
typed_data.Int32x4.YYYW = 213;
typed_data.Int32x4.YYZX = 37;
typed_data.Int32x4.YYZY = 101;
typed_data.Int32x4.YYZZ = 165;
typed_data.Int32x4.YYZW = 229;
typed_data.Int32x4.YYWX = 53;
typed_data.Int32x4.YYWY = 117;
typed_data.Int32x4.YYWZ = 181;
typed_data.Int32x4.YYWW = 245;
typed_data.Int32x4.YZXX = 9;
typed_data.Int32x4.YZXY = 73;
typed_data.Int32x4.YZXZ = 137;
typed_data.Int32x4.YZXW = 201;
typed_data.Int32x4.YZYX = 25;
typed_data.Int32x4.YZYY = 89;
typed_data.Int32x4.YZYZ = 153;
typed_data.Int32x4.YZYW = 217;
typed_data.Int32x4.YZZX = 41;
typed_data.Int32x4.YZZY = 105;
typed_data.Int32x4.YZZZ = 169;
typed_data.Int32x4.YZZW = 233;
typed_data.Int32x4.YZWX = 57;
typed_data.Int32x4.YZWY = 121;
typed_data.Int32x4.YZWZ = 185;
typed_data.Int32x4.YZWW = 249;
typed_data.Int32x4.YWXX = 13;
typed_data.Int32x4.YWXY = 77;
typed_data.Int32x4.YWXZ = 141;
typed_data.Int32x4.YWXW = 205;
typed_data.Int32x4.YWYX = 29;
typed_data.Int32x4.YWYY = 93;
typed_data.Int32x4.YWYZ = 157;
typed_data.Int32x4.YWYW = 221;
typed_data.Int32x4.YWZX = 45;
typed_data.Int32x4.YWZY = 109;
typed_data.Int32x4.YWZZ = 173;
typed_data.Int32x4.YWZW = 237;
typed_data.Int32x4.YWWX = 61;
typed_data.Int32x4.YWWY = 125;
typed_data.Int32x4.YWWZ = 189;
typed_data.Int32x4.YWWW = 253;
typed_data.Int32x4.ZXXX = 2;
typed_data.Int32x4.ZXXY = 66;
typed_data.Int32x4.ZXXZ = 130;
typed_data.Int32x4.ZXXW = 194;
typed_data.Int32x4.ZXYX = 18;
typed_data.Int32x4.ZXYY = 82;
typed_data.Int32x4.ZXYZ = 146;
typed_data.Int32x4.ZXYW = 210;
typed_data.Int32x4.ZXZX = 34;
typed_data.Int32x4.ZXZY = 98;
typed_data.Int32x4.ZXZZ = 162;
typed_data.Int32x4.ZXZW = 226;
typed_data.Int32x4.ZXWX = 50;
typed_data.Int32x4.ZXWY = 114;
typed_data.Int32x4.ZXWZ = 178;
typed_data.Int32x4.ZXWW = 242;
typed_data.Int32x4.ZYXX = 6;
typed_data.Int32x4.ZYXY = 70;
typed_data.Int32x4.ZYXZ = 134;
typed_data.Int32x4.ZYXW = 198;
typed_data.Int32x4.ZYYX = 22;
typed_data.Int32x4.ZYYY = 86;
typed_data.Int32x4.ZYYZ = 150;
typed_data.Int32x4.ZYYW = 214;
typed_data.Int32x4.ZYZX = 38;
typed_data.Int32x4.ZYZY = 102;
typed_data.Int32x4.ZYZZ = 166;
typed_data.Int32x4.ZYZW = 230;
typed_data.Int32x4.ZYWX = 54;
typed_data.Int32x4.ZYWY = 118;
typed_data.Int32x4.ZYWZ = 182;
typed_data.Int32x4.ZYWW = 246;
typed_data.Int32x4.ZZXX = 10;
typed_data.Int32x4.ZZXY = 74;
typed_data.Int32x4.ZZXZ = 138;
typed_data.Int32x4.ZZXW = 202;
typed_data.Int32x4.ZZYX = 26;
typed_data.Int32x4.ZZYY = 90;
typed_data.Int32x4.ZZYZ = 154;
typed_data.Int32x4.ZZYW = 218;
typed_data.Int32x4.ZZZX = 42;
typed_data.Int32x4.ZZZY = 106;
typed_data.Int32x4.ZZZZ = 170;
typed_data.Int32x4.ZZZW = 234;
typed_data.Int32x4.ZZWX = 58;
typed_data.Int32x4.ZZWY = 122;
typed_data.Int32x4.ZZWZ = 186;
typed_data.Int32x4.ZZWW = 250;
typed_data.Int32x4.ZWXX = 14;
typed_data.Int32x4.ZWXY = 78;
typed_data.Int32x4.ZWXZ = 142;
typed_data.Int32x4.ZWXW = 206;
typed_data.Int32x4.ZWYX = 30;
typed_data.Int32x4.ZWYY = 94;
typed_data.Int32x4.ZWYZ = 158;
typed_data.Int32x4.ZWYW = 222;
typed_data.Int32x4.ZWZX = 46;
typed_data.Int32x4.ZWZY = 110;
typed_data.Int32x4.ZWZZ = 174;
typed_data.Int32x4.ZWZW = 238;
typed_data.Int32x4.ZWWX = 62;
typed_data.Int32x4.ZWWY = 126;
typed_data.Int32x4.ZWWZ = 190;
typed_data.Int32x4.ZWWW = 254;
typed_data.Int32x4.WXXX = 3;
typed_data.Int32x4.WXXY = 67;
typed_data.Int32x4.WXXZ = 131;
typed_data.Int32x4.WXXW = 195;
typed_data.Int32x4.WXYX = 19;
typed_data.Int32x4.WXYY = 83;
typed_data.Int32x4.WXYZ = 147;
typed_data.Int32x4.WXYW = 211;
typed_data.Int32x4.WXZX = 35;
typed_data.Int32x4.WXZY = 99;
typed_data.Int32x4.WXZZ = 163;
typed_data.Int32x4.WXZW = 227;
typed_data.Int32x4.WXWX = 51;
typed_data.Int32x4.WXWY = 115;
typed_data.Int32x4.WXWZ = 179;
typed_data.Int32x4.WXWW = 243;
typed_data.Int32x4.WYXX = 7;
typed_data.Int32x4.WYXY = 71;
typed_data.Int32x4.WYXZ = 135;
typed_data.Int32x4.WYXW = 199;
typed_data.Int32x4.WYYX = 23;
typed_data.Int32x4.WYYY = 87;
typed_data.Int32x4.WYYZ = 151;
typed_data.Int32x4.WYYW = 215;
typed_data.Int32x4.WYZX = 39;
typed_data.Int32x4.WYZY = 103;
typed_data.Int32x4.WYZZ = 167;
typed_data.Int32x4.WYZW = 231;
typed_data.Int32x4.WYWX = 55;
typed_data.Int32x4.WYWY = 119;
typed_data.Int32x4.WYWZ = 183;
typed_data.Int32x4.WYWW = 247;
typed_data.Int32x4.WZXX = 11;
typed_data.Int32x4.WZXY = 75;
typed_data.Int32x4.WZXZ = 139;
typed_data.Int32x4.WZXW = 203;
typed_data.Int32x4.WZYX = 27;
typed_data.Int32x4.WZYY = 91;
typed_data.Int32x4.WZYZ = 155;
typed_data.Int32x4.WZYW = 219;
typed_data.Int32x4.WZZX = 43;
typed_data.Int32x4.WZZY = 107;
typed_data.Int32x4.WZZZ = 171;
typed_data.Int32x4.WZZW = 235;
typed_data.Int32x4.WZWX = 59;
typed_data.Int32x4.WZWY = 123;
typed_data.Int32x4.WZWZ = 187;
typed_data.Int32x4.WZWW = 251;
typed_data.Int32x4.WWXX = 15;
typed_data.Int32x4.WWXY = 79;
typed_data.Int32x4.WWXZ = 143;
typed_data.Int32x4.WWXW = 207;
typed_data.Int32x4.WWYX = 31;
typed_data.Int32x4.WWYY = 95;
typed_data.Int32x4.WWYZ = 159;
typed_data.Int32x4.WWYW = 223;
typed_data.Int32x4.WWZX = 47;
typed_data.Int32x4.WWZY = 111;
typed_data.Int32x4.WWZZ = 175;
typed_data.Int32x4.WWZW = 239;
typed_data.Int32x4.WWWX = 63;
typed_data.Int32x4.WWWY = 127;
typed_data.Int32x4.WWWZ = 191;
typed_data.Int32x4.WWWW = 255;
_native_typed_data.NativeInt32x4List = class NativeInt32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Int32x4), _internal.FixedLengthListMixin$(typed_data.Int32x4)) {
  new(length) {
    this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(length) * 4);
  }
  _externalStorage(storage) {
    this[_storage] = storage;
  }
  _slowFromList(list) {
    this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(list[dartx.length]) * 4);
    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
      let e = list[dartx._get](i);
      this[_storage][dartx._set](i * 4 + 0, e.x);
      this[_storage][dartx._set](i * 4 + 1, e.y);
      this[_storage][dartx._set](i * 4 + 2, e.z);
      this[_storage][dartx._set](i * 4 + 3, e.w);
    }
  }
  get runtimeType() {
    return dart.wrapType(typed_data.Int32x4List);
  }
  static fromList(list) {
    if (_native_typed_data.NativeInt32x4List.is(list)) {
      return new _native_typed_data.NativeInt32x4List._externalStorage(_native_typed_data.NativeInt32List.fromList(list[_storage]));
    } else {
      return new _native_typed_data.NativeInt32x4List._slowFromList(list);
    }
  }
  get buffer() {
    return this[_storage][dartx.buffer];
  }
  get lengthInBytes() {
    return this[_storage][dartx.lengthInBytes];
  }
  get offsetInBytes() {
    return this[_storage][dartx.offsetInBytes];
  }
  get elementSizeInBytes() {
    return typed_data.Int32x4List.BYTES_PER_ELEMENT;
  }
  get length() {
    return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
    let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
    let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
    let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
  }
  _set(index, value) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
    this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
    return value;
  }
  sublist(start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this.length);
    return new _native_typed_data.NativeInt32x4List._externalStorage(typed_data.Int32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
  }
};
dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_externalStorage');
dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_slowFromList');
_native_typed_data.NativeInt32x4List[dart.implements] = () => [typed_data.Int32x4List];
dart.setSignature(_native_typed_data.NativeInt32x4List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [core.int]),
    _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [typed_data.Int32List]),
    _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()])
  }),
  fields: () => ({[_storage]: typed_data.Int32List}),
  getters: () => ({
    buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
    lengthInBytes: dart.definiteFunctionType(core.int, []),
    offsetInBytes: dart.definiteFunctionType(core.int, []),
    elementSizeInBytes: dart.definiteFunctionType(core.int, []),
    length: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    _get: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
    _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Int32x4])
  })
});
dart.defineExtensionMembers(_native_typed_data.NativeInt32x4List, [
  '_get',
  '_set',
  'sublist',
  'buffer',
  'lengthInBytes',
  'offsetInBytes',
  'elementSizeInBytes',
  'length'
]);
typed_data.Float64x2 = class Float64x2 extends core.Object {
  static new(x, y) {
    return new _native_typed_data.NativeFloat64x2(x, y);
  }
  static splat(v) {
    return new _native_typed_data.NativeFloat64x2.splat(v);
  }
  static zero() {
    return new _native_typed_data.NativeFloat64x2.zero();
  }
  static fromFloat32x4(v) {
    return new _native_typed_data.NativeFloat64x2.fromFloat32x4(v);
  }
};
dart.setSignature(typed_data.Float64x2, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Float64x2, [core.double, core.double]),
    splat: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
    zero: dart.definiteFunctionType(typed_data.Float64x2, []),
    fromFloat32x4: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float32x4])
  })
});
_native_typed_data.NativeFloat64x2List = class NativeFloat64x2List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float64x2), _internal.FixedLengthListMixin$(typed_data.Float64x2)) {
  new(length) {
    this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(length) * 2);
  }
  _externalStorage(storage) {
    this[_storage] = storage;
  }
  _slowFromList(list) {
    this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(list[dartx.length]) * 2);
    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
      let e = list[dartx._get](i);
      this[_storage][dartx._set](i * 2 + 0, e.x);
      this[_storage][dartx._set](i * 2 + 1, e.y);
    }
  }
  static fromList(list) {
    if (_native_typed_data.NativeFloat64x2List.is(list)) {
      return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List.fromList(list[_storage]));
    } else {
      return new _native_typed_data.NativeFloat64x2List._slowFromList(list);
    }
  }
  get runtimeType() {
    return dart.wrapType(typed_data.Float64x2List);
  }
  get buffer() {
    return this[_storage][dartx.buffer];
  }
  get lengthInBytes() {
    return this[_storage][dartx.lengthInBytes];
  }
  get offsetInBytes() {
    return this[_storage][dartx.offsetInBytes];
  }
  get elementSizeInBytes() {
    return typed_data.Float64x2List.BYTES_PER_ELEMENT;
  }
  get length() {
    return (dart.notNull(this[_storage][dartx.length]) / 2)[dartx.truncate]();
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    let _x = this[_storage][dartx._get](dart.notNull(index) * 2 + 0);
    let _y = this[_storage][dartx._get](dart.notNull(index) * 2 + 1);
    return typed_data.Float64x2.new(_x, _y);
  }
  _set(index, value) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    this[_storage][dartx._set](dart.notNull(index) * 2 + 0, value.x);
    this[_storage][dartx._set](dart.notNull(index) * 2 + 1, value.y);
    return value;
  }
  sublist(start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this.length);
    return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List._check(this[_storage][dartx.sublist](dart.notNull(start) * 2, dart.notNull(end) * 2)));
  }
};
dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_externalStorage');
dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_slowFromList');
_native_typed_data.NativeFloat64x2List[dart.implements] = () => [typed_data.Float64x2List];
dart.setSignature(_native_typed_data.NativeFloat64x2List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [core.int]),
    _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [_native_typed_data.NativeFloat64List]),
    _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()])
  }),
  fields: () => ({[_storage]: _native_typed_data.NativeFloat64List}),
  getters: () => ({
    buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
    lengthInBytes: dart.definiteFunctionType(core.int, []),
    offsetInBytes: dart.definiteFunctionType(core.int, []),
    elementSizeInBytes: dart.definiteFunctionType(core.int, []),
    length: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    _get: dart.definiteFunctionType(typed_data.Float64x2, [core.int]),
    _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float64x2])
  })
});
dart.defineExtensionMembers(_native_typed_data.NativeFloat64x2List, [
  '_get',
  '_set',
  'sublist',
  'buffer',
  'lengthInBytes',
  'offsetInBytes',
  'elementSizeInBytes',
  'length'
]);
const _invalidPosition = Symbol('_invalidPosition');
const _checkPosition = Symbol('_checkPosition');
dart.defineExtensionNames([
  'buffer',
  'lengthInBytes',
  'offsetInBytes',
  'elementSizeInBytes'
]);
_native_typed_data.NativeTypedData = class NativeTypedData extends core.Object {
  get [dartx.buffer]() {
    return this.buffer;
  }
  get [dartx.lengthInBytes]() {
    return this.byteLength;
  }
  get [dartx.offsetInBytes]() {
    return this.byteOffset;
  }
  get [dartx.elementSizeInBytes]() {
    return this.BYTES_PER_ELEMENT;
  }
  [_invalidPosition](position, length, name) {
    if (!(typeof position == 'number')) {
      dart.throw(new core.ArgumentError.value(position, name, 'Invalid list position'));
    } else {
      dart.throw(new core.RangeError.range(position, 0, length, name));
    }
  }
  [_checkPosition](position, length, name) {
    if (position >>> 0 !== position || position > dart.notNull(length)) {
      this[_invalidPosition](position, length, name);
    }
  }
};
_native_typed_data.NativeTypedData[dart.implements] = () => [typed_data.TypedData];
dart.setSignature(_native_typed_data.NativeTypedData, {
  getters: () => ({
    [dartx.buffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
    [dartx.lengthInBytes]: dart.definiteFunctionType(core.int, []),
    [dartx.offsetInBytes]: dart.definiteFunctionType(core.int, []),
    [dartx.elementSizeInBytes]: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    [_invalidPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
    [_checkPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String])
  })
});
dart.registerExtension(dart.global.ArrayBufferView, _native_typed_data.NativeTypedData);
_native_typed_data._checkLength = function(length) {
  if (!(typeof length == 'number')) dart.throw(new core.ArgumentError(dart.str`Invalid length ${length}`));
  return core.int._check(length);
};
dart.fn(_native_typed_data._checkLength, dynamicToint());
_native_typed_data._checkViewArguments = function(buffer, offsetInBytes, length) {
  if (!_native_typed_data.NativeByteBuffer.is(buffer)) {
    dart.throw(new core.ArgumentError('Invalid view buffer'));
  }
  if (!(typeof offsetInBytes == 'number')) {
    dart.throw(new core.ArgumentError(dart.str`Invalid view offsetInBytes ${offsetInBytes}`));
  }
  if (length != null && !(typeof length == 'number')) {
    dart.throw(new core.ArgumentError(dart.str`Invalid view length ${length}`));
  }
};
dart.fn(_native_typed_data._checkViewArguments, dynamicAnddynamicAnddynamicTovoid());
_native_typed_data._ensureNativeList = function(list) {
  if (_interceptors.JSIndexable.is(list)) return list;
  let result = core.List.new(list[dartx.length]);
  for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
    result[dartx._set](i, list[dartx._get](i));
  }
  return result;
};
dart.lazyFn(_native_typed_data._ensureNativeList, () => ListToList());
const _getFloat32 = Symbol('_getFloat32');
const _getFloat64 = Symbol('_getFloat64');
const _getInt16 = Symbol('_getInt16');
const _getInt32 = Symbol('_getInt32');
const _getUint16 = Symbol('_getUint16');
const _getUint32 = Symbol('_getUint32');
const _setFloat32 = Symbol('_setFloat32');
const _setFloat64 = Symbol('_setFloat64');
const _setInt16 = Symbol('_setInt16');
const _setInt32 = Symbol('_setInt32');
const _setUint16 = Symbol('_setUint16');
const _setUint32 = Symbol('_setUint32');
dart.defineExtensionNames([
  'runtimeType',
  'elementSizeInBytes',
  'getFloat32',
  'getFloat64',
  'getInt16',
  'getInt32',
  'getInt64',
  'getInt8',
  'getUint16',
  'getUint32',
  'getUint64',
  'getUint8',
  'setFloat32',
  'setFloat64',
  'setInt16',
  'setInt32',
  'setInt64',
  'setInt8',
  'setUint16',
  'setUint32',
  'setUint64',
  'setUint8'
]);
_native_typed_data.NativeByteData = class NativeByteData extends _native_typed_data.NativeTypedData {
  static new(length) {
    return _native_typed_data.NativeByteData._create1(_native_typed_data._checkLength(length));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeByteData._create2(buffer, offsetInBytes) : _native_typed_data.NativeByteData._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.ByteData);
  }
  get [dartx.elementSizeInBytes]() {
    return 1;
  }
  [dartx.getFloat32](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_getFloat32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_getFloat32](...args) {
    return this.getFloat32.apply(this, args);
  }
  [dartx.getFloat64](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_getFloat64](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_getFloat64](...args) {
    return this.getFloat64.apply(this, args);
  }
  [dartx.getInt16](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_getInt16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_getInt16](...args) {
    return this.getInt16.apply(this, args);
  }
  [dartx.getInt32](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_getInt32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_getInt32](...args) {
    return this.getInt32.apply(this, args);
  }
  [dartx.getInt64](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
  }
  [dartx.getInt8](...args) {
    return this.getInt8.apply(this, args);
  }
  [dartx.getUint16](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_getUint16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_getUint16](...args) {
    return this.getUint16.apply(this, args);
  }
  [dartx.getUint32](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_getUint32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_getUint32](...args) {
    return this.getUint32.apply(this, args);
  }
  [dartx.getUint64](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
  }
  [dartx.getUint8](...args) {
    return this.getUint8.apply(this, args);
  }
  [dartx.setFloat32](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_setFloat32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_setFloat32](...args) {
    return this.setFloat32.apply(this, args);
  }
  [dartx.setFloat64](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_setFloat64](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_setFloat64](...args) {
    return this.setFloat64.apply(this, args);
  }
  [dartx.setInt16](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_setInt16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_setInt16](...args) {
    return this.setInt16.apply(this, args);
  }
  [dartx.setInt32](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_setInt32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_setInt32](...args) {
    return this.setInt32.apply(this, args);
  }
  [dartx.setInt64](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
  }
  [dartx.setInt8](...args) {
    return this.setInt8.apply(this, args);
  }
  [dartx.setUint16](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_setUint16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_setUint16](...args) {
    return this.setUint16.apply(this, args);
  }
  [dartx.setUint32](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    return this[_setUint32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
  }
  [_setUint32](...args) {
    return this.setUint32.apply(this, args);
  }
  [dartx.setUint64](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
    dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
  }
  [dartx.setUint8](...args) {
    return this.setUint8.apply(this, args);
  }
  static _create1(arg) {
    return new DataView(new ArrayBuffer(arg));
  }
  static _create2(arg1, arg2) {
    return new DataView(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new DataView(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeByteData[dart.implements] = () => [typed_data.ByteData];
dart.setSignature(_native_typed_data.NativeByteData, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeByteData, [core.int]),
    view: dart.definiteFunctionType(_native_typed_data.NativeByteData, [typed_data.ByteBuffer, core.int, core.int])
  }),
  methods: () => ({
    [dartx.getFloat32]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
    [_getFloat32]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
    [dartx.getFloat64]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
    [_getFloat64]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
    [dartx.getInt16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
    [_getInt16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
    [dartx.getInt32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
    [_getInt32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
    [dartx.getInt64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
    [dartx.getInt8]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.getUint16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
    [_getUint16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
    [dartx.getUint32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
    [_getUint32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
    [dartx.getUint64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
    [dartx.getUint8]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
    [_setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
    [dartx.setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
    [_setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
    [dartx.setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
    [_setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
    [dartx.setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
    [_setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
    [dartx.setInt64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
    [dartx.setInt8]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
    [_setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
    [dartx.setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
    [_setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
    [dartx.setUint64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
    [dartx.setUint8]: dart.definiteFunctionType(dart.void, [core.int, core.int])
  }),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.DataView, _native_typed_data.NativeByteData);
const _setRangeFast = Symbol('_setRangeFast');
_native_typed_data.NativeTypedArray = class NativeTypedArray extends _native_typed_data.NativeTypedData {
  [_setRangeFast](start, end, source, skipCount) {
    let targetLength = this[dartx.length];
    this[_checkPosition](start, targetLength, "start");
    this[_checkPosition](end, targetLength, "end");
    if (dart.notNull(start) > dart.notNull(end)) dart.throw(new core.RangeError.range(start, 0, end));
    let count = dart.notNull(end) - dart.notNull(start);
    if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
    let sourceLength = source[dartx.length];
    if (dart.notNull(sourceLength) - dart.notNull(skipCount) < count) {
      dart.throw(new core.StateError('Not enough elements'));
    }
    if (skipCount != 0 || sourceLength != count) {
      source = source.subarray(skipCount, dart.notNull(skipCount) + count);
    }
    this.set(source, start);
  }
};
_native_typed_data.NativeTypedArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior];
dart.setSignature(_native_typed_data.NativeTypedArray, {
  methods: () => ({[_setRangeFast]: dart.definiteFunctionType(dart.void, [core.int, core.int, _native_typed_data.NativeTypedArray, core.int])})
});
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'setRange'
]);
_native_typed_data.NativeTypedArrayOfDouble = class NativeTypedArrayOfDouble extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.double), _internal.FixedLengthListMixin$(core.double)) {
  get length() {
    return this.length;
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  _set(index, value) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    this[index] = value;
    return value;
  }
  setRange(start, end, iterable, skipCount) {
    if (skipCount === void 0) skipCount = 0;
    if (_native_typed_data.NativeTypedArrayOfDouble.is(iterable)) {
      this[_setRangeFast](start, end, iterable, skipCount);
      return;
    }
    super[dartx.setRange](start, end, iterable, skipCount);
  }
};
dart.setSignature(_native_typed_data.NativeTypedArrayOfDouble, {
  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    _get: dart.definiteFunctionType(core.double, [core.int]),
    _set: dart.definiteFunctionType(dart.void, [core.int, core.num])
  })
});
dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfDouble, ['_get', '_set', 'setRange', 'length']);
dart.defineExtensionNames([
  'length',
  '_set',
  'setRange'
]);
_native_typed_data.NativeTypedArrayOfInt = class NativeTypedArrayOfInt extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.int), _internal.FixedLengthListMixin$(core.int)) {
  get length() {
    return this.length;
  }
  set length(value) {
    super.length = value;
  }
  _set(index, value) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    this[index] = value;
    return value;
  }
  setRange(start, end, iterable, skipCount) {
    if (skipCount === void 0) skipCount = 0;
    if (_native_typed_data.NativeTypedArrayOfInt.is(iterable)) {
      this[_setRangeFast](start, end, iterable, skipCount);
      return;
    }
    super[dartx.setRange](start, end, iterable, skipCount);
  }
};
_native_typed_data.NativeTypedArrayOfInt[dart.implements] = () => [ListOfint()];
dart.setSignature(_native_typed_data.NativeTypedArrayOfInt, {
  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({_set: dart.definiteFunctionType(dart.void, [core.int, core.int])})
});
dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfInt, ['_set', 'setRange', 'length']);
dart.defineExtensionNames([
  'runtimeType',
  'sublist'
]);
_native_typed_data.NativeFloat32List = class NativeFloat32List extends _native_typed_data.NativeTypedArrayOfDouble {
  static new(length) {
    return _native_typed_data.NativeFloat32List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat32List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeFloat32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat32List._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Float32List);
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeFloat32List._create1(source);
  }
  static _create1(arg) {
    return new Float32Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Float32Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Float32Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeFloat32List[dart.implements] = () => [typed_data.Float32List];
dart.setSignature(_native_typed_data.NativeFloat32List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [ListOfdouble()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [typed_data.ByteBuffer, core.int, core.int])
  }),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Float32Array, _native_typed_data.NativeFloat32List);
dart.defineExtensionNames([
  'runtimeType',
  'sublist'
]);
_native_typed_data.NativeFloat64List = class NativeFloat64List extends _native_typed_data.NativeTypedArrayOfDouble {
  static new(length) {
    return _native_typed_data.NativeFloat64List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat64List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeFloat64List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat64List._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Float64List);
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeFloat64List._create1(source);
  }
  static _create1(arg) {
    return new Float64Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Float64Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Float64Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeFloat64List[dart.implements] = () => [typed_data.Float64List];
dart.setSignature(_native_typed_data.NativeFloat64List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [ListOfdouble()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [typed_data.ByteBuffer, core.int, core.int])
  }),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Float64Array, _native_typed_data.NativeFloat64List);
dart.defineExtensionNames([
  'runtimeType',
  '_get',
  'sublist'
]);
_native_typed_data.NativeInt16List = class NativeInt16List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeInt16List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt16List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeInt16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt16List._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Int16List);
  }
  [dartx._get](index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeInt16List._create1(source);
  }
  static _create1(arg) {
    return new Int16Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Int16Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Int16Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeInt16List[dart.implements] = () => [typed_data.Int16List];
dart.setSignature(_native_typed_data.NativeInt16List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [ListOfint()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [_native_typed_data.NativeByteBuffer, core.int, core.int])
  }),
  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Int16Array, _native_typed_data.NativeInt16List);
dart.defineExtensionNames([
  'runtimeType',
  '_get',
  'sublist'
]);
_native_typed_data.NativeInt32List = class NativeInt32List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeInt32List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt32List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeInt32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt32List._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Int32List);
  }
  [dartx._get](index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeInt32List._create1(source);
  }
  static _create1(arg) {
    return new Int32Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Int32Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Int32Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeInt32List[dart.implements] = () => [typed_data.Int32List];
dart.setSignature(_native_typed_data.NativeInt32List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [ListOfint()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [typed_data.ByteBuffer, core.int, core.int])
  }),
  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Int32Array, _native_typed_data.NativeInt32List);
dart.defineExtensionNames([
  'runtimeType',
  '_get',
  'sublist'
]);
_native_typed_data.NativeInt8List = class NativeInt8List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeInt8List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt8List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return _native_typed_data.NativeInt8List._check(length == null ? _native_typed_data.NativeInt8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt8List._create3(buffer, offsetInBytes, length));
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Int8List);
  }
  [dartx._get](index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeInt8List._create1(source);
  }
  static _create1(arg) {
    return new Int8Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Int8Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Int8Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeInt8List[dart.implements] = () => [typed_data.Int8List];
dart.setSignature(_native_typed_data.NativeInt8List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [ListOfint()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [typed_data.ByteBuffer, core.int, core.int])
  }),
  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(typed_data.Int8List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Int8Array, _native_typed_data.NativeInt8List);
dart.defineExtensionNames([
  'runtimeType',
  '_get',
  'sublist'
]);
_native_typed_data.NativeUint16List = class NativeUint16List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint16List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(list) {
    return _native_typed_data.NativeUint16List._create1(_native_typed_data._ensureNativeList(list));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint16List._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Uint16List);
  }
  [dartx._get](index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint16List._create1(source);
  }
  static _create1(arg) {
    return new Uint16Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint16Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint16Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeUint16List[dart.implements] = () => [typed_data.Uint16List];
dart.setSignature(_native_typed_data.NativeUint16List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [ListOfint()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [typed_data.ByteBuffer, core.int, core.int])
  }),
  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Uint16Array, _native_typed_data.NativeUint16List);
dart.defineExtensionNames([
  'runtimeType',
  '_get',
  'sublist'
]);
_native_typed_data.NativeUint32List = class NativeUint32List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint32List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint32List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint32List._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Uint32List);
  }
  [dartx._get](index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint32List._create1(source);
  }
  static _create1(arg) {
    return new Uint32Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint32Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint32Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeUint32List[dart.implements] = () => [typed_data.Uint32List];
dart.setSignature(_native_typed_data.NativeUint32List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [ListOfint()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [typed_data.ByteBuffer, core.int, core.int])
  }),
  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Uint32Array, _native_typed_data.NativeUint32List);
dart.defineExtensionNames([
  'runtimeType',
  'length',
  '_get',
  'sublist'
]);
_native_typed_data.NativeUint8ClampedList = class NativeUint8ClampedList extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint8ClampedList._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8ClampedList._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Uint8ClampedList);
  }
  get [dartx.length]() {
    return this.length;
  }
  set [dartx.length](value) {
    super[dartx.length] = value;
  }
  [dartx._get](index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint8ClampedList._create1(source);
  }
  static _create1(arg) {
    return new Uint8ClampedArray(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint8ClampedArray(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint8ClampedArray(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeUint8ClampedList[dart.implements] = () => [typed_data.Uint8ClampedList];
dart.setSignature(_native_typed_data.NativeUint8ClampedList, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [ListOfint()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [typed_data.ByteBuffer, core.int, core.int])
  }),
  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Uint8ClampedArray, _native_typed_data.NativeUint8ClampedList);
dart.registerExtension(dart.global.CanvasPixelArray, _native_typed_data.NativeUint8ClampedList);
dart.defineExtensionNames([
  'runtimeType',
  'length',
  '_get',
  'sublist'
]);
_native_typed_data.NativeUint8List = class NativeUint8List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint8List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8List._create3(buffer, offsetInBytes, length);
  }
  get [dartx.runtimeType]() {
    return dart.wrapType(typed_data.Uint8List);
  }
  get [dartx.length]() {
    return this.length;
  }
  set [dartx.length](value) {
    super[dartx.length] = value;
  }
  [dartx._get](index) {
    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
    return this[index];
  }
  [dartx.sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint8List._create1(source);
  }
  static _create1(arg) {
    return new Uint8Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint8Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint8Array(arg1, arg2, arg3);
  }
};
_native_typed_data.NativeUint8List[dart.implements] = () => [typed_data.Uint8List];
dart.setSignature(_native_typed_data.NativeUint8List, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [core.int]),
    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [ListOfint()]),
    view: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [typed_data.ByteBuffer, core.int, core.int])
  }),
  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
  statics: () => ({
    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic]),
    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic]),
    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create1', '_create2', '_create3']
});
dart.registerExtension(dart.global.Uint8Array, _native_typed_data.NativeUint8List);
_native_typed_data.NativeFloat32x4 = class NativeFloat32x4 extends core.Object {
  static _truncate(x) {
    _native_typed_data.NativeFloat32x4._list[dartx._set](0, core.num._check(x));
    return _native_typed_data.NativeFloat32x4._list[dartx._get](0);
  }
  new(x, y, z, w) {
    this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
    this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
    this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
    this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
    if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
    if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
    if (!(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
    if (!(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
  }
  splat(v) {
    NativeFloat32x4.prototype.new.call(this, v, v, v, v);
  }
  zero() {
    NativeFloat32x4.prototype._truncated.call(this, 0.0, 0.0, 0.0, 0.0);
  }
  static fromInt32x4Bits(i) {
    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](0, i.x);
    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](1, i.y);
    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](2, i.z);
    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](3, i.w);
    return new _native_typed_data.NativeFloat32x4._truncated(_native_typed_data.NativeFloat32x4._list[dartx._get](0), _native_typed_data.NativeFloat32x4._list[dartx._get](1), _native_typed_data.NativeFloat32x4._list[dartx._get](2), _native_typed_data.NativeFloat32x4._list[dartx._get](3));
  }
  fromFloat64x2(v) {
    NativeFloat32x4.prototype._truncated.call(this, core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.x)), core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.y)), 0.0, 0.0);
  }
  _doubles(x, y, z, w) {
    this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
    this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
    this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
    this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
  }
  _truncated(x, y, z, w) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.w = w;
  }
  toString() {
    return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
  }
  ['+'](other) {
    let _x = dart.notNull(this.x) + dart.notNull(other.x);
    let _y = dart.notNull(this.y) + dart.notNull(other.y);
    let _z = dart.notNull(this.z) + dart.notNull(other.z);
    let _w = dart.notNull(this.w) + dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  _negate() {
    return new _native_typed_data.NativeFloat32x4._truncated(-dart.notNull(this.x), -dart.notNull(this.y), -dart.notNull(this.z), -dart.notNull(this.w));
  }
  ['-'](other) {
    let _x = dart.notNull(this.x) - dart.notNull(other.x);
    let _y = dart.notNull(this.y) - dart.notNull(other.y);
    let _z = dart.notNull(this.z) - dart.notNull(other.z);
    let _w = dart.notNull(this.w) - dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  ['*'](other) {
    let _x = dart.notNull(this.x) * dart.notNull(other.x);
    let _y = dart.notNull(this.y) * dart.notNull(other.y);
    let _z = dart.notNull(this.z) * dart.notNull(other.z);
    let _w = dart.notNull(this.w) * dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  ['/'](other) {
    let _x = dart.notNull(this.x) / dart.notNull(other.x);
    let _y = dart.notNull(this.y) / dart.notNull(other.y);
    let _z = dart.notNull(this.z) / dart.notNull(other.z);
    let _w = dart.notNull(this.w) / dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  lessThan(other) {
    let _cx = dart.notNull(this.x) < dart.notNull(other.x);
    let _cy = dart.notNull(this.y) < dart.notNull(other.y);
    let _cz = dart.notNull(this.z) < dart.notNull(other.z);
    let _cw = dart.notNull(this.w) < dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  lessThanOrEqual(other) {
    let _cx = dart.notNull(this.x) <= dart.notNull(other.x);
    let _cy = dart.notNull(this.y) <= dart.notNull(other.y);
    let _cz = dart.notNull(this.z) <= dart.notNull(other.z);
    let _cw = dart.notNull(this.w) <= dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  greaterThan(other) {
    let _cx = dart.notNull(this.x) > dart.notNull(other.x);
    let _cy = dart.notNull(this.y) > dart.notNull(other.y);
    let _cz = dart.notNull(this.z) > dart.notNull(other.z);
    let _cw = dart.notNull(this.w) > dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  greaterThanOrEqual(other) {
    let _cx = dart.notNull(this.x) >= dart.notNull(other.x);
    let _cy = dart.notNull(this.y) >= dart.notNull(other.y);
    let _cz = dart.notNull(this.z) >= dart.notNull(other.z);
    let _cw = dart.notNull(this.w) >= dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  equal(other) {
    let _cx = this.x == other.x;
    let _cy = this.y == other.y;
    let _cz = this.z == other.z;
    let _cw = this.w == other.w;
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  notEqual(other) {
    let _cx = this.x != other.x;
    let _cy = this.y != other.y;
    let _cz = this.z != other.z;
    let _cw = this.w != other.w;
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  scale(s) {
    let _x = dart.notNull(s) * dart.notNull(this.x);
    let _y = dart.notNull(s) * dart.notNull(this.y);
    let _z = dart.notNull(s) * dart.notNull(this.z);
    let _w = dart.notNull(s) * dart.notNull(this.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  abs() {
    let _x = this.x[dartx.abs]();
    let _y = this.y[dartx.abs]();
    let _z = this.z[dartx.abs]();
    let _w = this.w[dartx.abs]();
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  clamp(lowerLimit, upperLimit) {
    let _lx = lowerLimit.x;
    let _ly = lowerLimit.y;
    let _lz = lowerLimit.z;
    let _lw = lowerLimit.w;
    let _ux = upperLimit.x;
    let _uy = upperLimit.y;
    let _uz = upperLimit.z;
    let _uw = upperLimit.w;
    let _x = this.x;
    let _y = this.y;
    let _z = this.z;
    let _w = this.w;
    _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
    _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
    _z = dart.notNull(_z) > dart.notNull(_uz) ? _uz : _z;
    _w = dart.notNull(_w) > dart.notNull(_uw) ? _uw : _w;
    _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
    _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
    _z = dart.notNull(_z) < dart.notNull(_lz) ? _lz : _z;
    _w = dart.notNull(_w) < dart.notNull(_lw) ? _lw : _w;
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  get signMask() {
    let view = _native_typed_data.NativeFloat32x4._uint32view;
    let mx = null, my = null, mz = null, mw = null;
    _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
    _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
    _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
    _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
    mx = (dart.notNull(view[dartx._get](0)) & 2147483648) >>> 31;
    my = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 30;
    mz = (dart.notNull(view[dartx._get](2)) & 2147483648) >>> 29;
    mw = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 28;
    return core.int._check(dart.dsend(dart.dsend(dart.dsend(mx, '|', my), '|', mz), '|', mw));
  }
  shuffle(mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
    _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
    _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
    _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
    let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
    let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  shuffleMix(other, mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
    _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
    _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
    _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
    let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
    _native_typed_data.NativeFloat32x4._list[dartx._set](0, other.x);
    _native_typed_data.NativeFloat32x4._list[dartx._set](1, other.y);
    _native_typed_data.NativeFloat32x4._list[dartx._set](2, other.z);
    _native_typed_data.NativeFloat32x4._list[dartx._set](3, other.w);
    let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  withX(newX) {
    return new _native_typed_data.NativeFloat32x4._truncated(core.double._check(_native_typed_data.NativeFloat32x4._truncate(newX)), this.y, this.z, this.w);
  }
  withY(newY) {
    return new _native_typed_data.NativeFloat32x4._truncated(this.x, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newY)), this.z, this.w);
  }
  withZ(newZ) {
    return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newZ)), this.w);
  }
  withW(newW) {
    return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, this.z, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newW)));
  }
  min(other) {
    let _x = dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x;
    let _y = dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y;
    let _z = dart.notNull(this.z) < dart.notNull(other.z) ? this.z : other.z;
    let _w = dart.notNull(this.w) < dart.notNull(other.w) ? this.w : other.w;
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  max(other) {
    let _x = dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x;
    let _y = dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y;
    let _z = dart.notNull(this.z) > dart.notNull(other.z) ? this.z : other.z;
    let _w = dart.notNull(this.w) > dart.notNull(other.w) ? this.w : other.w;
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  sqrt() {
    let _x = math.sqrt(this.x);
    let _y = math.sqrt(this.y);
    let _z = math.sqrt(this.z);
    let _w = math.sqrt(this.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  reciprocal() {
    let _x = 1.0 / dart.notNull(this.x);
    let _y = 1.0 / dart.notNull(this.y);
    let _z = 1.0 / dart.notNull(this.z);
    let _w = 1.0 / dart.notNull(this.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  reciprocalSqrt() {
    let _x = math.sqrt(1.0 / dart.notNull(this.x));
    let _y = math.sqrt(1.0 / dart.notNull(this.y));
    let _z = math.sqrt(1.0 / dart.notNull(this.z));
    let _w = math.sqrt(1.0 / dart.notNull(this.w));
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
};
dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'splat');
dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'zero');
dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'fromFloat64x2');
dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_doubles');
dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_truncated');
_native_typed_data.NativeFloat32x4[dart.implements] = () => [typed_data.Float32x4];
dart.setSignature(_native_typed_data.NativeFloat32x4, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
    splat: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double]),
    zero: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, []),
    fromInt32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Int32x4]),
    fromFloat64x2: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Float64x2]),
    _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
    _truncated: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double])
  }),
  fields: () => ({
    x: core.double,
    y: core.double,
    z: core.double,
    w: core.double
  }),
  getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    '+': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
    _negate: dart.definiteFunctionType(typed_data.Float32x4, []),
    '-': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
    '*': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
    '/': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
    lessThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
    lessThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
    greaterThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
    greaterThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
    equal: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
    notEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
    scale: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
    abs: dart.definiteFunctionType(typed_data.Float32x4, []),
    clamp: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4]),
    shuffle: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
    shuffleMix: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, core.int]),
    withX: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
    withY: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
    withZ: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
    withW: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
    min: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
    max: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
    sqrt: dart.definiteFunctionType(typed_data.Float32x4, []),
    reciprocal: dart.definiteFunctionType(typed_data.Float32x4, []),
    reciprocalSqrt: dart.definiteFunctionType(typed_data.Float32x4, [])
  }),
  sfields: () => ({
    _list: _native_typed_data.NativeFloat32List,
    _uint32view: typed_data.Uint32List
  }),
  statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
  names: ['_truncate']
});
dart.defineLazy(_native_typed_data.NativeFloat32x4, {
  get _list() {
    return _native_typed_data.NativeFloat32List.new(4);
  },
  get _uint32view() {
    return _native_typed_data.NativeFloat32x4._list[dartx.buffer][dartx.asUint32List]();
  }
});
_native_typed_data.NativeInt32x4 = class NativeInt32x4 extends core.Object {
  static _truncate(x) {
    _native_typed_data.NativeInt32x4._list[dartx._set](0, core.int._check(x));
    return _native_typed_data.NativeInt32x4._list[dartx._get](0);
  }
  new(x, y, z, w) {
    this.x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
    this.y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
    this.z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
    this.w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
    if (x != this.x && !(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
    if (y != this.y && !(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
    if (z != this.z && !(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
    if (w != this.w && !(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
  }
  bool(x, y, z, w) {
    this.x = dart.test(x) ? -1 : 0;
    this.y = dart.test(y) ? -1 : 0;
    this.z = dart.test(z) ? -1 : 0;
    this.w = dart.test(w) ? -1 : 0;
  }
  static fromFloat32x4Bits(f) {
    let floatList = _native_typed_data.NativeFloat32x4._list;
    floatList[dartx._set](0, f.x);
    floatList[dartx._set](1, f.y);
    floatList[dartx._set](2, f.z);
    floatList[dartx._set](3, f.w);
    let view = _native_typed_data.NativeInt32List._check(floatList[dartx.buffer][dartx.asInt32List]());
    return new _native_typed_data.NativeInt32x4._truncated(view[dartx._get](0), view[dartx._get](1), view[dartx._get](2), view[dartx._get](3));
  }
  _truncated(x, y, z, w) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.w = w;
  }
  toString() {
    return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
  }
  ['|'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x | other.x, this.y | other.y, this.z | other.z, this.w | other.w);
  }
  ['&'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x & other.x, this.y & other.y, this.z & other.z, this.w & other.w);
  }
  ['^'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x ^ other.x, this.y ^ other.y, this.z ^ other.z, this.w ^ other.w);
  }
  ['+'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x + other.x | 0, this.y + other.y | 0, this.z + other.z | 0, this.w + other.w | 0);
  }
  ['-'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x - other.x | 0, this.y - other.y | 0, this.z - other.z | 0, this.w - other.w | 0);
  }
  _negate() {
    return new _native_typed_data.NativeInt32x4._truncated(-this.x | 0, -this.y | 0, -this.z | 0, -this.w | 0);
  }
  get signMask() {
    let mx = (dart.notNull(this.x) & 2147483648) >>> 31;
    let my = (dart.notNull(this.y) & 2147483648) >>> 31;
    let mz = (dart.notNull(this.z) & 2147483648) >>> 31;
    let mw = (dart.notNull(this.w) & 2147483648) >>> 31;
    return (mx | my << 1 | mz << 2 | mw << 3) >>> 0;
  }
  shuffle(mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
    _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
    _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
    _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
    let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
    let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
  }
  shuffleMix(other, mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
    _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
    _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
    _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
    let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
    _native_typed_data.NativeInt32x4._list[dartx._set](0, other.x);
    _native_typed_data.NativeInt32x4._list[dartx._set](1, other.y);
    _native_typed_data.NativeInt32x4._list[dartx._set](2, other.z);
    _native_typed_data.NativeInt32x4._list[dartx._set](3, other.w);
    let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
  }
  withX(x) {
    let _x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
    return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
  }
  withY(y) {
    let _y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
    return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
  }
  withZ(z) {
    let _z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
  }
  withW(w) {
    let _w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
  }
  get flagX() {
    return this.x != 0;
  }
  get flagY() {
    return this.y != 0;
  }
  get flagZ() {
    return this.z != 0;
  }
  get flagW() {
    return this.w != 0;
  }
  withFlagX(flagX) {
    let _x = dart.test(flagX) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
  }
  withFlagY(flagY) {
    let _y = dart.test(flagY) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
  }
  withFlagZ(flagZ) {
    let _z = dart.test(flagZ) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
  }
  withFlagW(flagW) {
    let _w = dart.test(flagW) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
  }
  select(trueValue, falseValue) {
    let floatList = _native_typed_data.NativeFloat32x4._list;
    let intView = _native_typed_data.NativeFloat32x4._uint32view;
    floatList[dartx._set](0, trueValue.x);
    floatList[dartx._set](1, trueValue.y);
    floatList[dartx._set](2, trueValue.z);
    floatList[dartx._set](3, trueValue.w);
    let stx = intView[dartx._get](0);
    let sty = intView[dartx._get](1);
    let stz = intView[dartx._get](2);
    let stw = intView[dartx._get](3);
    floatList[dartx._set](0, falseValue.x);
    floatList[dartx._set](1, falseValue.y);
    floatList[dartx._set](2, falseValue.z);
    floatList[dartx._set](3, falseValue.w);
    let sfx = intView[dartx._get](0);
    let sfy = intView[dartx._get](1);
    let sfz = intView[dartx._get](2);
    let sfw = intView[dartx._get](3);
    let _x = (dart.notNull(this.x) & dart.notNull(stx) | ~dart.notNull(this.x) & dart.notNull(sfx)) >>> 0;
    let _y = (dart.notNull(this.y) & dart.notNull(sty) | ~dart.notNull(this.y) & dart.notNull(sfy)) >>> 0;
    let _z = (dart.notNull(this.z) & dart.notNull(stz) | ~dart.notNull(this.z) & dart.notNull(sfz)) >>> 0;
    let _w = (dart.notNull(this.w) & dart.notNull(stw) | ~dart.notNull(this.w) & dart.notNull(sfw)) >>> 0;
    intView[dartx._set](0, _x);
    intView[dartx._set](1, _y);
    intView[dartx._set](2, _z);
    intView[dartx._set](3, _w);
    return new _native_typed_data.NativeFloat32x4._truncated(floatList[dartx._get](0), floatList[dartx._get](1), floatList[dartx._get](2), floatList[dartx._get](3));
  }
};
dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, 'bool');
dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, '_truncated');
_native_typed_data.NativeInt32x4[dart.implements] = () => [typed_data.Int32x4];
dart.setSignature(_native_typed_data.NativeInt32x4, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int]),
    bool: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.bool, core.bool, core.bool, core.bool]),
    fromFloat32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [typed_data.Float32x4]),
    _truncated: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int])
  }),
  fields: () => ({
    x: core.int,
    y: core.int,
    z: core.int,
    w: core.int
  }),
  getters: () => ({
    signMask: dart.definiteFunctionType(core.int, []),
    flagX: dart.definiteFunctionType(core.bool, []),
    flagY: dart.definiteFunctionType(core.bool, []),
    flagZ: dart.definiteFunctionType(core.bool, []),
    flagW: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    '|': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
    '&': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
    '^': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
    '+': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
    '-': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
    _negate: dart.definiteFunctionType(typed_data.Int32x4, []),
    shuffle: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
    shuffleMix: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4, core.int]),
    withX: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
    withY: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
    withZ: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
    withW: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
    withFlagX: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
    withFlagY: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
    withFlagZ: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
    withFlagW: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
    select: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4])
  }),
  sfields: () => ({_list: _native_typed_data.NativeInt32List}),
  statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
  names: ['_truncate']
});
dart.defineLazy(_native_typed_data.NativeInt32x4, {
  get _list() {
    return _native_typed_data.NativeInt32List.new(4);
  }
});
_native_typed_data.NativeFloat64x2 = class NativeFloat64x2 extends core.Object {
  new(x, y) {
    this.x = x;
    this.y = y;
    if (!(typeof this.x == 'number')) dart.throw(new core.ArgumentError(this.x));
    if (!(typeof this.y == 'number')) dart.throw(new core.ArgumentError(this.y));
  }
  splat(v) {
    NativeFloat64x2.prototype.new.call(this, v, v);
  }
  zero() {
    NativeFloat64x2.prototype.splat.call(this, 0.0);
  }
  fromFloat32x4(v) {
    NativeFloat64x2.prototype.new.call(this, v.x, v.y);
  }
  _doubles(x, y) {
    this.x = x;
    this.y = y;
  }
  toString() {
    return dart.str`[${this.x}, ${this.y}]`;
  }
  ['+'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
  }
  _negate() {
    return new _native_typed_data.NativeFloat64x2._doubles(-dart.notNull(this.x), -dart.notNull(this.y));
  }
  ['-'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
  }
  ['*'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(other.x), dart.notNull(this.y) * dart.notNull(other.y));
  }
  ['/'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) / dart.notNull(other.x), dart.notNull(this.y) / dart.notNull(other.y));
  }
  scale(s) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(s), dart.notNull(this.y) * dart.notNull(s));
  }
  abs() {
    return new _native_typed_data.NativeFloat64x2._doubles(this.x[dartx.abs](), this.y[dartx.abs]());
  }
  clamp(lowerLimit, upperLimit) {
    let _lx = lowerLimit.x;
    let _ly = lowerLimit.y;
    let _ux = upperLimit.x;
    let _uy = upperLimit.y;
    let _x = this.x;
    let _y = this.y;
    _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
    _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
    _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
    _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
    return new _native_typed_data.NativeFloat64x2._doubles(_x, _y);
  }
  get signMask() {
    let view = _native_typed_data.NativeFloat64x2._uint32View;
    _native_typed_data.NativeFloat64x2._list[dartx._set](0, this.x);
    _native_typed_data.NativeFloat64x2._list[dartx._set](1, this.y);
    let mx = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 31;
    let my = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 31;
    return (mx | my << 1) >>> 0;
  }
  withX(x) {
    if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
    return new _native_typed_data.NativeFloat64x2._doubles(x, this.y);
  }
  withY(y) {
    if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
    return new _native_typed_data.NativeFloat64x2._doubles(this.x, y);
  }
  min(other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y);
  }
  max(other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y);
  }
  sqrt() {
    return new _native_typed_data.NativeFloat64x2._doubles(math.sqrt(this.x), math.sqrt(this.y));
  }
};
dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'splat');
dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'zero');
dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'fromFloat32x4');
dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, '_doubles');
_native_typed_data.NativeFloat64x2[dart.implements] = () => [typed_data.Float64x2];
dart.setSignature(_native_typed_data.NativeFloat64x2, {
  constructors: () => ({
    new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double]),
    splat: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double]),
    zero: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, []),
    fromFloat32x4: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [typed_data.Float32x4]),
    _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double])
  }),
  fields: () => ({
    x: core.double,
    y: core.double
  }),
  getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    '+': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
    _negate: dart.definiteFunctionType(typed_data.Float64x2, []),
    '-': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
    '*': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
    '/': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
    scale: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
    abs: dart.definiteFunctionType(typed_data.Float64x2, []),
    clamp: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2, typed_data.Float64x2]),
    withX: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
    withY: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
    min: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
    max: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
    sqrt: dart.definiteFunctionType(typed_data.Float64x2, [])
  }),
  sfields: () => ({
    _list: _native_typed_data.NativeFloat64List,
    _uint32View: _native_typed_data.NativeUint32List
  })
});
dart.defineLazy(_native_typed_data.NativeFloat64x2, {
  get _list() {
    return _native_typed_data.NativeFloat64List.new(2);
  },
  set _list(_) {},
  get _uint32View() {
    return _native_typed_data.NativeUint32List._check(_native_typed_data.NativeFloat64x2._list[dartx.buffer][dartx.asUint32List]());
  },
  set _uint32View(_) {}
});
_native_typed_data._isInvalidArrayIndex = function(index) {
  return index >>> 0 !== index;
};
dart.lazyFn(_native_typed_data._isInvalidArrayIndex, () => intTobool());
_native_typed_data._checkValidIndex = function(index, list, length) {
  if (dart.test(_native_typed_data._isInvalidArrayIndex(index)) || index >= dart.notNull(length)) {
    dart.throw(_js_helper.diagnoseIndexError(list, index));
  }
};
dart.lazyFn(_native_typed_data._checkValidIndex, () => intAndListAndintTovoid());
_native_typed_data._checkValidRange = function(start, end, length) {
  if (dart.test(_native_typed_data._isInvalidArrayIndex(start)) || (end == null ? dart.notNull(start) > dart.notNull(length) : dart.test(_native_typed_data._isInvalidArrayIndex(end)) || dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length))) {
    dart.throw(_js_helper.diagnoseRangeError(start, end, length));
  }
  if (end == null) return length;
  return end;
};
dart.fn(_native_typed_data._checkValidRange, intAndintAndintToint());
async._Callback = dart.typedef('_Callback', () => dart.functionType(dart.void, []));
async._TakeCallback = dart.typedef('_TakeCallback', () => dart.functionType(dart.void, [async._Callback]));
async._invokeErrorHandler = function(errorHandler, error, stackTrace) {
  if (async.ZoneBinaryCallback.is(errorHandler)) {
    return dart.dcall(errorHandler, error, stackTrace);
  } else {
    let unaryErrorHandler = async.ZoneUnaryCallback._check(errorHandler);
    return dart.dcall(unaryErrorHandler, error);
  }
};
dart.lazyFn(async._invokeErrorHandler, () => FunctionAndObjectAndStackTraceTodynamic());
async._registerErrorHandler = function(R) {
  return (errorHandler, zone) => {
    if (async.ZoneBinaryCallback.is(errorHandler)) {
      return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
    } else {
      return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
    }
  };
};
dart.lazyFn(async._registerErrorHandler, () => FunctionAndZoneToFunction());
async.AsyncError = class AsyncError extends core.Object {
  new(error, stackTrace) {
    this.error = error;
    this.stackTrace = stackTrace;
  }
  toString() {
    return dart.str`${this.error}`;
  }
};
async.AsyncError[dart.implements] = () => [core.Error];
dart.setSignature(async.AsyncError, {
  constructors: () => ({new: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace])}),
  fields: () => ({
    error: core.Object,
    stackTrace: core.StackTrace
  })
});
async._UncaughtAsyncError = class _UncaughtAsyncError extends async.AsyncError {
  new(error, stackTrace) {
    super.new(error, async._UncaughtAsyncError._getBestStackTrace(error, stackTrace));
  }
  static _getBestStackTrace(error, stackTrace) {
    if (stackTrace != null) return stackTrace;
    if (core.Error.is(error)) {
      return error.stackTrace;
    }
    return null;
  }
  toString() {
    let result = dart.str`Uncaught Error: ${this.error}`;
    if (this.stackTrace != null) {
      result = result + dart.str`\nStack Trace:\n${this.stackTrace}`;
    }
    return result;
  }
};
dart.setSignature(async._UncaughtAsyncError, {
  constructors: () => ({new: dart.definiteFunctionType(async._UncaughtAsyncError, [dart.dynamic, core.StackTrace])}),
  statics: () => ({_getBestStackTrace: dart.definiteFunctionType(core.StackTrace, [dart.dynamic, core.StackTrace])}),
  names: ['_getBestStackTrace']
});
const _controller$ = Symbol('_controller');
const _subscribe = Symbol('_subscribe');
const _createSubscription = Symbol('_createSubscription');
const _onListen = Symbol('_onListen');
async._StreamImpl$ = dart.generic(T => {
  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _StreamImpl extends async.Stream$(T) {
    new() {
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = core.identical(true, cancelOnError);
      let subscription = this[_createSubscription](onData, onError, onDone, cancelOnError);
      this[_onListen](subscription);
      return subscription;
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
    }
    [_onListen](subscription) {}
  }
  dart.setSignature(_StreamImpl, {
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
      [_onListen]: dart.definiteFunctionType(dart.void, [async.StreamSubscription])
    })
  });
  return _StreamImpl;
});
async._StreamImpl = _StreamImpl();
async._ControllerStream$ = dart.generic(T => {
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  class _ControllerStream extends async._StreamImpl$(T) {
    new(controller) {
      this[_controller$] = controller;
      super.new();
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
    }
    get hashCode() {
      return (dart.notNull(dart.hashCode(this[_controller$])) ^ 892482866) >>> 0;
    }
    ['=='](other) {
      if (core.identical(this, other)) return true;
      if (!async._ControllerStream.is(other)) return false;
      let otherStream = async._ControllerStream._check(other);
      return core.identical(otherStream[_controller$], this[_controller$]);
    }
  }
  dart.setSignature(_ControllerStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._ControllerStream$(T), [_StreamControllerLifecycleOfT()])}),
    fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()}),
    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
  });
  return _ControllerStream;
});
async._ControllerStream = _ControllerStream();
async._BroadcastStream$ = dart.generic(T => {
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  class _BroadcastStream extends async._ControllerStream$(T) {
    new(controller) {
      super.new(controller);
    }
    get isBroadcast() {
      return true;
    }
  }
  dart.setSignature(_BroadcastStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStream$(T), [_StreamControllerLifecycleOfT()])})
  });
  return _BroadcastStream;
});
async._BroadcastStream = _BroadcastStream();
const _eventState = Symbol('_eventState');
const _next$ = Symbol('_next');
const _previous$ = Symbol('_previous');
const _expectsEvent = Symbol('_expectsEvent');
const _toggleEventId = Symbol('_toggleEventId');
const _isFiring = Symbol('_isFiring');
const _setRemoveAfterFiring = Symbol('_setRemoveAfterFiring');
const _removeAfterFiring = Symbol('_removeAfterFiring');
const _onPause = Symbol('_onPause');
const _onResume = Symbol('_onResume');
const _recordCancel = Symbol('_recordCancel');
const _onCancel = Symbol('_onCancel');
const _recordPause = Symbol('_recordPause');
const _recordResume = Symbol('_recordResume');
const _zone = Symbol('_zone');
const _state = Symbol('_state');
const _onData = Symbol('_onData');
const _onError = Symbol('_onError');
const _onDone = Symbol('_onDone');
const _cancelFuture = Symbol('_cancelFuture');
const _pending = Symbol('_pending');
const _setPendingEvents = Symbol('_setPendingEvents');
const _isCanceled = Symbol('_isCanceled');
const _isPaused = Symbol('_isPaused');
const _isInputPaused = Symbol('_isInputPaused');
const _inCallback = Symbol('_inCallback');
const _guardCallback = Symbol('_guardCallback');
const _decrementPauseCount = Symbol('_decrementPauseCount');
const _hasPending = Symbol('_hasPending');
const _mayResumeInput = Symbol('_mayResumeInput');
const _cancel = Symbol('_cancel');
const _isClosed$ = Symbol('_isClosed');
const _waitsForCancel = Symbol('_waitsForCancel');
const _canFire = Symbol('_canFire');
const _cancelOnError = Symbol('_cancelOnError');
const _incrementPauseCount = Symbol('_incrementPauseCount');
const _sendData = Symbol('_sendData');
const _addPending = Symbol('_addPending');
const _sendError = Symbol('_sendError');
const _sendDone = Symbol('_sendDone');
let const$5;
const _close$ = Symbol('_close');
const _checkState = Symbol('_checkState');
async._BufferingStreamSubscription$ = dart.generic(T => {
  let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _BufferingStreamSubscription extends core.Object {
    new(onData, onError, onDone, cancelOnError) {
      this[_zone] = async.Zone.current;
      this[_state] = dart.test(cancelOnError) ? async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR : 0;
      this[_onData] = null;
      this[_onError] = null;
      this[_onDone] = null;
      this[_cancelFuture] = null;
      this[_pending] = null;
      this.onData(onData);
      this.onError(onError);
      this.onDone(onDone);
    }
    [_setPendingEvents](pendingEvents) {
      _PendingEventsOfT()._check(pendingEvents);
      dart.assert(this[_pending] == null);
      if (pendingEvents == null) return;
      this[_pending] = pendingEvents;
      if (!dart.test(pendingEvents.isEmpty)) {
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
        this[_pending].schedule(this);
      }
    }
    onData(handleData) {
      if (handleData == null) handleData = async._nullDataHandler;
      this[_onData] = this[_zone].registerUnaryCallback(dart.dynamic, T)(handleData);
    }
    onError(handleError) {
      if (handleError == null) handleError = async._nullErrorHandler;
      this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
    }
    onDone(handleDone) {
      if (handleDone == null) handleDone = async._nullDoneHandler;
      this[_onDone] = this[_zone].registerCallback(dart.void)(handleDone);
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      if (dart.test(this[_isCanceled])) return;
      let wasPaused = this[_isPaused];
      let wasInputPaused = this[_isInputPaused];
      this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
      if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
      if (!dart.test(wasPaused) && this[_pending] != null) this[_pending].cancelSchedule();
      if (!dart.test(wasInputPaused) && !dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onPause));
    }
    resume() {
      if (dart.test(this[_isCanceled])) return;
      if (dart.test(this[_isPaused])) {
        this[_decrementPauseCount]();
        if (!dart.test(this[_isPaused])) {
          if (dart.test(this[_hasPending]) && !dart.test(this[_pending].isEmpty)) {
            this[_pending].schedule(this);
          } else {
            dart.assert(this[_mayResumeInput]);
            this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
            if (!dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onResume));
          }
        }
      }
    }
    cancel() {
      this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
      if (dart.test(this[_isCanceled])) return this[_cancelFuture];
      this[_cancel]();
      return this[_cancelFuture];
    }
    asFuture(E) {
      return futureValue => {
        if (futureValue === void 0) futureValue = null;
        let result = new (async._Future$(E))();
        this[_onDone] = dart.fn(() => {
          result[_complete](futureValue);
        }, VoidToNull());
        this[_onError] = dart.fn((error, stackTrace) => {
          this.cancel();
          result[_completeError](error, core.StackTrace._check(stackTrace));
        }, dynamicAnddynamicToNull());
        return result;
      };
    }
    get [_isInputPaused]() {
      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_INPUT_PAUSED) != 0;
    }
    get [_isClosed$]() {
      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CLOSED) != 0;
    }
    get [_isCanceled]() {
      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCELED) != 0;
    }
    get [_waitsForCancel]() {
      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) != 0;
    }
    get [_inCallback]() {
      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_IN_CALLBACK) != 0;
    }
    get [_hasPending]() {
      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_HAS_PENDING) != 0;
    }
    get [_isPaused]() {
      return dart.notNull(this[_state]) >= async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
    }
    get [_canFire]() {
      return dart.notNull(this[_state]) < async._BufferingStreamSubscription._STATE_IN_CALLBACK;
    }
    get [_mayResumeInput]() {
      return !dart.test(this[_isPaused]) && (this[_pending] == null || dart.test(this[_pending].isEmpty));
    }
    get [_cancelOnError]() {
      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR) != 0;
    }
    get isPaused() {
      return this[_isPaused];
    }
    [_cancel]() {
      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED) >>> 0;
      if (dart.test(this[_hasPending])) {
        this[_pending].cancelSchedule();
      }
      if (!dart.test(this[_inCallback])) this[_pending] = null;
      this[_cancelFuture] = this[_onCancel]();
    }
    [_incrementPauseCount]() {
      this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
    }
    [_decrementPauseCount]() {
      dart.assert(this[_isPaused]);
      this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
    }
    [_add$](data) {
      T._check(data);
      dart.assert(!dart.test(this[_isClosed$]));
      if (dart.test(this[_isCanceled])) return;
      if (dart.test(this[_canFire])) {
        this[_sendData](data);
      } else {
        this[_addPending](new (_DelayedDataOfT())(data));
      }
    }
    [_addError](error, stackTrace) {
      if (dart.test(this[_isCanceled])) return;
      if (dart.test(this[_canFire])) {
        this[_sendError](error, stackTrace);
      } else {
        this[_addPending](new async._DelayedError(error, stackTrace));
      }
    }
    [_close$]() {
      dart.assert(!dart.test(this[_isClosed$]));
      if (dart.test(this[_isCanceled])) return;
      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CLOSED) >>> 0;
      if (dart.test(this[_canFire])) {
        this[_sendDone]();
      } else {
        this[_addPending](const$5 || (const$5 = dart.const(new async._DelayedDone())));
      }
    }
    [_onPause]() {
      dart.assert(this[_isInputPaused]);
    }
    [_onResume]() {
      dart.assert(!dart.test(this[_isInputPaused]));
    }
    [_onCancel]() {
      dart.assert(this[_isCanceled]);
      return null;
    }
    [_addPending](event) {
      let pending = _StreamImplEventsOfT()._check(this[_pending]);
      if (this[_pending] == null) {
        pending = this[_pending] = new (_StreamImplEventsOfT())();
      }
      pending.add(event);
      if (!dart.test(this[_hasPending])) {
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
        if (!dart.test(this[_isPaused])) {
          this[_pending].schedule(this);
        }
      }
    }
    [_sendData](data) {
      T._check(data);
      dart.assert(!dart.test(this[_isCanceled]));
      dart.assert(!dart.test(this[_isPaused]));
      dart.assert(!dart.test(this[_inCallback]));
      let wasInputPaused = this[_isInputPaused];
      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
      this[_zone].runUnaryGuarded(dart.void, T)(this[_onData], data);
      this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
      this[_checkState](wasInputPaused);
    }
    [_sendError](error, stackTrace) {
      dart.assert(!dart.test(this[_isCanceled]));
      dart.assert(!dart.test(this[_isPaused]));
      dart.assert(!dart.test(this[_inCallback]));
      let wasInputPaused = this[_isInputPaused];
      const sendError = (function() {
        if (dart.test(this[_isCanceled]) && !dart.test(this[_waitsForCancel])) return;
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        if (ZoneBinaryCallbackOfdynamic$Object$StackTrace().is(this[_onError])) {
          let errorCallback = ZoneBinaryCallbackOfdynamic$Object$StackTrace().as(this[_onError]);
          this[_zone].runBinaryGuarded(dart.dynamic, core.Object, core.StackTrace)(errorCallback, error, stackTrace);
        } else {
          this[_zone].runUnaryGuarded(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(this[_onError]), error);
        }
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
      }).bind(this);
      dart.fn(sendError, VoidTovoid$());
      if (dart.test(this[_cancelOnError])) {
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
        this[_cancel]();
        if (async.Future.is(this[_cancelFuture])) {
          this[_cancelFuture].whenComplete(sendError);
        } else {
          sendError();
        }
      } else {
        sendError();
        this[_checkState](wasInputPaused);
      }
    }
    [_sendDone]() {
      dart.assert(!dart.test(this[_isCanceled]));
      dart.assert(!dart.test(this[_isPaused]));
      dart.assert(!dart.test(this[_inCallback]));
      const sendDone = (function() {
        if (!dart.test(this[_waitsForCancel])) return;
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED | async._BufferingStreamSubscription._STATE_CLOSED | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        this[_zone].runGuarded(dart.void)(this[_onDone]);
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
      }).bind(this);
      dart.fn(sendDone, VoidTovoid$());
      this[_cancel]();
      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
      if (async.Future.is(this[_cancelFuture])) {
        this[_cancelFuture].whenComplete(sendDone);
      } else {
        sendDone();
      }
    }
    [_guardCallback](callback) {
      dart.assert(!dart.test(this[_inCallback]));
      let wasInputPaused = this[_isInputPaused];
      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
      callback();
      this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
      this[_checkState](wasInputPaused);
    }
    [_checkState](wasInputPaused) {
      dart.assert(!dart.test(this[_inCallback]));
      if (dart.test(this[_hasPending]) && dart.test(this[_pending].isEmpty)) {
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
        if (dart.test(this[_isInputPaused]) && dart.test(this[_mayResumeInput])) {
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
        }
      }
      while (true) {
        if (dart.test(this[_isCanceled])) {
          this[_pending] = null;
          return;
        }
        let isInputPaused = this[_isInputPaused];
        if (wasInputPaused == isInputPaused) break;
        this[_state] = (dart.notNull(this[_state]) ^ async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        if (dart.test(isInputPaused)) {
          this[_onPause]();
        } else {
          this[_onResume]();
        }
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        wasInputPaused = isInputPaused;
      }
      if (dart.test(this[_hasPending]) && !dart.test(this[_isPaused])) {
        this[_pending].schedule(this);
      }
    }
  }
  dart.addTypeTests(_BufferingStreamSubscription);
  _BufferingStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT(), _EventSinkOfT(), _EventDispatchOfT()];
  dart.setSignature(_BufferingStreamSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(async._BufferingStreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool])}),
    fields: () => ({
      [_onData]: TTovoid(),
      [_onError]: core.Function,
      [_onDone]: async._DoneHandler,
      [_zone]: async.Zone,
      [_state]: core.int,
      [_cancelFuture]: async.Future,
      [_pending]: _PendingEventsOfT()
    }),
    getters: () => ({
      [_isInputPaused]: dart.definiteFunctionType(core.bool, []),
      [_isClosed$]: dart.definiteFunctionType(core.bool, []),
      [_isCanceled]: dart.definiteFunctionType(core.bool, []),
      [_waitsForCancel]: dart.definiteFunctionType(core.bool, []),
      [_inCallback]: dart.definiteFunctionType(core.bool, []),
      [_hasPending]: dart.definiteFunctionType(core.bool, []),
      [_isPaused]: dart.definiteFunctionType(core.bool, []),
      [_canFire]: dart.definiteFunctionType(core.bool, []),
      [_mayResumeInput]: dart.definiteFunctionType(core.bool, []),
      [_cancelOnError]: dart.definiteFunctionType(core.bool, []),
      isPaused: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      [_setPendingEvents]: dart.definiteFunctionType(dart.void, [_PendingEventsOfT()]),
      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
      onError: dart.definiteFunctionType(dart.void, [core.Function]),
      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
      resume: dart.definiteFunctionType(dart.void, []),
      cancel: dart.definiteFunctionType(async.Future, []),
      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
      [_cancel]: dart.definiteFunctionType(dart.void, []),
      [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
      [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
      [_add$]: dart.definiteFunctionType(dart.void, [T]),
      [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_close$]: dart.definiteFunctionType(dart.void, []),
      [_onPause]: dart.definiteFunctionType(dart.void, []),
      [_onResume]: dart.definiteFunctionType(dart.void, []),
      [_onCancel]: dart.definiteFunctionType(async.Future, []),
      [_addPending]: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_sendDone]: dart.definiteFunctionType(dart.void, []),
      [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
    }),
    sfields: () => ({
      _STATE_CANCEL_ON_ERROR: core.int,
      _STATE_CLOSED: core.int,
      _STATE_INPUT_PAUSED: core.int,
      _STATE_CANCELED: core.int,
      _STATE_WAIT_FOR_CANCEL: core.int,
      _STATE_IN_CALLBACK: core.int,
      _STATE_HAS_PENDING: core.int,
      _STATE_PAUSE_COUNT: core.int,
      _STATE_PAUSE_COUNT_SHIFT: core.int
    })
  });
  return _BufferingStreamSubscription;
});
async._BufferingStreamSubscription = _BufferingStreamSubscription();
async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR = 1;
async._BufferingStreamSubscription._STATE_CLOSED = 2;
async._BufferingStreamSubscription._STATE_INPUT_PAUSED = 4;
async._BufferingStreamSubscription._STATE_CANCELED = 8;
async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL = 16;
async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
async._ControllerSubscription$ = dart.generic(T => {
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
    new(controller, onData, onError, onDone, cancelOnError) {
      this[_controller$] = controller;
      super.new(onData, onError, onDone, cancelOnError);
    }
    [_onCancel]() {
      return this[_controller$][_recordCancel](this);
    }
    [_onPause]() {
      this[_controller$][_recordPause](this);
    }
    [_onResume]() {
      this[_controller$][_recordResume](this);
    }
  }
  dart.setSignature(_ControllerSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(async._ControllerSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
    fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()})
  });
  return _ControllerSubscription;
});
async._ControllerSubscription = _ControllerSubscription();
async._BroadcastSubscription$ = dart.generic(T => {
  let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _BroadcastSubscription extends async._ControllerSubscription$(T) {
    new(controller, onData, onError, onDone, cancelOnError) {
      this[_eventState] = 0;
      this[_next$] = null;
      this[_previous$] = null;
      super.new(controller, onData, onError, onDone, cancelOnError);
      this[_next$] = this[_previous$] = this;
    }
    [_expectsEvent](eventId) {
      return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_EVENT_ID) == eventId;
    }
    [_toggleEventId]() {
      this[_eventState] = (dart.notNull(this[_eventState]) ^ async._BroadcastSubscription._STATE_EVENT_ID) >>> 0;
    }
    get [_isFiring]() {
      return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_FIRING) != 0;
    }
    [_setRemoveAfterFiring]() {
      dart.assert(this[_isFiring]);
      this[_eventState] = (dart.notNull(this[_eventState]) | async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) >>> 0;
    }
    get [_removeAfterFiring]() {
      return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) != 0;
    }
    [_onPause]() {}
    [_onResume]() {}
  }
  dart.setSignature(_BroadcastSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
    fields: () => ({
      [_eventState]: core.int,
      [_next$]: _BroadcastSubscriptionOfT(),
      [_previous$]: _BroadcastSubscriptionOfT()
    }),
    getters: () => ({
      [_isFiring]: dart.definiteFunctionType(core.bool, []),
      [_removeAfterFiring]: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      [_expectsEvent]: dart.definiteFunctionType(core.bool, [core.int]),
      [_toggleEventId]: dart.definiteFunctionType(dart.void, []),
      [_setRemoveAfterFiring]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      _STATE_EVENT_ID: core.int,
      _STATE_FIRING: core.int,
      _STATE_REMOVE_AFTER_FIRING: core.int
    })
  });
  return _BroadcastSubscription;
});
async._BroadcastSubscription = _BroadcastSubscription();
async._BroadcastSubscription._STATE_EVENT_ID = 1;
async._BroadcastSubscription._STATE_FIRING = 2;
async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING = 4;
const _firstSubscription = Symbol('_firstSubscription');
const _lastSubscription = Symbol('_lastSubscription');
const _addStreamState = Symbol('_addStreamState');
const _doneFuture = Symbol('_doneFuture');
const _isEmpty = Symbol('_isEmpty');
const _hasOneListener = Symbol('_hasOneListener');
const _isAddingStream = Symbol('_isAddingStream');
const _mayAddEvent = Symbol('_mayAddEvent');
const _ensureDoneFuture = Symbol('_ensureDoneFuture');
const _addListener = Symbol('_addListener');
const _removeListener = Symbol('_removeListener');
const _callOnCancel = Symbol('_callOnCancel');
const _addEventError = Symbol('_addEventError');
const _forEachListener = Symbol('_forEachListener');
const _mayComplete = Symbol('_mayComplete');
const _asyncComplete = Symbol('_asyncComplete');
async._BroadcastStreamController$ = dart.generic(T => {
  let _BroadcastStreamOfT = () => (_BroadcastStreamOfT = dart.constFn(async._BroadcastStream$(T)))();
  let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
  let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _AddStreamStateOfT = () => (_AddStreamStateOfT = dart.constFn(async._AddStreamState$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
  let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
  class _BroadcastStreamController extends core.Object {
    new(onListen, onCancel) {
      this.onListen = onListen;
      this.onCancel = onCancel;
      this[_state] = async._BroadcastStreamController._STATE_INITIAL;
      this[_firstSubscription] = null;
      this[_lastSubscription] = null;
      this[_addStreamState] = null;
      this[_doneFuture] = null;
    }
    get onPause() {
      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
    }
    set onPause(onPauseHandler) {
      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
    }
    get onResume() {
      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
    }
    set onResume(onResumeHandler) {
      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
    }
    get stream() {
      return new (_BroadcastStreamOfT())(this);
    }
    get sink() {
      return new (_StreamSinkWrapperOfT())(this);
    }
    get isClosed() {
      return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_CLOSED) != 0;
    }
    get isPaused() {
      return false;
    }
    get hasListener() {
      return !dart.test(this[_isEmpty]);
    }
    get [_hasOneListener]() {
      dart.assert(!dart.test(this[_isEmpty]));
      return core.identical(this[_firstSubscription], this[_lastSubscription]);
    }
    get [_isFiring]() {
      return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_FIRING) != 0;
    }
    get [_isAddingStream]() {
      return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_ADDSTREAM) != 0;
    }
    get [_mayAddEvent]() {
      return dart.notNull(this[_state]) < async._BroadcastStreamController._STATE_CLOSED;
    }
    [_ensureDoneFuture]() {
      if (this[_doneFuture] != null) return this[_doneFuture];
      return this[_doneFuture] = new async._Future();
    }
    get [_isEmpty]() {
      return this[_firstSubscription] == null;
    }
    [_addListener](subscription) {
      _BroadcastSubscriptionOfT()._check(subscription);
      dart.assert(core.identical(subscription[_next$], subscription));
      subscription[_eventState] = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
      let oldLast = this[_lastSubscription];
      this[_lastSubscription] = subscription;
      subscription[_next$] = null;
      subscription[_previous$] = oldLast;
      if (oldLast == null) {
        this[_firstSubscription] = subscription;
      } else {
        oldLast[_next$] = subscription;
      }
    }
    [_removeListener](subscription) {
      _BroadcastSubscriptionOfT()._check(subscription);
      dart.assert(core.identical(subscription[_controller$], this));
      dart.assert(!core.identical(subscription[_next$], subscription));
      let previous = subscription[_previous$];
      let next = subscription[_next$];
      if (previous == null) {
        this[_firstSubscription] = next;
      } else {
        previous[_next$] = next;
      }
      if (next == null) {
        this[_lastSubscription] = previous;
      } else {
        next[_previous$] = previous;
      }
      subscription[_next$] = subscription[_previous$] = subscription;
    }
    [_subscribe](onData, onError, onDone, cancelOnError) {
      if (dart.test(this.isClosed)) {
        if (onDone == null) onDone = async._nullDoneHandler;
        return new (_DoneStreamSubscriptionOfT())(onDone);
      }
      let subscription = new (_BroadcastSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
      this[_addListener](_BroadcastSubscriptionOfT()._check(subscription));
      if (core.identical(this[_firstSubscription], this[_lastSubscription])) {
        async._runGuarded(this.onListen);
      }
      return subscription;
    }
    [_recordCancel](sub) {
      StreamSubscriptionOfT()._check(sub);
      let subscription = _BroadcastSubscriptionOfT()._check(sub);
      if (core.identical(subscription[_next$], subscription)) return null;
      if (dart.test(subscription[_isFiring])) {
        subscription[_setRemoveAfterFiring]();
      } else {
        this[_removeListener](subscription);
        if (!dart.test(this[_isFiring]) && dart.test(this[_isEmpty])) {
          this[_callOnCancel]();
        }
      }
      return null;
    }
    [_recordPause](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_recordResume](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_addEventError]() {
      if (dart.test(this.isClosed)) {
        return new core.StateError("Cannot add new events after calling close");
      }
      dart.assert(this[_isAddingStream]);
      return new core.StateError("Cannot add new events while doing an addStream");
    }
    add(data) {
      T._check(data);
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_sendData](data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      error = async._nonNullError(error);
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      let replacement = async.Zone.current.errorCallback(error, stackTrace);
      if (replacement != null) {
        error = async._nonNullError(replacement.error);
        stackTrace = replacement.stackTrace;
      }
      this[_sendError](error, stackTrace);
    }
    close() {
      if (dart.test(this.isClosed)) {
        dart.assert(this[_doneFuture] != null);
        return this[_doneFuture];
      }
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
      let doneFuture = this[_ensureDoneFuture]();
      this[_sendDone]();
      return doneFuture;
    }
    get done() {
      return this[_ensureDoneFuture]();
    }
    addStream(stream, opts) {
      StreamOfT()._check(stream);
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
      this[_addStreamState] = new (_AddStreamStateOfT())(this, stream, cancelOnError);
      return this[_addStreamState].addStreamFuture;
    }
    [_add$](data) {
      T._check(data);
      this[_sendData](data);
    }
    [_addError](error, stackTrace) {
      this[_sendError](error, stackTrace);
    }
    [_close$]() {
      dart.assert(this[_isAddingStream]);
      let addState = this[_addStreamState];
      this[_addStreamState] = null;
      this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
      addState.complete();
    }
    [_forEachListener](action) {
      if (dart.test(this[_isFiring])) {
        dart.throw(new core.StateError("Cannot fire new event. Controller is already firing an event"));
      }
      if (dart.test(this[_isEmpty])) return;
      let id = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
      this[_state] = (dart.notNull(this[_state]) ^ (async._BroadcastStreamController._STATE_EVENT_ID | async._BroadcastStreamController._STATE_FIRING)) >>> 0;
      let subscription = this[_firstSubscription];
      while (subscription != null) {
        if (dart.test(subscription[_expectsEvent](id))) {
          subscription[_eventState] = (dart.notNull(subscription[_eventState]) | async._BroadcastSubscription._STATE_FIRING) >>> 0;
          action(subscription);
          subscription[_toggleEventId]();
          let next = subscription[_next$];
          if (dart.test(subscription[_removeAfterFiring])) {
            this[_removeListener](subscription);
          }
          subscription[_eventState] = (dart.notNull(subscription[_eventState]) & ~async._BroadcastSubscription._STATE_FIRING) >>> 0;
          subscription = next;
        } else {
          subscription = subscription[_next$];
        }
      }
      this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
      if (dart.test(this[_isEmpty])) {
        this[_callOnCancel]();
      }
    }
    [_callOnCancel]() {
      dart.assert(this[_isEmpty]);
      if (dart.test(this.isClosed) && dart.test(this[_doneFuture][_mayComplete])) {
        this[_doneFuture][_asyncComplete](null);
      }
      async._runGuarded(this.onCancel);
    }
  }
  dart.addTypeTests(_BroadcastStreamController);
  _BroadcastStreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
  dart.setSignature(_BroadcastStreamController, {
    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStreamController$(T), [async.ControllerCallback, async.ControllerCancelCallback])}),
    fields: () => ({
      onListen: async.ControllerCallback,
      onCancel: async.ControllerCancelCallback,
      [_state]: core.int,
      [_firstSubscription]: _BroadcastSubscriptionOfT(),
      [_lastSubscription]: _BroadcastSubscriptionOfT(),
      [_addStreamState]: _AddStreamStateOfT(),
      [_doneFuture]: async._Future
    }),
    getters: () => ({
      onPause: dart.definiteFunctionType(async.ControllerCallback, []),
      onResume: dart.definiteFunctionType(async.ControllerCallback, []),
      stream: dart.definiteFunctionType(async.Stream$(T), []),
      sink: dart.definiteFunctionType(async.StreamSink$(T), []),
      isClosed: dart.definiteFunctionType(core.bool, []),
      isPaused: dart.definiteFunctionType(core.bool, []),
      hasListener: dart.definiteFunctionType(core.bool, []),
      [_hasOneListener]: dart.definiteFunctionType(core.bool, []),
      [_isFiring]: dart.definiteFunctionType(core.bool, []),
      [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
      [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
      [_isEmpty]: dart.definiteFunctionType(core.bool, []),
      done: dart.definiteFunctionType(async.Future, [])
    }),
    setters: () => ({
      onPause: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      onResume: dart.definiteFunctionType(dart.void, [VoidTovoid()])
    }),
    methods: () => ({
      [_ensureDoneFuture]: dart.definiteFunctionType(async._Future, []),
      [_addListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
      [_removeListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
      [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
      [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
      [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
      [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
      [_addEventError]: dart.definiteFunctionType(core.Error, []),
      add: dart.definiteFunctionType(dart.void, [T]),
      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      close: dart.definiteFunctionType(async.Future, []),
      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
      [_add$]: dart.definiteFunctionType(dart.void, [T]),
      [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_close$]: dart.definiteFunctionType(dart.void, []),
      [_forEachListener]: dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfTTovoid()]),
      [_callOnCancel]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      _STATE_INITIAL: core.int,
      _STATE_EVENT_ID: core.int,
      _STATE_FIRING: core.int,
      _STATE_CLOSED: core.int,
      _STATE_ADDSTREAM: core.int
    })
  });
  return _BroadcastStreamController;
});
async._BroadcastStreamController = _BroadcastStreamController();
async._BroadcastStreamController._STATE_INITIAL = 0;
async._BroadcastStreamController._STATE_EVENT_ID = 1;
async._BroadcastStreamController._STATE_FIRING = 2;
async._BroadcastStreamController._STATE_CLOSED = 4;
async._BroadcastStreamController._STATE_ADDSTREAM = 8;
async._SyncBroadcastStreamController$ = dart.generic(T => {
  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
  let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
  let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
  class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
    new(onListen, onCancel) {
      super.new(onListen, onCancel);
    }
    get [_mayAddEvent]() {
      return dart.test(super[_mayAddEvent]) && !dart.test(this[_isFiring]);
    }
    [_addEventError]() {
      if (dart.test(this[_isFiring])) {
        return new core.StateError("Cannot fire new event. Controller is already firing an event");
      }
      return super[_addEventError]();
    }
    [_sendData](data) {
      T._check(data);
      if (dart.test(this[_isEmpty])) return;
      if (dart.test(this[_hasOneListener])) {
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_FIRING) >>> 0;
        let subscription = this[_firstSubscription];
        subscription[_add$](data);
        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
        if (dart.test(this[_isEmpty])) {
          this[_callOnCancel]();
        }
        return;
      }
      this[_forEachListener](dart.fn(subscription => {
        subscription[_add$](data);
      }, _BufferingStreamSubscriptionOfTToNull()));
    }
    [_sendError](error, stackTrace) {
      if (dart.test(this[_isEmpty])) return;
      this[_forEachListener](dart.fn(subscription => {
        subscription[_addError](error, stackTrace);
      }, _BufferingStreamSubscriptionOfTToNull()));
    }
    [_sendDone]() {
      if (!dart.test(this[_isEmpty])) {
        this[_forEachListener](dart.fn(subscription => {
          subscription[_close$]();
        }, _BufferingStreamSubscriptionOfTToNull()));
      } else {
        dart.assert(this[_doneFuture] != null);
        dart.assert(this[_doneFuture][_mayComplete]);
        this[_doneFuture][_asyncComplete](null);
      }
    }
  }
  _SyncBroadcastStreamController[dart.implements] = () => [SynchronousStreamControllerOfT()];
  dart.setSignature(_SyncBroadcastStreamController, {
    constructors: () => ({new: dart.definiteFunctionType(async._SyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
    methods: () => ({
      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_sendDone]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _SyncBroadcastStreamController;
});
async._SyncBroadcastStreamController = _SyncBroadcastStreamController();
let const$6;
async._AsyncBroadcastStreamController$ = dart.generic(T => {
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  class _AsyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
    new(onListen, onCancel) {
      super.new(onListen, onCancel);
    }
    [_sendData](data) {
      T._check(data);
      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
        subscription[_addPending](new (_DelayedDataOfT())(data));
      }
    }
    [_sendError](error, stackTrace) {
      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
        subscription[_addPending](new async._DelayedError(error, stackTrace));
      }
    }
    [_sendDone]() {
      if (!dart.test(this[_isEmpty])) {
        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
          subscription[_addPending](const$6 || (const$6 = dart.const(new async._DelayedDone())));
        }
      } else {
        dart.assert(this[_doneFuture] != null);
        dart.assert(this[_doneFuture][_mayComplete]);
        this[_doneFuture][_asyncComplete](null);
      }
    }
  }
  dart.setSignature(_AsyncBroadcastStreamController, {
    constructors: () => ({new: dart.definiteFunctionType(async._AsyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
    methods: () => ({
      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_sendDone]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _AsyncBroadcastStreamController;
});
async._AsyncBroadcastStreamController = _AsyncBroadcastStreamController();
const _addPendingEvent = Symbol('_addPendingEvent');
let const$7;
async._AsBroadcastStreamController$ = dart.generic(T => {
  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _AsBroadcastStreamController extends async._SyncBroadcastStreamController$(T) {
    new(onListen, onCancel) {
      this[_pending] = null;
      super.new(onListen, onCancel);
    }
    get [_hasPending]() {
      return this[_pending] != null && !dart.test(this[_pending].isEmpty);
    }
    [_addPendingEvent](event) {
      if (this[_pending] == null) {
        this[_pending] = new (_StreamImplEventsOfT())();
      }
      this[_pending].add(event);
    }
    add(data) {
      T._check(data);
      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
        this[_addPendingEvent](new (_DelayedDataOfT())(data));
        return;
      }
      super.add(data);
      while (dart.test(this[_hasPending])) {
        this[_pending].handleNext(this);
      }
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
        this[_addPendingEvent](new async._DelayedError(error, stackTrace));
        return;
      }
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_sendError](error, stackTrace);
      while (dart.test(this[_hasPending])) {
        this[_pending].handleNext(this);
      }
    }
    close() {
      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
        this[_addPendingEvent](const$7 || (const$7 = dart.const(new async._DelayedDone())));
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
        return super.done;
      }
      let result = super.close();
      dart.assert(!dart.test(this[_hasPending]));
      return result;
    }
    [_callOnCancel]() {
      if (dart.test(this[_hasPending])) {
        this[_pending].clear();
        this[_pending] = null;
      }
      super[_callOnCancel]();
    }
  }
  _AsBroadcastStreamController[dart.implements] = () => [_EventDispatchOfT()];
  dart.setSignature(_AsBroadcastStreamController, {
    constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
    fields: () => ({[_pending]: _StreamImplEventsOfT()}),
    getters: () => ({[_hasPending]: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({[_addPendingEvent]: dart.definiteFunctionType(dart.void, [async._DelayedEvent])})
  });
  return _AsBroadcastStreamController;
});
async._AsBroadcastStreamController = _AsBroadcastStreamController();
const _pauseCount = Symbol('_pauseCount');
const _resume = Symbol('_resume');
async._DoneSubscription$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _DoneSubscription extends core.Object {
    new() {
      this[_pauseCount] = 0;
    }
    onData(handleData) {}
    onError(handleError) {}
    onDone(handleDone) {}
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      if (resumeSignal != null) resumeSignal.then(dart.void)(dart.bind(this, _resume));
      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
    }
    resume() {
      this[_resume](null);
    }
    [_resume](_) {
      if (dart.notNull(this[_pauseCount]) > 0) {
        this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
      }
    }
    cancel() {
      return new async._Future.immediate(null);
    }
    get isPaused() {
      return dart.notNull(this[_pauseCount]) > 0;
    }
    asFuture(E) {
      return value => {
        if (value === void 0) value = null;
        return new (async._Future$(E))();
      };
    }
  }
  dart.addTypeTests(_DoneSubscription);
  _DoneSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
  dart.setSignature(_DoneSubscription, {
    fields: () => ({[_pauseCount]: core.int}),
    getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
      onError: dart.definiteFunctionType(dart.void, [core.Function]),
      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
      resume: dart.definiteFunctionType(dart.void, []),
      [_resume]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      cancel: dart.definiteFunctionType(async.Future, []),
      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
    })
  });
  return _DoneSubscription;
});
async._DoneSubscription = _DoneSubscription();
async.DeferredLibrary = class DeferredLibrary extends core.Object {
  new(libraryName, opts) {
    let uri = opts && 'uri' in opts ? opts.uri : null;
    this.libraryName = libraryName;
    this.uri = uri;
  }
  load() {
    dart.throw('DeferredLibrary not supported. ' + 'please use the `import "lib.dart" deferred as lib` syntax.');
  }
};
dart.setSignature(async.DeferredLibrary, {
  constructors: () => ({new: dart.definiteFunctionType(async.DeferredLibrary, [core.String], {uri: core.String})}),
  fields: () => ({
    libraryName: core.String,
    uri: core.String
  }),
  methods: () => ({load: dart.definiteFunctionType(async.Future$(core.Null), [])})
});
const _s = Symbol('_s');
async.DeferredLoadException = class DeferredLoadException extends core.Object {
  new(s) {
    this[_s] = s;
  }
  toString() {
    return dart.str`DeferredLoadException: '${this[_s]}'`;
  }
};
async.DeferredLoadException[dart.implements] = () => [core.Exception];
dart.setSignature(async.DeferredLoadException, {
  constructors: () => ({new: dart.definiteFunctionType(async.DeferredLoadException, [core.String])}),
  fields: () => ({[_s]: core.String})
});
async.FutureOr$ = dart.generic(T => {
  class FutureOr extends core.Object {
    _() {
      dart.throw(new core.UnsupportedError("FutureOr can't be instantiated"));
    }
  }
  dart.addTypeTests(FutureOr);
  dart.defineNamedConstructor(FutureOr, '_');
  dart.setSignature(FutureOr, {
    constructors: () => ({_: dart.definiteFunctionType(async.FutureOr$(T), [])})
  });
  return FutureOr;
});
async.FutureOr = FutureOr();
const _completeWithValue = Symbol('_completeWithValue');
let const$8;
async.Future$ = dart.flattenFutures(dart.generic(T => {
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
  class Future extends core.Object {
    static new(computation) {
      let result = new (_FutureOfT())();
      async.Timer.run(dart.fn(() => {
        try {
          result[_complete](computation());
        } catch (e) {
          let s = dart.stackTrace(e);
          async._completeWithErrorCallback(result, e, s);
        }

      }, VoidToNull()));
      return result;
    }
    static microtask(computation) {
      let result = new (_FutureOfT())();
      async.scheduleMicrotask(dart.fn(() => {
        try {
          result[_complete](computation());
        } catch (e) {
          let s = dart.stackTrace(e);
          async._completeWithErrorCallback(result, e, s);
        }

      }, VoidToNull()));
      return result;
    }
    static sync(computation) {
      try {
        let result = computation();
        return FutureOfT().value(result);
      } catch (error) {
        let stackTrace = dart.stackTrace(error);
        return FutureOfT().error(error, stackTrace);
      }

    }
    static value(value) {
      if (value === void 0) value = null;
      return new (_FutureOfT()).immediate(value);
    }
    static error(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      error = async._nonNullError(error);
      if (!core.identical(async.Zone.current, async._ROOT_ZONE)) {
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
      }
      return new (_FutureOfT()).immediateError(error, stackTrace);
    }
    static delayed(duration, computation) {
      if (computation === void 0) computation = null;
      let result = new (_FutureOfT())();
      async.Timer.new(duration, dart.fn(() => {
        try {
          result[_complete](dart.nullSafe(computation, _ => _()));
        } catch (e) {
          let s = dart.stackTrace(e);
          async._completeWithErrorCallback(result, e, s);
        }

      }, VoidToNull()));
      return result;
    }
    static wait(T) {
      return (futures, opts) => {
        let eagerError = opts && 'eagerError' in opts ? opts.eagerError : false;
        let cleanUp = opts && 'cleanUp' in opts ? opts.cleanUp : null;
        let result = new (async._Future$(core.List$(T)))();
        let values = null;
        let remaining = 0;
        let error = null;
        let stackTrace = null;
        function handleError(theError, theStackTrace) {
          remaining--;
          if (values != null) {
            if (cleanUp != null) {
              for (let value of values) {
                if (value != null) {
                  async.Future.sync(dart.fn(() => {
                    cleanUp(value);
                  }, VoidToNull()));
                }
              }
            }
            values = null;
            if (remaining == 0 || dart.test(eagerError)) {
              result[_completeError](theError, core.StackTrace._check(theStackTrace));
            } else {
              error = theError;
              stackTrace = core.StackTrace._check(theStackTrace);
            }
          } else if (remaining == 0 && !dart.test(eagerError)) {
            result[_completeError](error, stackTrace);
          }
        }
        dart.fn(handleError, dynamicAnddynamicTovoid$());
        try {
          for (let future of futures) {
            let pos = remaining;
            future.then(dart.dynamic)(dart.fn(value => {
              remaining--;
              if (values != null) {
                values[dartx._set](pos, value);
                if (remaining == 0) {
                  result[_completeWithValue](values);
                }
              } else {
                if (cleanUp != null && value != null) {
                  async.Future.sync(dart.fn(() => {
                    cleanUp(value);
                  }, VoidToNull()));
                }
                if (remaining == 0 && !dart.test(eagerError)) {
                  result[_completeError](error, stackTrace);
                }
              }
            }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
            remaining++;
          }
          if (remaining == 0) {
            return async.Future$(core.List$(T)).value(const$8 || (const$8 = dart.constList([], dart.dynamic)));
          }
          values = core.List$(T).new(remaining);
        } catch (e) {
          let st = dart.stackTrace(e);
          if (remaining == 0 || dart.test(eagerError)) {
            return async.Future$(core.List$(T)).error(e, st);
          } else {
            error = e;
            stackTrace = st;
          }
        }

        return result;
      };
    }
    static any(T) {
      return futures => {
        let completer = async.Completer$(T).sync();
        let onValue = dart.fn(value => {
          if (!dart.test(completer.isCompleted)) completer.complete(value);
        }, dart.definiteFunctionType(core.Null, [T]));
        let onError = dart.fn((error, stack) => {
          if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
        }, dynamicAnddynamicToNull());
        for (let future of futures) {
          future.then(dart.dynamic)(onValue, {onError: onError});
        }
        return completer.future;
      };
    }
    static forEach(T) {
      return (input, f) => {
        let iterator = input[dartx.iterator];
        return async.Future.doWhile(dart.fn(() => {
          if (!dart.test(iterator.moveNext())) return false;
          return async.Future.sync(dart.fn(() => f(iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
        }, VoidToObject$()));
      };
    }
    static doWhile(f) {
      let doneSignal = new async._Future();
      let nextIteration = null;
      nextIteration = async.Zone.current.bindUnaryCallback(dart.dynamic, core.bool)(dart.fn(keepGoing => {
        if (dart.test(keepGoing)) {
          async.Future.sync(f).then(dart.dynamic)(dynamicToFutureOr()._check(nextIteration), {onError: dart.bind(doneSignal, _completeError)});
        } else {
          doneSignal[_complete](null);
        }
      }, boolToNull()), {runGuarded: true});
      dart.dcall(nextIteration, true);
      return doneSignal;
    }
  }
  dart.addTypeTests(Future);
  dart.setSignature(Future, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
      microtask: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
      sync: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
      value: dart.definiteFunctionType(async.Future$(T), [], [dart.dynamic]),
      error: dart.definiteFunctionType(async.Future$(T), [core.Object], [core.StackTrace]),
      delayed: dart.definiteFunctionType(async.Future$(T), [core.Duration], [VoidTodynamic()])
    }),
    sfields: () => ({_nullFuture: async._Future}),
    statics: () => ({
      wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
      any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
      forEach: dart.definiteFunctionType(T => [async.Future, [core.Iterable$(T), dart.functionType(dart.dynamic, [T])]]),
      doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
    }),
    names: ['wait', 'any', 'forEach', 'doWhile']
  });
  return Future;
}));
async.Future = Future();
dart.defineLazy(async.Future, {
  get _nullFuture() {
    return async._Future._check(async.Future.value(null));
  }
});
async.TimeoutException = class TimeoutException extends core.Object {
  new(message, duration) {
    if (duration === void 0) duration = null;
    this.message = message;
    this.duration = duration;
  }
  toString() {
    let result = "TimeoutException";
    if (this.duration != null) result = dart.str`TimeoutException after ${this.duration}`;
    if (this.message != null) result = dart.str`${result}: ${this.message}`;
    return result;
  }
};
async.TimeoutException[dart.implements] = () => [core.Exception];
dart.setSignature(async.TimeoutException, {
  constructors: () => ({new: dart.definiteFunctionType(async.TimeoutException, [core.String], [core.Duration])}),
  fields: () => ({
    message: core.String,
    duration: core.Duration
  })
});
async.Completer$ = dart.generic(T => {
  let _AsyncCompleterOfT = () => (_AsyncCompleterOfT = dart.constFn(async._AsyncCompleter$(T)))();
  let _SyncCompleterOfT = () => (_SyncCompleterOfT = dart.constFn(async._SyncCompleter$(T)))();
  class Completer extends core.Object {
    static new() {
      return new (_AsyncCompleterOfT())();
    }
    static sync() {
      return new (_SyncCompleterOfT())();
    }
  }
  dart.addTypeTests(Completer);
  dart.setSignature(Completer, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.Completer$(T), []),
      sync: dart.definiteFunctionType(async.Completer$(T), [])
    })
  });
  return Completer;
});
async.Completer = Completer();
async._completeWithErrorCallback = function(result, error, stackTrace) {
  let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
  if (replacement != null) {
    error = async._nonNullError(replacement.error);
    stackTrace = replacement.stackTrace;
  }
  result[_completeError](error, core.StackTrace._check(stackTrace));
};
dart.lazyFn(async._completeWithErrorCallback, () => _FutureAnddynamicAnddynamicTovoid());
async._nonNullError = function(error) {
  return error != null ? error : new core.NullThrownError();
};
dart.fn(async._nonNullError, ObjectToObject());
async._FutureOnValue$ = dart.generic((S, T) => {
  const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
  return _FutureOnValue;
});
async._FutureOnValue = _FutureOnValue();
async._FutureErrorTest = dart.typedef('_FutureErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
async._FutureAction = dart.typedef('_FutureAction', () => dart.functionType(dart.dynamic, []));
async._Completer$ = dart.generic(T => {
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let CompleterOfT = () => (CompleterOfT = dart.constFn(async.Completer$(T)))();
  class _Completer extends core.Object {
    new() {
      this.future = new (_FutureOfT())();
    }
    completeError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      error = async._nonNullError(error);
      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
      let replacement = async.Zone.current.errorCallback(error, stackTrace);
      if (replacement != null) {
        error = async._nonNullError(replacement.error);
        stackTrace = replacement.stackTrace;
      }
      this[_completeError](error, stackTrace);
    }
    get isCompleted() {
      return !dart.test(this.future[_mayComplete]);
    }
  }
  dart.addTypeTests(_Completer);
  _Completer[dart.implements] = () => [CompleterOfT()];
  dart.setSignature(_Completer, {
    fields: () => ({future: _FutureOfT()}),
    getters: () => ({isCompleted: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({completeError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
  });
  return _Completer;
});
async._Completer = _Completer();
const _asyncCompleteError = Symbol('_asyncCompleteError');
async._AsyncCompleter$ = dart.generic(T => {
  class _AsyncCompleter extends async._Completer$(T) {
    new() {
      super.new();
    }
    complete(value) {
      if (value === void 0) value = null;
      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
      this.future[_asyncComplete](value);
    }
    [_completeError](error, stackTrace) {
      this.future[_asyncCompleteError](error, stackTrace);
    }
  }
  dart.setSignature(_AsyncCompleter, {
    methods: () => ({
      complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
      [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
    })
  });
  return _AsyncCompleter;
});
async._AsyncCompleter = _AsyncCompleter();
async._SyncCompleter$ = dart.generic(T => {
  class _SyncCompleter extends async._Completer$(T) {
    new() {
      super.new();
    }
    complete(value) {
      if (value === void 0) value = null;
      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
      this.future[_complete](value);
    }
    [_completeError](error, stackTrace) {
      this.future[_completeError](error, stackTrace);
    }
  }
  dart.setSignature(_SyncCompleter, {
    methods: () => ({
      complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
      [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
    })
  });
  return _SyncCompleter;
});
async._SyncCompleter = _SyncCompleter();
const _nextListener = Symbol('_nextListener');
const _onValue = Symbol('_onValue');
const _errorTest = Symbol('_errorTest');
const _whenCompleteAction = Symbol('_whenCompleteAction');
async._FutureListener$ = dart.generic((S, T) => {
  let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  class _FutureListener extends core.Object {
    then(result, onValue, errorCallback) {
      this.result = result;
      this.callback = onValue;
      this.errorCallback = errorCallback;
      this.state = errorCallback == null ? async._FutureListener.STATE_THEN : async._FutureListener.STATE_THEN_ONERROR;
      this[_nextListener] = null;
    }
    catchError(result, errorCallback, test) {
      this.result = result;
      this.errorCallback = errorCallback;
      this.callback = test;
      this.state = test == null ? async._FutureListener.STATE_CATCHERROR : async._FutureListener.STATE_CATCHERROR_TEST;
      this[_nextListener] = null;
    }
    whenComplete(result, onComplete) {
      this.result = result;
      this.callback = onComplete;
      this.errorCallback = null;
      this.state = async._FutureListener.STATE_WHENCOMPLETE;
      this[_nextListener] = null;
    }
    get [_zone]() {
      return this.result[_zone];
    }
    get handlesValue() {
      return (dart.notNull(this.state) & async._FutureListener.MASK_VALUE) != 0;
    }
    get handlesError() {
      return (dart.notNull(this.state) & async._FutureListener.MASK_ERROR) != 0;
    }
    get hasErrorTest() {
      return this.state == async._FutureListener.STATE_CATCHERROR_TEST;
    }
    get handlesComplete() {
      return this.state == async._FutureListener.STATE_WHENCOMPLETE;
    }
    get [_onValue]() {
      dart.assert(this.handlesValue);
      return _FutureOnValueOfS$T().as(this.callback);
    }
    get [_onError]() {
      return this.errorCallback;
    }
    get [_errorTest]() {
      dart.assert(this.hasErrorTest);
      return async._FutureErrorTest.as(this.callback);
    }
    get [_whenCompleteAction]() {
      dart.assert(this.handlesComplete);
      return async._FutureAction.as(this.callback);
    }
    get hasErrorCallback() {
      dart.assert(this.handlesError);
      return this[_onError] != null;
    }
    handleValue(sourceResult) {
      S._check(sourceResult);
      return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
    }
    matchesErrorTest(asyncError) {
      if (!dart.test(this.hasErrorTest)) return true;
      let test = this[_errorTest];
      return this[_zone].runUnary(core.bool, dart.dynamic)(this[_errorTest], asyncError.error);
    }
    handleError(asyncError) {
      dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
      if (async.ZoneBinaryCallback.is(this.errorCallback)) {
        let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
        return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
      } else {
        return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
      }
    }
    handleWhenComplete() {
      dart.assert(!dart.test(this.handlesError));
      return this[_zone].run(dart.dynamic)(this[_whenCompleteAction]);
    }
  }
  dart.addTypeTests(_FutureListener);
  dart.defineNamedConstructor(_FutureListener, 'then');
  dart.defineNamedConstructor(_FutureListener, 'catchError');
  dart.defineNamedConstructor(_FutureListener, 'whenComplete');
  dart.setSignature(_FutureListener, {
    constructors: () => ({
      then: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), _FutureOnValueOfS$T(), core.Function]),
      catchError: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), core.Function, async._FutureErrorTest]),
      whenComplete: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), async._FutureAction])
    }),
    fields: () => ({
      [_nextListener]: async._FutureListener,
      result: _FutureOfT(),
      state: core.int,
      callback: core.Function,
      errorCallback: core.Function
    }),
    getters: () => ({
      [_zone]: dart.definiteFunctionType(async.Zone, []),
      handlesValue: dart.definiteFunctionType(core.bool, []),
      handlesError: dart.definiteFunctionType(core.bool, []),
      hasErrorTest: dart.definiteFunctionType(core.bool, []),
      handlesComplete: dart.definiteFunctionType(core.bool, []),
      [_onValue]: dart.definiteFunctionType(async._FutureOnValue$(S, T), []),
      [_onError]: dart.definiteFunctionType(core.Function, []),
      [_errorTest]: dart.definiteFunctionType(async._FutureErrorTest, []),
      [_whenCompleteAction]: dart.definiteFunctionType(async._FutureAction, []),
      hasErrorCallback: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
      matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
      handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
      handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
    }),
    sfields: () => ({
      MASK_VALUE: core.int,
      MASK_ERROR: core.int,
      MASK_TEST_ERROR: core.int,
      MASK_WHENCOMPLETE: core.int,
      STATE_CHAIN: core.int,
      STATE_THEN: core.int,
      STATE_THEN_ONERROR: core.int,
      STATE_CATCHERROR: core.int,
      STATE_CATCHERROR_TEST: core.int,
      STATE_WHENCOMPLETE: core.int
    })
  });
  return _FutureListener;
});
async._FutureListener = _FutureListener();
async._FutureListener.MASK_VALUE = 1;
async._FutureListener.MASK_ERROR = 2;
async._FutureListener.MASK_TEST_ERROR = 4;
async._FutureListener.MASK_WHENCOMPLETE = 8;
async._FutureListener.STATE_CHAIN = 0;
async._FutureListener.STATE_THEN_ONERROR = 3;
async._FutureListener.STATE_CATCHERROR_TEST = 6;
dart.defineLazy(async._FutureListener, {
  get STATE_THEN() {
    return async._FutureListener.MASK_VALUE;
  },
  get STATE_CATCHERROR() {
    return async._FutureListener.MASK_ERROR;
  },
  get STATE_WHENCOMPLETE() {
    return async._FutureListener.MASK_WHENCOMPLETE;
  }
});
const _resultOrListeners = Symbol('_resultOrListeners');
const _isPendingComplete = Symbol('_isPendingComplete');
const _mayAddListener = Symbol('_mayAddListener');
const _isChained = Symbol('_isChained');
const _isComplete = Symbol('_isComplete');
const _hasError = Symbol('_hasError');
const _setChained = Symbol('_setChained');
const _thenNoZoneRegistration = Symbol('_thenNoZoneRegistration');
const _setPendingComplete = Symbol('_setPendingComplete');
const _clearPendingComplete = Symbol('_clearPendingComplete');
const _error = Symbol('_error');
const _chainSource = Symbol('_chainSource');
const _setValue = Symbol('_setValue');
const _setErrorObject = Symbol('_setErrorObject');
const _setError = Symbol('_setError');
const _cloneResult = Symbol('_cloneResult');
const _prependListeners = Symbol('_prependListeners');
const _reverseListeners = Symbol('_reverseListeners');
const _removeListeners = Symbol('_removeListeners');
async._Future$ = dart.flattenFutures(dart.generic(T => {
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let _FutureListenerOfT$T = () => (_FutureListenerOfT$T = dart.constFn(async._FutureListener$(T, T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
  let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
  let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
  class _Future extends core.Object {
    new() {
      this[_zone] = async.Zone.current;
      this[_state] = async._Future._INCOMPLETE;
      this[_resultOrListeners] = null;
    }
    immediate(value) {
      this[_zone] = async.Zone.current;
      this[_state] = async._Future._INCOMPLETE;
      this[_resultOrListeners] = null;
      this[_asyncComplete](value);
    }
    immediateError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_zone] = async.Zone.current;
      this[_state] = async._Future._INCOMPLETE;
      this[_resultOrListeners] = null;
      this[_asyncCompleteError](error, stackTrace);
    }
    get [_mayComplete]() {
      return this[_state] == async._Future._INCOMPLETE;
    }
    get [_isPendingComplete]() {
      return this[_state] == async._Future._PENDING_COMPLETE;
    }
    get [_mayAddListener]() {
      return dart.notNull(this[_state]) <= async._Future._PENDING_COMPLETE;
    }
    get [_isChained]() {
      return this[_state] == async._Future._CHAINED;
    }
    get [_isComplete]() {
      return dart.notNull(this[_state]) >= async._Future._VALUE;
    }
    get [_hasError]() {
      return this[_state] == async._Future._ERROR;
    }
    [_setChained](source) {
      dart.assert(this[_mayAddListener]);
      this[_state] = async._Future._CHAINED;
      this[_resultOrListeners] = source;
    }
    then(E) {
      return (f, opts) => {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let currentZone = async.Zone.current;
        let registered = null;
        if (!core.identical(currentZone, async._ROOT_ZONE)) {
          f = currentZone.registerUnaryCallback(async.FutureOr$(E), T)(f);
          if (onError != null) {
            onError = async._registerErrorHandler(T)(onError, currentZone);
          }
        }
        return this[_thenNoZoneRegistration](E)(f, onError);
      };
    }
    [_thenNoZoneRegistration](E) {
      return (f, onError) => {
        let result = new (async._Future$(E))();
        this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
        return result;
      };
    }
    catchError(onError, opts) {
      let test = opts && 'test' in opts ? opts.test : null;
      let result = new (_FutureOfT())();
      if (!core.identical(result[_zone], async._ROOT_ZONE)) {
        onError = async._registerErrorHandler(T)(onError, result[_zone]);
        if (test != null) test = result[_zone].registerUnaryCallback(core.bool, dart.dynamic)(test);
      }
      this[_addListener](new (_FutureListenerOfT$T()).catchError(result, onError, test));
      return result;
    }
    whenComplete(action) {
      let result = new (_FutureOfT())();
      if (!core.identical(result[_zone], async._ROOT_ZONE)) {
        action = result[_zone].registerCallback(dart.dynamic)(action);
      }
      this[_addListener](new (_FutureListenerOfT$T()).whenComplete(result, action));
      return result;
    }
    asStream() {
      return StreamOfT().fromFuture(this);
    }
    [_setPendingComplete]() {
      dart.assert(this[_mayComplete]);
      this[_state] = async._Future._PENDING_COMPLETE;
    }
    [_clearPendingComplete]() {
      dart.assert(this[_isPendingComplete]);
      this[_state] = async._Future._INCOMPLETE;
    }
    get [_error]() {
      dart.assert(this[_hasError]);
      return async.AsyncError._check(this[_resultOrListeners]);
    }
    get [_chainSource]() {
      dart.assert(this[_isChained]);
      return async._Future._check(this[_resultOrListeners]);
    }
    [_setValue](value) {
      T._check(value);
      dart.assert(!dart.test(this[_isComplete]));
      this[_state] = async._Future._VALUE;
      this[_resultOrListeners] = value;
    }
    [_setErrorObject](error) {
      dart.assert(!dart.test(this[_isComplete]));
      this[_state] = async._Future._ERROR;
      this[_resultOrListeners] = error;
    }
    [_setError](error, stackTrace) {
      this[_setErrorObject](new async.AsyncError(error, stackTrace));
    }
    [_cloneResult](source) {
      dart.assert(!dart.test(this[_isComplete]));
      dart.assert(source[_isComplete]);
      this[_state] = source[_state];
      this[_resultOrListeners] = source[_resultOrListeners];
    }
    [_addListener](listener) {
      dart.assert(listener[_nextListener] == null);
      if (dart.test(this[_mayAddListener])) {
        listener[_nextListener] = async._FutureListener._check(this[_resultOrListeners]);
        this[_resultOrListeners] = listener;
      } else {
        if (dart.test(this[_isChained])) {
          let source = this[_chainSource];
          if (!dart.test(source[_isComplete])) {
            source[_addListener](listener);
            return;
          }
          this[_cloneResult](source);
        }
        dart.assert(this[_isComplete]);
        this[_zone].scheduleMicrotask(dart.fn(() => {
          async._Future._propagateToListeners(this, listener);
        }, VoidToNull()));
      }
    }
    [_prependListeners](listeners) {
      if (listeners == null) return;
      if (dart.test(this[_mayAddListener])) {
        let existingListeners = async._FutureListener._check(this[_resultOrListeners]);
        this[_resultOrListeners] = listeners;
        if (existingListeners != null) {
          let cursor = listeners;
          while (cursor[_nextListener] != null) {
            cursor = cursor[_nextListener];
          }
          cursor[_nextListener] = existingListeners;
        }
      } else {
        if (dart.test(this[_isChained])) {
          let source = this[_chainSource];
          if (!dart.test(source[_isComplete])) {
            source[_prependListeners](listeners);
            return;
          }
          this[_cloneResult](source);
        }
        dart.assert(this[_isComplete]);
        listeners = this[_reverseListeners](listeners);
        this[_zone].scheduleMicrotask(dart.fn(() => {
          async._Future._propagateToListeners(this, listeners);
        }, VoidToNull()));
      }
    }
    [_removeListeners]() {
      dart.assert(!dart.test(this[_isComplete]));
      let current = async._FutureListener._check(this[_resultOrListeners]);
      this[_resultOrListeners] = null;
      return this[_reverseListeners](current);
    }
    [_reverseListeners](listeners) {
      let prev = null;
      let current = listeners;
      while (current != null) {
        let next = current[_nextListener];
        current[_nextListener] = prev;
        prev = current;
        current = next;
      }
      return prev;
    }
    static _chainForeignFuture(source, target) {
      dart.assert(!dart.test(target[_isComplete]));
      dart.assert(!async._Future.is(source));
      target[_setPendingComplete]();
      try {
        source.then(dart.dynamic)(dart.fn(value => {
          dart.assert(target[_isPendingComplete]);
          target[_clearPendingComplete]();
          target[_complete](value);
        }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
            if (stackTrace === void 0) stackTrace = null;
            dart.assert(target[_isPendingComplete]);
            target[_completeError](error, core.StackTrace._check(stackTrace));
          }, dynamic__ToNull())});
      } catch (e) {
        let s = dart.stackTrace(e);
        async.scheduleMicrotask(dart.fn(() => {
          target[_completeError](e, s);
        }, VoidToNull()));
      }

    }
    static _chainCoreFuture(source, target) {
      dart.assert(target[_mayAddListener]);
      while (dart.test(source[_isChained])) {
        source = source[_chainSource];
      }
      if (dart.test(source[_isComplete])) {
        let listeners = target[_removeListeners]();
        target[_cloneResult](source);
        async._Future._propagateToListeners(target, listeners);
      } else {
        let listeners = async._FutureListener._check(target[_resultOrListeners]);
        target[_setChained](source);
        source[_prependListeners](listeners);
      }
    }
    [_complete](value) {
      dart.assert(!dart.test(this[_isComplete]));
      if (async.Future.is(value)) {
        if (async._Future.is(value)) {
          async._Future._chainCoreFuture(value, this);
        } else {
          async._Future._chainForeignFuture(value, this);
        }
      } else {
        let listeners = this[_removeListeners]();
        this[_setValue](T.as(value));
        async._Future._propagateToListeners(this, listeners);
      }
    }
    [_completeWithValue](value) {
      T._check(value);
      dart.assert(!dart.test(this[_isComplete]));
      dart.assert(!async.Future.is(value));
      let listeners = this[_removeListeners]();
      this[_setValue](value);
      async._Future._propagateToListeners(this, listeners);
    }
    [_completeError](error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      dart.assert(!dart.test(this[_isComplete]));
      let listeners = this[_removeListeners]();
      this[_setError](error, stackTrace);
      async._Future._propagateToListeners(this, listeners);
    }
    [_asyncComplete](value) {
      dart.assert(!dart.test(this[_isComplete]));
      if (async.Future.is(value)) {
        let typedFuture = FutureOfT().as(value);
        if (async._Future.is(typedFuture)) {
          let coreFuture = _FutureOfT()._check(typedFuture);
          if (dart.test(coreFuture[_hasError])) {
            this[_setPendingComplete]();
            this[_zone].scheduleMicrotask(dart.fn(() => {
              async._Future._chainCoreFuture(coreFuture, this);
            }, VoidToNull()));
          } else {
            async._Future._chainCoreFuture(coreFuture, this);
          }
        } else {
          async._Future._chainForeignFuture(typedFuture, this);
        }
        return;
      }
      let typedValue = T.as(value);
      this[_setPendingComplete]();
      this[_zone].scheduleMicrotask(dart.fn(() => {
        this[_completeWithValue](typedValue);
      }, VoidToNull()));
    }
    [_asyncCompleteError](error, stackTrace) {
      dart.assert(!dart.test(this[_isComplete]));
      this[_setPendingComplete]();
      this[_zone].scheduleMicrotask(dart.fn(() => {
        this[_completeError](error, stackTrace);
      }, VoidToNull()));
    }
    static _propagateToListeners(source, listeners) {
      while (true) {
        dart.assert(source[_isComplete]);
        let hasError = source[_hasError];
        if (listeners == null) {
          if (dart.test(hasError)) {
            let asyncError = source[_error];
            source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
          }
          return;
        }
        while (listeners[_nextListener] != null) {
          let listener = listeners;
          listeners = listener[_nextListener];
          listener[_nextListener] = null;
          async._Future._propagateToListeners(source, listener);
        }
        let listener = listeners;
        let sourceResult = source[_resultOrListeners];
        let listenerHasError = hasError;
        let listenerValueOrError = sourceResult;
        if (dart.test(hasError) || dart.test(listener.handlesValue) || dart.test(listener.handlesComplete)) {
          let zone = listener[_zone];
          if (dart.test(hasError) && !dart.test(source[_zone].inSameErrorZone(zone))) {
            let asyncError = source[_error];
            source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
            return;
          }
          let oldZone = null;
          if (!core.identical(async.Zone.current, zone)) {
            oldZone = async.Zone._enter(zone);
          }
          function handleWhenCompleteCallback() {
            dart.assert(!dart.test(listener.handlesValue));
            dart.assert(!dart.test(listener.handlesError));
            let completeResult = null;
            try {
              completeResult = listener.handleWhenComplete();
            } catch (e) {
              let s = dart.stackTrace(e);
              if (dart.test(hasError) && core.identical(source[_error].error, e)) {
                listenerValueOrError = source[_error];
              } else {
                listenerValueOrError = new async.AsyncError(e, s);
              }
              listenerHasError = true;
              return;
            }

            if (async.Future.is(completeResult)) {
              if (async._Future.is(completeResult) && dart.test(completeResult[_isComplete])) {
                if (dart.test(completeResult[_hasError])) {
                  listenerValueOrError = completeResult[_error];
                  listenerHasError = true;
                }
                return;
              }
              let originalSource = source;
              listenerValueOrError = completeResult.then(dart.dynamic)(dart.fn(_ => originalSource, dynamicTo_Future()));
              listenerHasError = false;
            }
          }
          dart.fn(handleWhenCompleteCallback, VoidTovoid$());
          function handleValueCallback() {
            try {
              listenerValueOrError = listener.handleValue(sourceResult);
            } catch (e) {
              let s = dart.stackTrace(e);
              listenerValueOrError = new async.AsyncError(e, s);
              listenerHasError = true;
            }

          }
          dart.fn(handleValueCallback, VoidTovoid$());
          function handleError() {
            try {
              let asyncError = source[_error];
              if (dart.test(listener.matchesErrorTest(asyncError)) && dart.test(listener.hasErrorCallback)) {
                listenerValueOrError = listener.handleError(asyncError);
                listenerHasError = false;
              }
            } catch (e) {
              let s = dart.stackTrace(e);
              if (core.identical(source[_error].error, e)) {
                listenerValueOrError = source[_error];
              } else {
                listenerValueOrError = new async.AsyncError(e, s);
              }
              listenerHasError = true;
            }

          }
          dart.fn(handleError, VoidTovoid$());
          if (dart.test(listener.handlesComplete)) {
            handleWhenCompleteCallback();
          } else if (!dart.test(hasError)) {
            if (dart.test(listener.handlesValue)) {
              handleValueCallback();
            }
          } else {
            if (dart.test(listener.handlesError)) {
              handleError();
            }
          }
          if (oldZone != null) async.Zone._leave(oldZone);
          if (async.Future.is(listenerValueOrError)) {
            let chainSource = async.Future._check(listenerValueOrError);
            let result = listener.result;
            if (async._Future.is(chainSource)) {
              if (dart.test(chainSource[_isComplete])) {
                listeners = result[_removeListeners]();
                result[_cloneResult](chainSource);
                source = chainSource;
                continue;
              } else {
                async._Future._chainCoreFuture(chainSource, result);
              }
            } else {
              async._Future._chainForeignFuture(chainSource, result);
            }
            return;
          }
        }
        let result = listener.result;
        listeners = result[_removeListeners]();
        if (!dart.test(listenerHasError)) {
          result[_setValue](listenerValueOrError);
        } else {
          let asyncError = async.AsyncError._check(listenerValueOrError);
          result[_setErrorObject](asyncError);
        }
        source = result;
      }
    }
    timeout(timeLimit, opts) {
      let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
      if (dart.test(this[_isComplete])) return new (_FutureOfT()).immediate(this);
      let result = new (_FutureOfT())();
      let timer = null;
      if (onTimeout == null) {
        timer = async.Timer.new(timeLimit, dart.fn(() => {
          result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
        }, VoidToNull()));
      } else {
        let zone = async.Zone.current;
        onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
        timer = async.Timer.new(timeLimit, dart.fn(() => {
          try {
            result[_complete](zone.run(dart.dynamic)(onTimeout));
          } catch (e) {
            let s = dart.stackTrace(e);
            result[_completeError](e, s);
          }

        }, VoidToNull()));
      }
      this.then(dart.dynamic)(dart.fn(v => {
        if (dart.test(timer.isActive)) {
          timer.cancel();
          result[_completeWithValue](v);
        }
      }, TToNull()), {onError: dart.fn((e, s) => {
          if (dart.test(timer.isActive)) {
            timer.cancel();
            result[_completeError](e, core.StackTrace._check(s));
          }
        }, dynamicAnddynamicToNull())});
      return result;
    }
  }
  dart.addTypeTests(_Future);
  dart.defineNamedConstructor(_Future, 'immediate');
  dart.defineNamedConstructor(_Future, 'immediateError');
  _Future[dart.implements] = () => [FutureOfT()];
  dart.setSignature(_Future, {
    constructors: () => ({
      new: dart.definiteFunctionType(async._Future$(T), []),
      immediate: dart.definiteFunctionType(async._Future$(T), [dart.dynamic]),
      immediateError: dart.definiteFunctionType(async._Future$(T), [dart.dynamic], [core.StackTrace])
    }),
    fields: () => ({
      [_state]: core.int,
      [_zone]: async.Zone,
      [_resultOrListeners]: dart.dynamic
    }),
    getters: () => ({
      [_mayComplete]: dart.definiteFunctionType(core.bool, []),
      [_isPendingComplete]: dart.definiteFunctionType(core.bool, []),
      [_mayAddListener]: dart.definiteFunctionType(core.bool, []),
      [_isChained]: dart.definiteFunctionType(core.bool, []),
      [_isComplete]: dart.definiteFunctionType(core.bool, []),
      [_hasError]: dart.definiteFunctionType(core.bool, []),
      [_error]: dart.definiteFunctionType(async.AsyncError, []),
      [_chainSource]: dart.definiteFunctionType(async._Future, [])
    }),
    methods: () => ({
      [_setChained]: dart.definiteFunctionType(dart.void, [async._Future]),
      then: dart.definiteFunctionType(E => [async.Future$(E), [dart.functionType(async.FutureOr$(E), [T])], {onError: core.Function}]),
      [_thenNoZoneRegistration]: dart.definiteFunctionType(E => [async.Future$(E), [TTodynamic(), core.Function]]),
      catchError: dart.definiteFunctionType(async.Future$(T), [core.Function], {test: dynamicTobool()}),
      whenComplete: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
      asStream: dart.definiteFunctionType(async.Stream$(T), []),
      [_setPendingComplete]: dart.definiteFunctionType(dart.void, []),
      [_clearPendingComplete]: dart.definiteFunctionType(dart.void, []),
      [_setValue]: dart.definiteFunctionType(dart.void, [T]),
      [_setErrorObject]: dart.definiteFunctionType(dart.void, [async.AsyncError]),
      [_setError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_cloneResult]: dart.definiteFunctionType(dart.void, [async._Future]),
      [_addListener]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
      [_prependListeners]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
      [_removeListeners]: dart.definiteFunctionType(async._FutureListener, []),
      [_reverseListeners]: dart.definiteFunctionType(async._FutureListener, [async._FutureListener]),
      [_complete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_completeWithValue]: dart.definiteFunctionType(dart.void, [T]),
      [_completeError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      [_asyncComplete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_asyncCompleteError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
      timeout: dart.definiteFunctionType(async.Future$(T), [core.Duration], {onTimeout: VoidTodynamic()})
    }),
    sfields: () => ({
      _INCOMPLETE: core.int,
      _PENDING_COMPLETE: core.int,
      _CHAINED: core.int,
      _VALUE: core.int,
      _ERROR: core.int
    }),
    statics: () => ({
      _chainForeignFuture: dart.definiteFunctionType(dart.void, [async.Future, async._Future]),
      _chainCoreFuture: dart.definiteFunctionType(dart.void, [async._Future, async._Future]),
      _propagateToListeners: dart.definiteFunctionType(dart.void, [async._Future, async._FutureListener])
    }),
    names: ['_chainForeignFuture', '_chainCoreFuture', '_propagateToListeners']
  });
  return _Future;
}));
async._Future = _Future();
async._Future._INCOMPLETE = 0;
async._Future._PENDING_COMPLETE = 1;
async._Future._CHAINED = 2;
async._Future._VALUE = 4;
async._Future._ERROR = 8;
async._AsyncCallback = dart.typedef('_AsyncCallback', () => dart.functionType(dart.void, []));
async._AsyncCallbackEntry = class _AsyncCallbackEntry extends core.Object {
  new(callback) {
    this.callback = callback;
    this.next = null;
  }
};
dart.setSignature(async._AsyncCallbackEntry, {
  constructors: () => ({new: dart.definiteFunctionType(async._AsyncCallbackEntry, [async._AsyncCallback])}),
  fields: () => ({
    callback: async._AsyncCallback,
    next: async._AsyncCallbackEntry
  })
});
async._nextCallback = null;
async._lastCallback = null;
async._lastPriorityCallback = null;
async._isInCallbackLoop = false;
async._microtaskLoop = function() {
  while (async._nextCallback != null) {
    async._lastPriorityCallback = null;
    let entry = async._nextCallback;
    async._nextCallback = entry.next;
    if (async._nextCallback == null) async._lastCallback = null;
    entry.callback();
  }
};
dart.fn(async._microtaskLoop, VoidTovoid$());
async._startMicrotaskLoop = function() {
  async._isInCallbackLoop = true;
  try {
    async._microtaskLoop();
  } finally {
    async._lastPriorityCallback = null;
    async._isInCallbackLoop = false;
    if (async._nextCallback != null) {
      async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
    }
  }
};
dart.fn(async._startMicrotaskLoop, VoidTovoid$());
async._scheduleAsyncCallback = function(callback) {
  let newEntry = new async._AsyncCallbackEntry(callback);
  if (async._nextCallback == null) {
    async._nextCallback = async._lastCallback = newEntry;
    if (!dart.test(async._isInCallbackLoop)) {
      async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
    }
  } else {
    async._lastCallback.next = newEntry;
    async._lastCallback = newEntry;
  }
};
dart.fn(async._scheduleAsyncCallback, _AsyncCallbackTovoid());
async._schedulePriorityAsyncCallback = function(callback) {
  if (async._nextCallback == null) {
    async._scheduleAsyncCallback(callback);
    async._lastPriorityCallback = async._lastCallback;
    return;
  }
  let entry = new async._AsyncCallbackEntry(callback);
  if (async._lastPriorityCallback == null) {
    entry.next = async._nextCallback;
    async._nextCallback = async._lastPriorityCallback = entry;
  } else {
    entry.next = async._lastPriorityCallback.next;
    async._lastPriorityCallback.next = entry;
    async._lastPriorityCallback = entry;
    if (entry.next == null) {
      async._lastCallback = entry;
    }
  }
};
dart.fn(async._schedulePriorityAsyncCallback, _AsyncCallbackTovoid());
const _scheduleMicrotask = Symbol('_scheduleMicrotask');
async.scheduleMicrotask = function(callback) {
  let currentZone = async._Zone._check(async.Zone.current);
  if (core.identical(async._ROOT_ZONE, currentZone)) {
    async._rootScheduleMicrotask(null, null, async._ROOT_ZONE, callback);
    return;
  }
  let implementation = currentZone[_scheduleMicrotask];
  if (core.identical(async._ROOT_ZONE, implementation.zone) && dart.test(async._ROOT_ZONE.inSameErrorZone(currentZone))) {
    async._rootScheduleMicrotask(null, null, currentZone, currentZone.registerCallback(dart.void)(callback));
    return;
  }
  async.Zone.current.scheduleMicrotask(async.Zone.current.bindCallback(dart.void)(callback, {runGuarded: true}));
};
dart.fn(async.scheduleMicrotask, _AsyncCallbackTovoid());
async._AsyncRun = class _AsyncRun extends core.Object {
  static _scheduleImmediate(callback) {
    async._AsyncRun._scheduleImmediateClosure(callback);
  }
  static _initializeScheduleImmediate() {
    if (_isolate_helper.global.scheduleImmediate != null) {
      return async._AsyncRun._scheduleImmediateJsOverride;
    }
    if (_isolate_helper.global.MutationObserver != null && _isolate_helper.global.document != null) {
      let div = _isolate_helper.global.document.createElement("div");
      let span = _isolate_helper.global.document.createElement("span");
      let storedCallback = null;
      function internalCallback(_) {
        _isolate_helper.leaveJsAsync();
        let f = storedCallback;
        storedCallback = null;
        f();
      }
      dart.fn(internalCallback, dynamicToNull$());
      ;
      let observer = new _isolate_helper.global.MutationObserver(internalCallback);
      observer.observe(div, {childList: true});
      return dart.fn(callback => {
        dart.assert(storedCallback == null);
        _isolate_helper.enterJsAsync();
        storedCallback = callback;
        div.firstChild ? div.removeChild(span) : div.appendChild(span);
      }, FnToNull());
    } else if (_isolate_helper.global.setImmediate != null) {
      return async._AsyncRun._scheduleImmediateWithSetImmediate;
    }
    return async._AsyncRun._scheduleImmediateWithTimer;
  }
  static _scheduleImmediateJsOverride(callback) {
    function internalCallback() {
      _isolate_helper.leaveJsAsync();
      callback();
    }
    dart.fn(internalCallback, VoidToNull());
    ;
    _isolate_helper.enterJsAsync();
    _isolate_helper.global.scheduleImmediate(internalCallback);
  }
  static _scheduleImmediateWithSetImmediate(callback) {
    function internalCallback() {
      _isolate_helper.leaveJsAsync();
      callback();
    }
    dart.fn(internalCallback, VoidToNull());
    ;
    _isolate_helper.enterJsAsync();
    _isolate_helper.global.setImmediate(internalCallback);
  }
  static _scheduleImmediateWithTimer(callback) {
    async.Timer._createTimer(core.Duration.ZERO, callback);
  }
};
dart.setSignature(async._AsyncRun, {
  sfields: () => ({_scheduleImmediateClosure: async._TakeCallback}),
  statics: () => ({
    _scheduleImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    _initializeScheduleImmediate: dart.definiteFunctionType(async._TakeCallback, []),
    _scheduleImmediateJsOverride: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    _scheduleImmediateWithSetImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    _scheduleImmediateWithTimer: dart.definiteFunctionType(dart.void, [VoidTovoid()])
  }),
  names: ['_scheduleImmediate', '_initializeScheduleImmediate', '_scheduleImmediateJsOverride', '_scheduleImmediateWithSetImmediate', '_scheduleImmediateWithTimer']
});
dart.defineLazy(async._AsyncRun, {
  get _scheduleImmediateClosure() {
    return async._AsyncRun._initializeScheduleImmediate();
  }
});
async._TimerCallback = dart.typedef('_TimerCallback', () => dart.functionType(dart.void, []));
async.StreamSubscription$ = dart.generic(T => {
  class StreamSubscription extends core.Object {}
  dart.addTypeTests(StreamSubscription);
  return StreamSubscription;
});
async.StreamSubscription = StreamSubscription();
async.EventSink$ = dart.generic(T => {
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  class EventSink extends core.Object {}
  dart.addTypeTests(EventSink);
  EventSink[dart.implements] = () => [SinkOfT()];
  return EventSink;
});
async.EventSink = EventSink();
const _stream = Symbol('_stream');
async.StreamView$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class StreamView extends async.Stream$(T) {
    new(stream) {
      this[_stream] = stream;
      super._internal();
    }
    get isBroadcast() {
      return this[_stream].isBroadcast;
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this[_stream].asBroadcastStream({onListen: onListen, onCancel: onCancel});
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
  }
  dart.setSignature(StreamView, {
    constructors: () => ({new: dart.definiteFunctionType(async.StreamView$(T), [StreamOfT()])}),
    fields: () => ({[_stream]: StreamOfT()}),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  return StreamView;
});
async.StreamView = StreamView();
async.StreamConsumer$ = dart.generic(S => {
  class StreamConsumer extends core.Object {}
  dart.addTypeTests(StreamConsumer);
  return StreamConsumer;
});
async.StreamConsumer = StreamConsumer();
async.StreamSink$ = dart.generic(S => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let StreamConsumerOfS = () => (StreamConsumerOfS = dart.constFn(async.StreamConsumer$(S)))();
  class StreamSink extends core.Object {}
  dart.addTypeTests(StreamSink);
  StreamSink[dart.implements] = () => [EventSinkOfS(), StreamConsumerOfS()];
  return StreamSink;
});
async.StreamSink = StreamSink();
async.StreamTransformer$ = dart.generic((S, T) => {
  let _StreamSubscriptionTransformerOfS$T = () => (_StreamSubscriptionTransformerOfS$T = dart.constFn(async._StreamSubscriptionTransformer$(S, T)))();
  let _StreamHandlerTransformerOfS$T = () => (_StreamHandlerTransformerOfS$T = dart.constFn(async._StreamHandlerTransformer$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let StreamOfSAndboolToStreamSubscriptionOfT = () => (StreamOfSAndboolToStreamSubscriptionOfT = dart.constFn(dart.functionType(StreamSubscriptionOfT(), [StreamOfS(), core.bool])))();
  let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
  let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
  class StreamTransformer extends core.Object {
    static new(transformer) {
      return new (_StreamSubscriptionTransformerOfS$T())(transformer);
    }
    static fromHandlers(opts) {
      return new (_StreamHandlerTransformerOfS$T())(opts);
    }
  }
  dart.addTypeTests(StreamTransformer);
  dart.setSignature(StreamTransformer, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.StreamTransformer$(S, T), [StreamOfSAndboolToStreamSubscriptionOfT()]),
      fromHandlers: dart.definiteFunctionType(async.StreamTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})
    })
  });
  return StreamTransformer;
});
async.StreamTransformer = StreamTransformer();
async.StreamIterator$ = dart.generic(T => {
  let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class StreamIterator extends core.Object {
    static new(stream) {
      return new (_StreamIteratorImplOfT())(stream);
    }
  }
  dart.addTypeTests(StreamIterator);
  dart.setSignature(StreamIterator, {
    constructors: () => ({new: dart.definiteFunctionType(async.StreamIterator$(T), [StreamOfT()])})
  });
  return StreamIterator;
});
async.StreamIterator = StreamIterator();
async._ControllerEventSinkWrapper$ = dart.generic(T => {
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _ControllerEventSinkWrapper extends core.Object {
    new(sink) {
      this[_sink] = sink;
    }
    add(data) {
      T._check(data);
      this[_sink].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_sink].addError(error, stackTrace);
    }
    close() {
      this[_sink].close();
    }
  }
  dart.addTypeTests(_ControllerEventSinkWrapper);
  _ControllerEventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
  dart.setSignature(_ControllerEventSinkWrapper, {
    constructors: () => ({new: dart.definiteFunctionType(async._ControllerEventSinkWrapper$(T), [async.EventSink])}),
    fields: () => ({[_sink]: async.EventSink}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [T]),
      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _ControllerEventSinkWrapper;
});
async._ControllerEventSinkWrapper = _ControllerEventSinkWrapper();
async.ControllerCallback = dart.typedef('ControllerCallback', () => dart.functionType(dart.void, []));
async.ControllerCancelCallback = dart.typedef('ControllerCancelCallback', () => dart.functionType(dart.dynamic, []));
async.StreamController$ = dart.generic(T => {
  let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
  let _AsyncStreamControllerOfT = () => (_AsyncStreamControllerOfT = dart.constFn(async._AsyncStreamController$(T)))();
  let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
  let _AsyncBroadcastStreamControllerOfT = () => (_AsyncBroadcastStreamControllerOfT = dart.constFn(async._AsyncBroadcastStreamController$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  class StreamController extends core.Object {
    static new(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onPause = opts && 'onPause' in opts ? opts.onPause : null;
      let onResume = opts && 'onResume' in opts ? opts.onResume : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      let sync = opts && 'sync' in opts ? opts.sync : false;
      return dart.test(sync) ? new (_SyncStreamControllerOfT())(onListen, onPause, onResume, onCancel) : new (_AsyncStreamControllerOfT())(onListen, onPause, onResume, onCancel);
    }
    static broadcast(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      let sync = opts && 'sync' in opts ? opts.sync : false;
      return dart.test(sync) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_AsyncBroadcastStreamControllerOfT())(onListen, onCancel);
    }
  }
  dart.addTypeTests(StreamController);
  StreamController[dart.implements] = () => [StreamSinkOfT()];
  dart.setSignature(StreamController, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onPause: VoidTovoid(), onResume: VoidTovoid(), onCancel: VoidTodynamic(), sync: core.bool}),
      broadcast: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onCancel: VoidTovoid(), sync: core.bool})
    })
  });
  return StreamController;
});
async.StreamController = StreamController();
async.SynchronousStreamController$ = dart.generic(T => {
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  class SynchronousStreamController extends core.Object {}
  dart.addTypeTests(SynchronousStreamController);
  SynchronousStreamController[dart.implements] = () => [StreamControllerOfT()];
  return SynchronousStreamController;
});
async.SynchronousStreamController = SynchronousStreamController();
async._StreamControllerLifecycle$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  class _StreamControllerLifecycle extends core.Object {
    [_recordPause](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_recordResume](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_recordCancel](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      return null;
    }
  }
  dart.addTypeTests(_StreamControllerLifecycle);
  dart.setSignature(_StreamControllerLifecycle, {
    methods: () => ({
      [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
      [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
      [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()])
    })
  });
  return _StreamControllerLifecycle;
});
async._StreamControllerLifecycle = _StreamControllerLifecycle();
const _varData = Symbol('_varData');
const _isInitialState = Symbol('_isInitialState');
const _subscription = Symbol('_subscription');
const _pendingEvents = Symbol('_pendingEvents');
const _ensurePendingEvents = Symbol('_ensurePendingEvents');
const _badEventState = Symbol('_badEventState');
let const$9;
async._StreamController$ = dart.generic(T => {
  let _ControllerStreamOfT = () => (_ControllerStreamOfT = dart.constFn(async._ControllerStream$(T)))();
  let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
  let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
  let _StreamControllerAddStreamStateOfT = () => (_StreamControllerAddStreamStateOfT = dart.constFn(async._StreamControllerAddStreamState$(T)))();
  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
  let _ControllerSubscriptionOfT = () => (_ControllerSubscriptionOfT = dart.constFn(async._ControllerSubscription$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _StreamController extends core.Object {
    new(onListen, onPause, onResume, onCancel) {
      this.onListen = onListen;
      this.onPause = onPause;
      this.onResume = onResume;
      this.onCancel = onCancel;
      this[_varData] = null;
      this[_state] = async._StreamController._STATE_INITIAL;
      this[_doneFuture] = null;
    }
    get stream() {
      return new (_ControllerStreamOfT())(this);
    }
    get sink() {
      return new (_StreamSinkWrapperOfT())(this);
    }
    get [_isCanceled]() {
      return (dart.notNull(this[_state]) & async._StreamController._STATE_CANCELED) != 0;
    }
    get hasListener() {
      return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIBED) != 0;
    }
    get [_isInitialState]() {
      return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIPTION_MASK) == async._StreamController._STATE_INITIAL;
    }
    get isClosed() {
      return (dart.notNull(this[_state]) & async._StreamController._STATE_CLOSED) != 0;
    }
    get isPaused() {
      return dart.test(this.hasListener) ? this[_subscription][_isInputPaused] : !dart.test(this[_isCanceled]);
    }
    get [_isAddingStream]() {
      return (dart.notNull(this[_state]) & async._StreamController._STATE_ADDSTREAM) != 0;
    }
    get [_mayAddEvent]() {
      return dart.notNull(this[_state]) < async._StreamController._STATE_CLOSED;
    }
    get [_pendingEvents]() {
      dart.assert(this[_isInitialState]);
      if (!dart.test(this[_isAddingStream])) {
        return _PendingEventsOfT().as(this[_varData]);
      }
      let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
      return _PendingEventsOfT().as(state.varData);
    }
    [_ensurePendingEvents]() {
      dart.assert(this[_isInitialState]);
      if (!dart.test(this[_isAddingStream])) {
        if (this[_varData] == null) this[_varData] = new (_StreamImplEventsOfT())();
        return _StreamImplEventsOfT().as(this[_varData]);
      }
      let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
      if (state.varData == null) state.varData = new (_StreamImplEventsOfT())();
      return _StreamImplEventsOfT().as(state.varData);
    }
    get [_subscription]() {
      dart.assert(this.hasListener);
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        return _ControllerSubscriptionOfT().as(addState.varData);
      }
      return _ControllerSubscriptionOfT().as(this[_varData]);
    }
    [_badEventState]() {
      if (dart.test(this.isClosed)) {
        return new core.StateError("Cannot add event after closing");
      }
      dart.assert(this[_isAddingStream]);
      return new core.StateError("Cannot add event while adding a stream");
    }
    addStream(source, opts) {
      StreamOfT()._check(source);
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      if (dart.test(this[_isCanceled])) return new async._Future.immediate(null);
      let addState = new (_StreamControllerAddStreamStateOfT())(this, this[_varData], source, cancelOnError);
      this[_varData] = addState;
      this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_ADDSTREAM) >>> 0;
      return addState.addStreamFuture;
    }
    get done() {
      return this[_ensureDoneFuture]();
    }
    [_ensureDoneFuture]() {
      if (this[_doneFuture] == null) {
        this[_doneFuture] = dart.test(this[_isCanceled]) ? async.Future._nullFuture : new async._Future();
      }
      return this[_doneFuture];
    }
    add(value) {
      T._check(value);
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      this[_add$](value);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      error = async._nonNullError(error);
      let replacement = async.Zone.current.errorCallback(error, stackTrace);
      if (replacement != null) {
        error = async._nonNullError(replacement.error);
        stackTrace = replacement.stackTrace;
      }
      this[_addError](error, stackTrace);
    }
    close() {
      if (dart.test(this.isClosed)) {
        return this[_ensureDoneFuture]();
      }
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      this[_closeUnchecked]();
      return this[_ensureDoneFuture]();
    }
    [_closeUnchecked]() {
      this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_CLOSED) >>> 0;
      if (dart.test(this.hasListener)) {
        this[_sendDone]();
      } else if (dart.test(this[_isInitialState])) {
        this[_ensurePendingEvents]().add(const$9 || (const$9 = dart.const(new async._DelayedDone())));
      }
    }
    [_add$](value) {
      T._check(value);
      if (dart.test(this.hasListener)) {
        this[_sendData](value);
      } else if (dart.test(this[_isInitialState])) {
        this[_ensurePendingEvents]().add(new (_DelayedDataOfT())(value));
      }
    }
    [_addError](error, stackTrace) {
      if (dart.test(this.hasListener)) {
        this[_sendError](error, stackTrace);
      } else if (dart.test(this[_isInitialState])) {
        this[_ensurePendingEvents]().add(new async._DelayedError(error, stackTrace));
      }
    }
    [_close$]() {
      dart.assert(this[_isAddingStream]);
      let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
      this[_varData] = addState.varData;
      this[_state] = (dart.notNull(this[_state]) & ~async._StreamController._STATE_ADDSTREAM) >>> 0;
      addState.complete();
    }
    [_subscribe](onData, onError, onDone, cancelOnError) {
      if (!dart.test(this[_isInitialState])) {
        dart.throw(new core.StateError("Stream has already been listened to."));
      }
      let subscription = new (_ControllerSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
      let pendingEvents = this[_pendingEvents];
      this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_SUBSCRIBED) >>> 0;
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        addState.varData = subscription;
        addState.resume();
      } else {
        this[_varData] = subscription;
      }
      subscription[_setPendingEvents](pendingEvents);
      subscription[_guardCallback](dart.fn(() => {
        async._runGuarded(this.onListen);
      }, VoidToNull()));
      return subscription;
    }
    [_recordCancel](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      let result = null;
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        result = addState.cancel();
      }
      this[_varData] = null;
      this[_state] = (dart.notNull(this[_state]) & ~(async._StreamController._STATE_SUBSCRIBED | async._StreamController._STATE_ADDSTREAM) | async._StreamController._STATE_CANCELED) >>> 0;
      if (this.onCancel != null) {
        if (result == null) {
          try {
            result = async.Future._check(this.onCancel());
          } catch (e) {
            let s = dart.stackTrace(e);
            result = new async._Future();
            result[_asyncCompleteError](e, s);
          }

        } else {
          result = result.whenComplete(this.onCancel);
        }
      }
      const complete = (function() {
        if (this[_doneFuture] != null && dart.test(this[_doneFuture][_mayComplete])) {
          this[_doneFuture][_asyncComplete](null);
        }
      }).bind(this);
      dart.fn(complete, VoidTovoid$());
      if (result != null) {
        result = result.whenComplete(complete);
      } else {
        complete();
      }
      return result;
    }
    [_recordPause](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        addState.pause();
      }
      async._runGuarded(this.onPause);
    }
    [_recordResume](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        addState.resume();
      }
      async._runGuarded(this.onResume);
    }
  }
  dart.addTypeTests(_StreamController);
  _StreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
  dart.setSignature(_StreamController, {
    constructors: () => ({new: dart.definiteFunctionType(async._StreamController$(T), [async.ControllerCallback, async.ControllerCallback, async.ControllerCallback, async.ControllerCancelCallback])}),
    fields: () => ({
      [_varData]: dart.dynamic,
      [_state]: core.int,
      [_doneFuture]: async._Future,
      onListen: async.ControllerCallback,
      onPause: async.ControllerCallback,
      onResume: async.ControllerCallback,
      onCancel: async.ControllerCancelCallback
    }),
    getters: () => ({
      stream: dart.definiteFunctionType(async.Stream$(T), []),
      sink: dart.definiteFunctionType(async.StreamSink$(T), []),
      [_isCanceled]: dart.definiteFunctionType(core.bool, []),
      hasListener: dart.definiteFunctionType(core.bool, []),
      [_isInitialState]: dart.definiteFunctionType(core.bool, []),
      isClosed: dart.definiteFunctionType(core.bool, []),
      isPaused: dart.definiteFunctionType(core.bool, []),
      [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
      [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
      [_pendingEvents]: dart.definiteFunctionType(async._PendingEvents$(T), []),
      [_subscription]: dart.definiteFunctionType(async._ControllerSubscription$(T), []),
      done: dart.definiteFunctionType(async.Future, [])
    }),
    methods: () => ({
      [_ensurePendingEvents]: dart.definiteFunctionType(async._StreamImplEvents$(T), []),
      [_badEventState]: dart.definiteFunctionType(core.Error, []),
      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
      [_ensureDoneFuture]: dart.definiteFunctionType(async.Future, []),
      add: dart.definiteFunctionType(dart.void, [T]),
      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      close: dart.definiteFunctionType(async.Future, []),
      [_closeUnchecked]: dart.definiteFunctionType(dart.void, []),
      [_add$]: dart.definiteFunctionType(dart.void, [T]),
      [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_close$]: dart.definiteFunctionType(dart.void, []),
      [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
      [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
      [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
      [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()])
    }),
    sfields: () => ({
      _STATE_INITIAL: core.int,
      _STATE_SUBSCRIBED: core.int,
      _STATE_CANCELED: core.int,
      _STATE_SUBSCRIPTION_MASK: core.int,
      _STATE_CLOSED: core.int,
      _STATE_ADDSTREAM: core.int
    })
  });
  return _StreamController;
});
async._StreamController = _StreamController();
async._StreamController._STATE_INITIAL = 0;
async._StreamController._STATE_SUBSCRIBED = 1;
async._StreamController._STATE_CANCELED = 2;
async._StreamController._STATE_SUBSCRIPTION_MASK = 3;
async._StreamController._STATE_CLOSED = 4;
async._StreamController._STATE_ADDSTREAM = 8;
async._SyncStreamControllerDispatch$ = dart.generic(T => {
  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
  let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
  class _SyncStreamControllerDispatch extends core.Object {
    [_sendData](data) {
      T._check(data);
      this[_subscription][_add$](data);
    }
    [_sendError](error, stackTrace) {
      this[_subscription][_addError](error, stackTrace);
    }
    [_sendDone]() {
      this[_subscription][_close$]();
    }
  }
  dart.addTypeTests(_SyncStreamControllerDispatch);
  _SyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT(), SynchronousStreamControllerOfT()];
  dart.setSignature(_SyncStreamControllerDispatch, {
    methods: () => ({
      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_sendDone]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _SyncStreamControllerDispatch;
});
async._SyncStreamControllerDispatch = _SyncStreamControllerDispatch();
let const$10;
async._AsyncStreamControllerDispatch$ = dart.generic(T => {
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
  class _AsyncStreamControllerDispatch extends core.Object {
    [_sendData](data) {
      T._check(data);
      this[_subscription][_addPending](new (_DelayedDataOfT())(data));
    }
    [_sendError](error, stackTrace) {
      this[_subscription][_addPending](new async._DelayedError(error, stackTrace));
    }
    [_sendDone]() {
      this[_subscription][_addPending](const$10 || (const$10 = dart.const(new async._DelayedDone())));
    }
  }
  dart.addTypeTests(_AsyncStreamControllerDispatch);
  _AsyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT()];
  dart.setSignature(_AsyncStreamControllerDispatch, {
    methods: () => ({
      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
      [_sendDone]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _AsyncStreamControllerDispatch;
});
async._AsyncStreamControllerDispatch = _AsyncStreamControllerDispatch();
async._AsyncStreamController$ = dart.generic(T => {
  class _AsyncStreamController extends dart.mixin(async._StreamController$(T), async._AsyncStreamControllerDispatch$(T)) {
    new(onListen, onPause, onResume, onCancel) {
      super.new(onListen, onPause, onResume, onCancel);
    }
  }
  return _AsyncStreamController;
});
async._AsyncStreamController = _AsyncStreamController();
async._SyncStreamController$ = dart.generic(T => {
  class _SyncStreamController extends dart.mixin(async._StreamController$(T), async._SyncStreamControllerDispatch$(T)) {
    new(onListen, onPause, onResume, onCancel) {
      super.new(onListen, onPause, onResume, onCancel);
    }
  }
  return _SyncStreamController;
});
async._SyncStreamController = _SyncStreamController();
async._NotificationHandler = dart.typedef('_NotificationHandler', () => dart.functionType(dart.dynamic, []));
async._runGuarded = function(notificationHandler) {
  if (notificationHandler == null) return null;
  try {
    let result = notificationHandler();
    if (async.Future.is(result)) return result;
    return null;
  } catch (e) {
    let s = dart.stackTrace(e);
    async.Zone.current.handleUncaughtError(dart.dynamic)(e, s);
  }

};
dart.fn(async._runGuarded, _NotificationHandlerToFuture());
const _target = Symbol('_target');
async._StreamSinkWrapper$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  class _StreamSinkWrapper extends core.Object {
    new(target) {
      this[_target] = target;
    }
    add(data) {
      T._check(data);
      this[_target].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_target].addError(error, stackTrace);
    }
    close() {
      return this[_target].close();
    }
    addStream(source, opts) {
      StreamOfT()._check(source);
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
      return this[_target].addStream(source, {cancelOnError: cancelOnError});
    }
    get done() {
      return this[_target].done;
    }
  }
  dart.addTypeTests(_StreamSinkWrapper);
  _StreamSinkWrapper[dart.implements] = () => [StreamSinkOfT()];
  dart.setSignature(_StreamSinkWrapper, {
    constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkWrapper$(T), [async.StreamController])}),
    fields: () => ({[_target]: async.StreamController}),
    getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [T]),
      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      close: dart.definiteFunctionType(async.Future, []),
      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool})
    })
  });
  return _StreamSinkWrapper;
});
async._StreamSinkWrapper = _StreamSinkWrapper();
async._AddStreamState$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  class _AddStreamState extends core.Object {
    new(controller, source, cancelOnError) {
      this.addStreamFuture = new async._Future();
      this.addSubscription = source.listen(dart.bind(controller, _add$), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close$), cancelOnError: cancelOnError});
    }
    static makeErrorHandler(controller) {
      return dart.fn((e, s) => {
        controller[_addError](e, s);
        controller[_close$]();
      }, dynamicAndStackTraceToNull());
    }
    pause() {
      this.addSubscription.pause();
    }
    resume() {
      this.addSubscription.resume();
    }
    cancel() {
      let cancel = this.addSubscription.cancel();
      if (cancel == null) {
        this.addStreamFuture[_asyncComplete](null);
        return null;
      }
      return cancel.whenComplete(dart.fn(() => {
        this.addStreamFuture[_asyncComplete](null);
      }, VoidToNull()));
    }
    complete() {
      this.addStreamFuture[_asyncComplete](null);
    }
  }
  dart.addTypeTests(_AddStreamState);
  dart.setSignature(_AddStreamState, {
    constructors: () => ({new: dart.definiteFunctionType(async._AddStreamState$(T), [_EventSinkOfT(), async.Stream, core.bool])}),
    fields: () => ({
      addStreamFuture: async._Future,
      addSubscription: async.StreamSubscription
    }),
    methods: () => ({
      pause: dart.definiteFunctionType(dart.void, []),
      resume: dart.definiteFunctionType(dart.void, []),
      cancel: dart.definiteFunctionType(async.Future, []),
      complete: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({makeErrorHandler: dart.definiteFunctionType(dart.dynamic, [async._EventSink])}),
    names: ['makeErrorHandler']
  });
  return _AddStreamState;
});
async._AddStreamState = _AddStreamState();
async._StreamControllerAddStreamState$ = dart.generic(T => {
  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
  class _StreamControllerAddStreamState extends async._AddStreamState$(T) {
    new(controller, varData, source, cancelOnError) {
      this.varData = varData;
      super.new(controller, source, cancelOnError);
      if (dart.test(controller.isPaused)) {
        this.addSubscription.pause();
      }
    }
  }
  dart.setSignature(_StreamControllerAddStreamState, {
    constructors: () => ({new: dart.definiteFunctionType(async._StreamControllerAddStreamState$(T), [_StreamControllerOfT(), dart.dynamic, async.Stream, core.bool])}),
    fields: () => ({varData: dart.dynamic})
  });
  return _StreamControllerAddStreamState;
});
async._StreamControllerAddStreamState = _StreamControllerAddStreamState();
async._EventSink$ = dart.generic(T => {
  class _EventSink extends core.Object {}
  dart.addTypeTests(_EventSink);
  return _EventSink;
});
async._EventSink = _EventSink();
async._EventDispatch$ = dart.generic(T => {
  class _EventDispatch extends core.Object {}
  dart.addTypeTests(_EventDispatch);
  return _EventDispatch;
});
async._EventDispatch = _EventDispatch();
async._EventGenerator$ = dart.generic(T => {
  const _EventGenerator = dart.typedef('_EventGenerator', () => dart.functionType(async._PendingEvents$(T), []));
  return _EventGenerator;
});
async._EventGenerator = _EventGenerator();
const _isUsed = Symbol('_isUsed');
async._GeneratedStreamImpl$ = dart.generic(T => {
  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let _EventGeneratorOfT = () => (_EventGeneratorOfT = dart.constFn(async._EventGenerator$(T)))();
  class _GeneratedStreamImpl extends async._StreamImpl$(T) {
    new(pending) {
      this[_pending] = pending;
      this[_isUsed] = false;
      super.new();
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      if (dart.test(this[_isUsed])) dart.throw(new core.StateError("Stream has already been listened to."));
      this[_isUsed] = true;
      let _ = new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
      _[_setPendingEvents](this[_pending]());
      return _;
    }
  }
  dart.setSignature(_GeneratedStreamImpl, {
    constructors: () => ({new: dart.definiteFunctionType(async._GeneratedStreamImpl$(T), [_EventGeneratorOfT()])}),
    fields: () => ({
      [_pending]: _EventGeneratorOfT(),
      [_isUsed]: core.bool
    })
  });
  return _GeneratedStreamImpl;
});
async._GeneratedStreamImpl = _GeneratedStreamImpl();
const _iterator$ = Symbol('_iterator');
const _eventScheduled = Symbol('_eventScheduled');
async._PendingEvents$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _PendingEvents extends core.Object {
    new() {
      this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
    }
    get isScheduled() {
      return this[_state] == async._PendingEvents._STATE_SCHEDULED;
    }
    get [_eventScheduled]() {
      return dart.notNull(this[_state]) >= async._PendingEvents._STATE_SCHEDULED;
    }
    schedule(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      if (dart.test(this.isScheduled)) return;
      dart.assert(!dart.test(this.isEmpty));
      if (dart.test(this[_eventScheduled])) {
        dart.assert(this[_state] == async._PendingEvents._STATE_CANCELED);
        this[_state] = async._PendingEvents._STATE_SCHEDULED;
        return;
      }
      async.scheduleMicrotask(dart.fn(() => {
        let oldState = this[_state];
        this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
        if (oldState == async._PendingEvents._STATE_CANCELED) return;
        this.handleNext(dispatch);
      }, VoidToNull()));
      this[_state] = async._PendingEvents._STATE_SCHEDULED;
    }
    cancelSchedule() {
      if (dart.test(this.isScheduled)) this[_state] = async._PendingEvents._STATE_CANCELED;
    }
  }
  dart.addTypeTests(_PendingEvents);
  dart.setSignature(_PendingEvents, {
    fields: () => ({[_state]: core.int}),
    getters: () => ({
      isScheduled: dart.definiteFunctionType(core.bool, []),
      [_eventScheduled]: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      schedule: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
      cancelSchedule: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      _STATE_UNSCHEDULED: core.int,
      _STATE_SCHEDULED: core.int,
      _STATE_CANCELED: core.int
    })
  });
  return _PendingEvents;
});
async._PendingEvents = _PendingEvents();
async._PendingEvents._STATE_UNSCHEDULED = 0;
async._PendingEvents._STATE_SCHEDULED = 1;
async._PendingEvents._STATE_CANCELED = 3;
async._IterablePendingEvents$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  class _IterablePendingEvents extends async._PendingEvents$(T) {
    new(data) {
      this[_iterator$] = data[dartx.iterator];
      super.new();
    }
    get isEmpty() {
      return this[_iterator$] == null;
    }
    handleNext(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      if (this[_iterator$] == null) {
        dart.throw(new core.StateError("No events pending."));
      }
      let isDone = null;
      try {
        isDone = !dart.test(this[_iterator$].moveNext());
      } catch (e) {
        let s = dart.stackTrace(e);
        this[_iterator$] = null;
        dispatch[_sendError](e, s);
        return;
      }

      if (!dart.test(isDone)) {
        dispatch[_sendData](this[_iterator$].current);
      } else {
        this[_iterator$] = null;
        dispatch[_sendDone]();
      }
    }
    clear() {
      if (dart.test(this.isScheduled)) this.cancelSchedule();
      this[_iterator$] = null;
    }
  }
  dart.setSignature(_IterablePendingEvents, {
    constructors: () => ({new: dart.definiteFunctionType(async._IterablePendingEvents$(T), [IterableOfT()])}),
    fields: () => ({[_iterator$]: IteratorOfT()}),
    getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
      clear: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _IterablePendingEvents;
});
async._IterablePendingEvents = _IterablePendingEvents();
async._DataHandler$ = dart.generic(T => {
  const _DataHandler = dart.typedef('_DataHandler', () => dart.functionType(dart.void, [T]));
  return _DataHandler;
});
async._DataHandler = _DataHandler();
async._DoneHandler = dart.typedef('_DoneHandler', () => dart.functionType(dart.void, []));
async._nullDataHandler = function(value) {
};
dart.fn(async._nullDataHandler, dynamicTovoid$());
async._nullErrorHandler = function(error, stackTrace) {
  if (stackTrace === void 0) stackTrace = null;
  async.Zone.current.handleUncaughtError(dart.dynamic)(error, stackTrace);
};
dart.lazyFn(async._nullErrorHandler, () => dynamic__Tovoid());
async._nullDoneHandler = function() {
};
dart.fn(async._nullDoneHandler, VoidTovoid$());
async._DelayedEvent$ = dart.generic(T => {
  class _DelayedEvent extends core.Object {
    new() {
      this.next = null;
    }
  }
  dart.addTypeTests(_DelayedEvent);
  dart.setSignature(_DelayedEvent, {
    fields: () => ({next: async._DelayedEvent})
  });
  return _DelayedEvent;
});
async._DelayedEvent = _DelayedEvent();
async._DelayedData$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _DelayedData extends async._DelayedEvent$(T) {
    new(value) {
      this.value = value;
      super.new();
    }
    perform(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      dispatch[_sendData](this.value);
    }
  }
  dart.setSignature(_DelayedData, {
    constructors: () => ({new: dart.definiteFunctionType(async._DelayedData$(T), [T])}),
    fields: () => ({value: T}),
    methods: () => ({perform: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()])})
  });
  return _DelayedData;
});
async._DelayedData = _DelayedData();
async._DelayedError = class _DelayedError extends async._DelayedEvent {
  new(error, stackTrace) {
    this.error = error;
    this.stackTrace = stackTrace;
    super.new();
  }
  perform(dispatch) {
    dispatch[_sendError](this.error, this.stackTrace);
  }
};
dart.addSimpleTypeTests(async._DelayedError);
dart.setSignature(async._DelayedError, {
  constructors: () => ({new: dart.definiteFunctionType(async._DelayedError, [dart.dynamic, core.StackTrace])}),
  fields: () => ({
    error: dart.dynamic,
    stackTrace: core.StackTrace
  }),
  methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
});
async._DelayedDone = class _DelayedDone extends core.Object {
  new() {
  }
  perform(dispatch) {
    dispatch[_sendDone]();
  }
  get next() {
    return null;
  }
  set next(_) {
    dart.throw(new core.StateError("No events after a done."));
  }
};
async._DelayedDone[dart.implements] = () => [async._DelayedEvent];
dart.setSignature(async._DelayedDone, {
  constructors: () => ({new: dart.definiteFunctionType(async._DelayedDone, [])}),
  getters: () => ({next: dart.definiteFunctionType(async._DelayedEvent, [])}),
  setters: () => ({next: dart.definiteFunctionType(dart.void, [async._DelayedEvent])}),
  methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
});
async._StreamImplEvents$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _StreamImplEvents extends async._PendingEvents$(T) {
    new() {
      this.firstPendingEvent = null;
      this.lastPendingEvent = null;
      super.new();
    }
    get isEmpty() {
      return this.lastPendingEvent == null;
    }
    add(event) {
      if (this.lastPendingEvent == null) {
        this.firstPendingEvent = this.lastPendingEvent = event;
      } else {
        this.lastPendingEvent = this.lastPendingEvent.next = event;
      }
    }
    handleNext(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      dart.assert(!dart.test(this.isScheduled));
      let event = this.firstPendingEvent;
      this.firstPendingEvent = event.next;
      if (this.firstPendingEvent == null) {
        this.lastPendingEvent = null;
      }
      event.perform(dispatch);
    }
    clear() {
      if (dart.test(this.isScheduled)) this.cancelSchedule();
      this.firstPendingEvent = this.lastPendingEvent = null;
    }
  }
  dart.setSignature(_StreamImplEvents, {
    fields: () => ({
      firstPendingEvent: async._DelayedEvent,
      lastPendingEvent: async._DelayedEvent
    }),
    getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
      handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
      clear: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _StreamImplEvents;
});
async._StreamImplEvents = _StreamImplEvents();
const _unlink = Symbol('_unlink');
const _insertBefore = Symbol('_insertBefore');
async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
  new() {
    this[_next$] = null;
    this[_previous$] = null;
  }
  [_unlink]() {
    this[_previous$][_next$] = this[_next$];
    this[_next$][_previous$] = this[_previous$];
    this[_next$] = this[_previous$] = this;
  }
  [_insertBefore](newNext) {
    let newPrevious = newNext[_previous$];
    newPrevious[_next$] = this;
    newNext[_previous$] = this[_previous$];
    this[_previous$][_next$] = newNext;
    this[_previous$] = newPrevious;
  }
};
dart.setSignature(async._BroadcastLinkedList, {
  fields: () => ({
    [_next$]: async._BroadcastLinkedList,
    [_previous$]: async._BroadcastLinkedList
  }),
  methods: () => ({
    [_unlink]: dart.definiteFunctionType(dart.void, []),
    [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
  })
});
async._BroadcastCallback$ = dart.generic(T => {
  const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
  return _BroadcastCallback;
});
async._BroadcastCallback = _BroadcastCallback();
const _schedule = Symbol('_schedule');
const _isSent = Symbol('_isSent');
const _isScheduled = Symbol('_isScheduled');
async._DoneStreamSubscription$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _DoneStreamSubscription extends core.Object {
    new(onDone) {
      this[_onDone] = onDone;
      this[_zone] = async.Zone.current;
      this[_state] = 0;
      this[_schedule]();
    }
    get [_isSent]() {
      return (dart.notNull(this[_state]) & async._DoneStreamSubscription._DONE_SENT) != 0;
    }
    get [_isScheduled]() {
      return (dart.notNull(this[_state]) & async._DoneStreamSubscription._SCHEDULED) != 0;
    }
    get isPaused() {
      return dart.notNull(this[_state]) >= async._DoneStreamSubscription._PAUSED;
    }
    [_schedule]() {
      if (dart.test(this[_isScheduled])) return;
      this[_zone].scheduleMicrotask(dart.bind(this, _sendDone));
      this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._SCHEDULED) >>> 0;
    }
    onData(handleData) {}
    onError(handleError) {}
    onDone(handleDone) {
      this[_onDone] = handleDone;
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      this[_state] = dart.notNull(this[_state]) + async._DoneStreamSubscription._PAUSED;
      if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
    }
    resume() {
      if (dart.test(this.isPaused)) {
        this[_state] = dart.notNull(this[_state]) - async._DoneStreamSubscription._PAUSED;
        if (!dart.test(this.isPaused) && !dart.test(this[_isSent])) {
          this[_schedule]();
        }
      }
    }
    cancel() {
      return null;
    }
    asFuture(E) {
      return futureValue => {
        if (futureValue === void 0) futureValue = null;
        let result = new (async._Future$(E))();
        this[_onDone] = dart.fn(() => {
          result[_completeWithValue](null);
        }, VoidToNull());
        return result;
      };
    }
    [_sendDone]() {
      this[_state] = (dart.notNull(this[_state]) & ~async._DoneStreamSubscription._SCHEDULED) >>> 0;
      if (dart.test(this.isPaused)) return;
      this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._DONE_SENT) >>> 0;
      if (this[_onDone] != null) this[_zone].runGuarded(dart.void)(this[_onDone]);
    }
  }
  dart.addTypeTests(_DoneStreamSubscription);
  _DoneStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
  dart.setSignature(_DoneStreamSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(async._DoneStreamSubscription$(T), [async._DoneHandler])}),
    fields: () => ({
      [_zone]: async.Zone,
      [_state]: core.int,
      [_onDone]: async._DoneHandler
    }),
    getters: () => ({
      [_isSent]: dart.definiteFunctionType(core.bool, []),
      [_isScheduled]: dart.definiteFunctionType(core.bool, []),
      isPaused: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      [_schedule]: dart.definiteFunctionType(dart.void, []),
      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
      onError: dart.definiteFunctionType(dart.void, [core.Function]),
      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
      resume: dart.definiteFunctionType(dart.void, []),
      cancel: dart.definiteFunctionType(async.Future, []),
      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
      [_sendDone]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      _DONE_SENT: core.int,
      _SCHEDULED: core.int,
      _PAUSED: core.int
    })
  });
  return _DoneStreamSubscription;
});
async._DoneStreamSubscription = _DoneStreamSubscription();
async._DoneStreamSubscription._DONE_SENT = 1;
async._DoneStreamSubscription._SCHEDULED = 2;
async._DoneStreamSubscription._PAUSED = 4;
const _source$ = Symbol('_source');
const _onListenHandler = Symbol('_onListenHandler');
const _onCancelHandler = Symbol('_onCancelHandler');
const _cancelSubscription = Symbol('_cancelSubscription');
const _pauseSubscription = Symbol('_pauseSubscription');
const _resumeSubscription = Symbol('_resumeSubscription');
const _isSubscriptionPaused = Symbol('_isSubscriptionPaused');
async._AsBroadcastStream$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let _AsBroadcastStreamControllerOfT = () => (_AsBroadcastStreamControllerOfT = dart.constFn(async._AsBroadcastStreamController$(T)))();
  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
  let _BroadcastSubscriptionWrapperOfT = () => (_BroadcastSubscriptionWrapperOfT = dart.constFn(async._BroadcastSubscriptionWrapper$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _BroadcastCallbackOfT = () => (_BroadcastCallbackOfT = dart.constFn(async._BroadcastCallback$(T)))();
  class _AsBroadcastStream extends async.Stream$(T) {
    new(source, onListenHandler, onCancelHandler) {
      this[_source$] = source;
      this[_onListenHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onListenHandler);
      this[_onCancelHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onCancelHandler);
      this[_zone] = async.Zone.current;
      this[_controller$] = null;
      this[_subscription] = null;
      super.new();
      this[_controller$] = new (_AsBroadcastStreamControllerOfT())(dart.bind(this, _onListen), dart.bind(this, _onCancel));
    }
    get isBroadcast() {
      return true;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      if (this[_controller$] == null || dart.test(this[_controller$].isClosed)) {
        return new (_DoneStreamSubscriptionOfT())(onDone);
      }
      if (this[_subscription] == null) {
        this[_subscription] = this[_source$].listen(dart.bind(this[_controller$], 'add'), {onError: dart.bind(this[_controller$], 'addError'), onDone: dart.bind(this[_controller$], 'close')});
      }
      cancelOnError = core.identical(true, cancelOnError);
      return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
    }
    [_onCancel]() {
      let shutdown = this[_controller$] == null || dart.test(this[_controller$].isClosed);
      if (this[_onCancelHandler] != null) {
        this[_zone].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT())(this[_onCancelHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
      }
      if (shutdown) {
        if (this[_subscription] != null) {
          this[_subscription].cancel();
          this[_subscription] = null;
        }
      }
    }
    [_onListen]() {
      if (this[_onListenHandler] != null) {
        this[_zone].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT())(this[_onListenHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
      }
    }
    [_cancelSubscription]() {
      if (this[_subscription] == null) return;
      let subscription = this[_subscription];
      this[_subscription] = null;
      this[_controller$] = null;
      subscription.cancel();
    }
    [_pauseSubscription](resumeSignal) {
      if (this[_subscription] == null) return;
      this[_subscription].pause(resumeSignal);
    }
    [_resumeSubscription]() {
      if (this[_subscription] == null) return;
      this[_subscription].resume();
    }
    get [_isSubscriptionPaused]() {
      if (this[_subscription] == null) return false;
      return this[_subscription].isPaused;
    }
  }
  dart.setSignature(_AsBroadcastStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStream$(T), [StreamOfT(), _BroadcastCallbackOfT(), _BroadcastCallbackOfT()])}),
    fields: () => ({
      [_source$]: StreamOfT(),
      [_onListenHandler]: _BroadcastCallbackOfT(),
      [_onCancelHandler]: _BroadcastCallbackOfT(),
      [_zone]: async.Zone,
      [_controller$]: _AsBroadcastStreamControllerOfT(),
      [_subscription]: StreamSubscriptionOfT()
    }),
    getters: () => ({[_isSubscriptionPaused]: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      [_onCancel]: dart.definiteFunctionType(dart.void, []),
      [_onListen]: dart.definiteFunctionType(dart.void, []),
      [_cancelSubscription]: dart.definiteFunctionType(dart.void, []),
      [_pauseSubscription]: dart.definiteFunctionType(dart.void, [async.Future]),
      [_resumeSubscription]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _AsBroadcastStream;
});
async._AsBroadcastStream = _AsBroadcastStream();
async._BroadcastSubscriptionWrapper$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _BroadcastSubscriptionWrapper extends core.Object {
    new(stream) {
      this[_stream] = stream;
    }
    onData(handleData) {
      dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
    }
    onError(handleError) {
      dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
    }
    onDone(handleDone) {
      dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      this[_stream][_pauseSubscription](resumeSignal);
    }
    resume() {
      this[_stream][_resumeSubscription]();
    }
    cancel() {
      this[_stream][_cancelSubscription]();
      return null;
    }
    get isPaused() {
      return this[_stream][_isSubscriptionPaused];
    }
    asFuture(E) {
      return futureValue => {
        if (futureValue === void 0) futureValue = null;
        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
      };
    }
  }
  dart.addTypeTests(_BroadcastSubscriptionWrapper);
  _BroadcastSubscriptionWrapper[dart.implements] = () => [StreamSubscriptionOfT()];
  dart.setSignature(_BroadcastSubscriptionWrapper, {
    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscriptionWrapper$(T), [async._AsBroadcastStream])}),
    fields: () => ({[_stream]: async._AsBroadcastStream}),
    getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
      onError: dart.definiteFunctionType(dart.void, [core.Function]),
      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
      resume: dart.definiteFunctionType(dart.void, []),
      cancel: dart.definiteFunctionType(async.Future, []),
      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
    })
  });
  return _BroadcastSubscriptionWrapper;
});
async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
const _current$1 = Symbol('_current');
const _futureOrPrefetch = Symbol('_futureOrPrefetch');
const _clear = Symbol('_clear');
async._StreamIteratorImpl$ = dart.generic(T => {
  let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _StreamIteratorImpl extends core.Object {
    new(stream) {
      this[_subscription] = null;
      this[_current$1] = null;
      this[_futureOrPrefetch] = null;
      this[_state] = async._StreamIteratorImpl._STATE_FOUND;
      this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
    }
    get current() {
      return this[_current$1];
    }
    moveNext() {
      if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
        return new (_FutureOfbool()).immediate(false);
      }
      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
        dart.throw(new core.StateError("Already waiting for next."));
      }
      if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
        this[_state] = async._StreamIteratorImpl._STATE_MOVING;
        this[_current$1] = null;
        let result = new (_FutureOfbool())();
        this[_futureOrPrefetch] = result;
        return result;
      } else {
        dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
        switch (this[_state]) {
          case async._StreamIteratorImpl._STATE_EXTRA_DATA:
          {
            this[_state] = async._StreamIteratorImpl._STATE_FOUND;
            this[_current$1] = T.as(this[_futureOrPrefetch]);
            this[_futureOrPrefetch] = null;
            this[_subscription].resume();
            return new (_FutureOfbool()).immediate(true);
          }
          case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
          {
            let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
            this[_clear]();
            return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
          }
          case async._StreamIteratorImpl._STATE_EXTRA_DONE:
          {
            this[_clear]();
            return new (_FutureOfbool()).immediate(false);
          }
        }
      }
    }
    [_clear]() {
      this[_subscription] = null;
      this[_futureOrPrefetch] = null;
      this[_current$1] = null;
      this[_state] = async._StreamIteratorImpl._STATE_DONE;
    }
    cancel() {
      let subscription = this[_subscription];
      if (subscription == null) return null;
      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
        this[_clear]();
        hasNext[_complete](false);
      } else {
        this[_clear]();
      }
      return subscription.cancel();
    }
    [_onData](data) {
      T._check(data);
      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
        this[_current$1] = data;
        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
        this[_futureOrPrefetch] = null;
        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
        hasNext[_complete](true);
        return;
      }
      this[_subscription].pause();
      dart.assert(this[_futureOrPrefetch] == null);
      this[_futureOrPrefetch] = data;
      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
    }
    [_onError](error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
        this[_clear]();
        hasNext[_completeError](error, stackTrace);
        return;
      }
      this[_subscription].pause();
      dart.assert(this[_futureOrPrefetch] == null);
      this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
    }
    [_onDone]() {
      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
        this[_clear]();
        hasNext[_complete](false);
        return;
      }
      this[_subscription].pause();
      this[_futureOrPrefetch] = null;
      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
    }
  }
  dart.addTypeTests(_StreamIteratorImpl);
  _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
  dart.setSignature(_StreamIteratorImpl, {
    constructors: () => ({new: dart.definiteFunctionType(async._StreamIteratorImpl$(T), [StreamOfT()])}),
    fields: () => ({
      [_subscription]: async.StreamSubscription,
      [_current$1]: T,
      [_futureOrPrefetch]: dart.dynamic,
      [_state]: core.int
    }),
    getters: () => ({current: dart.definiteFunctionType(T, [])}),
    methods: () => ({
      moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
      [_clear]: dart.definiteFunctionType(dart.void, []),
      cancel: dart.definiteFunctionType(async.Future, []),
      [_onData]: dart.definiteFunctionType(dart.void, [T]),
      [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      [_onDone]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      _STATE_FOUND: core.int,
      _STATE_DONE: core.int,
      _STATE_MOVING: core.int,
      _STATE_EXTRA_DATA: core.int,
      _STATE_EXTRA_ERROR: core.int,
      _STATE_EXTRA_DONE: core.int
    })
  });
  return _StreamIteratorImpl;
});
async._StreamIteratorImpl = _StreamIteratorImpl();
async._StreamIteratorImpl._STATE_FOUND = 0;
async._StreamIteratorImpl._STATE_DONE = 1;
async._StreamIteratorImpl._STATE_MOVING = 2;
async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
async._EmptyStream$ = dart.generic(T => {
  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _EmptyStream extends async.Stream$(T) {
    new() {
      super._internal();
    }
    get isBroadcast() {
      return true;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return new (_DoneStreamSubscriptionOfT())(onDone);
    }
  }
  dart.setSignature(_EmptyStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._EmptyStream$(T), [])}),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  return _EmptyStream;
});
async._EmptyStream = _EmptyStream();
async._runUserCode = function(userCode, onSuccess, onError) {
  try {
    dart.dcall(onSuccess, userCode());
  } catch (e) {
    let s = dart.stackTrace(e);
    let replacement = async.Zone.current.errorCallback(e, s);
    if (replacement == null) {
      dart.dcall(onError, e, s);
    } else {
      let error = async._nonNullError(replacement.error);
      let stackTrace = replacement.stackTrace;
      dart.dcall(onError, error, stackTrace);
    }
  }

};
dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
async._cancelAndError = function(subscription, future, error, stackTrace) {
  let cancelFuture = subscription.cancel();
  if (async.Future.is(cancelFuture)) {
    cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
  } else {
    future[_completeError](error, stackTrace);
  }
};
dart.lazyFn(async._cancelAndError, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
async._cancelAndErrorWithReplacement = function(subscription, future, error, stackTrace) {
  let replacement = async.Zone.current.errorCallback(error, stackTrace);
  if (replacement != null) {
    error = async._nonNullError(replacement.error);
    stackTrace = replacement.stackTrace;
  }
  async._cancelAndError(subscription, future, error, stackTrace);
};
dart.lazyFn(async._cancelAndErrorWithReplacement, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
async._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [dart.dynamic, core.StackTrace]));
async._cancelAndErrorClosure = function(subscription, future) {
  return dart.fn((error, stackTrace) => {
    async._cancelAndError(subscription, future, error, stackTrace);
  }, dynamicAndStackTraceToNull());
};
dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
async._cancelAndValue = function(subscription, future, value) {
  let cancelFuture = subscription.cancel();
  if (async.Future.is(cancelFuture)) {
    cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
  } else {
    future[_complete](value);
  }
};
dart.fn(async._cancelAndValue, StreamSubscriptionAnd_FutureAnddynamicTovoid());
const _handleData = Symbol('_handleData');
const _handleError = Symbol('_handleError');
const _handleDone = Symbol('_handleDone');
async._ForwardingStream$ = dart.generic((S, T) => {
  let _ForwardingStreamSubscriptionOfS$T = () => (_ForwardingStreamSubscriptionOfS$T = dart.constFn(async._ForwardingStreamSubscription$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _ForwardingStream extends async.Stream$(T) {
    new(source) {
      this[_source$] = source;
      super.new();
    }
    get isBroadcast() {
      return this[_source$].isBroadcast;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = core.identical(true, cancelOnError);
      return this[_createSubscription](onData, onError, onDone, cancelOnError);
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_ForwardingStreamSubscriptionOfS$T())(this, onData, onError, onDone, cancelOnError);
    }
    [_handleData](data, sink) {
      S._check(data);
      _EventSinkOfT()._check(sink);
      sink[_add$](T.as(data));
    }
    [_handleError](error, stackTrace, sink) {
      _EventSinkOfT()._check(sink);
      sink[_addError](error, stackTrace);
    }
    [_handleDone](sink) {
      _EventSinkOfT()._check(sink);
      sink[_close$]();
    }
  }
  dart.setSignature(_ForwardingStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStream$(S, T), [StreamOfS()])}),
    fields: () => ({[_source$]: StreamOfS()}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
      [_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()]),
      [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, _EventSinkOfT()]),
      [_handleDone]: dart.definiteFunctionType(dart.void, [_EventSinkOfT()])
    })
  });
  return _ForwardingStream;
});
async._ForwardingStream = _ForwardingStream();
async._ForwardingStreamSubscription$ = dart.generic((S, T) => {
  let _ForwardingStreamOfS$T = () => (_ForwardingStreamOfS$T = dart.constFn(async._ForwardingStream$(S, T)))();
  let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _ForwardingStreamSubscription extends async._BufferingStreamSubscription$(T) {
    new(stream, onData, onError, onDone, cancelOnError) {
      this[_stream] = stream;
      this[_subscription] = null;
      super.new(onData, onError, onDone, cancelOnError);
      this[_subscription] = this[_stream][_source$].listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
    }
    [_add$](data) {
      T._check(data);
      if (dart.test(this[_isClosed$])) return;
      super[_add$](data);
    }
    [_addError](error, stackTrace) {
      if (dart.test(this[_isClosed$])) return;
      super[_addError](error, stackTrace);
    }
    [_onPause]() {
      if (this[_subscription] == null) return;
      this[_subscription].pause();
    }
    [_onResume]() {
      if (this[_subscription] == null) return;
      this[_subscription].resume();
    }
    [_onCancel]() {
      if (this[_subscription] != null) {
        let subscription = this[_subscription];
        this[_subscription] = null;
        return subscription.cancel();
      }
      return null;
    }
    [_handleData](data) {
      S._check(data);
      this[_stream][_handleData](data, this);
    }
    [_handleError](error, stackTrace) {
      this[_stream][_handleError](error, stackTrace, this);
    }
    [_handleDone]() {
      this[_stream][_handleDone](this);
    }
  }
  dart.setSignature(_ForwardingStreamSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStreamSubscription$(S, T), [_ForwardingStreamOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
    fields: () => ({
      [_stream]: _ForwardingStreamOfS$T(),
      [_subscription]: StreamSubscriptionOfS()
    }),
    methods: () => ({
      [_handleData]: dart.definiteFunctionType(dart.void, [S]),
      [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
      [_handleDone]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _ForwardingStreamSubscription;
});
async._ForwardingStreamSubscription = _ForwardingStreamSubscription();
async._Predicate$ = dart.generic(T => {
  const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
  return _Predicate;
});
async._Predicate = _Predicate();
async._addErrorWithReplacement = function(sink, error, stackTrace) {
  let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
  if (replacement != null) {
    error = async._nonNullError(replacement.error);
    stackTrace = replacement.stackTrace;
  }
  sink[_addError](error, core.StackTrace._check(stackTrace));
};
dart.fn(async._addErrorWithReplacement, _EventSinkAnddynamicAnddynamicTovoid());
const _test = Symbol('_test');
async._WhereStream$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _WhereStream extends async._ForwardingStream$(T, T) {
    new(source, test) {
      this[_test] = test;
      super.new(source);
    }
    [_handleData](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let satisfies = null;
      try {
        satisfies = this[_test](inputEvent);
      } catch (e) {
        let s = dart.stackTrace(e);
        async._addErrorWithReplacement(sink, e, s);
        return;
      }

      if (dart.test(satisfies)) {
        sink[_add$](inputEvent);
      }
    }
  }
  dart.setSignature(_WhereStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._WhereStream$(T), [StreamOfT(), _PredicateOfT()])}),
    fields: () => ({[_test]: _PredicateOfT()})
  });
  return _WhereStream;
});
async._WhereStream = _WhereStream();
async._Transformation$ = dart.generic((S, T) => {
  const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
  return _Transformation;
});
async._Transformation = _Transformation$();
const _transform = Symbol('_transform');
async._MapStream$ = dart.generic((S, T) => {
  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(async._Transformation$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  class _MapStream extends async._ForwardingStream$(S, T) {
    new(source, transform) {
      this[_transform] = transform;
      super.new(source);
    }
    [_handleData](inputEvent, sink) {
      S._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let outputEvent = null;
      try {
        outputEvent = this[_transform](inputEvent);
      } catch (e) {
        let s = dart.stackTrace(e);
        async._addErrorWithReplacement(sink, e, s);
        return;
      }

      sink[_add$](outputEvent);
    }
  }
  dart.setSignature(_MapStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._MapStream$(S, T), [StreamOfS(), _TransformationOfS$T()])}),
    fields: () => ({[_transform]: _TransformationOfS$T()})
  });
  return _MapStream;
});
async._MapStream = _MapStream();
const _expand = Symbol('_expand');
async._ExpandStream$ = dart.generic((S, T) => {
  let _TransformationOfS$IterableOfT = () => (_TransformationOfS$IterableOfT = dart.constFn(async._Transformation$(S, IterableOfT())))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  class _ExpandStream extends async._ForwardingStream$(S, T) {
    new(source, expand) {
      this[_expand] = expand;
      super.new(source);
    }
    [_handleData](inputEvent, sink) {
      S._check(inputEvent);
      _EventSinkOfT()._check(sink);
      try {
        for (let value of this[_expand](inputEvent)) {
          sink[_add$](value);
        }
      } catch (e) {
        let s = dart.stackTrace(e);
        async._addErrorWithReplacement(sink, e, s);
      }

    }
  }
  dart.setSignature(_ExpandStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._ExpandStream$(S, T), [StreamOfS(), _TransformationOfS$IterableOfT()])}),
    fields: () => ({[_expand]: _TransformationOfS$IterableOfT()})
  });
  return _ExpandStream;
});
async._ExpandStream = _ExpandStream();
async._ErrorTest = dart.typedef('_ErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
async._HandleErrorStream$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _HandleErrorStream extends async._ForwardingStream$(T, T) {
    new(source, onError, test) {
      this[_transform] = onError;
      this[_test] = test;
      super.new(source);
    }
    [_handleError](error, stackTrace, sink) {
      _EventSinkOfT()._check(sink);
      let matches = true;
      if (this[_test] != null) {
        try {
          matches = dart.dcall(this[_test], error);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          return;
        }

      }
      if (dart.test(matches)) {
        try {
          async._invokeErrorHandler(this[_transform], error, stackTrace);
        } catch (e) {
          let s = dart.stackTrace(e);
          if (core.identical(e, error)) {
            sink[_addError](error, stackTrace);
          } else {
            async._addErrorWithReplacement(sink, e, s);
          }
          return;
        }

      } else {
        sink[_addError](error, stackTrace);
      }
    }
  }
  dart.setSignature(_HandleErrorStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._HandleErrorStream$(T), [StreamOfT(), core.Function, dynamicTobool()])}),
    fields: () => ({
      [_transform]: core.Function,
      [_test]: async._ErrorTest
    }),
    methods: () => ({[_handleError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace, _EventSinkOfT()])})
  });
  return _HandleErrorStream;
});
async._HandleErrorStream = _HandleErrorStream();
const _count = Symbol('_count');
async._TakeStream$ = dart.generic(T => {
  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _TakeStream extends async._ForwardingStream$(T, T) {
    new(source, count) {
      this[_count] = count;
      super.new(source);
      if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
    }
    [_handleData](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let subscription = _StateStreamSubscriptionOfT()._check(sink);
      let count = subscription[_count];
      if (dart.notNull(count) > 0) {
        sink[_add$](inputEvent);
        count = dart.notNull(count) - 1;
        subscription[_count] = count;
        if (count == 0) {
          sink[_close$]();
        }
      }
    }
  }
  dart.setSignature(_TakeStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._TakeStream$(T), [StreamOfT(), core.int])}),
    fields: () => ({[_count]: core.int})
  });
  return _TakeStream;
});
async._TakeStream = _TakeStream();
const _sharedState = Symbol('_sharedState');
const _flag = Symbol('_flag');
async._StateStreamSubscription$ = dart.generic(T => {
  let _ForwardingStreamOfT$T = () => (_ForwardingStreamOfT$T = dart.constFn(async._ForwardingStream$(T, T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _StateStreamSubscription extends async._ForwardingStreamSubscription$(T, T) {
    new(stream, onData, onError, onDone, cancelOnError, sharedState) {
      this[_sharedState] = sharedState;
      super.new(stream, onData, onError, onDone, cancelOnError);
    }
    get [_flag]() {
      return core.bool._check(this[_sharedState]);
    }
    set [_flag](flag) {
      this[_sharedState] = flag;
    }
    get [_count]() {
      return core.int._check(this[_sharedState]);
    }
    set [_count](count) {
      this[_sharedState] = count;
    }
  }
  dart.setSignature(_StateStreamSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(async._StateStreamSubscription$(T), [_ForwardingStreamOfT$T(), TTovoid(), core.Function, VoidTovoid(), core.bool, dart.dynamic])}),
    fields: () => ({[_sharedState]: dart.dynamic}),
    getters: () => ({
      [_flag]: dart.definiteFunctionType(core.bool, []),
      [_count]: dart.definiteFunctionType(core.int, [])
    }),
    setters: () => ({
      [_flag]: dart.definiteFunctionType(dart.void, [core.bool]),
      [_count]: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  return _StateStreamSubscription;
});
async._StateStreamSubscription = _StateStreamSubscription();
async._TakeWhileStream$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _TakeWhileStream extends async._ForwardingStream$(T, T) {
    new(source, test) {
      this[_test] = test;
      super.new(source);
    }
    [_handleData](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let satisfies = null;
      try {
        satisfies = this[_test](inputEvent);
      } catch (e) {
        let s = dart.stackTrace(e);
        async._addErrorWithReplacement(sink, e, s);
        sink[_close$]();
        return;
      }

      if (dart.test(satisfies)) {
        sink[_add$](inputEvent);
      } else {
        sink[_close$]();
      }
    }
  }
  dart.setSignature(_TakeWhileStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._TakeWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
    fields: () => ({[_test]: _PredicateOfT()})
  });
  return _TakeWhileStream;
});
async._TakeWhileStream = _TakeWhileStream();
async._SkipStream$ = dart.generic(T => {
  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _SkipStream extends async._ForwardingStream$(T, T) {
    new(source, count) {
      this[_count] = count;
      super.new(source);
      if (!(typeof count == 'number') || dart.notNull(count) < 0) dart.throw(new core.ArgumentError(count));
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
    }
    [_handleData](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let subscription = _StateStreamSubscriptionOfT()._check(sink);
      let count = subscription[_count];
      if (dart.notNull(count) > 0) {
        subscription[_count] = dart.notNull(count) - 1;
        return;
      }
      sink[_add$](inputEvent);
    }
  }
  dart.setSignature(_SkipStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._SkipStream$(T), [StreamOfT(), core.int])}),
    fields: () => ({[_count]: core.int})
  });
  return _SkipStream;
});
async._SkipStream = _SkipStream();
async._SkipWhileStream$ = dart.generic(T => {
  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _SkipWhileStream extends async._ForwardingStream$(T, T) {
    new(source, test) {
      this[_test] = test;
      super.new(source);
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, false);
    }
    [_handleData](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let subscription = _StateStreamSubscriptionOfT()._check(sink);
      let hasFailed = subscription[_flag];
      if (dart.test(hasFailed)) {
        sink[_add$](inputEvent);
        return;
      }
      let satisfies = null;
      try {
        satisfies = this[_test](inputEvent);
      } catch (e) {
        let s = dart.stackTrace(e);
        async._addErrorWithReplacement(sink, e, s);
        subscription[_flag] = true;
        return;
      }

      if (!dart.test(satisfies)) {
        subscription[_flag] = true;
        sink[_add$](inputEvent);
      }
    }
  }
  dart.setSignature(_SkipWhileStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._SkipWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
    fields: () => ({[_test]: _PredicateOfT()})
  });
  return _SkipWhileStream;
});
async._SkipWhileStream = _SkipWhileStream();
async._Equality$ = dart.generic(T => {
  const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [T, T]));
  return _Equality;
});
async._Equality = _Equality();
const _equals = Symbol('_equals');
async._DistinctStream$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _EqualityOfT = () => (_EqualityOfT = dart.constFn(async._Equality$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _DistinctStream extends async._ForwardingStream$(T, T) {
    new(source, equals) {
      this[_previous$] = async._DistinctStream._SENTINEL;
      this[_equals] = equals;
      super.new(source);
    }
    [_handleData](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      if (core.identical(this[_previous$], async._DistinctStream._SENTINEL)) {
        this[_previous$] = inputEvent;
        return sink[_add$](inputEvent);
      } else {
        let isEqual = null;
        try {
          if (this[_equals] == null) {
            isEqual = dart.equals(this[_previous$], inputEvent);
          } else {
            isEqual = this[_equals](T.as(this[_previous$]), inputEvent);
          }
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          return null;
        }

        if (!dart.test(isEqual)) {
          sink[_add$](inputEvent);
          this[_previous$] = inputEvent;
        }
      }
    }
  }
  dart.setSignature(_DistinctStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._DistinctStream$(T), [StreamOfT(), _EqualityOfT()])}),
    fields: () => ({
      [_equals]: _EqualityOfT(),
      [_previous$]: core.Object
    }),
    sfields: () => ({_SENTINEL: core.Object})
  });
  return _DistinctStream;
});
async._DistinctStream = _DistinctStream();
dart.defineLazy(async._DistinctStream, {
  get _SENTINEL() {
    return new core.Object();
  },
  set _SENTINEL(_) {}
});
async._EventSinkWrapper$ = dart.generic(T => {
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _EventSinkWrapper extends core.Object {
    new(sink) {
      this[_sink] = sink;
    }
    add(data) {
      T._check(data);
      this[_sink][_add$](data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_sink][_addError](error, stackTrace);
    }
    close() {
      this[_sink][_close$]();
    }
  }
  dart.addTypeTests(_EventSinkWrapper);
  _EventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
  dart.setSignature(_EventSinkWrapper, {
    constructors: () => ({new: dart.definiteFunctionType(async._EventSinkWrapper$(T), [async._EventSink])}),
    fields: () => ({[_sink]: async._EventSink}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [T]),
      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _EventSinkWrapper;
});
async._EventSinkWrapper = _EventSinkWrapper();
const _transformerSink = Symbol('_transformerSink');
const _isSubscribed = Symbol('_isSubscribed');
async._SinkTransformerStreamSubscription$ = dart.generic((S, T) => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
  let _EventSinkWrapperOfT = () => (_EventSinkWrapperOfT = dart.constFn(async._EventSinkWrapper$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _SinkTransformerStreamSubscription extends async._BufferingStreamSubscription$(T) {
    new(source, mapper, onData, onError, onDone, cancelOnError) {
      this[_transformerSink] = null;
      this[_subscription] = null;
      super.new(onData, onError, onDone, cancelOnError);
      let eventSink = new (_EventSinkWrapperOfT())(this);
      this[_transformerSink] = mapper(eventSink);
      this[_subscription] = source.listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
    }
    get [_isSubscribed]() {
      return this[_subscription] != null;
    }
    [_add$](data) {
      T._check(data);
      if (dart.test(this[_isClosed$])) {
        dart.throw(new core.StateError("Stream is already closed"));
      }
      super[_add$](data);
    }
    [_addError](error, stackTrace) {
      if (dart.test(this[_isClosed$])) {
        dart.throw(new core.StateError("Stream is already closed"));
      }
      super[_addError](error, stackTrace);
    }
    [_close$]() {
      if (dart.test(this[_isClosed$])) {
        dart.throw(new core.StateError("Stream is already closed"));
      }
      super[_close$]();
    }
    [_onPause]() {
      if (dart.test(this[_isSubscribed])) this[_subscription].pause();
    }
    [_onResume]() {
      if (dart.test(this[_isSubscribed])) this[_subscription].resume();
    }
    [_onCancel]() {
      if (dart.test(this[_isSubscribed])) {
        let subscription = this[_subscription];
        this[_subscription] = null;
        subscription.cancel();
      }
      return null;
    }
    [_handleData](data) {
      S._check(data);
      try {
        this[_transformerSink].add(data);
      } catch (e) {
        let s = dart.stackTrace(e);
        this[_addError](e, s);
      }

    }
    [_handleError](error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      try {
        this[_transformerSink].addError(error, core.StackTrace._check(stackTrace));
      } catch (e) {
        let s = dart.stackTrace(e);
        if (core.identical(e, error)) {
          this[_addError](error, core.StackTrace._check(stackTrace));
        } else {
          this[_addError](e, s);
        }
      }

    }
    [_handleDone]() {
      try {
        this[_subscription] = null;
        this[_transformerSink].close();
      } catch (e) {
        let s = dart.stackTrace(e);
        this[_addError](e, s);
      }

    }
  }
  dart.setSignature(_SinkTransformerStreamSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(async._SinkTransformerStreamSubscription$(S, T), [StreamOfS(), _SinkMapperOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
    fields: () => ({
      [_transformerSink]: EventSinkOfS(),
      [_subscription]: StreamSubscriptionOfS()
    }),
    getters: () => ({[_isSubscribed]: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      [_handleData]: dart.definiteFunctionType(dart.void, [S]),
      [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic]),
      [_handleDone]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _SinkTransformerStreamSubscription;
});
async._SinkTransformerStreamSubscription = _SinkTransformerStreamSubscription();
async._SinkMapper$ = dart.generic((S, T) => {
  const _SinkMapper = dart.typedef('_SinkMapper', () => dart.functionType(async.EventSink$(S), [async.EventSink$(T)]));
  return _SinkMapper;
});
async._SinkMapper = _SinkMapper();
const _sinkMapper = Symbol('_sinkMapper');
async._StreamSinkTransformer$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _BoundSinkStreamOfS$T = () => (_BoundSinkStreamOfS$T = dart.constFn(async._BoundSinkStream$(S, T)))();
  let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
  let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
  class _StreamSinkTransformer extends core.Object {
    new(sinkMapper) {
      this[_sinkMapper] = sinkMapper;
    }
    bind(stream) {
      StreamOfS()._check(stream);
      return new (_BoundSinkStreamOfS$T())(stream, this[_sinkMapper]);
    }
  }
  dart.addTypeTests(_StreamSinkTransformer);
  _StreamSinkTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
  dart.setSignature(_StreamSinkTransformer, {
    constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkTransformer$(S, T), [_SinkMapperOfS$T()])}),
    fields: () => ({[_sinkMapper]: _SinkMapperOfS$T()}),
    methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
  });
  return _StreamSinkTransformer;
});
async._StreamSinkTransformer = _StreamSinkTransformer();
async._BoundSinkStream$ = dart.generic((S, T) => {
  let _SinkTransformerStreamSubscriptionOfS$T = () => (_SinkTransformerStreamSubscriptionOfS$T = dart.constFn(async._SinkTransformerStreamSubscription$(S, T)))();
  let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _BoundSinkStream extends async.Stream$(T) {
    get isBroadcast() {
      return this[_stream].isBroadcast;
    }
    new(stream, sinkMapper) {
      this[_stream] = stream;
      this[_sinkMapper] = sinkMapper;
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = core.identical(true, cancelOnError);
      let subscription = new (_SinkTransformerStreamSubscriptionOfS$T())(this[_stream], this[_sinkMapper], onData, onError, onDone, cancelOnError);
      return subscription;
    }
  }
  dart.setSignature(_BoundSinkStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._BoundSinkStream$(S, T), [StreamOfS(), _SinkMapperOfS$T()])}),
    fields: () => ({
      [_sinkMapper]: _SinkMapperOfS$T(),
      [_stream]: StreamOfS()
    }),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  return _BoundSinkStream;
});
async._BoundSinkStream = _BoundSinkStream();
async._TransformDataHandler$ = dart.generic((S, T) => {
  const _TransformDataHandler = dart.typedef('_TransformDataHandler', () => dart.functionType(dart.void, [S, async.EventSink$(T)]));
  return _TransformDataHandler;
});
async._TransformDataHandler = _TransformDataHandler();
async._TransformErrorHandler$ = dart.generic(T => {
  const _TransformErrorHandler = dart.typedef('_TransformErrorHandler', () => dart.functionType(dart.void, [core.Object, core.StackTrace, async.EventSink$(T)]));
  return _TransformErrorHandler;
});
async._TransformErrorHandler = _TransformErrorHandler();
async._TransformDoneHandler$ = dart.generic(T => {
  const _TransformDoneHandler = dart.typedef('_TransformDoneHandler', () => dart.functionType(dart.void, [async.EventSink$(T)]));
  return _TransformDoneHandler;
});
async._TransformDoneHandler = _TransformDoneHandler();
async._HandlerEventSink$ = dart.generic((S, T) => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let _TransformDataHandlerOfS$T = () => (_TransformDataHandlerOfS$T = dart.constFn(async._TransformDataHandler$(S, T)))();
  let _TransformErrorHandlerOfT = () => (_TransformErrorHandlerOfT = dart.constFn(async._TransformErrorHandler$(T)))();
  let _TransformDoneHandlerOfT = () => (_TransformDoneHandlerOfT = dart.constFn(async._TransformDoneHandler$(T)))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _HandlerEventSink extends core.Object {
    new(handleData, handleError, handleDone, sink) {
      this[_handleData] = handleData;
      this[_handleError] = handleError;
      this[_handleDone] = handleDone;
      this[_sink] = sink;
    }
    add(data) {
      S._check(data);
      this[_handleData](data, this[_sink]);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_handleError](error, stackTrace, this[_sink]);
    }
    close() {
      this[_handleDone](this[_sink]);
    }
  }
  dart.addTypeTests(_HandlerEventSink);
  _HandlerEventSink[dart.implements] = () => [EventSinkOfS()];
  dart.setSignature(_HandlerEventSink, {
    constructors: () => ({new: dart.definiteFunctionType(async._HandlerEventSink$(S, T), [_TransformDataHandlerOfS$T(), _TransformErrorHandlerOfT(), _TransformDoneHandlerOfT(), EventSinkOfT()])}),
    fields: () => ({
      [_handleData]: _TransformDataHandlerOfS$T(),
      [_handleError]: _TransformErrorHandlerOfT(),
      [_handleDone]: _TransformDoneHandlerOfT(),
      [_sink]: EventSinkOfT()
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [S]),
      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _HandlerEventSink;
});
async._HandlerEventSink = _HandlerEventSink();
async._StreamHandlerTransformer$ = dart.generic((S, T) => {
  let _HandlerEventSinkOfS$T = () => (_HandlerEventSinkOfS$T = dart.constFn(async._HandlerEventSink$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
  let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
  let EventSinkOfTTo_HandlerEventSinkOfS$T = () => (EventSinkOfTTo_HandlerEventSinkOfS$T = dart.constFn(dart.definiteFunctionType(_HandlerEventSinkOfS$T(), [EventSinkOfT()])))();
  class _StreamHandlerTransformer extends async._StreamSinkTransformer$(S, T) {
    new(opts) {
      let handleData = opts && 'handleData' in opts ? opts.handleData : null;
      let handleError = opts && 'handleError' in opts ? opts.handleError : null;
      let handleDone = opts && 'handleDone' in opts ? opts.handleDone : null;
      super.new(dart.fn(outputSink => {
        if (handleData == null) handleData = async._StreamHandlerTransformer._defaultHandleData;
        if (handleError == null) handleError = async._StreamHandlerTransformer._defaultHandleError;
        if (handleDone == null) handleDone = async._StreamHandlerTransformer._defaultHandleDone;
        return new (_HandlerEventSinkOfS$T())(handleData, handleError, handleDone, outputSink);
      }, EventSinkOfTTo_HandlerEventSinkOfS$T()));
    }
    bind(stream) {
      StreamOfS()._check(stream);
      return super.bind(stream);
    }
    static _defaultHandleData(data, sink) {
      sink.add(data);
    }
    static _defaultHandleError(error, stackTrace, sink) {
      sink.addError(error, stackTrace);
    }
    static _defaultHandleDone(sink) {
      sink.close();
    }
  }
  dart.setSignature(_StreamHandlerTransformer, {
    constructors: () => ({new: dart.definiteFunctionType(async._StreamHandlerTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})}),
    statics: () => ({
      _defaultHandleData: dart.definiteFunctionType(dart.void, [dart.dynamic, async.EventSink]),
      _defaultHandleError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, async.EventSink]),
      _defaultHandleDone: dart.definiteFunctionType(dart.void, [async.EventSink])
    }),
    names: ['_defaultHandleData', '_defaultHandleError', '_defaultHandleDone']
  });
  return _StreamHandlerTransformer;
});
async._StreamHandlerTransformer = _StreamHandlerTransformer();
async._SubscriptionTransformer$ = dart.generic((S, T) => {
  const _SubscriptionTransformer = dart.typedef('_SubscriptionTransformer', () => dart.functionType(async.StreamSubscription$(T), [async.Stream$(S), core.bool]));
  return _SubscriptionTransformer;
});
async._SubscriptionTransformer = _SubscriptionTransformer();
const _transformer = Symbol('_transformer');
async._StreamSubscriptionTransformer$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _BoundSubscriptionStreamOfS$T = () => (_BoundSubscriptionStreamOfS$T = dart.constFn(async._BoundSubscriptionStream$(S, T)))();
  let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
  let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
  class _StreamSubscriptionTransformer extends core.Object {
    new(transformer) {
      this[_transformer] = transformer;
    }
    bind(stream) {
      StreamOfS()._check(stream);
      return new (_BoundSubscriptionStreamOfS$T())(stream, this[_transformer]);
    }
  }
  dart.addTypeTests(_StreamSubscriptionTransformer);
  _StreamSubscriptionTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
  dart.setSignature(_StreamSubscriptionTransformer, {
    constructors: () => ({new: dart.definiteFunctionType(async._StreamSubscriptionTransformer$(S, T), [_SubscriptionTransformerOfS$T()])}),
    fields: () => ({[_transformer]: _SubscriptionTransformerOfS$T()}),
    methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
  });
  return _StreamSubscriptionTransformer;
});
async._StreamSubscriptionTransformer = _StreamSubscriptionTransformer();
async._BoundSubscriptionStream$ = dart.generic((S, T) => {
  let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _BoundSubscriptionStream extends async.Stream$(T) {
    new(stream, transformer) {
      this[_stream] = stream;
      this[_transformer] = transformer;
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = core.identical(true, cancelOnError);
      let result = this[_transformer](this[_stream], cancelOnError);
      result.onData(onData);
      result.onError(onError);
      result.onDone(onDone);
      return result;
    }
  }
  dart.setSignature(_BoundSubscriptionStream, {
    constructors: () => ({new: dart.definiteFunctionType(async._BoundSubscriptionStream$(S, T), [StreamOfS(), _SubscriptionTransformerOfS$T()])}),
    fields: () => ({
      [_transformer]: _SubscriptionTransformerOfS$T(),
      [_stream]: StreamOfS()
    }),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  return _BoundSubscriptionStream;
});
async._BoundSubscriptionStream = _BoundSubscriptionStream();
async.Timer = class Timer extends core.Object {
  static new(duration, callback) {
    if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
      return async.Zone.current.createTimer(duration, callback);
    }
    return async.Zone.current.createTimer(duration, async.Zone.current.bindCallback(dart.void)(callback, {runGuarded: true}));
  }
  static periodic(duration, callback) {
    if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
      return async.Zone.current.createPeriodicTimer(duration, callback);
    }
    let boundCallback = async.Zone.current.bindUnaryCallback(dart.dynamic, async.Timer)(callback, {runGuarded: true});
    return async.Zone.current.createPeriodicTimer(duration, boundCallback);
  }
  static run(callback) {
    async.Timer.new(core.Duration.ZERO, callback);
  }
  static _createTimer(duration, callback) {
    let milliseconds = duration.inMilliseconds;
    if (dart.notNull(milliseconds) < 0) milliseconds = 0;
    return new _isolate_helper.TimerImpl(milliseconds, callback);
  }
  static _createPeriodicTimer(duration, callback) {
    let milliseconds = duration.inMilliseconds;
    if (dart.notNull(milliseconds) < 0) milliseconds = 0;
    return new _isolate_helper.TimerImpl.periodic(milliseconds, callback);
  }
};
dart.setSignature(async.Timer, {
  constructors: () => ({
    new: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
    periodic: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
  }),
  statics: () => ({
    run: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    _createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
    _createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
  }),
  names: ['run', '_createTimer', '_createPeriodicTimer']
});
async.ZoneCallback$ = dart.generic(R => {
  const ZoneCallback = dart.typedef('ZoneCallback', () => dart.functionType(R, []));
  return ZoneCallback;
});
async.ZoneCallback = ZoneCallback();
async.ZoneUnaryCallback$ = dart.generic((R, T) => {
  const ZoneUnaryCallback = dart.typedef('ZoneUnaryCallback', () => dart.functionType(R, [T]));
  return ZoneUnaryCallback;
});
async.ZoneUnaryCallback = ZoneUnaryCallback();
async.ZoneBinaryCallback$ = dart.generic((R, T1, T2) => {
  const ZoneBinaryCallback = dart.typedef('ZoneBinaryCallback', () => dart.functionType(R, [T1, T2]));
  return ZoneBinaryCallback;
});
async.ZoneBinaryCallback = ZoneBinaryCallback();
async.HandleUncaughtErrorHandler$ = dart.generic(R => {
  const HandleUncaughtErrorHandler = dart.typedef('HandleUncaughtErrorHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]));
  return HandleUncaughtErrorHandler;
});
async.HandleUncaughtErrorHandler = HandleUncaughtErrorHandler();
async.RunHandler$ = dart.generic(R => {
  const RunHandler = dart.typedef('RunHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
  return RunHandler;
});
async.RunHandler = RunHandler();
async.RunUnaryHandler$ = dart.generic((R, T) => {
  const RunUnaryHandler = dart.typedef('RunUnaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]));
  return RunUnaryHandler;
});
async.RunUnaryHandler = RunUnaryHandler();
async.RunBinaryHandler$ = dart.generic((R, T1, T2) => {
  const RunBinaryHandler = dart.typedef('RunBinaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]));
  return RunBinaryHandler;
});
async.RunBinaryHandler = RunBinaryHandler();
async.RegisterCallbackHandler$ = dart.generic(R => {
  const RegisterCallbackHandler = dart.typedef('RegisterCallbackHandler', () => dart.functionType(async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
  return RegisterCallbackHandler;
});
async.RegisterCallbackHandler = RegisterCallbackHandler();
async.RegisterUnaryCallbackHandler$ = dart.generic((R, T) => {
  const RegisterUnaryCallbackHandler = dart.typedef('RegisterUnaryCallbackHandler', () => dart.functionType(async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]));
  return RegisterUnaryCallbackHandler;
});
async.RegisterUnaryCallbackHandler = RegisterUnaryCallbackHandler();
async.RegisterBinaryCallbackHandler$ = dart.generic((R, T1, T2) => {
  const RegisterBinaryCallbackHandler = dart.typedef('RegisterBinaryCallbackHandler', () => dart.functionType(async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]));
  return RegisterBinaryCallbackHandler;
});
async.RegisterBinaryCallbackHandler = RegisterBinaryCallbackHandler();
async.ErrorCallbackHandler = dart.typedef('ErrorCallbackHandler', () => dart.functionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace]));
async.ScheduleMicrotaskHandler = dart.typedef('ScheduleMicrotaskHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTovoid()]));
async.CreateTimerHandler = dart.typedef('CreateTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()]));
async.CreatePeriodicTimerHandler = dart.typedef('CreatePeriodicTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()]));
async.PrintHandler = dart.typedef('PrintHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String]));
async.ForkHandler = dart.typedef('ForkHandler', () => dart.functionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map]));
async._ZoneFunction$ = dart.generic(T => {
  class _ZoneFunction extends core.Object {
    new(zone, func) {
      this.zone = zone;
      this.function = func;
    }
  }
  dart.addTypeTests(_ZoneFunction);
  dart.setSignature(_ZoneFunction, {
    constructors: () => ({new: dart.definiteFunctionType(async._ZoneFunction$(T), [async._Zone, T])}),
    fields: () => ({
      zone: async._Zone,
      function: T
    })
  });
  return _ZoneFunction;
});
async._ZoneFunction = _ZoneFunction();
async.ZoneSpecification = class ZoneSpecification extends core.Object {
  static new(opts) {
    return new async._ZoneSpecification(opts);
  }
  static from(other, opts) {
    let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
    let run = opts && 'run' in opts ? opts.run : null;
    let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
    let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
    let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
    let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
    let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
    let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
    let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
    let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
    let print = opts && 'print' in opts ? opts.print : null;
    let fork = opts && 'fork' in opts ? opts.fork : null;
    return async.ZoneSpecification.new({handleUncaughtError: (handleUncaughtError != null ? handleUncaughtError : other.handleUncaughtError), run: (run != null ? run : other.run), runUnary: (runUnary != null ? runUnary : other.runUnary), runBinary: (runBinary != null ? runBinary : other.runBinary), registerCallback: (registerCallback != null ? registerCallback : other.registerCallback), registerUnaryCallback: (registerUnaryCallback != null ? registerUnaryCallback : other.registerUnaryCallback), registerBinaryCallback: (registerBinaryCallback != null ? registerBinaryCallback : other.registerBinaryCallback), errorCallback: (errorCallback != null ? errorCallback : other.errorCallback), scheduleMicrotask: (scheduleMicrotask != null ? scheduleMicrotask : other.scheduleMicrotask), createTimer: (createTimer != null ? createTimer : other.createTimer), createPeriodicTimer: (createPeriodicTimer != null ? createPeriodicTimer : other.createPeriodicTimer), print: (print != null ? print : other.print), fork: (fork != null ? fork : other.fork)});
  }
};
dart.setSignature(async.ZoneSpecification, {
  constructors: () => ({
    new: dart.definiteFunctionType(async.ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler}),
    from: dart.definiteFunctionType(async.ZoneSpecification, [async.ZoneSpecification], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})
  })
});
async._ZoneSpecification = class _ZoneSpecification extends core.Object {
  new(opts) {
    let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
    let run = opts && 'run' in opts ? opts.run : null;
    let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
    let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
    let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
    let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
    let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
    let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
    let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
    let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
    let print = opts && 'print' in opts ? opts.print : null;
    let fork = opts && 'fork' in opts ? opts.fork : null;
    this.handleUncaughtError = handleUncaughtError;
    this.run = run;
    this.runUnary = runUnary;
    this.runBinary = runBinary;
    this.registerCallback = registerCallback;
    this.registerUnaryCallback = registerUnaryCallback;
    this.registerBinaryCallback = registerBinaryCallback;
    this.errorCallback = errorCallback;
    this.scheduleMicrotask = scheduleMicrotask;
    this.createTimer = createTimer;
    this.createPeriodicTimer = createPeriodicTimer;
    this.print = print;
    this.fork = fork;
  }
};
async._ZoneSpecification[dart.implements] = () => [async.ZoneSpecification];
dart.setSignature(async._ZoneSpecification, {
  constructors: () => ({new: dart.definiteFunctionType(async._ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})}),
  fields: () => ({
    handleUncaughtError: async.HandleUncaughtErrorHandler,
    run: async.RunHandler,
    runUnary: async.RunUnaryHandler,
    runBinary: async.RunBinaryHandler,
    registerCallback: async.RegisterCallbackHandler,
    registerUnaryCallback: async.RegisterUnaryCallbackHandler,
    registerBinaryCallback: async.RegisterBinaryCallbackHandler,
    errorCallback: async.ErrorCallbackHandler,
    scheduleMicrotask: async.ScheduleMicrotaskHandler,
    createTimer: async.CreateTimerHandler,
    createPeriodicTimer: async.CreatePeriodicTimerHandler,
    print: async.PrintHandler,
    fork: async.ForkHandler
  })
});
async.ZoneDelegate = class ZoneDelegate extends core.Object {};
async.Zone = class Zone extends core.Object {
  _() {
  }
  static get current() {
    return async.Zone._current;
  }
  static _enter(zone) {
    dart.assert(zone != null);
    dart.assert(!core.identical(zone, async.Zone._current));
    let previous = async.Zone._current;
    async.Zone._current = zone;
    return previous;
  }
  static _leave(previous) {
    dart.assert(previous != null);
    async.Zone._current = previous;
  }
};
dart.defineNamedConstructor(async.Zone, '_');
dart.setSignature(async.Zone, {
  constructors: () => ({_: dart.definiteFunctionType(async.Zone, [])}),
  sfields: () => ({
    ROOT: async.Zone,
    _current: async.Zone
  }),
  sgetters: () => ({current: dart.definiteFunctionType(async.Zone, [])}),
  statics: () => ({
    _enter: dart.definiteFunctionType(async.Zone, [async.Zone]),
    _leave: dart.definiteFunctionType(dart.void, [async.Zone])
  }),
  names: ['_enter', '_leave']
});
dart.defineLazy(async.Zone, {
  get ROOT() {
    return async._ROOT_ZONE;
  },
  get _current() {
    return async._ROOT_ZONE;
  },
  set _current(_) {}
});
const _delegate = Symbol('_delegate');
async._parentDelegate = function(zone) {
  if (zone.parent == null) return null;
  return zone.parent[_delegate];
};
dart.lazyFn(async._parentDelegate, () => _ZoneToZoneDelegate());
const _delegationTarget = Symbol('_delegationTarget');
const _handleUncaughtError = Symbol('_handleUncaughtError');
const _run = Symbol('_run');
const _runUnary = Symbol('_runUnary');
const _runBinary = Symbol('_runBinary');
const _registerCallback = Symbol('_registerCallback');
const _registerUnaryCallback = Symbol('_registerUnaryCallback');
const _registerBinaryCallback = Symbol('_registerBinaryCallback');
const _errorCallback = Symbol('_errorCallback');
const _createTimer = Symbol('_createTimer');
const _createPeriodicTimer = Symbol('_createPeriodicTimer');
const _print = Symbol('_print');
const _fork = Symbol('_fork');
async._ZoneDelegate = class _ZoneDelegate extends core.Object {
  new(delegationTarget) {
    this[_delegationTarget] = delegationTarget;
  }
  handleUncaughtError(R) {
    return (zone, error, stackTrace) => {
      let implementation = this[_delegationTarget][_handleUncaughtError];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, error, stackTrace));
    };
  }
  run(R) {
    return (zone, f) => {
      let implementation = this[_delegationTarget][_run];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return R.as(handler(implZone, async._parentDelegate(implZone), zone, f));
    };
  }
  runUnary(R, T) {
    return (zone, f, arg) => {
      let implementation = this[_delegationTarget][_runUnary];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg));
    };
  }
  runBinary(R, T1, T2) {
    return (zone, f, arg1, arg2) => {
      let implementation = this[_delegationTarget][_runBinary];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg1, arg2));
    };
  }
  registerCallback(R) {
    return (zone, f) => {
      let implementation = this[_delegationTarget][_registerCallback];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return async.ZoneCallback$(R).as(handler(implZone, async._parentDelegate(implZone), zone, f));
    };
  }
  registerUnaryCallback(R, T) {
    return (zone, f) => {
      let implementation = this[_delegationTarget][_registerUnaryCallback];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return async.ZoneUnaryCallback$(R, T).as(handler(implZone, async._parentDelegate(implZone), zone, f));
    };
  }
  registerBinaryCallback(R, T1, T2) {
    return (zone, f) => {
      let implementation = this[_delegationTarget][_registerBinaryCallback];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implZone, async._parentDelegate(implZone), zone, f));
    };
  }
  errorCallback(zone, error, stackTrace) {
    let implementation = this[_delegationTarget][_errorCallback];
    let implZone = implementation.zone;
    if (core.identical(implZone, async._ROOT_ZONE)) return null;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, error, stackTrace);
  }
  scheduleMicrotask(zone, f) {
    let implementation = this[_delegationTarget][_scheduleMicrotask];
    let implZone = implementation.zone;
    let handler = implementation.function;
    handler(implZone, async._parentDelegate(implZone), zone, f);
  }
  createTimer(zone, duration, f) {
    let implementation = this[_delegationTarget][_createTimer];
    let implZone = implementation.zone;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, duration, f);
  }
  createPeriodicTimer(zone, period, f) {
    let implementation = this[_delegationTarget][_createPeriodicTimer];
    let implZone = implementation.zone;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, period, f);
  }
  print(zone, line) {
    let implementation = this[_delegationTarget][_print];
    let implZone = implementation.zone;
    let handler = implementation.function;
    handler(implZone, async._parentDelegate(implZone), zone, line);
  }
  fork(zone, specification, zoneValues) {
    let implementation = this[_delegationTarget][_fork];
    let implZone = implementation.zone;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, specification, zoneValues);
  }
};
async._ZoneDelegate[dart.implements] = () => [async.ZoneDelegate];
dart.setSignature(async._ZoneDelegate, {
  constructors: () => ({new: dart.definiteFunctionType(async._ZoneDelegate, [async._Zone])}),
  fields: () => ({[_delegationTarget]: async._Zone}),
  methods: () => ({
    handleUncaughtError: dart.definiteFunctionType(R => [R, [async.Zone, dart.dynamic, core.StackTrace]]),
    run: dart.definiteFunctionType(R => [R, [async.Zone, dart.functionType(R, [])]]),
    runUnary: dart.definiteFunctionType((R, T) => [R, [async.Zone, dart.functionType(R, [T]), T]]),
    runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, dart.functionType(R, [T1, T2]), T1, T2]]),
    registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, dart.functionType(R, [])]]),
    registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, dart.functionType(R, [T])]]),
    registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, dart.functionType(R, [T1, T2])]]),
    errorCallback: dart.definiteFunctionType(async.AsyncError, [async.Zone, core.Object, core.StackTrace]),
    scheduleMicrotask: dart.definiteFunctionType(dart.void, [async.Zone, VoidTodynamic()]),
    createTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, VoidTovoid()]),
    createPeriodicTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, TimerTovoid()]),
    print: dart.definiteFunctionType(dart.void, [async.Zone, core.String]),
    fork: dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneSpecification, core.Map])
  })
});
const _map$ = Symbol('_map');
async._Zone = class _Zone extends core.Object {
  new() {
  }
  inSameErrorZone(otherZone) {
    return core.identical(this, otherZone) || core.identical(this.errorZone, otherZone.errorZone);
  }
};
async._Zone[dart.implements] = () => [async.Zone];
dart.setSignature(async._Zone, {
  constructors: () => ({new: dart.definiteFunctionType(async._Zone, [])}),
  methods: () => ({inSameErrorZone: dart.definiteFunctionType(core.bool, [async.Zone])})
});
const _delegateCache = Symbol('_delegateCache');
async._CustomZone = class _CustomZone extends async._Zone {
  get [_delegate]() {
    if (this[_delegateCache] != null) return this[_delegateCache];
    this[_delegateCache] = new async._ZoneDelegate(this);
    return this[_delegateCache];
  }
  new(parent, specification, map) {
    this.parent = parent;
    this[_map$] = map;
    this[_run] = null;
    this[_runUnary] = null;
    this[_runBinary] = null;
    this[_registerCallback] = null;
    this[_registerUnaryCallback] = null;
    this[_registerBinaryCallback] = null;
    this[_errorCallback] = null;
    this[_scheduleMicrotask] = null;
    this[_createTimer] = null;
    this[_createPeriodicTimer] = null;
    this[_print] = null;
    this[_fork] = null;
    this[_handleUncaughtError] = null;
    this[_delegateCache] = null;
    super.new();
    this[_run] = specification.run != null ? new (_ZoneFunctionOfRunHandler())(this, specification.run) : this.parent[_run];
    this[_runUnary] = specification.runUnary != null ? new (_ZoneFunctionOfRunUnaryHandler())(this, specification.runUnary) : this.parent[_runUnary];
    this[_runBinary] = specification.runBinary != null ? new (_ZoneFunctionOfRunBinaryHandler())(this, specification.runBinary) : this.parent[_runBinary];
    this[_registerCallback] = specification.registerCallback != null ? new (_ZoneFunctionOfRegisterCallbackHandler())(this, specification.registerCallback) : this.parent[_registerCallback];
    this[_registerUnaryCallback] = specification.registerUnaryCallback != null ? new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(this, specification.registerUnaryCallback) : this.parent[_registerUnaryCallback];
    this[_registerBinaryCallback] = specification.registerBinaryCallback != null ? new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(this, specification.registerBinaryCallback) : this.parent[_registerBinaryCallback];
    this[_errorCallback] = specification.errorCallback != null ? new (_ZoneFunctionOfErrorCallbackHandler())(this, specification.errorCallback) : this.parent[_errorCallback];
    this[_scheduleMicrotask] = specification.scheduleMicrotask != null ? new (_ZoneFunctionOfScheduleMicrotaskHandler())(this, specification.scheduleMicrotask) : this.parent[_scheduleMicrotask];
    this[_createTimer] = specification.createTimer != null ? new (_ZoneFunctionOfCreateTimerHandler())(this, specification.createTimer) : this.parent[_createTimer];
    this[_createPeriodicTimer] = specification.createPeriodicTimer != null ? new (_ZoneFunctionOfCreatePeriodicTimerHandler())(this, specification.createPeriodicTimer) : this.parent[_createPeriodicTimer];
    this[_print] = specification.print != null ? new (_ZoneFunctionOfPrintHandler())(this, specification.print) : this.parent[_print];
    this[_fork] = specification.fork != null ? new (_ZoneFunctionOfForkHandler())(this, specification.fork) : this.parent[_fork];
    this[_handleUncaughtError] = specification.handleUncaughtError != null ? new (_ZoneFunctionOfHandleUncaughtErrorHandler())(this, specification.handleUncaughtError) : this.parent[_handleUncaughtError];
  }
  get errorZone() {
    return this[_handleUncaughtError].zone;
  }
  runGuarded(R) {
    return f => {
      try {
        return this.run(R)(f);
      } catch (e) {
        let s = dart.stackTrace(e);
        return this.handleUncaughtError(R)(e, s);
      }

    };
  }
  runUnaryGuarded(R, T) {
    return (f, arg) => {
      try {
        return this.runUnary(R, T)(f, arg);
      } catch (e) {
        let s = dart.stackTrace(e);
        return this.handleUncaughtError(R)(e, s);
      }

    };
  }
  runBinaryGuarded(R, T1, T2) {
    return (f, arg1, arg2) => {
      try {
        return this.runBinary(R, T1, T2)(f, arg1, arg2);
      } catch (e) {
        let s = dart.stackTrace(e);
        return this.handleUncaughtError(R)(e, s);
      }

    };
  }
  bindCallback(R) {
    return (f, opts) => {
      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
      let registered = this.registerCallback(R)(f);
      if (dart.test(runGuarded)) {
        return dart.fn(() => this.runGuarded(R)(registered), dart.definiteFunctionType(R, []));
      } else {
        return dart.fn(() => this.run(R)(registered), dart.definiteFunctionType(R, []));
      }
    };
  }
  bindUnaryCallback(R, T) {
    return (f, opts) => {
      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
      let registered = this.registerUnaryCallback(R, T)(f);
      if (dart.test(runGuarded)) {
        return dart.fn(arg => this.runUnaryGuarded(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
      } else {
        return dart.fn(arg => this.runUnary(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
      }
    };
  }
  bindBinaryCallback(R, T1, T2) {
    return (f, opts) => {
      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
      let registered = this.registerBinaryCallback(R, T1, T2)(f);
      if (dart.test(runGuarded)) {
        return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
      } else {
        return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
      }
    };
  }
  _get(key) {
    let result = this[_map$][dartx._get](key);
    if (result != null || dart.test(this[_map$][dartx.containsKey](key))) return result;
    if (this.parent != null) {
      let value = this.parent._get(key);
      if (value != null) {
        this[_map$][dartx._set](key, value);
      }
      return value;
    }
    dart.assert(dart.equals(this, async._ROOT_ZONE));
    return null;
  }
  handleUncaughtError(R) {
    return (error, stackTrace) => {
      let implementation = this[_handleUncaughtError];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, error, stackTrace));
    };
  }
  fork(opts) {
    let specification = opts && 'specification' in opts ? opts.specification : null;
    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
    let implementation = this[_fork];
    dart.assert(implementation != null);
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, specification, zoneValues);
  }
  run(R) {
    return f => {
      let implementation = this[_run];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return R.as(handler(implementation.zone, parentDelegate, this, f));
    };
  }
  runUnary(R, T) {
    return (f, arg) => {
      let implementation = this[_runUnary];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg));
    };
  }
  runBinary(R, T1, T2) {
    return (f, arg1, arg2) => {
      let implementation = this[_runBinary];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg1, arg2));
    };
  }
  registerCallback(R) {
    return callback => {
      let implementation = this[_registerCallback];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return async.ZoneCallback$(R).as(handler(implementation.zone, parentDelegate, this, callback));
    };
  }
  registerUnaryCallback(R, T) {
    return callback => {
      let implementation = this[_registerUnaryCallback];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return async.ZoneUnaryCallback$(R, T).as(handler(implementation.zone, parentDelegate, this, callback));
    };
  }
  registerBinaryCallback(R, T1, T2) {
    return callback => {
      let implementation = this[_registerBinaryCallback];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implementation.zone, parentDelegate, this, callback));
    };
  }
  errorCallback(error, stackTrace) {
    let implementation = this[_errorCallback];
    dart.assert(implementation != null);
    let implementationZone = implementation.zone;
    if (core.identical(implementationZone, async._ROOT_ZONE)) return null;
    let parentDelegate = async._parentDelegate(async._Zone._check(implementationZone));
    let handler = implementation.function;
    return handler(implementationZone, parentDelegate, this, error, stackTrace);
  }
  scheduleMicrotask(f) {
    let implementation = this[_scheduleMicrotask];
    dart.assert(implementation != null);
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, f);
  }
  createTimer(duration, f) {
    let implementation = this[_createTimer];
    dart.assert(implementation != null);
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, duration, f);
  }
  createPeriodicTimer(duration, f) {
    let implementation = this[_createPeriodicTimer];
    dart.assert(implementation != null);
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, duration, f);
  }
  print(line) {
    let implementation = this[_print];
    dart.assert(implementation != null);
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, line);
  }
};
dart.setSignature(async._CustomZone, {
  constructors: () => ({new: dart.definiteFunctionType(async._CustomZone, [async._Zone, async.ZoneSpecification, core.Map])}),
  fields: () => ({
    [_run]: _ZoneFunctionOfRunHandler(),
    [_runUnary]: _ZoneFunctionOfRunUnaryHandler(),
    [_runBinary]: _ZoneFunctionOfRunBinaryHandler(),
    [_registerCallback]: _ZoneFunctionOfRegisterCallbackHandler(),
    [_registerUnaryCallback]: _ZoneFunctionOfRegisterUnaryCallbackHandler(),
    [_registerBinaryCallback]: _ZoneFunctionOfRegisterBinaryCallbackHandler(),
    [_errorCallback]: _ZoneFunctionOfErrorCallbackHandler(),
    [_scheduleMicrotask]: _ZoneFunctionOfScheduleMicrotaskHandler(),
    [_createTimer]: _ZoneFunctionOfCreateTimerHandler(),
    [_createPeriodicTimer]: _ZoneFunctionOfCreatePeriodicTimerHandler(),
    [_print]: _ZoneFunctionOfPrintHandler(),
    [_fork]: _ZoneFunctionOfForkHandler(),
    [_handleUncaughtError]: _ZoneFunctionOfHandleUncaughtErrorHandler(),
    [_delegateCache]: async.ZoneDelegate,
    parent: async._Zone,
    [_map$]: core.Map
  }),
  getters: () => ({
    [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
    errorZone: dart.definiteFunctionType(async.Zone, [])
  }),
  methods: () => ({
    runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
    runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
    runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
    bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
    bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
    bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
    fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
    run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
    runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
    runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
    registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
    registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
    registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
    errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
    scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
    createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
    print: dart.definiteFunctionType(dart.void, [core.String])
  })
});
async._rootHandleUncaughtError = function(R) {
  return (self, parent, zone, error, stackTrace) => {
    async._schedulePriorityAsyncCallback(dart.fn(() => {
      if (error == null) error = new core.NullThrownError();
      if (stackTrace == null) dart.throw(error);
      async._rethrow(error, stackTrace);
    }, VoidToNull()));
  };
};
dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
async._rethrow = function(error, stackTrace) {
  error.stack = dart.toString(stackTrace);
  throw error;
};
dart.lazyFn(async._rethrow, () => ObjectAndStackTraceTovoid());
async._rootRun = function(R) {
  return (self, parent, zone, f) => {
    if (dart.equals(async.Zone._current, zone)) return f();
    let old = async.Zone._enter(zone);
    try {
      return f();
    } finally {
      async.Zone._leave(old);
    }
  };
};
dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR$());
async._rootRunUnary = function(R, T) {
  return (self, parent, zone, f, arg) => {
    if (dart.equals(async.Zone._current, zone)) return f(arg);
    let old = async.Zone._enter(zone);
    try {
      return f(arg);
    } finally {
      async.Zone._leave(old);
    }
  };
};
dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR$0());
async._rootRunBinary = function(R, T1, T2) {
  return (self, parent, zone, f, arg1, arg2) => {
    if (dart.equals(async.Zone._current, zone)) return f(arg1, arg2);
    let old = async.Zone._enter(zone);
    try {
      return f(arg1, arg2);
    } finally {
      async.Zone._leave(old);
    }
  };
};
dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR$1());
async._rootRegisterCallback = function(R) {
  return (self, parent, zone, f) => {
    return f;
  };
};
dart.fn(async._rootRegisterCallback, ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR());
async._rootRegisterUnaryCallback = function(R, T) {
  return (self, parent, zone, f) => {
    return f;
  };
};
dart.fn(async._rootRegisterUnaryCallback, ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T());
async._rootRegisterBinaryCallback = function(R, T1, T2) {
  return (self, parent, zone, f) => {
    return f;
  };
};
dart.fn(async._rootRegisterBinaryCallback, ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2());
async._rootErrorCallback = function(self, parent, zone, error, stackTrace) {
  return null;
};
dart.lazyFn(async._rootErrorCallback, () => ZoneAndZoneDelegateAndZone__ToAsyncError());
async._rootScheduleMicrotask = function(self, parent, zone, f) {
  if (!core.identical(async._ROOT_ZONE, zone)) {
    let hasErrorHandler = !dart.test(async._ROOT_ZONE.inSameErrorZone(zone));
    f = zone.bindCallback(dart.dynamic)(f, {runGuarded: hasErrorHandler});
    zone = async._ROOT_ZONE;
  }
  async._scheduleAsyncCallback(f);
};
dart.fn(async._rootScheduleMicrotask, ZoneAndZoneDelegateAndZone__Tovoid());
async._rootCreateTimer = function(self, parent, zone, duration, callback) {
  if (!core.identical(async._ROOT_ZONE, zone)) {
    callback = zone.bindCallback(dart.void)(callback);
  }
  return async.Timer._createTimer(duration, callback);
};
dart.lazyFn(async._rootCreateTimer, () => ZoneAndZoneDelegateAndZone__ToTimer());
async._rootCreatePeriodicTimer = function(self, parent, zone, duration, callback) {
  if (!core.identical(async._ROOT_ZONE, zone)) {
    callback = zone.bindUnaryCallback(dart.dynamic, async.Timer)(callback);
  }
  return async.Timer._createPeriodicTimer(duration, callback);
};
dart.lazyFn(async._rootCreatePeriodicTimer, () => ZoneAndZoneDelegateAndZone__ToTimer$());
async._rootPrint = function(self, parent, zone, line) {
  _internal.printToConsole(line);
};
dart.lazyFn(async._rootPrint, () => ZoneAndZoneDelegateAndZone__Tovoid$());
async._printToZone = function(line) {
  async.Zone.current.print(line);
};
dart.lazyFn(async._printToZone, () => StringTovoid$());
let const$11;
async._rootFork = function(self, parent, zone, specification, zoneValues) {
  _internal.printToZone = async._printToZone;
  if (specification == null) {
    specification = const$11 || (const$11 = dart.const(async.ZoneSpecification.new()));
  } else if (!async._ZoneSpecification.is(specification)) {
    dart.throw(new core.ArgumentError("ZoneSpecifications must be instantiated" + " with the provided constructor."));
  }
  let valueMap = null;
  if (zoneValues == null) {
    if (async._Zone.is(zone)) {
      valueMap = zone[_map$];
    } else {
      valueMap = collection.HashMap.new();
    }
  } else {
    valueMap = collection.HashMap.from(zoneValues);
  }
  return new async._CustomZone(async._Zone._check(zone), specification, valueMap);
};
dart.lazyFn(async._rootFork, () => ZoneAndZoneDelegateAndZone__ToZone());
let const$12;
let const$13;
let const$14;
let const$15;
let const$16;
let const$17;
let const$18;
let const$19;
let const$20;
let const$21;
let const$22;
let const$23;
let const$24;
async._RootZone = class _RootZone extends async._Zone {
  new() {
    super.new();
  }
  get [_run]() {
    return const$12 || (const$12 = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
  }
  get [_runUnary]() {
    return const$13 || (const$13 = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
  }
  get [_runBinary]() {
    return const$14 || (const$14 = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
  }
  get [_registerCallback]() {
    return const$15 || (const$15 = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
  }
  get [_registerUnaryCallback]() {
    return const$16 || (const$16 = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
  }
  get [_registerBinaryCallback]() {
    return const$17 || (const$17 = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
  }
  get [_errorCallback]() {
    return const$18 || (const$18 = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
  }
  get [_scheduleMicrotask]() {
    return const$19 || (const$19 = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
  }
  get [_createTimer]() {
    return const$20 || (const$20 = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
  }
  get [_createPeriodicTimer]() {
    return const$21 || (const$21 = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
  }
  get [_print]() {
    return const$22 || (const$22 = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
  }
  get [_fork]() {
    return const$23 || (const$23 = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
  }
  get [_handleUncaughtError]() {
    return const$24 || (const$24 = dart.const(new (_ZoneFunctionOfHandleUncaughtErrorHandler())(async._ROOT_ZONE, dart.gbind(async._rootHandleUncaughtError, dart.dynamic))));
  }
  get parent() {
    return null;
  }
  get [_map$]() {
    return async._RootZone._rootMap;
  }
  get [_delegate]() {
    if (async._RootZone._rootDelegate != null) return async._RootZone._rootDelegate;
    return async._RootZone._rootDelegate = new async._ZoneDelegate(this);
  }
  get errorZone() {
    return this;
  }
  runGuarded(R) {
    return f => {
      try {
        if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
          return f();
        }
        return async._rootRun(R)(null, null, this, f);
      } catch (e) {
        let s = dart.stackTrace(e);
        return this.handleUncaughtError(R)(e, s);
      }

    };
  }
  runUnaryGuarded(R, T) {
    return (f, arg) => {
      try {
        if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
          return f(arg);
        }
        return async._rootRunUnary(R, T)(null, null, this, f, arg);
      } catch (e) {
        let s = dart.stackTrace(e);
        return this.handleUncaughtError(R)(e, s);
      }

    };
  }
  runBinaryGuarded(R, T1, T2) {
    return (f, arg1, arg2) => {
      try {
        if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
          return f(arg1, arg2);
        }
        return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
      } catch (e) {
        let s = dart.stackTrace(e);
        return this.handleUncaughtError(R)(e, s);
      }

    };
  }
  bindCallback(R) {
    return (f, opts) => {
      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
      if (dart.test(runGuarded)) {
        return dart.fn(() => this.runGuarded(R)(f), dart.definiteFunctionType(R, []));
      } else {
        return dart.fn(() => this.run(R)(f), dart.definiteFunctionType(R, []));
      }
    };
  }
  bindUnaryCallback(R, T) {
    return (f, opts) => {
      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
      if (dart.test(runGuarded)) {
        return dart.fn(arg => this.runUnaryGuarded(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
      } else {
        return dart.fn(arg => this.runUnary(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
      }
    };
  }
  bindBinaryCallback(R, T1, T2) {
    return (f, opts) => {
      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
      if (dart.test(runGuarded)) {
        return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
      } else {
        return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
      }
    };
  }
  _get(key) {
    return null;
  }
  handleUncaughtError(R) {
    return (error, stackTrace) => {
      return async._rootHandleUncaughtError(R)(null, null, this, error, stackTrace);
    };
  }
  fork(opts) {
    let specification = opts && 'specification' in opts ? opts.specification : null;
    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
    return async._rootFork(null, null, this, specification, zoneValues);
  }
  run(R) {
    return f => {
      if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f();
      return async._rootRun(R)(null, null, this, f);
    };
  }
  runUnary(R, T) {
    return (f, arg) => {
      if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg);
      return async._rootRunUnary(R, T)(null, null, this, f, arg);
    };
  }
  runBinary(R, T1, T2) {
    return (f, arg1, arg2) => {
      if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg1, arg2);
      return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
    };
  }
  registerCallback(R) {
    return f => {
      return f;
    };
  }
  registerUnaryCallback(R, T) {
    return f => {
      return f;
    };
  }
  registerBinaryCallback(R, T1, T2) {
    return f => {
      return f;
    };
  }
  errorCallback(error, stackTrace) {
    return null;
  }
  scheduleMicrotask(f) {
    async._rootScheduleMicrotask(null, null, this, f);
  }
  createTimer(duration, f) {
    return async.Timer._createTimer(duration, f);
  }
  createPeriodicTimer(duration, f) {
    return async.Timer._createPeriodicTimer(duration, f);
  }
  print(line) {
    _internal.printToConsole(line);
  }
};
dart.setSignature(async._RootZone, {
  constructors: () => ({new: dart.definiteFunctionType(async._RootZone, [])}),
  getters: () => ({
    [_run]: dart.definiteFunctionType(async._ZoneFunction$(async.RunHandler), []),
    [_runUnary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunUnaryHandler), []),
    [_runBinary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunBinaryHandler), []),
    [_registerCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterCallbackHandler), []),
    [_registerUnaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterUnaryCallbackHandler), []),
    [_registerBinaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterBinaryCallbackHandler), []),
    [_errorCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.ErrorCallbackHandler), []),
    [_scheduleMicrotask]: dart.definiteFunctionType(async._ZoneFunction$(async.ScheduleMicrotaskHandler), []),
    [_createTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreateTimerHandler), []),
    [_createPeriodicTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreatePeriodicTimerHandler), []),
    [_print]: dart.definiteFunctionType(async._ZoneFunction$(async.PrintHandler), []),
    [_fork]: dart.definiteFunctionType(async._ZoneFunction$(async.ForkHandler), []),
    [_handleUncaughtError]: dart.definiteFunctionType(async._ZoneFunction$(async.HandleUncaughtErrorHandler), []),
    parent: dart.definiteFunctionType(async._Zone, []),
    [_map$]: dart.definiteFunctionType(core.Map, []),
    [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
    errorZone: dart.definiteFunctionType(async.Zone, [])
  }),
  methods: () => ({
    runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
    runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
    runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
    bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
    bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
    bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
    fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
    run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
    runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
    runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
    registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
    registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
    registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
    errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
    scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
    createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
    print: dart.definiteFunctionType(dart.void, [core.String])
  }),
  sfields: () => ({
    _rootMap: core.Map,
    _rootDelegate: async.ZoneDelegate
  })
});
async._RootZone._rootDelegate = null;
dart.defineLazy(async._RootZone, {
  get _rootMap() {
    return collection.HashMap.new();
  },
  set _rootMap(_) {}
});
async._ROOT_ZONE = dart.const(new async._RootZone());
async.runZoned = function(R) {
  return (body, opts) => {
    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
    let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let errorHandler = null;
    if (onError != null) {
      errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
        try {
          if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
            return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
          }
          return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
        } catch (e) {
          let s = dart.stackTrace(e);
          if (core.identical(e, error)) {
            return parent.handleUncaughtError(dart.dynamic)(zone, error, stackTrace);
          } else {
            return parent.handleUncaughtError(dart.dynamic)(zone, e, s);
          }
        }

      }, ZoneAndZoneDelegateAndZone__Todynamic());
    }
    if (zoneSpecification == null) {
      zoneSpecification = async.ZoneSpecification.new({handleUncaughtError: errorHandler});
    } else if (errorHandler != null) {
      zoneSpecification = async.ZoneSpecification.from(zoneSpecification, {handleUncaughtError: errorHandler});
    }
    let zone = async.Zone.current.fork({specification: zoneSpecification, zoneValues: zoneValues});
    if (onError != null) {
      return zone.runGuarded(R)(body);
    } else {
      return zone.run(R)(body);
    }
  };
};
dart.lazyFn(async.runZoned, () => Fn__ToR());
collection._USE_ES6_MAPS = true;
const _length$1 = Symbol('_length');
const _strings$ = Symbol('_strings');
const _nums$ = Symbol('_nums');
const _rest$ = Symbol('_rest');
const _keys = Symbol('_keys');
const _containsKey = Symbol('_containsKey');
const _getBucket$ = Symbol('_getBucket');
const _findBucketIndex = Symbol('_findBucketIndex');
const _computeKeys = Symbol('_computeKeys');
const _get = Symbol('_get');
const _addHashTableEntry$ = Symbol('_addHashTableEntry');
const _set = Symbol('_set');
const _computeHashCode = Symbol('_computeHashCode');
const _removeHashTableEntry$ = Symbol('_removeHashTableEntry');
const _remove = Symbol('_remove');
collection._HashMap$ = dart.generic((K, V) => {
  let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
  let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
  let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
  class _HashMap extends core.Object {
    new() {
      this[_length$1] = 0;
      this[_strings$] = null;
      this[_nums$] = null;
      this[_rest$] = null;
      this[_keys] = null;
    }
    get length() {
      return this[_length$1];
    }
    get isEmpty() {
      return this[_length$1] == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    get keys() {
      return new (_HashMapKeyIterableOfK())(this);
    }
    get values() {
      return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
    }
    containsKey(key) {
      if (dart.test(collection._HashMap._isStringKey(key))) {
        let strings = this[_strings$];
        return strings == null ? false : collection._HashMap._hasTableEntry(strings, key);
      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
        let nums = this[_nums$];
        return nums == null ? false : collection._HashMap._hasTableEntry(nums, key);
      } else {
        return this[_containsKey](key);
      }
    }
    [_containsKey](key) {
      let rest = this[_rest$];
      if (rest == null) return false;
      let bucket = this[_getBucket$](rest, key);
      return dart.notNull(this[_findBucketIndex](bucket, key)) >= 0;
    }
    containsValue(value) {
      return this[_computeKeys]()[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
    }
    addAll(other) {
      MapOfK$V()._check(other);
      other[dartx.forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, KAndVToNull()));
    }
    _get(key) {
      if (dart.test(collection._HashMap._isStringKey(key))) {
        let strings = this[_strings$];
        return V._check(strings == null ? null : collection._HashMap._getTableEntry(strings, key));
      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
        let nums = this[_nums$];
        return V._check(nums == null ? null : collection._HashMap._getTableEntry(nums, key));
      } else {
        return this[_get](key);
      }
    }
    [_get](key) {
      let rest = this[_rest$];
      if (rest == null) return null;
      let bucket = this[_getBucket$](rest, key);
      let index = this[_findBucketIndex](bucket, key);
      return V._check(dart.notNull(index) < 0 ? null : bucket[dart.notNull(index) + 1]);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      if (dart.test(collection._HashMap._isStringKey(key))) {
        let strings = this[_strings$];
        if (strings == null) this[_strings$] = strings = collection._HashMap._newHashTable();
        this[_addHashTableEntry$](strings, key, value);
      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
        let nums = this[_nums$];
        if (nums == null) this[_nums$] = nums = collection._HashMap._newHashTable();
        this[_addHashTableEntry$](nums, key, value);
      } else {
        this[_set](key, value);
      }
      return value;
    }
    [_set](key, value) {
      K._check(key);
      V._check(value);
      let rest = this[_rest$];
      if (rest == null) this[_rest$] = rest = collection._HashMap._newHashTable();
      let hash = this[_computeHashCode](key);
      let bucket = rest[hash];
      if (bucket == null) {
        collection._HashMap._setTableEntry(rest, hash, [key, value]);
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_keys] = null;
      } else {
        let index = this[_findBucketIndex](bucket, key);
        if (dart.notNull(index) >= 0) {
          bucket[dart.notNull(index) + 1] = value;
        } else {
          bucket.push(key, value);
          this[_length$1] = dart.notNull(this[_length$1]) + 1;
          this[_keys] = null;
        }
      }
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (dart.test(this.containsKey(key))) return this._get(key);
      let value = ifAbsent();
      this._set(key, value);
      return value;
    }
    remove(key) {
      if (dart.test(collection._HashMap._isStringKey(key))) {
        return this[_removeHashTableEntry$](this[_strings$], key);
      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
        return this[_removeHashTableEntry$](this[_nums$], key);
      } else {
        return this[_remove](key);
      }
    }
    [_remove](key) {
      let rest = this[_rest$];
      if (rest == null) return null;
      let bucket = this[_getBucket$](rest, key);
      let index = this[_findBucketIndex](bucket, key);
      if (dart.notNull(index) < 0) return null;
      this[_length$1] = dart.notNull(this[_length$1]) - 1;
      this[_keys] = null;
      return bucket.splice(index, 2)[1];
    }
    clear() {
      if (dart.notNull(this[_length$1]) > 0) {
        this[_strings$] = this[_nums$] = this[_rest$] = this[_keys] = null;
        this[_length$1] = 0;
      }
    }
    forEach(action) {
      let keys = this[_computeKeys]();
      for (let i = 0, length = keys[dartx.length]; i < dart.notNull(length); i++) {
        let key = keys[i];
        action(K._check(key), this._get(key));
        if (keys !== this[_keys]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
    }
    [_computeKeys]() {
      if (this[_keys] != null) return this[_keys];
      let result = ListOfK().new(this[_length$1]);
      let index = 0;
      let strings = this[_strings$];
      if (strings != null) {
        let names = Object.getOwnPropertyNames(strings);
        let entries = names.length;
        for (let i = 0; i < entries; i++) {
          let key = names[i];
          result[index] = key;
          index++;
        }
      }
      let nums = this[_nums$];
      if (nums != null) {
        let names = Object.getOwnPropertyNames(nums);
        let entries = names.length;
        for (let i = 0; i < entries; i++) {
          let key = +names[i];
          result[index] = key;
          index++;
        }
      }
      let rest = this[_rest$];
      if (rest != null) {
        let names = Object.getOwnPropertyNames(rest);
        let entries = names.length;
        for (let i = 0; i < entries; i++) {
          let key = names[i];
          let bucket = rest[key];
          let length = bucket.length;
          for (let i = 0; i < length; i = i + 2) {
            let key = bucket[i];
            result[index] = key;
            index++;
          }
        }
      }
      dart.assert(index == this[_length$1]);
      return this[_keys] = result;
    }
    [_addHashTableEntry$](table, key, value) {
      K._check(key);
      V._check(value);
      if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_keys] = null;
      }
      collection._HashMap._setTableEntry(table, key, value);
    }
    [_removeHashTableEntry$](table, key) {
      if (table != null && dart.test(collection._HashMap._hasTableEntry(table, key))) {
        let value = V._check(collection._HashMap._getTableEntry(table, key));
        collection._HashMap._deleteTableEntry(table, key);
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_keys] = null;
        return value;
      } else {
        return null;
      }
    }
    static _isStringKey(key) {
      return typeof key == 'string' && key != '__proto__';
    }
    static _isNumericKey(key) {
      return typeof key == 'number' && (key & 0x3ffffff) === key;
    }
    [_computeHashCode](key) {
      return dart.hashCode(key) & 0x3ffffff;
    }
    static _hasTableEntry(table, key) {
      let entry = table[key];
      return entry != null;
    }
    static _getTableEntry(table, key) {
      let entry = table[key];
      return entry === table ? null : entry;
    }
    static _setTableEntry(table, key, value) {
      if (value == null) {
        table[key] = table;
      } else {
        table[key] = value;
      }
    }
    static _deleteTableEntry(table, key) {
      delete table[key];
    }
    [_getBucket$](table, key) {
      let hash = this[_computeHashCode](key);
      return table[hash];
    }
    [_findBucketIndex](bucket, key) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i = i + 2) {
        if (dart.equals(bucket[i], key)) return i;
      }
      return -1;
    }
    static _newHashTable() {
      let table = Object.create(null);
      let temporaryKey = '<non-identifier-key>';
      collection._HashMap._setTableEntry(table, temporaryKey, table);
      collection._HashMap._deleteTableEntry(table, temporaryKey);
      return table;
    }
  }
  dart.addTypeTests(_HashMap);
  _HashMap[dart.implements] = () => [HashMapOfK$V()];
  dart.setSignature(_HashMap, {
    constructors: () => ({new: dart.definiteFunctionType(collection._HashMap$(K, V), [])}),
    fields: () => ({
      [_length$1]: core.int,
      [_strings$]: dart.dynamic,
      [_nums$]: dart.dynamic,
      [_rest$]: dart.dynamic,
      [_keys]: ListOfK()
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      keys: dart.definiteFunctionType(core.Iterable$(K), []),
      values: dart.definiteFunctionType(core.Iterable$(V), [])
    }),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      [_containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
      _get: dart.definiteFunctionType(V, [core.Object]),
      [_get]: dart.definiteFunctionType(V, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [K, V]),
      [_set]: dart.definiteFunctionType(dart.void, [K, V]),
      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
      remove: dart.definiteFunctionType(V, [core.Object]),
      [_remove]: dart.definiteFunctionType(V, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
      [_computeKeys]: dart.definiteFunctionType(core.List$(K), []),
      [_addHashTableEntry$]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
      [_removeHashTableEntry$]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
      [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
      [_getBucket$]: dart.definiteFunctionType(core.List, [dart.dynamic, dart.dynamic]),
      [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, core.Object])
    }),
    statics: () => ({
      _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      _getTableEntry: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
    }),
    names: ['_isStringKey', '_isNumericKey', '_hasTableEntry', '_getTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
  });
  dart.defineExtensionMembers(_HashMap, [
    'containsKey',
    'containsValue',
    'addAll',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  return _HashMap;
});
collection._HashMap = _HashMap();
collection._IdentityHashMap$ = dart.generic((K, V) => {
  class _IdentityHashMap extends collection._HashMap$(K, V) {
    new() {
      super.new();
    }
    [_computeHashCode](key) {
      return core.identityHashCode(key) & 0x3ffffff;
    }
    [_findBucketIndex](bucket, key) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i = i + 2) {
        if (core.identical(bucket[i], key)) return i;
      }
      return -1;
    }
  }
  return _IdentityHashMap;
});
collection._IdentityHashMap = _IdentityHashMap();
const _equals$ = Symbol('_equals');
const _hashCode = Symbol('_hashCode');
const _validKey = Symbol('_validKey');
collection._CustomHashMap$ = dart.generic((K, V) => {
  let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
  let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
  class _CustomHashMap extends collection._HashMap$(K, V) {
    new(equals, hashCode, validKey) {
      this[_equals$] = equals;
      this[_hashCode] = hashCode;
      this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
      super.new();
    }
    _get(key) {
      if (!dart.test(this[_validKey](key))) return null;
      return super[_get](key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      super[_set](key, value);
      return value;
    }
    containsKey(key) {
      if (!dart.test(this[_validKey](key))) return false;
      return super[_containsKey](key);
    }
    remove(key) {
      if (!dart.test(this[_validKey](key))) return null;
      return super[_remove](key);
    }
    [_computeHashCode](key) {
      return this[_hashCode](K._check(key)) & 0x3ffffff;
    }
    [_findBucketIndex](bucket, key) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i = i + 2) {
        if (dart.test(this[_equals$](bucket[i], K._check(key)))) return i;
      }
      return -1;
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
  }
  dart.setSignature(_CustomHashMap, {
    constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
    fields: () => ({
      [_equals$]: _EqualityOfK(),
      [_hashCode]: _HasherOfK(),
      [_validKey]: _PredicateOfObject()
    })
  });
  dart.defineExtensionMembers(_CustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
  return _CustomHashMap;
});
collection._CustomHashMap = _CustomHashMap();
const _map$0 = Symbol('_map');
collection._HashMapKeyIterable$ = dart.generic(E => {
  let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
  class _HashMapKeyIterable extends core.Iterable$(E) {
    new(map) {
      this[_map$0] = map;
      super.new();
    }
    get length() {
      return this[_map$0][_length$1];
    }
    get isEmpty() {
      return this[_map$0][_length$1] == 0;
    }
    get iterator() {
      return new (_HashMapKeyIteratorOfE())(this[_map$0], this[_map$0][_computeKeys]());
    }
    contains(element) {
      return this[_map$0].containsKey(element);
    }
    forEach(f) {
      let keys = this[_map$0][_computeKeys]();
      for (let i = 0, length = keys.length; i < length; i++) {
        f(keys[i]);
        if (keys !== this[_map$0][_keys]) {
          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
        }
      }
    }
  }
  _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_HashMapKeyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
    fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(_HashMapKeyIterable, [
    'contains',
    'forEach',
    'length',
    'isEmpty',
    'iterator'
  ]);
  return _HashMapKeyIterable;
});
collection._HashMapKeyIterable = _HashMapKeyIterable();
const _offset = Symbol('_offset');
const _current$2 = Symbol('_current');
collection._HashMapKeyIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  class _HashMapKeyIterator extends core.Object {
    new(map, keys) {
      this[_map$0] = map;
      this[_keys] = keys;
      this[_offset] = 0;
      this[_current$2] = null;
    }
    get current() {
      return this[_current$2];
    }
    moveNext() {
      let keys = this[_keys];
      let offset = this[_offset];
      if (keys !== this[_map$0][_keys]) {
        dart.throw(new core.ConcurrentModificationError(this[_map$0]));
      } else if (dart.notNull(offset) >= keys.length) {
        this[_current$2] = null;
        return false;
      } else {
        this[_current$2] = keys[offset];
        this[_offset] = dart.notNull(offset) + 1;
        return true;
      }
    }
  }
  dart.addTypeTests(_HashMapKeyIterator);
  _HashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_HashMapKeyIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterator$(E), [_HashMapOfE$dynamic(), ListOfE()])}),
    fields: () => ({
      [_map$0]: _HashMapOfE$dynamic(),
      [_keys]: ListOfE(),
      [_offset]: core.int,
      [_current$2]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _HashMapKeyIterator;
});
collection._HashMapKeyIterator = _HashMapKeyIterator();
collection._LinkedIdentityHashMap$ = dart.generic((K, V) => {
  let _Es6LinkedIdentityHashMapOfK$V = () => (_Es6LinkedIdentityHashMapOfK$V = dart.constFn(collection._Es6LinkedIdentityHashMap$(K, V)))();
  let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
  class _LinkedIdentityHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
    static get _supportsEs6Maps() {
      return true;
    }
    static es6() {
      return collection._USE_ES6_MAPS && dart.test(collection._LinkedIdentityHashMap._supportsEs6Maps) ? new (_Es6LinkedIdentityHashMapOfK$V())() : new (_LinkedIdentityHashMapOfK$V())();
    }
    new() {
      super.new();
    }
    internalComputeHashCode(key) {
      return core.identityHashCode(key) & 0x3ffffff;
    }
    internalFindBucketIndex(bucket, key) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        let cell = bucket[i];
        if (core.identical(cell.hashMapCellKey, key)) return i;
      }
      return -1;
    }
  }
  dart.setSignature(_LinkedIdentityHashMap, {
    constructors: () => ({
      es6: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), []),
      new: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), [])
    }),
    sgetters: () => ({_supportsEs6Maps: dart.definiteFunctionType(core.bool, [])})
  });
  return _LinkedIdentityHashMap;
});
collection._LinkedIdentityHashMap = _LinkedIdentityHashMap();
const _modifications$ = Symbol('_modifications');
const _modified$ = Symbol('_modified');
collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
  let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
  let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
  let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
  class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
    new() {
      this[_map$0] = new Map();
      this[_modifications$] = 0;
      super.new();
    }
    get length() {
      return this[_map$0].size;
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    get keys() {
      return new (_Es6MapIterableOfK())(this, true);
    }
    get values() {
      return new (_Es6MapIterableOfV())(this, false);
    }
    containsKey(key) {
      return this[_map$0].has(key);
    }
    containsValue(value) {
      return this.values[dartx.any](dart.fn(each => dart.equals(each, value), VTobool()));
    }
    addAll(other) {
      MapOfK$V()._check(other);
      other[dartx.forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, KAndVToNull()));
    }
    _get(key) {
      return this[_map$0].get(key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_map$0].set(key, value);
      this[_modified$]();
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (dart.test(this.containsKey(key))) return this._get(key);
      let value = ifAbsent();
      this._set(key, value);
      return value;
    }
    remove(key) {
      let value = this._get(key);
      this[_map$0].delete(key);
      this[_modified$]();
      return value;
    }
    clear() {
      this[_map$0].clear();
      this[_modified$]();
    }
    forEach(action) {
      let jsEntries = this[_map$0].entries();
      let modifications = this[_modifications$];
      while (true) {
        let next = jsEntries.next();
        let done = next.done;
        if (done) break;
        let entry = next.value;
        let key = entry[0];
        let value = entry[1];
        action(K._check(key), V._check(value));
        if (modifications != this[_modifications$]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
    }
    [_modified$]() {
      this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
  }
  _Es6LinkedIdentityHashMap[dart.implements] = () => [InternalMapOfK$V()];
  dart.setSignature(_Es6LinkedIdentityHashMap, {
    constructors: () => ({new: dart.definiteFunctionType(collection._Es6LinkedIdentityHashMap$(K, V), [])}),
    fields: () => ({
      [_map$0]: dart.dynamic,
      [_modifications$]: core.int
    }),
    methods: () => ({[_modified$]: dart.definiteFunctionType(dart.void, [])})
  });
  dart.defineExtensionMembers(_Es6LinkedIdentityHashMap, [
    'containsKey',
    'containsValue',
    'addAll',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  return _Es6LinkedIdentityHashMap;
});
collection._Es6LinkedIdentityHashMap = _Es6LinkedIdentityHashMap();
const _isKeys = Symbol('_isKeys');
collection._Es6MapIterable$ = dart.generic(E => {
  let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  class _Es6MapIterable extends core.Iterable$(E) {
    new(map, isKeys) {
      this[_map$0] = map;
      this[_isKeys] = isKeys;
      super.new();
    }
    get length() {
      return core.int._check(dart.dload(this[_map$0], 'length'));
    }
    get isEmpty() {
      return core.bool._check(dart.dload(this[_map$0], 'isEmpty'));
    }
    get iterator() {
      return new (_Es6MapIteratorOfE())(this[_map$0], core.int._check(dart.dload(this[_map$0], _modifications$)), this[_isKeys]);
    }
    contains(element) {
      return core.bool._check(dart.dsend(this[_map$0], 'containsKey', element));
    }
    forEach(f) {
      let jsIterator = null;
      if (dart.test(this[_isKeys])) {
        jsIterator = dart.dload(this[_map$0], _map$0).keys();
      } else {
        jsIterator = dart.dload(this[_map$0], _map$0).values();
      }
      let modifications = core.int._check(dart.dload(this[_map$0], _modifications$));
      while (true) {
        let next = jsIterator.next();
        let done = next.done;
        if (done) break;
        let value = next.value;
        f(E._check(value));
        if (!dart.equals(modifications, dart.dload(this[_map$0], _modifications$))) {
          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
        }
      }
    }
  }
  _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_Es6MapIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
    fields: () => ({
      [_map$0]: dart.dynamic,
      [_isKeys]: core.bool
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(_Es6MapIterable, [
    'contains',
    'forEach',
    'length',
    'isEmpty',
    'iterator'
  ]);
  return _Es6MapIterable;
});
collection._Es6MapIterable = _Es6MapIterable();
const _jsIterator$ = Symbol('_jsIterator');
const _next$0 = Symbol('_next');
const _done = Symbol('_done');
collection._Es6MapIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class _Es6MapIterator extends core.Object {
    new(map, modifications, isKeys) {
      this[_map$0] = map;
      this[_modifications$] = modifications;
      this[_isKeys] = isKeys;
      this[_jsIterator$] = null;
      this[_next$0] = null;
      this[_current$2] = null;
      this[_done] = null;
      if (dart.test(this[_isKeys])) {
        this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
      } else {
        this[_jsIterator$] = dart.dload(this[_map$0], _map$0).values();
      }
      this[_done] = false;
    }
    get current() {
      return this[_current$2];
    }
    moveNext() {
      if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
        dart.throw(new core.ConcurrentModificationError(this[_map$0]));
      }
      if (dart.test(this[_done])) return false;
      this[_next$0] = this[_jsIterator$].next();
      let done = this[_next$0].done;
      if (done) {
        this[_current$2] = null;
        this[_done] = true;
        return false;
      } else {
        this[_current$2] = this[_next$0].value;
        return true;
      }
    }
  }
  dart.addTypeTests(_Es6MapIterator);
  _Es6MapIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_Es6MapIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterator$(E), [dart.dynamic, core.int, core.bool])}),
    fields: () => ({
      [_map$0]: dart.dynamic,
      [_modifications$]: core.int,
      [_isKeys]: core.bool,
      [_jsIterator$]: dart.dynamic,
      [_next$0]: dart.dynamic,
      [_current$2]: E,
      [_done]: core.bool
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _Es6MapIterator;
});
collection._Es6MapIterator = _Es6MapIterator();
collection._LinkedCustomHashMap$ = dart.generic((K, V) => {
  let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
  let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
  class _LinkedCustomHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
    new(equals, hashCode, validKey) {
      this[_equals$] = equals;
      this[_hashCode] = hashCode;
      this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
      super.new();
    }
    _get(key) {
      if (!dart.test(this[_validKey](key))) return null;
      return super.internalGet(key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      super.internalSet(key, value);
      return value;
    }
    containsKey(key) {
      if (!dart.test(this[_validKey](key))) return false;
      return super.internalContainsKey(key);
    }
    remove(key) {
      if (!dart.test(this[_validKey](key))) return null;
      return super.internalRemove(key);
    }
    internalComputeHashCode(key) {
      return this[_hashCode](K._check(key)) & 0x3ffffff;
    }
    internalFindBucketIndex(bucket, key) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        let cell = bucket[i];
        if (dart.test(this[_equals$](cell.hashMapCellKey, K._check(key)))) return i;
      }
      return -1;
    }
  }
  dart.setSignature(_LinkedCustomHashMap, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
    fields: () => ({
      [_equals$]: _EqualityOfK(),
      [_hashCode]: _HasherOfK(),
      [_validKey]: _PredicateOfObject()
    })
  });
  dart.defineExtensionMembers(_LinkedCustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
  return _LinkedCustomHashMap;
});
collection._LinkedCustomHashMap = _LinkedCustomHashMap();
const _elements = Symbol('_elements');
const _newSet = Symbol('_newSet');
const _computeElements = Symbol('_computeElements');
const _contains = Symbol('_contains');
const _lookup = Symbol('_lookup');
const _add$0 = Symbol('_add');
collection.SetMixin$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  class SetMixin extends core.Object {
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return this.length != 0;
    }
    clear() {
      this.removeAll(this.toList());
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      for (let element of elements)
        this.add(element);
    }
    removeAll(elements) {
      for (let element of elements)
        this.remove(element);
    }
    retainAll(elements) {
      let toRemove = this.toSet();
      for (let o of elements) {
        toRemove.remove(o);
      }
      this.removeAll(toRemove);
    }
    removeWhere(test) {
      let toRemove = [];
      for (let element of this) {
        if (dart.test(test(element))) toRemove[dartx.add](element);
      }
      this.removeAll(toRemove);
    }
    retainWhere(test) {
      let toRemove = [];
      for (let element of this) {
        if (!dart.test(test(element))) toRemove[dartx.add](element);
      }
      this.removeAll(toRemove);
    }
    containsAll(other) {
      for (let o of other) {
        if (!dart.test(this.contains(o))) return false;
      }
      return true;
    }
    union(other) {
      SetOfE()._check(other);
      let _ = this.toSet();
      _.addAll(other);
      return _;
    }
    intersection(other) {
      let result = this.toSet();
      for (let element of this) {
        if (!dart.test(other.contains(element))) result.remove(element);
      }
      return result;
    }
    difference(other) {
      let result = this.toSet();
      for (let element of this) {
        if (dart.test(other.contains(element))) result.remove(element);
      }
      return result;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = dart.test(growable) ? (() => {
        let _ = ListOfE().new();
        _[dartx.length] = this.length;
        return _;
      })() : ListOfE().new(this.length);
      let i = 0;
      for (let element of this)
        result[dartx._set](i++, element);
      return result;
    }
    map(T) {
      return f => {
        return new (_internal.EfficientLengthMappedIterable$(E, T))(this, f);
      };
    }
    get single() {
      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
      let it = this.iterator;
      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
      let result = it.current;
      return result;
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, '{', '}');
    }
    where(f) {
      return new (WhereIterableOfE())(this, f);
    }
    expand(T) {
      return f => {
        return new (_internal.ExpandIterable$(E, T))(this, f);
      };
    }
    forEach(f) {
      for (let element of this)
        f(element);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let value = iterator.current;
      while (dart.test(iterator.moveNext())) {
        value = combine(value, iterator.current);
      }
      return value;
    }
    fold(T) {
      return (initialValue, combine) => {
        let value = initialValue;
        for (let element of this)
          value = combine(value, element);
        return value;
      };
    }
    every(f) {
      for (let element of this) {
        if (!dart.test(f(element))) return false;
      }
      return true;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) return "";
      let buffer = new core.StringBuffer();
      if (separator == null || separator == "") {
        do {
          buffer.write(dart.str`${iterator.current}`);
        } while (dart.test(iterator.moveNext()));
      } else {
        buffer.write(dart.str`${iterator.current}`);
        while (dart.test(iterator.moveNext())) {
          buffer.write(separator);
          buffer.write(dart.str`${iterator.current}`);
        }
      }
      return buffer.toString();
    }
    any(test) {
      for (let element of this) {
        if (dart.test(test(element))) return true;
      }
      return false;
    }
    take(n) {
      return TakeIterableOfE().new(this, n);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE())(this, test);
    }
    skip(n) {
      return SkipIterableOfE().new(this, n);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE())(this, test);
    }
    get first() {
      let it = this.iterator;
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      return it.current;
    }
    get last() {
      let it = this.iterator;
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = null;
      do {
        result = it.current;
      } while (dart.test(it.moveNext()));
      return result;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      for (let element of this) {
        if (dart.test(test(element))) return element;
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test) {
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          if (foundMatching) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
      core.RangeError.checkNotNegative(index, "index");
      let elementIndex = 0;
      for (let element of this) {
        if (index == elementIndex) return element;
        elementIndex++;
      }
      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
    }
  }
  dart.addTypeTests(SetMixin);
  SetMixin[dart.implements] = () => [SetOfE()];
  dart.setSignature(SetMixin, {
    getters: () => ({
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      single: dart.definiteFunctionType(E, []),
      first: dart.definiteFunctionType(E, []),
      last: dart.definiteFunctionType(E, [])
    }),
    methods: () => ({
      clear: dart.definiteFunctionType(dart.void, []),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
      retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
      union: dart.definiteFunctionType(core.Set$(E), [SetOfE()]),
      intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
      difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
      every: dart.definiteFunctionType(core.bool, [ETobool()]),
      join: dart.definiteFunctionType(core.String, [], [core.String]),
      any: dart.definiteFunctionType(core.bool, [ETobool()]),
      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
      elementAt: dart.definiteFunctionType(E, [core.int])
    })
  });
  dart.defineExtensionMembers(SetMixin, [
    'toList',
    'map',
    'toString',
    'where',
    'expand',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'isEmpty',
    'isNotEmpty',
    'single',
    'first',
    'last'
  ]);
  return SetMixin;
});
collection.SetMixin = SetMixin();
collection.SetBase$ = dart.generic(E => {
  class SetBase extends collection.SetMixin$(E) {
    static setToString(set) {
      return collection.IterableBase.iterableToFullString(set, '{', '}');
    }
  }
  dart.setSignature(SetBase, {
    statics: () => ({setToString: dart.definiteFunctionType(core.String, [core.Set])}),
    names: ['setToString']
  });
  return SetBase;
});
collection.SetBase = SetBase();
collection._HashSetBase$ = dart.generic(E => {
  class _HashSetBase extends collection.SetBase$(E) {
    difference(other) {
      let result = this[_newSet]();
      for (let element of this) {
        if (!dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    intersection(other) {
      let result = this[_newSet]();
      for (let element of this) {
        if (dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    toSet() {
      return (() => {
        let _ = this[_newSet]();
        _.addAll(this);
        return _;
      })();
    }
  }
  dart.setSignature(_HashSetBase, {
    methods: () => ({toSet: dart.definiteFunctionType(core.Set$(E), [])})
  });
  dart.defineExtensionMembers(_HashSetBase, ['toSet']);
  return _HashSetBase;
});
collection._HashSetBase = _HashSetBase();
collection._HashSet$ = dart.generic(E => {
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  let _HashSetIteratorOfE = () => (_HashSetIteratorOfE = dart.constFn(collection._HashSetIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
  class _HashSet extends collection._HashSetBase$(E) {
    new() {
      this[_length$1] = 0;
      this[_strings$] = null;
      this[_nums$] = null;
      this[_rest$] = null;
      this[_elements] = null;
    }
    [_newSet]() {
      return new (_HashSetOfE())();
    }
    get iterator() {
      return new (_HashSetIteratorOfE())(this, this[_computeElements]());
    }
    get length() {
      return this[_length$1];
    }
    get isEmpty() {
      return this[_length$1] == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    contains(object) {
      if (dart.test(collection._HashSet._isStringElement(object))) {
        let strings = this[_strings$];
        return strings == null ? false : collection._HashSet._hasTableEntry(strings, object);
      } else if (dart.test(collection._HashSet._isNumericElement(object))) {
        let nums = this[_nums$];
        return nums == null ? false : collection._HashSet._hasTableEntry(nums, object);
      } else {
        return this[_contains](object);
      }
    }
    [_contains](object) {
      let rest = this[_rest$];
      if (rest == null) return false;
      let bucket = this[_getBucket$](rest, object);
      return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
    }
    lookup(object) {
      if (dart.test(collection._HashSet._isStringElement(object)) || dart.test(collection._HashSet._isNumericElement(object))) {
        return E._check(dart.test(this.contains(object)) ? object : null);
      }
      return this[_lookup](object);
    }
    [_lookup](object) {
      let rest = this[_rest$];
      if (rest == null) return null;
      let bucket = this[_getBucket$](rest, object);
      let index = this[_findBucketIndex](bucket, object);
      if (dart.notNull(index) < 0) return null;
      return bucket[dartx._get](index);
    }
    add(element) {
      E._check(element);
      if (dart.test(collection._HashSet._isStringElement(element))) {
        let strings = this[_strings$];
        if (strings == null) this[_strings$] = strings = collection._HashSet._newHashTable();
        return this[_addHashTableEntry$](strings, element);
      } else if (dart.test(collection._HashSet._isNumericElement(element))) {
        let nums = this[_nums$];
        if (nums == null) this[_nums$] = nums = collection._HashSet._newHashTable();
        return this[_addHashTableEntry$](nums, element);
      } else {
        return this[_add$0](element);
      }
    }
    [_add$0](element) {
      E._check(element);
      let rest = this[_rest$];
      if (rest == null) this[_rest$] = rest = collection._HashSet._newHashTable();
      let hash = this[_computeHashCode](element);
      let bucket = rest[hash];
      if (bucket == null) {
        collection._HashSet._setTableEntry(rest, hash, [element]);
      } else {
        let index = this[_findBucketIndex](bucket, element);
        if (dart.notNull(index) >= 0) return false;
        bucket.push(element);
      }
      this[_length$1] = dart.notNull(this[_length$1]) + 1;
      this[_elements] = null;
      return true;
    }
    addAll(objects) {
      IterableOfE()._check(objects);
      for (let each of objects) {
        this.add(each);
      }
    }
    remove(object) {
      if (dart.test(collection._HashSet._isStringElement(object))) {
        return this[_removeHashTableEntry$](this[_strings$], object);
      } else if (dart.test(collection._HashSet._isNumericElement(object))) {
        return this[_removeHashTableEntry$](this[_nums$], object);
      } else {
        return this[_remove](object);
      }
    }
    [_remove](object) {
      let rest = this[_rest$];
      if (rest == null) return false;
      let bucket = this[_getBucket$](rest, object);
      let index = this[_findBucketIndex](bucket, object);
      if (dart.notNull(index) < 0) return false;
      this[_length$1] = dart.notNull(this[_length$1]) - 1;
      this[_elements] = null;
      bucket.splice(index, 1);
      return true;
    }
    clear() {
      if (dart.notNull(this[_length$1]) > 0) {
        this[_strings$] = this[_nums$] = this[_rest$] = this[_elements] = null;
        this[_length$1] = 0;
      }
    }
    [_computeElements]() {
      if (this[_elements] != null) return this[_elements];
      let result = ListOfE().new(this[_length$1]);
      let index = 0;
      let strings = this[_strings$];
      if (strings != null) {
        let names = Object.getOwnPropertyNames(strings);
        let entries = names.length;
        for (let i = 0; i < entries; i++) {
          let element = names[i];
          result[index] = element;
          index++;
        }
      }
      let nums = this[_nums$];
      if (nums != null) {
        let names = Object.getOwnPropertyNames(nums);
        let entries = names.length;
        for (let i = 0; i < entries; i++) {
          let element = +names[i];
          result[index] = element;
          index++;
        }
      }
      let rest = this[_rest$];
      if (rest != null) {
        let names = Object.getOwnPropertyNames(rest);
        let entries = names.length;
        for (let i = 0; i < entries; i++) {
          let entry = names[i];
          let bucket = rest[entry];
          let length = bucket.length;
          for (let i = 0; i < length; i++) {
            result[index] = bucket[i];
            index++;
          }
        }
      }
      dart.assert(index == this[_length$1]);
      return this[_elements] = result;
    }
    [_addHashTableEntry$](table, element) {
      E._check(element);
      if (dart.test(collection._HashSet._hasTableEntry(table, element))) return false;
      collection._HashSet._setTableEntry(table, element, 0);
      this[_length$1] = dart.notNull(this[_length$1]) + 1;
      this[_elements] = null;
      return true;
    }
    [_removeHashTableEntry$](table, element) {
      if (table != null && dart.test(collection._HashSet._hasTableEntry(table, element))) {
        collection._HashSet._deleteTableEntry(table, element);
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_elements] = null;
        return true;
      } else {
        return false;
      }
    }
    static _isStringElement(element) {
      return typeof element == 'string' && element != '__proto__';
    }
    static _isNumericElement(element) {
      return typeof element == 'number' && (element & 0x3ffffff) === element;
    }
    [_computeHashCode](element) {
      return dart.hashCode(element) & 0x3ffffff;
    }
    static _hasTableEntry(table, key) {
      let entry = table[key];
      return entry != null;
    }
    static _setTableEntry(table, key, value) {
      dart.assert(value != null);
      table[key] = value;
    }
    static _deleteTableEntry(table, key) {
      delete table[key];
    }
    [_getBucket$](table, element) {
      let hash = this[_computeHashCode](element);
      return table[hash];
    }
    [_findBucketIndex](bucket, element) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        if (dart.equals(bucket[i], element)) return i;
      }
      return -1;
    }
    static _newHashTable() {
      let table = Object.create(null);
      let temporaryKey = '<non-identifier-key>';
      collection._HashSet._setTableEntry(table, temporaryKey, table);
      collection._HashSet._deleteTableEntry(table, temporaryKey);
      return table;
    }
  }
  _HashSet[dart.implements] = () => [HashSetOfE()];
  dart.setSignature(_HashSet, {
    constructors: () => ({new: dart.definiteFunctionType(collection._HashSet$(E), [])}),
    fields: () => ({
      [_length$1]: core.int,
      [_strings$]: dart.dynamic,
      [_nums$]: dart.dynamic,
      [_rest$]: dart.dynamic,
      [_elements]: ListOfE()
    }),
    getters: () => ({
      iterator: dart.definiteFunctionType(core.Iterator$(E), []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
      contains: dart.definiteFunctionType(core.bool, [core.Object]),
      [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
      lookup: dart.definiteFunctionType(E, [core.Object]),
      [_lookup]: dart.definiteFunctionType(E, [core.Object]),
      add: dart.definiteFunctionType(core.bool, [E]),
      [_add$0]: dart.definiteFunctionType(core.bool, [E]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
      [_computeElements]: dart.definiteFunctionType(core.List$(E), []),
      [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
      [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
      [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
      [_getBucket$]: dart.definiteFunctionType(core.List$(E), [dart.dynamic, dart.dynamic]),
      [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
    }),
    statics: () => ({
      _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
    }),
    names: ['_isStringElement', '_isNumericElement', '_hasTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
  });
  dart.defineExtensionMembers(_HashSet, [
    'contains',
    'iterator',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  return _HashSet;
});
collection._HashSet = _HashSet();
collection._IdentityHashSet$ = dart.generic(E => {
  let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
  class _IdentityHashSet extends collection._HashSet$(E) {
    new() {
      super.new();
    }
    [_newSet]() {
      return new (_IdentityHashSetOfE())();
    }
    [_computeHashCode](key) {
      return core.identityHashCode(key) & 0x3ffffff;
    }
    [_findBucketIndex](bucket, element) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        if (core.identical(bucket[i], element)) return i;
      }
      return -1;
    }
  }
  return _IdentityHashSet;
});
collection._IdentityHashSet = _IdentityHashSet();
const _equality = Symbol('_equality');
const _hasher = Symbol('_hasher');
collection._CustomHashSet$ = dart.generic(E => {
  let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
  let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
  let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
  class _CustomHashSet extends collection._HashSet$(E) {
    new(equality, hasher, validKey) {
      this[_equality] = equality;
      this[_hasher] = hasher;
      this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
      super.new();
    }
    [_newSet]() {
      return new (_CustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
    }
    [_findBucketIndex](bucket, element) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        if (dart.test(this[_equality](bucket[i], E._check(element)))) return i;
      }
      return -1;
    }
    [_computeHashCode](element) {
      return this[_hasher](E._check(element)) & 0x3ffffff;
    }
    add(object) {
      E._check(object);
      return super[_add$0](object);
    }
    contains(object) {
      if (!dart.test(this[_validKey](object))) return false;
      return super[_contains](object);
    }
    lookup(object) {
      if (!dart.test(this[_validKey](object))) return null;
      return super[_lookup](object);
    }
    remove(object) {
      if (!dart.test(this[_validKey](object))) return false;
      return super[_remove](object);
    }
  }
  dart.setSignature(_CustomHashSet, {
    constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
    fields: () => ({
      [_equality]: _EqualityOfE(),
      [_hasher]: _HasherOfE(),
      [_validKey]: _PredicateOfObject()
    })
  });
  dart.defineExtensionMembers(_CustomHashSet, ['contains']);
  return _CustomHashSet;
});
collection._CustomHashSet = _CustomHashSet();
collection._HashSetIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  class _HashSetIterator extends core.Object {
    new(set, elements) {
      this[_set] = set;
      this[_elements] = elements;
      this[_offset] = 0;
      this[_current$2] = null;
    }
    get current() {
      return this[_current$2];
    }
    moveNext() {
      let elements = this[_elements];
      let offset = this[_offset];
      if (elements !== dart.dload(this[_set], _elements)) {
        dart.throw(new core.ConcurrentModificationError(this[_set]));
      } else if (dart.notNull(offset) >= elements.length) {
        this[_current$2] = null;
        return false;
      } else {
        this[_current$2] = elements[offset];
        this[_offset] = dart.notNull(offset) + 1;
        return true;
      }
    }
  }
  dart.addTypeTests(_HashSetIterator);
  _HashSetIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_HashSetIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._HashSetIterator$(E), [dart.dynamic, ListOfE()])}),
    fields: () => ({
      [_set]: dart.dynamic,
      [_elements]: ListOfE(),
      [_offset]: core.int,
      [_current$2]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _HashSetIterator;
});
collection._HashSetIterator = _HashSetIterator();
const _first$ = Symbol('_first');
const _last$ = Symbol('_last');
const _unsupported = Symbol('_unsupported');
const _getTableEntry = Symbol('_getTableEntry');
const _element = Symbol('_element');
const _newLinkedCell$ = Symbol('_newLinkedCell');
const _unlinkCell$ = Symbol('_unlinkCell');
const _filterWhere = Symbol('_filterWhere');
const _previous$0 = Symbol('_previous');
collection._LinkedHashSet$ = dart.generic(E => {
  let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
  let _LinkedHashSetIteratorOfE = () => (_LinkedHashSetIteratorOfE = dart.constFn(collection._LinkedHashSetIterator$(E)))();
  let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  class _LinkedHashSet extends collection._HashSetBase$(E) {
    new() {
      this[_length$1] = 0;
      this[_strings$] = null;
      this[_nums$] = null;
      this[_rest$] = null;
      this[_first$] = null;
      this[_last$] = null;
      this[_modifications$] = 0;
    }
    [_newSet]() {
      return new (_LinkedHashSetOfE())();
    }
    [_unsupported](operation) {
      dart.throw(dart.str`LinkedHashSet: unsupported ${operation}`);
    }
    get iterator() {
      return new (_LinkedHashSetIteratorOfE())(this, this[_modifications$]);
    }
    get length() {
      return this[_length$1];
    }
    get isEmpty() {
      return this[_length$1] == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    contains(object) {
      if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
        let strings = this[_strings$];
        if (strings == null) return false;
        let cell = this[_getTableEntry](strings, object);
        return cell != null;
      } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
        let nums = this[_nums$];
        if (nums == null) return false;
        let cell = this[_getTableEntry](nums, object);
        return cell != null;
      } else {
        return this[_contains](object);
      }
    }
    [_contains](object) {
      let rest = this[_rest$];
      if (rest == null) return false;
      let bucket = this[_getBucket$](rest, object);
      return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
    }
    lookup(object) {
      if (dart.test(collection._LinkedHashSet._isStringElement(object)) || dart.test(collection._LinkedHashSet._isNumericElement(object))) {
        return E._check(dart.test(this.contains(object)) ? object : null);
      } else {
        return this[_lookup](object);
      }
    }
    [_lookup](object) {
      let rest = this[_rest$];
      if (rest == null) return null;
      let bucket = this[_getBucket$](rest, object);
      let index = this[_findBucketIndex](bucket, object);
      if (dart.notNull(index) < 0) return null;
      return bucket[dartx._get](index)[_element];
    }
    forEach(action) {
      let cell = this[_first$];
      let modifications = this[_modifications$];
      while (cell != null) {
        action(cell[_element]);
        if (modifications != this[_modifications$]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        cell = cell[_next$0];
      }
    }
    get first() {
      if (this[_first$] == null) dart.throw(new core.StateError("No elements"));
      return this[_first$][_element];
    }
    get last() {
      if (this[_last$] == null) dart.throw(new core.StateError("No elements"));
      return this[_last$][_element];
    }
    add(element) {
      E._check(element);
      if (dart.test(collection._LinkedHashSet._isStringElement(element))) {
        let strings = this[_strings$];
        if (strings == null) this[_strings$] = strings = collection._LinkedHashSet._newHashTable();
        return this[_addHashTableEntry$](strings, element);
      } else if (dart.test(collection._LinkedHashSet._isNumericElement(element))) {
        let nums = this[_nums$];
        if (nums == null) this[_nums$] = nums = collection._LinkedHashSet._newHashTable();
        return this[_addHashTableEntry$](nums, element);
      } else {
        return this[_add$0](element);
      }
    }
    [_add$0](element) {
      E._check(element);
      let rest = this[_rest$];
      if (rest == null) this[_rest$] = rest = collection._LinkedHashSet._newHashTable();
      let hash = this[_computeHashCode](element);
      let bucket = rest[hash];
      if (bucket == null) {
        let cell = this[_newLinkedCell$](element);
        collection._LinkedHashSet._setTableEntry(rest, hash, [cell]);
      } else {
        let index = this[_findBucketIndex](bucket, element);
        if (dart.notNull(index) >= 0) return false;
        let cell = this[_newLinkedCell$](element);
        bucket.push(cell);
      }
      return true;
    }
    remove(object) {
      if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
        return this[_removeHashTableEntry$](this[_strings$], object);
      } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
        return this[_removeHashTableEntry$](this[_nums$], object);
      } else {
        return this[_remove](object);
      }
    }
    [_remove](object) {
      let rest = this[_rest$];
      if (rest == null) return false;
      let bucket = this[_getBucket$](rest, object);
      let index = this[_findBucketIndex](bucket, object);
      if (dart.notNull(index) < 0) return false;
      let cell = bucket.splice(index, 1)[0];
      this[_unlinkCell$](cell);
      return true;
    }
    removeWhere(test) {
      this[_filterWhere](test, true);
    }
    retainWhere(test) {
      this[_filterWhere](test, false);
    }
    [_filterWhere](test, removeMatching) {
      let cell = this[_first$];
      while (cell != null) {
        let element = cell[_element];
        let next = cell[_next$0];
        let modifications = this[_modifications$];
        let shouldRemove = removeMatching == test(element);
        if (modifications != this[_modifications$]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        if (shouldRemove) this.remove(element);
        cell = next;
      }
    }
    clear() {
      if (dart.notNull(this[_length$1]) > 0) {
        this[_strings$] = this[_nums$] = this[_rest$] = this[_first$] = this[_last$] = null;
        this[_length$1] = 0;
        this[_modified$]();
      }
    }
    [_addHashTableEntry$](table, element) {
      E._check(element);
      let cell = this[_getTableEntry](table, element);
      if (cell != null) return false;
      collection._LinkedHashSet._setTableEntry(table, element, this[_newLinkedCell$](element));
      return true;
    }
    [_removeHashTableEntry$](table, element) {
      if (table == null) return false;
      let cell = this[_getTableEntry](table, element);
      if (cell == null) return false;
      this[_unlinkCell$](cell);
      collection._LinkedHashSet._deleteTableEntry(table, element);
      return true;
    }
    [_modified$]() {
      this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
    }
    [_newLinkedCell$](element) {
      E._check(element);
      let cell = new (_LinkedHashSetCellOfE())(element);
      if (this[_first$] == null) {
        this[_first$] = this[_last$] = cell;
      } else {
        let last = this[_last$];
        cell[_previous$0] = last;
        this[_last$] = last[_next$0] = cell;
      }
      this[_length$1] = dart.notNull(this[_length$1]) + 1;
      this[_modified$]();
      return cell;
    }
    [_unlinkCell$](cell) {
      _LinkedHashSetCellOfE()._check(cell);
      let previous = cell[_previous$0];
      let next = cell[_next$0];
      if (previous == null) {
        dart.assert(dart.equals(cell, this[_first$]));
        this[_first$] = next;
      } else {
        previous[_next$0] = next;
      }
      if (next == null) {
        dart.assert(dart.equals(cell, this[_last$]));
        this[_last$] = previous;
      } else {
        next[_previous$0] = previous;
      }
      this[_length$1] = dart.notNull(this[_length$1]) - 1;
      this[_modified$]();
    }
    static _isStringElement(element) {
      return typeof element == 'string' && element != '__proto__';
    }
    static _isNumericElement(element) {
      return typeof element == 'number' && (element & 0x3ffffff) === element;
    }
    [_computeHashCode](element) {
      return dart.hashCode(element) & 0x3ffffff;
    }
    [_getTableEntry](table, key) {
      return table[key];
    }
    static _setTableEntry(table, key, value) {
      dart.assert(value != null);
      table[key] = value;
    }
    static _deleteTableEntry(table, key) {
      delete table[key];
    }
    [_getBucket$](table, element) {
      let hash = this[_computeHashCode](element);
      return table[hash];
    }
    [_findBucketIndex](bucket, element) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        let cell = bucket[i];
        if (dart.equals(cell[_element], element)) return i;
      }
      return -1;
    }
    static _newHashTable() {
      let table = Object.create(null);
      let temporaryKey = '<non-identifier-key>';
      collection._LinkedHashSet._setTableEntry(table, temporaryKey, table);
      collection._LinkedHashSet._deleteTableEntry(table, temporaryKey);
      return table;
    }
  }
  _LinkedHashSet[dart.implements] = () => [LinkedHashSetOfE()];
  dart.setSignature(_LinkedHashSet, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSet$(E), [])}),
    fields: () => ({
      [_length$1]: core.int,
      [_strings$]: dart.dynamic,
      [_nums$]: dart.dynamic,
      [_rest$]: dart.dynamic,
      [_first$]: _LinkedHashSetCellOfE(),
      [_last$]: _LinkedHashSetCellOfE(),
      [_modifications$]: core.int
    }),
    getters: () => ({
      iterator: dart.definiteFunctionType(core.Iterator$(E), []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
      [_unsupported]: dart.definiteFunctionType(dart.void, [core.String]),
      contains: dart.definiteFunctionType(core.bool, [core.Object]),
      [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
      lookup: dart.definiteFunctionType(E, [core.Object]),
      [_lookup]: dart.definiteFunctionType(E, [core.Object]),
      add: dart.definiteFunctionType(core.bool, [E]),
      [_add$0]: dart.definiteFunctionType(core.bool, [E]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
      [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
      [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
      [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
      [_modified$]: dart.definiteFunctionType(dart.void, []),
      [_newLinkedCell$]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E]),
      [_unlinkCell$]: dart.definiteFunctionType(dart.void, [_LinkedHashSetCellOfE()]),
      [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
      [_getTableEntry]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [dart.dynamic, dart.dynamic]),
      [_getBucket$]: dart.definiteFunctionType(core.List$(collection._LinkedHashSetCell$(E)), [dart.dynamic, dart.dynamic]),
      [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
    }),
    statics: () => ({
      _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
    }),
    names: ['_isStringElement', '_isNumericElement', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
  });
  dart.defineExtensionMembers(_LinkedHashSet, [
    'contains',
    'forEach',
    'iterator',
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last'
  ]);
  return _LinkedHashSet;
});
collection._LinkedHashSet = _LinkedHashSet();
collection._LinkedIdentityHashSet$ = dart.generic(E => {
  let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
  class _LinkedIdentityHashSet extends collection._LinkedHashSet$(E) {
    new() {
      super.new();
    }
    [_newSet]() {
      return new (_LinkedIdentityHashSetOfE())();
    }
    [_computeHashCode](key) {
      return core.identityHashCode(key) & 0x3ffffff;
    }
    [_findBucketIndex](bucket, element) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        let cell = bucket[i];
        if (core.identical(cell[_element], element)) return i;
      }
      return -1;
    }
  }
  return _LinkedIdentityHashSet;
});
collection._LinkedIdentityHashSet = _LinkedIdentityHashSet();
collection._LinkedCustomHashSet$ = dart.generic(E => {
  let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
  let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
  let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
  class _LinkedCustomHashSet extends collection._LinkedHashSet$(E) {
    new(equality, hasher, validKey) {
      this[_equality] = equality;
      this[_hasher] = hasher;
      this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
      super.new();
    }
    [_newSet]() {
      return new (_LinkedCustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
    }
    [_findBucketIndex](bucket, element) {
      if (bucket == null) return -1;
      let length = bucket.length;
      for (let i = 0; i < length; i++) {
        let cell = bucket[i];
        if (dart.test(this[_equality](cell[_element], E._check(element)))) return i;
      }
      return -1;
    }
    [_computeHashCode](element) {
      return this[_hasher](E._check(element)) & 0x3ffffff;
    }
    add(element) {
      E._check(element);
      return super[_add$0](element);
    }
    contains(object) {
      if (!dart.test(this[_validKey](object))) return false;
      return super[_contains](object);
    }
    lookup(object) {
      if (!dart.test(this[_validKey](object))) return null;
      return super[_lookup](object);
    }
    remove(object) {
      if (!dart.test(this[_validKey](object))) return false;
      return super[_remove](object);
    }
    containsAll(elements) {
      for (let element of elements) {
        if (!dart.test(this[_validKey](element)) || !dart.test(this.contains(element))) return false;
      }
      return true;
    }
    removeAll(elements) {
      for (let element of elements) {
        if (dart.test(this[_validKey](element))) {
          super[_remove](element);
        }
      }
    }
  }
  dart.setSignature(_LinkedCustomHashSet, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
    fields: () => ({
      [_equality]: _EqualityOfE(),
      [_hasher]: _HasherOfE(),
      [_validKey]: _PredicateOfObject()
    })
  });
  dart.defineExtensionMembers(_LinkedCustomHashSet, ['contains']);
  return _LinkedCustomHashSet;
});
collection._LinkedCustomHashSet = _LinkedCustomHashSet();
collection._LinkedHashSetCell$ = dart.generic(E => {
  let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
  class _LinkedHashSetCell extends core.Object {
    new(element) {
      this[_element] = element;
      this[_next$0] = null;
      this[_previous$0] = null;
    }
  }
  dart.addTypeTests(_LinkedHashSetCell);
  dart.setSignature(_LinkedHashSetCell, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
    fields: () => ({
      [_element]: E,
      [_next$0]: _LinkedHashSetCellOfE(),
      [_previous$0]: _LinkedHashSetCellOfE()
    })
  });
  return _LinkedHashSetCell;
});
collection._LinkedHashSetCell = _LinkedHashSetCell();
const _cell$ = Symbol('_cell');
collection._LinkedHashSetIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class _LinkedHashSetIterator extends core.Object {
    new(set, modifications) {
      this[_set] = set;
      this[_modifications$] = modifications;
      this[_cell$] = null;
      this[_current$2] = null;
      this[_cell$] = this[_set][_first$];
    }
    get current() {
      return this[_current$2];
    }
    moveNext() {
      if (this[_modifications$] != this[_set][_modifications$]) {
        dart.throw(new core.ConcurrentModificationError(this[_set]));
      } else if (this[_cell$] == null) {
        this[_current$2] = null;
        return false;
      } else {
        this[_current$2] = E._check(this[_cell$][_element]);
        this[_cell$] = this[_cell$][_next$0];
        return true;
      }
    }
  }
  dart.addTypeTests(_LinkedHashSetIterator);
  _LinkedHashSetIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_LinkedHashSetIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetIterator$(E), [collection._LinkedHashSet, core.int])}),
    fields: () => ({
      [_set]: collection._LinkedHashSet,
      [_modifications$]: core.int,
      [_cell$]: collection._LinkedHashSetCell,
      [_current$2]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _LinkedHashSetIterator;
});
collection._LinkedHashSetIterator = _LinkedHashSetIterator();
const _source$0 = Symbol('_source');
collection.UnmodifiableListView$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
    new(source) {
      this[_source$0] = source;
    }
    get length() {
      return this[_source$0][dartx.length];
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      return this[_source$0][dartx.elementAt](index);
    }
  }
  dart.setSignature(UnmodifiableListView, {
    constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
    fields: () => ({[_source$0]: IterableOfE()}),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({_get: dart.definiteFunctionType(E, [core.int])})
  });
  dart.defineExtensionMembers(UnmodifiableListView, ['_get', 'length']);
  return UnmodifiableListView;
});
collection.UnmodifiableListView = UnmodifiableListView();
collection._defaultEquals = function(a, b) {
  return dart.equals(a, b);
};
dart.lazyFn(collection._defaultEquals, () => dynamicAnddynamicTobool());
collection._defaultHashCode = function(a) {
  return dart.hashCode(a);
};
dart.fn(collection._defaultHashCode, dynamicToint());
collection._Equality$ = dart.generic(K => {
  const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [K, K]));
  return _Equality;
});
collection._Equality = _Equality$();
collection._Hasher$ = dart.generic(K => {
  const _Hasher = dart.typedef('_Hasher', () => dart.functionType(core.int, [K]));
  return _Hasher;
});
collection._Hasher = _Hasher();
collection.HashMap$ = dart.generic((K, V) => {
  let _HashMapOfK$V = () => (_HashMapOfK$V = dart.constFn(collection._HashMap$(K, V)))();
  let _IdentityHashMapOfK$V = () => (_IdentityHashMapOfK$V = dart.constFn(collection._IdentityHashMap$(K, V)))();
  let _CustomHashMapOfK$V = () => (_CustomHashMapOfK$V = dart.constFn(collection._CustomHashMap$(K, V)))();
  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
  let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
  class HashMap extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            return new (_HashMapOfK$V())();
          }
          hashCode = collection._defaultHashCode;
        } else {
          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
            return new (_IdentityHashMapOfK$V())();
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
      } else {
        if (hashCode == null) {
          hashCode = collection._defaultHashCode;
        }
        if (equals == null) {
          equals = collection._defaultEquals;
        }
      }
      return new (_CustomHashMapOfK$V())(equals, hashCode, isValidKey);
    }
    static identity() {
      return new (_IdentityHashMapOfK$V())();
    }
    static from(other) {
      let result = HashMapOfK$V().new();
      other[dartx.forEach](dart.fn((k, v) => {
        result._set(K.as(k), V.as(v));
      }, dynamicAnddynamicToNull()));
      return result;
    }
    static fromIterable(iterable, opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let map = HashMapOfK$V().new();
      collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
      return map;
    }
    static fromIterables(keys, values) {
      let map = HashMapOfK$V().new();
      collection.Maps._fillMapWithIterables(map, keys, values);
      return map;
    }
  }
  dart.addTypeTests(HashMap);
  HashMap[dart.implements] = () => [MapOfK$V()];
  dart.setSignature(HashMap, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.HashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
      identity: dart.definiteFunctionType(collection.HashMap$(K, V), []),
      from: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Map]),
      fromIterable: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
      fromIterables: dart.definiteFunctionType(collection.HashMap$(K, V), [IterableOfK(), IterableOfV()])
    })
  });
  return HashMap;
});
collection.HashMap = HashMap();
collection.HashSet$ = dart.generic(E => {
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
  let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
  let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
  class HashSet extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            return new (_HashSetOfE())();
          }
          hashCode = collection._defaultHashCode;
        } else {
          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
            return new (_IdentityHashSetOfE())();
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
      } else {
        if (hashCode == null) {
          hashCode = collection._defaultHashCode;
        }
        if (equals == null) {
          equals = collection._defaultEquals;
        }
      }
      return new (_CustomHashSetOfE())(equals, hashCode, isValidKey);
    }
    static identity() {
      return new (_IdentityHashSetOfE())();
    }
    static from(elements) {
      let result = HashSetOfE().new();
      for (let e of elements) {
        let element = E.as(e);
        result.add(element);
      }
      return result;
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
  }
  dart.addTypeTests(HashSet);
  HashSet[dart.implements] = () => [SetOfE()];
  dart.setSignature(HashSet, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.HashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
      identity: dart.definiteFunctionType(collection.HashSet$(E), []),
      from: dart.definiteFunctionType(collection.HashSet$(E), [core.Iterable])
    })
  });
  return HashSet;
});
collection.HashSet = HashSet();
collection.IterableMixin$ = dart.generic(E => {
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  class IterableMixin extends core.Object {
    map(T) {
      return f => {
        return _internal.MappedIterable$(E, T).new(this, f);
      };
    }
    where(f) {
      return new (WhereIterableOfE())(this, f);
    }
    expand(T) {
      return f => {
        return new (_internal.ExpandIterable$(E, T))(this, f);
      };
    }
    contains(element) {
      for (let e of this) {
        if (dart.equals(e, element)) return true;
      }
      return false;
    }
    forEach(f) {
      for (let element of this)
        f(element);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let value = iterator.current;
      while (dart.test(iterator.moveNext())) {
        value = combine(value, iterator.current);
      }
      return value;
    }
    fold(T) {
      return (initialValue, combine) => {
        let value = initialValue;
        for (let element of this)
          value = combine(value, element);
        return value;
      };
    }
    every(f) {
      for (let element of this) {
        if (!dart.test(f(element))) return false;
      }
      return true;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) return "";
      let buffer = new core.StringBuffer();
      if (separator == null || separator == "") {
        do {
          buffer.write(dart.str`${iterator.current}`);
        } while (dart.test(iterator.moveNext()));
      } else {
        buffer.write(dart.str`${iterator.current}`);
        while (dart.test(iterator.moveNext())) {
          buffer.write(separator);
          buffer.write(dart.str`${iterator.current}`);
        }
      }
      return buffer.toString();
    }
    any(f) {
      for (let element of this) {
        if (dart.test(f(element))) return true;
      }
      return false;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return ListOfE().from(this, {growable: growable});
    }
    toSet() {
      return SetOfE().from(this);
    }
    get length() {
      dart.assert(!_internal.EfficientLength.is(this));
      let count = 0;
      let it = this[dartx.iterator];
      while (dart.test(it.moveNext())) {
        count++;
      }
      return count;
    }
    get isEmpty() {
      return !dart.test(this[dartx.iterator].moveNext());
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    take(count) {
      return TakeIterableOfE().new(this, count);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE())(this, test);
    }
    skip(count) {
      return SkipIterableOfE().new(this, count);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE())(this, test);
    }
    get first() {
      let it = this[dartx.iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      return it.current;
    }
    get last() {
      let it = this[dartx.iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = null;
      do {
        result = it.current;
      } while (dart.test(it.moveNext()));
      return result;
    }
    get single() {
      let it = this[dartx.iterator];
      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
      let result = it.current;
      if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
      return result;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      for (let element of this) {
        if (dart.test(test(element))) return element;
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test) {
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          if (foundMatching) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
      core.RangeError.checkNotNegative(index, "index");
      let elementIndex = 0;
      for (let element of this) {
        if (index == elementIndex) return element;
        elementIndex++;
      }
      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
    }
    toString() {
      return collection.IterableBase.iterableToShortString(this, '(', ')');
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
  }
  dart.addTypeTests(IterableMixin);
  IterableMixin[dart.implements] = () => [IterableOfE()];
  dart.setSignature(IterableMixin, {
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      first: dart.definiteFunctionType(E, []),
      last: dart.definiteFunctionType(E, []),
      single: dart.definiteFunctionType(E, [])
    }),
    methods: () => ({
      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
      contains: dart.definiteFunctionType(core.bool, [core.Object]),
      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
      every: dart.definiteFunctionType(core.bool, [ETobool()]),
      join: dart.definiteFunctionType(core.String, [], [core.String]),
      any: dart.definiteFunctionType(core.bool, [ETobool()]),
      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
      toSet: dart.definiteFunctionType(core.Set$(E), []),
      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
      elementAt: dart.definiteFunctionType(E, [core.int])
    })
  });
  dart.defineExtensionMembers(IterableMixin, [
    'map',
    'where',
    'expand',
    'contains',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'toList',
    'toSet',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'toString',
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single'
  ]);
  return IterableMixin;
});
collection.IterableMixin = IterableMixin();
dart.defineLazy(collection, {
  get _toStringVisiting() {
    return [];
  }
});
collection._isToStringVisiting = function(o) {
  for (let i = 0; i < dart.notNull(collection._toStringVisiting[dartx.length]); i++) {
    if (core.identical(o, collection._toStringVisiting[dartx._get](i))) return true;
  }
  return false;
};
dart.lazyFn(collection._isToStringVisiting, () => ObjectTobool());
collection._iterablePartsToStrings = function(iterable, parts) {
  let LENGTH_LIMIT = 80;
  let HEAD_COUNT = 3;
  let TAIL_COUNT = 2;
  let MAX_COUNT = 100;
  let OVERHEAD = 2;
  let ELLIPSIS_SIZE = 3;
  let length = 0;
  let count = 0;
  let it = iterable[dartx.iterator];
  while (dart.notNull(length) < LENGTH_LIMIT || count < HEAD_COUNT) {
    if (!dart.test(it.moveNext())) return;
    let next = dart.str`${it.current}`;
    parts[dartx.add](next);
    length = dart.notNull(length) + (dart.notNull(next[dartx.length]) + OVERHEAD);
    count++;
  }
  let penultimateString = null;
  let ultimateString = null;
  let penultimate = null;
  let ultimate = null;
  if (!dart.test(it.moveNext())) {
    if (count <= HEAD_COUNT + TAIL_COUNT) return;
    ultimateString = core.String._check(parts[dartx.removeLast]());
    penultimateString = core.String._check(parts[dartx.removeLast]());
  } else {
    penultimate = it.current;
    count++;
    if (!dart.test(it.moveNext())) {
      if (count <= HEAD_COUNT + 1) {
        parts[dartx.add](dart.str`${penultimate}`);
        return;
      }
      ultimateString = dart.str`${penultimate}`;
      penultimateString = core.String._check(parts[dartx.removeLast]());
      length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + OVERHEAD);
    } else {
      ultimate = it.current;
      count++;
      dart.assert(count < MAX_COUNT);
      while (dart.test(it.moveNext())) {
        penultimate = ultimate;
        ultimate = it.current;
        count++;
        if (count > MAX_COUNT) {
          while (dart.notNull(length) > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD && count > HEAD_COUNT) {
            length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
            count--;
          }
          parts[dartx.add]("...");
          return;
        }
      }
      penultimateString = dart.str`${penultimate}`;
      ultimateString = dart.str`${ultimate}`;
      length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + dart.notNull(penultimateString[dartx.length]) + 2 * OVERHEAD);
    }
  }
  let elision = null;
  if (count > dart.notNull(parts[dartx.length]) + TAIL_COUNT) {
    elision = "...";
    length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
  }
  while (dart.notNull(length) > LENGTH_LIMIT && dart.notNull(parts[dartx.length]) > HEAD_COUNT) {
    length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
    if (elision == null) {
      elision = "...";
      length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
    }
  }
  if (elision != null) {
    parts[dartx.add](elision);
  }
  parts[dartx.add](penultimateString);
  parts[dartx.add](ultimateString);
};
dart.lazyFn(collection._iterablePartsToStrings, () => IterableAndListTovoid());
const _iterator$0 = Symbol('_iterator');
const _state$ = Symbol('_state');
const _move = Symbol('_move');
collection.HasNextIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class HasNextIterator extends core.Object {
    new(iterator) {
      this[_iterator$0] = iterator;
      this[_state$] = collection.HasNextIterator._NOT_MOVED_YET;
    }
    get hasNext() {
      if (this[_state$] == collection.HasNextIterator._NOT_MOVED_YET) this[_move]();
      return this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
    }
    next() {
      if (!dart.test(this.hasNext)) dart.throw(new core.StateError("No more elements"));
      dart.assert(this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT);
      let result = this[_iterator$0].current;
      this[_move]();
      return result;
    }
    [_move]() {
      if (dart.test(this[_iterator$0].moveNext())) {
        this[_state$] = collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
      } else {
        this[_state$] = collection.HasNextIterator._NO_NEXT;
      }
    }
  }
  dart.addTypeTests(HasNextIterator);
  dart.setSignature(HasNextIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection.HasNextIterator$(E), [IteratorOfE()])}),
    fields: () => ({
      [_iterator$0]: IteratorOfE(),
      [_state$]: core.int
    }),
    getters: () => ({hasNext: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      next: dart.definiteFunctionType(E, []),
      [_move]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      _HAS_NEXT_AND_NEXT_IN_CURRENT: core.int,
      _NO_NEXT: core.int,
      _NOT_MOVED_YET: core.int
    })
  });
  return HasNextIterator;
});
collection.HasNextIterator = HasNextIterator();
collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT = 0;
collection.HasNextIterator._NO_NEXT = 1;
collection.HasNextIterator._NOT_MOVED_YET = 2;
collection.LinkedHashMap$ = dart.generic((K, V) => {
  let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
  let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
  let _LinkedCustomHashMapOfK$V = () => (_LinkedCustomHashMapOfK$V = dart.constFn(collection._LinkedCustomHashMap$(K, V)))();
  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
  let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
  let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
  class LinkedHashMap extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            return JsLinkedHashMapOfK$V().es6();
          }
          hashCode = collection._defaultHashCode;
        } else {
          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
            return _LinkedIdentityHashMapOfK$V().es6();
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
      } else {
        if (hashCode == null) {
          hashCode = collection._defaultHashCode;
        }
        if (equals == null) {
          equals = collection._defaultEquals;
        }
      }
      return new (_LinkedCustomHashMapOfK$V())(equals, hashCode, isValidKey);
    }
    static identity() {
      return _LinkedIdentityHashMapOfK$V().es6();
    }
    static from(other) {
      let result = LinkedHashMapOfK$V().new();
      other[dartx.forEach](dart.fn((k, v) => {
        result._set(K.as(k), V.as(v));
      }, dynamicAnddynamicToNull()));
      return result;
    }
    static fromIterable(iterable, opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let map = LinkedHashMapOfK$V().new();
      collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
      return map;
    }
    static fromIterables(keys, values) {
      let map = LinkedHashMapOfK$V().new();
      collection.Maps._fillMapWithIterables(map, keys, values);
      return map;
    }
  }
  dart.addTypeTests(LinkedHashMap);
  LinkedHashMap[dart.implements] = () => [HashMapOfK$V()];
  dart.setSignature(LinkedHashMap, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
      identity: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), []),
      from: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Map]),
      fromIterable: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
      fromIterables: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [IterableOfK(), IterableOfV()])
    })
  });
  return LinkedHashMap;
});
collection.LinkedHashMap = LinkedHashMap();
collection.LinkedHashSet$ = dart.generic(E => {
  let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
  let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
  let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
  let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
  let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
  class LinkedHashSet extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            return new (_LinkedHashSetOfE())();
          }
          hashCode = collection._defaultHashCode;
        } else {
          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
            return new (_LinkedIdentityHashSetOfE())();
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
      } else {
        if (hashCode == null) {
          hashCode = collection._defaultHashCode;
        }
        if (equals == null) {
          equals = collection._defaultEquals;
        }
      }
      return new (_LinkedCustomHashSetOfE())(equals, hashCode, isValidKey);
    }
    static identity() {
      return new (_LinkedIdentityHashSetOfE())();
    }
    static from(elements) {
      let result = LinkedHashSetOfE().new();
      for (let element of elements) {
        let e = E.as(element);
        result.add(e);
      }
      return result;
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
  }
  dart.addTypeTests(LinkedHashSet);
  LinkedHashSet[dart.implements] = () => [HashSetOfE()];
  dart.setSignature(LinkedHashSet, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.LinkedHashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
      identity: dart.definiteFunctionType(collection.LinkedHashSet$(E), []),
      from: dart.definiteFunctionType(collection.LinkedHashSet$(E), [core.Iterable])
    })
  });
  return LinkedHashSet;
});
collection.LinkedHashSet = LinkedHashSet();
const _modificationCount = Symbol('_modificationCount');
const _insertBefore$ = Symbol('_insertBefore');
const _list = Symbol('_list');
const _unlink$ = Symbol('_unlink');
collection.LinkedList$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  class LinkedList extends core.Iterable$(E) {
    new() {
      this[_modificationCount] = 0;
      this[_length$1] = 0;
      this[_first$] = null;
      super.new();
    }
    addFirst(entry) {
      E._check(entry);
      this[_insertBefore$](this[_first$], entry, {updateFirst: true});
      this[_first$] = entry;
    }
    add(entry) {
      E._check(entry);
      this[_insertBefore$](this[_first$], entry, {updateFirst: false});
    }
    addAll(entries) {
      IterableOfE()._check(entries);
      entries[dartx.forEach](dart.bind(this, 'add'));
    }
    remove(entry) {
      E._check(entry);
      if (!dart.equals(entry[_list], this)) return false;
      this[_unlink$](entry);
      return true;
    }
    get iterator() {
      return new (_LinkedListIteratorOfE())(this);
    }
    get length() {
      return this[_length$1];
    }
    clear() {
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      if (dart.test(this.isEmpty)) return;
      let next = this[_first$];
      do {
        let entry = next;
        next = entry[_next$0];
        entry[_next$0] = entry[_previous$0] = entry[_list] = null;
      } while (!core.identical(next, this[_first$]));
      this[_first$] = null;
      this[_length$1] = 0;
    }
    get first() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError('No such element'));
      }
      return this[_first$];
    }
    get last() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError('No such element'));
      }
      return this[_first$][_previous$0];
    }
    get single() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError('No such element'));
      }
      if (dart.notNull(this[_length$1]) > 1) {
        dart.throw(new core.StateError('Too many elements'));
      }
      return this[_first$];
    }
    forEach(action) {
      let modificationCount = this[_modificationCount];
      if (dart.test(this.isEmpty)) return;
      let current = this[_first$];
      do {
        action(current);
        if (modificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        current = current[_next$0];
      } while (!core.identical(current, this[_first$]));
    }
    get isEmpty() {
      return this[_length$1] == 0;
    }
    [_insertBefore$](entry, newEntry, opts) {
      E._check(entry);
      E._check(newEntry);
      let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
      if (newEntry.list != null) {
        dart.throw(new core.StateError('LinkedListEntry is already in a LinkedList'));
      }
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      newEntry[_list] = this;
      if (dart.test(this.isEmpty)) {
        dart.assert(entry == null);
        newEntry[_previous$0] = newEntry[_next$0] = newEntry;
        this[_first$] = newEntry;
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        return;
      }
      let predecessor = entry[_previous$0];
      let successor = entry;
      newEntry[_previous$0] = predecessor;
      newEntry[_next$0] = successor;
      predecessor[_next$0] = newEntry;
      successor[_previous$0] = newEntry;
      if (dart.test(updateFirst) && core.identical(entry, this[_first$])) {
        this[_first$] = newEntry;
      }
      this[_length$1] = dart.notNull(this[_length$1]) + 1;
    }
    [_unlink$](entry) {
      E._check(entry);
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      entry[_next$0][_previous$0] = entry[_previous$0];
      let next = entry[_previous$0][_next$0] = entry[_next$0];
      this[_length$1] = dart.notNull(this[_length$1]) - 1;
      entry[_list] = entry[_next$0] = entry[_previous$0] = null;
      if (dart.test(this.isEmpty)) {
        this[_first$] = null;
      } else if (core.identical(entry, this[_first$])) {
        this[_first$] = next;
      }
    }
  }
  dart.setSignature(LinkedList, {
    constructors: () => ({new: dart.definiteFunctionType(collection.LinkedList$(E), [])}),
    fields: () => ({
      [_modificationCount]: core.int,
      [_length$1]: core.int,
      [_first$]: E
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    methods: () => ({
      addFirst: dart.definiteFunctionType(dart.void, [E]),
      add: dart.definiteFunctionType(dart.void, [E]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      remove: dart.definiteFunctionType(core.bool, [E]),
      clear: dart.definiteFunctionType(dart.void, []),
      [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
      [_unlink$]: dart.definiteFunctionType(dart.void, [E])
    })
  });
  dart.defineExtensionMembers(LinkedList, [
    'forEach',
    'iterator',
    'length',
    'first',
    'last',
    'single',
    'isEmpty'
  ]);
  return LinkedList;
});
collection.LinkedList = LinkedList();
const _visitedFirst = Symbol('_visitedFirst');
collection._LinkedListIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
  let LinkedListEntryOfE = () => (LinkedListEntryOfE = dart.constFn(collection.LinkedListEntry$(E)))();
  class _LinkedListIterator extends core.Object {
    new(list) {
      this[_list] = list;
      this[_modificationCount] = list[_modificationCount];
      this[_next$0] = list[_first$];
      this[_visitedFirst] = false;
      this[_current$2] = null;
    }
    get current() {
      return this[_current$2];
    }
    moveNext() {
      if (this[_modificationCount] != this[_list][_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError(this));
      }
      if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
        this[_current$2] = null;
        return false;
      }
      this[_visitedFirst] = true;
      this[_current$2] = E._check(this[_next$0]);
      this[_next$0] = this[_next$0][_next$0];
      return true;
    }
  }
  dart.addTypeTests(_LinkedListIterator);
  _LinkedListIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_LinkedListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedListIterator$(E), [LinkedListOfE()])}),
    fields: () => ({
      [_list]: LinkedListOfE(),
      [_modificationCount]: core.int,
      [_current$2]: E,
      [_next$0]: LinkedListEntryOfE(),
      [_visitedFirst]: core.bool
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _LinkedListIterator;
});
collection._LinkedListIterator = _LinkedListIterator();
collection.LinkedListEntry$ = dart.generic(E => {
  let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
  class LinkedListEntry extends core.Object {
    new() {
      this[_list] = null;
      this[_next$0] = null;
      this[_previous$0] = null;
    }
    get list() {
      return this[_list];
    }
    unlink() {
      this[_list][_unlink$](E._check(this));
    }
    get next() {
      if (core.identical(this, this[_next$0])) return null;
      return this[_next$0];
    }
    get previous() {
      if (core.identical(this, this[_previous$0])) return null;
      return this[_previous$0];
    }
    insertAfter(entry) {
      E._check(entry);
      this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
    }
    insertBefore(entry) {
      E._check(entry);
      this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
    }
  }
  dart.addTypeTests(LinkedListEntry);
  dart.setSignature(LinkedListEntry, {
    fields: () => ({
      [_list]: LinkedListOfE(),
      [_next$0]: E,
      [_previous$0]: E
    }),
    getters: () => ({
      list: dart.definiteFunctionType(collection.LinkedList$(E), []),
      next: dart.definiteFunctionType(E, []),
      previous: dart.definiteFunctionType(E, [])
    }),
    methods: () => ({
      unlink: dart.definiteFunctionType(dart.void, []),
      insertAfter: dart.definiteFunctionType(dart.void, [E]),
      insertBefore: dart.definiteFunctionType(dart.void, [E])
    })
  });
  return LinkedListEntry;
});
collection.LinkedListEntry = LinkedListEntry();
collection.MapMixin$ = dart.generic((K, V) => {
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let _MapBaseValueIterableOfK$V = () => (_MapBaseValueIterableOfK$V = dart.constFn(collection._MapBaseValueIterable$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  class MapMixin extends core.Object {
    forEach(action) {
      for (let key of this.keys) {
        action(key, this._get(key));
      }
    }
    addAll(other) {
      MapOfK$V()._check(other);
      for (let key of other[dartx.keys]) {
        this._set(key, other[dartx._get](key));
      }
    }
    containsValue(value) {
      for (let key of this.keys) {
        if (dart.equals(this._get(key), value)) return true;
      }
      return false;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (dart.test(this.containsKey(key))) {
        return this._get(key);
      }
      return this._set(key, ifAbsent());
    }
    containsKey(key) {
      return this.keys[dartx.contains](key);
    }
    get length() {
      return this.keys[dartx.length];
    }
    get isEmpty() {
      return this.keys[dartx.isEmpty];
    }
    get isNotEmpty() {
      return this.keys[dartx.isNotEmpty];
    }
    get values() {
      return new (_MapBaseValueIterableOfK$V())(this);
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
  }
  dart.addTypeTests(MapMixin);
  MapMixin[dart.implements] = () => [MapOfK$V()];
  dart.setSignature(MapMixin, {
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      values: dart.definiteFunctionType(core.Iterable$(V), [])
    }),
    methods: () => ({
      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object])
    })
  });
  dart.defineExtensionMembers(MapMixin, [
    'forEach',
    'addAll',
    'containsValue',
    'putIfAbsent',
    'containsKey',
    'length',
    'isEmpty',
    'isNotEmpty',
    'values'
  ]);
  return MapMixin;
});
collection.MapMixin = MapMixin();
collection.MapBase$ = dart.generic((K, V) => {
  class MapBase extends dart.mixin(core.Object, collection.MapMixin$(K, V)) {}
  return MapBase;
});
collection.MapBase = MapBase();
collection._UnmodifiableMapMixin$ = dart.generic((K, V) => {
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  class _UnmodifiableMapMixin extends core.Object {
    _set(key, value) {
      K._check(key);
      V._check(value);
      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
    }
    clear() {
      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
    }
    remove(key) {
      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
    }
  }
  dart.addTypeTests(_UnmodifiableMapMixin);
  _UnmodifiableMapMixin[dart.implements] = () => [MapOfK$V()];
  dart.setSignature(_UnmodifiableMapMixin, {
    methods: () => ({
      _set: dart.definiteFunctionType(dart.void, [K, V]),
      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
      clear: dart.definiteFunctionType(dart.void, []),
      remove: dart.definiteFunctionType(V, [core.Object]),
      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()])
    })
  });
  dart.defineExtensionMembers(_UnmodifiableMapMixin, [
    '_set',
    'addAll',
    'clear',
    'remove',
    'putIfAbsent'
  ]);
  return _UnmodifiableMapMixin;
});
collection._UnmodifiableMapMixin = _UnmodifiableMapMixin();
collection.UnmodifiableMapBase$ = dart.generic((K, V) => {
  class UnmodifiableMapBase extends dart.mixin(collection.MapBase$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
    new() {
      super.new();
    }
  }
  return UnmodifiableMapBase;
});
collection.UnmodifiableMapBase = UnmodifiableMapBase();
collection._MapBaseValueIterable$ = dart.generic((K, V) => {
  let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  class _MapBaseValueIterable extends core.Iterable$(V) {
    new(map) {
      this[_map$0] = map;
      super.new();
    }
    get length() {
      return this[_map$0][dartx.length];
    }
    get isEmpty() {
      return this[_map$0][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map$0][dartx.isNotEmpty];
    }
    get first() {
      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.first]);
    }
    get single() {
      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.single]);
    }
    get last() {
      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.last]);
    }
    get iterator() {
      return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
    }
  }
  _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_MapBaseValueIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
    fields: () => ({[_map$0]: MapOfK$V()}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
  });
  dart.defineExtensionMembers(_MapBaseValueIterable, [
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'single',
    'last',
    'iterator'
  ]);
  return _MapBaseValueIterable;
});
collection._MapBaseValueIterable = _MapBaseValueIterable();
collection._MapBaseValueIterator$ = dart.generic((K, V) => {
  let IteratorOfK = () => (IteratorOfK = dart.constFn(core.Iterator$(K)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let IteratorOfV = () => (IteratorOfV = dart.constFn(core.Iterator$(V)))();
  class _MapBaseValueIterator extends core.Object {
    new(map) {
      this[_map$0] = map;
      this[_keys] = map[dartx.keys][dartx.iterator];
      this[_current$2] = null;
    }
    moveNext() {
      if (dart.test(this[_keys].moveNext())) {
        this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
        return true;
      }
      this[_current$2] = null;
      return false;
    }
    get current() {
      return this[_current$2];
    }
  }
  dart.addTypeTests(_MapBaseValueIterator);
  _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
  dart.setSignature(_MapBaseValueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
    fields: () => ({
      [_keys]: IteratorOfK(),
      [_map$0]: MapOfK$V(),
      [_current$2]: V
    }),
    getters: () => ({current: dart.definiteFunctionType(V, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _MapBaseValueIterator;
});
collection._MapBaseValueIterator = _MapBaseValueIterator();
collection.MapView$ = dart.generic((K, V) => {
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  class MapView extends core.Object {
    new(map) {
      this[_map$0] = map;
    }
    _get(key) {
      return this[_map$0][dartx._get](key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_map$0][dartx._set](key, value);
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      this[_map$0][dartx.addAll](other);
    }
    clear() {
      this[_map$0][dartx.clear]();
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      return this[_map$0][dartx.putIfAbsent](key, ifAbsent);
    }
    containsKey(key) {
      return this[_map$0][dartx.containsKey](key);
    }
    containsValue(value) {
      return this[_map$0][dartx.containsValue](value);
    }
    forEach(action) {
      this[_map$0][dartx.forEach](action);
    }
    get isEmpty() {
      return this[_map$0][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map$0][dartx.isNotEmpty];
    }
    get length() {
      return this[_map$0][dartx.length];
    }
    get keys() {
      return this[_map$0][dartx.keys];
    }
    remove(key) {
      return this[_map$0][dartx.remove](key);
    }
    toString() {
      return dart.toString(this[_map$0]);
    }
    get values() {
      return this[_map$0][dartx.values];
    }
  }
  dart.addTypeTests(MapView);
  MapView[dart.implements] = () => [MapOfK$V()];
  dart.setSignature(MapView, {
    constructors: () => ({new: dart.definiteFunctionType(collection.MapView$(K, V), [MapOfK$V()])}),
    fields: () => ({[_map$0]: MapOfK$V()}),
    getters: () => ({
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      length: dart.definiteFunctionType(core.int, []),
      keys: dart.definiteFunctionType(core.Iterable$(K), []),
      values: dart.definiteFunctionType(core.Iterable$(V), [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(V, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [K, V]),
      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
      clear: dart.definiteFunctionType(dart.void, []),
      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
      remove: dart.definiteFunctionType(V, [core.Object])
    })
  });
  dart.defineExtensionMembers(MapView, [
    '_get',
    '_set',
    'addAll',
    'clear',
    'putIfAbsent',
    'containsKey',
    'containsValue',
    'forEach',
    'remove',
    'isEmpty',
    'isNotEmpty',
    'length',
    'keys',
    'values'
  ]);
  return MapView;
});
collection.MapView = MapView();
collection.UnmodifiableMapView$ = dart.generic((K, V) => {
  class UnmodifiableMapView extends dart.mixin(collection.MapView$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
    new(map) {
      super.new(map);
    }
  }
  return UnmodifiableMapView;
});
collection.UnmodifiableMapView = UnmodifiableMapView();
collection.Maps = class Maps extends core.Object {
  static containsValue(map, value) {
    for (let v of map[dartx.values]) {
      if (dart.equals(v, value)) {
        return true;
      }
    }
    return false;
  }
  static containsKey(map, key) {
    for (let k of map[dartx.keys]) {
      if (dart.equals(k, key)) {
        return true;
      }
    }
    return false;
  }
  static putIfAbsent(map, key, ifAbsent) {
    if (dart.test(map[dartx.containsKey](key))) {
      return map[dartx._get](key);
    }
    let v = ifAbsent();
    map[dartx._set](key, v);
    return v;
  }
  static clear(map) {
    for (let k of map[dartx.keys][dartx.toList]()) {
      map[dartx.remove](k);
    }
  }
  static forEach(map, f) {
    for (let k of map[dartx.keys]) {
      dart.dcall(f, k, map[dartx._get](k));
    }
  }
  static getValues(map) {
    return map[dartx.keys][dartx.map](dart.dynamic)(dart.fn(key => map[dartx._get](key), dynamicTodynamic$()));
  }
  static length(map) {
    return map[dartx.keys][dartx.length];
  }
  static isEmpty(map) {
    return map[dartx.keys][dartx.isEmpty];
  }
  static isNotEmpty(map) {
    return map[dartx.keys][dartx.isNotEmpty];
  }
  static mapToString(m) {
    if (dart.test(collection._isToStringVisiting(m))) {
      return '{...}';
    }
    let result = new core.StringBuffer();
    try {
      collection._toStringVisiting[dartx.add](m);
      result.write('{');
      let first = true;
      m[dartx.forEach](dart.fn((k, v) => {
        if (!first) {
          result.write(', ');
        }
        first = false;
        result.write(k);
        result.write(': ');
        result.write(v);
      }, dynamicAnddynamicToNull()));
      result.write('}');
    } finally {
      dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
      collection._toStringVisiting[dartx.removeLast]();
    }
    return result.toString();
  }
  static _id(x) {
    return x;
  }
  static _fillMapWithMappedIterable(map, iterable, key, value) {
    if (key == null) key = collection.Maps._id;
    if (value == null) value = collection.Maps._id;
    for (let element of iterable) {
      map[dartx._set](dart.dcall(key, element), dart.dcall(value, element));
    }
  }
  static _fillMapWithIterables(map, keys, values) {
    let keyIterator = keys[dartx.iterator];
    let valueIterator = values[dartx.iterator];
    let hasNextKey = keyIterator.moveNext();
    let hasNextValue = valueIterator.moveNext();
    while (dart.test(hasNextKey) && dart.test(hasNextValue)) {
      map[dartx._set](keyIterator.current, valueIterator.current);
      hasNextKey = keyIterator.moveNext();
      hasNextValue = valueIterator.moveNext();
    }
    if (dart.test(hasNextKey) || dart.test(hasNextValue)) {
      dart.throw(new core.ArgumentError("Iterables do not have same length."));
    }
  }
};
dart.setSignature(collection.Maps, {
  statics: () => ({
    containsValue: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
    containsKey: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
    putIfAbsent: dart.definiteFunctionType(dart.dynamic, [core.Map, dart.dynamic, VoidTodynamic()]),
    clear: dart.definiteFunctionType(dart.dynamic, [core.Map]),
    forEach: dart.definiteFunctionType(dart.dynamic, [core.Map, dynamicAnddynamicTovoid()]),
    getValues: dart.definiteFunctionType(core.Iterable, [core.Map]),
    length: dart.definiteFunctionType(core.int, [core.Map]),
    isEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
    isNotEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
    mapToString: dart.definiteFunctionType(core.String, [core.Map]),
    _id: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _fillMapWithMappedIterable: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, dynamicTodynamic(), dynamicTodynamic()]),
    _fillMapWithIterables: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, core.Iterable])
  }),
  names: ['containsValue', 'containsKey', 'putIfAbsent', 'clear', 'forEach', 'getValues', 'length', 'isEmpty', 'isNotEmpty', 'mapToString', '_id', '_fillMapWithMappedIterable', '_fillMapWithIterables']
});
collection.Queue$ = dart.generic(E => {
  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class Queue extends core.Object {
    static new() {
      return new (ListQueueOfE())();
    }
    static from(elements) {
      return ListQueueOfE().from(elements);
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
  }
  dart.addTypeTests(Queue);
  Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
  dart.setSignature(Queue, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.Queue$(E), []),
      from: dart.definiteFunctionType(collection.Queue$(E), [core.Iterable])
    })
  });
  return Queue;
});
collection.Queue = Queue();
const _previousLink = Symbol('_previousLink');
const _nextLink = Symbol('_nextLink');
const _link = Symbol('_link');
collection._DoubleLink$ = dart.generic(E => {
  class _DoubleLink extends core.Object {
    new() {
      this[_previousLink] = null;
      this[_nextLink] = null;
    }
    [_link](previous, next) {
      E._check(previous);
      E._check(next);
      this[_nextLink] = next;
      this[_previousLink] = previous;
      if (previous != null) previous[_nextLink] = this;
      if (next != null) next[_previousLink] = this;
    }
    [_unlink$]() {
      if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
      if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
      this[_nextLink] = null;
      this[_previousLink] = null;
    }
  }
  dart.addTypeTests(_DoubleLink);
  dart.setSignature(_DoubleLink, {
    fields: () => ({
      [_previousLink]: E,
      [_nextLink]: E
    }),
    methods: () => ({
      [_link]: dart.definiteFunctionType(dart.void, [E, E]),
      [_unlink$]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _DoubleLink;
});
collection._DoubleLink = _DoubleLink();
collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
  class DoubleLinkedQueueEntry extends core.Object {
    static new(element) {
      return new (_UserDoubleLinkedQueueEntryOfE())(element);
    }
  }
  dart.addTypeTests(DoubleLinkedQueueEntry);
  dart.setSignature(DoubleLinkedQueueEntry, {
    constructors: () => ({new: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [E])})
  });
  return DoubleLinkedQueueEntry;
});
collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
  class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
    new(element) {
      this.element = element;
      super.new();
    }
    append(e) {
      E._check(e);
      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
    }
    prepend(e) {
      E._check(e);
      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
    }
    remove() {
      this[_unlink$]();
      return this.element;
    }
    previousEntry() {
      return this[_previousLink];
    }
    nextEntry() {
      return this[_nextLink];
    }
  }
  _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
  dart.setSignature(_UserDoubleLinkedQueueEntry, {
    constructors: () => ({new: dart.definiteFunctionType(collection._UserDoubleLinkedQueueEntry$(E), [E])}),
    fields: () => ({element: E}),
    methods: () => ({
      append: dart.definiteFunctionType(dart.void, [E]),
      prepend: dart.definiteFunctionType(dart.void, [E]),
      remove: dart.definiteFunctionType(E, []),
      previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
      nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
    })
  });
  return _UserDoubleLinkedQueueEntry;
}, _UserDoubleLinkedQueueEntry => {
  dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
});
collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
const _queue = Symbol('_queue');
const _append = Symbol('_append');
const _prepend = Symbol('_prepend');
const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
  class _DoubleLinkedQueueEntry extends collection._DoubleLink {
    new(queue) {
      this[_queue] = queue;
      super.new();
    }
    [_append](e) {
      E._check(e);
      new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this, this[_nextLink]);
    }
    [_prepend](e) {
      E._check(e);
      new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
    }
    nextEntry() {
      return this[_nextLink][_asNonSentinelEntry]();
    }
    previousEntry() {
      return this[_previousLink][_asNonSentinelEntry]();
    }
  }
  dart.setSignature(_DoubleLinkedQueueEntry, {
    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueEntry$(E), [DoubleLinkedQueueOfE()])}),
    fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
    methods: () => ({
      [_append]: dart.definiteFunctionType(dart.void, [E]),
      [_prepend]: dart.definiteFunctionType(dart.void, [E]),
      nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
      previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
    })
  });
  return _DoubleLinkedQueueEntry;
}, _DoubleLinkedQueueEntry => {
  dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
});
collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
const _elementCount = Symbol('_elementCount');
collection._DoubleLinkedQueueElement$ = dart.generic(E => {
  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
  class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
    new(element, queue) {
      this.element = element;
      super.new(queue);
    }
    append(e) {
      E._check(e);
      this[_append](e);
      if (this[_queue] != null) {
        let o = this[_queue];
        o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
      }
    }
    prepend(e) {
      E._check(e);
      this[_prepend](e);
      if (this[_queue] != null) {
        let o = this[_queue];
        o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
      }
    }
    [_remove]() {
      this[_queue] = null;
      this[_unlink$]();
      return this.element;
    }
    remove() {
      if (this[_queue] != null) {
        let o = this[_queue];
        o[_elementCount] = dart.notNull(o[_elementCount]) - 1;
      }
      return this[_remove]();
    }
    [_asNonSentinelEntry]() {
      return this;
    }
  }
  _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
  dart.setSignature(_DoubleLinkedQueueElement, {
    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [E, DoubleLinkedQueueOfE()])}),
    fields: () => ({element: E}),
    methods: () => ({
      append: dart.definiteFunctionType(dart.void, [E]),
      prepend: dart.definiteFunctionType(dart.void, [E]),
      [_remove]: dart.definiteFunctionType(E, []),
      remove: dart.definiteFunctionType(E, []),
      [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
    })
  });
  return _DoubleLinkedQueueElement;
});
collection._DoubleLinkedQueueElement = _DoubleLinkedQueueElement();
collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
  class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
    new(queue) {
      super.new(queue);
      this[_previousLink] = this;
      this[_nextLink] = this;
    }
    [_asNonSentinelEntry]() {
      return null;
    }
    [_remove]() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    get element() {
      dart.throw(_internal.IterableElementError.noElement());
    }
  }
  dart.setSignature(_DoubleLinkedQueueSentinel, {
    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueSentinel$(E), [DoubleLinkedQueueOfE()])}),
    getters: () => ({element: dart.definiteFunctionType(E, [])}),
    methods: () => ({
      [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
      [_remove]: dart.definiteFunctionType(E, [])
    })
  });
  return _DoubleLinkedQueueSentinel;
});
collection._DoubleLinkedQueueSentinel = _DoubleLinkedQueueSentinel();
const _sentinel = Symbol('_sentinel');
collection.DoubleLinkedQueue$ = dart.generic(E => {
  let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
  let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
  let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
  let DoubleLinkedQueueEntryOfETovoid = () => (DoubleLinkedQueueEntryOfETovoid = dart.constFn(dart.functionType(dart.void, [DoubleLinkedQueueEntryOfE()])))();
  class DoubleLinkedQueue extends core.Iterable$(E) {
    new() {
      this[_sentinel] = null;
      this[_elementCount] = 0;
      super.new();
      this[_sentinel] = new (_DoubleLinkedQueueSentinelOfE())(this);
    }
    static from(elements) {
      let list = new (DoubleLinkedQueueOfE())();
      for (let e of elements) {
        let element = E.as(e);
        list.addLast(element);
      }
      return DoubleLinkedQueueOfE()._check(list);
    }
    get length() {
      return this[_elementCount];
    }
    addLast(value) {
      E._check(value);
      this[_sentinel][_prepend](value);
      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
    }
    addFirst(value) {
      E._check(value);
      this[_sentinel][_append](value);
      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
    }
    add(value) {
      E._check(value);
      this[_sentinel][_prepend](value);
      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      for (let value of iterable) {
        this[_sentinel][_prepend](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
    }
    removeLast() {
      let lastEntry = this[_sentinel][_previousLink];
      let result = lastEntry[_remove]();
      this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
      return result;
    }
    removeFirst() {
      let firstEntry = this[_sentinel][_nextLink];
      let result = firstEntry[_remove]();
      this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
      return result;
    }
    remove(o) {
      let entry = this[_sentinel][_nextLink];
      while (!core.identical(entry, this[_sentinel])) {
        if (dart.equals(entry.element, o)) {
          entry[_remove]();
          this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
          return true;
        }
        entry = entry[_nextLink];
      }
      return false;
    }
    [_filter](test, removeMatching) {
      let entry = this[_sentinel][_nextLink];
      while (!core.identical(entry, this[_sentinel])) {
        let next = entry[_nextLink];
        if (core.identical(removeMatching, test(entry.element))) {
          entry[_remove]();
          this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
        }
        entry = next;
      }
    }
    removeWhere(test) {
      this[_filter](test, true);
    }
    retainWhere(test) {
      this[_filter](test, false);
    }
    get first() {
      let firstEntry = this[_sentinel][_nextLink];
      return firstEntry.element;
    }
    get last() {
      let lastEntry = this[_sentinel][_previousLink];
      return lastEntry.element;
    }
    get single() {
      if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
        let entry = this[_sentinel][_nextLink];
        return entry.element;
      }
      dart.throw(_internal.IterableElementError.tooMany());
    }
    lastEntry() {
      return this[_sentinel].previousEntry();
    }
    firstEntry() {
      return this[_sentinel].nextEntry();
    }
    get isEmpty() {
      return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
    }
    clear() {
      this[_sentinel][_nextLink] = this[_sentinel];
      this[_sentinel][_previousLink] = this[_sentinel];
      this[_elementCount] = 0;
    }
    forEachEntry(f) {
      let entry = this[_sentinel][_nextLink];
      while (!core.identical(entry, this[_sentinel])) {
        let nextEntry = entry[_nextLink];
        let element = _DoubleLinkedQueueElementOfE()._check(entry);
        f(element);
        entry = nextEntry;
      }
    }
    get iterator() {
      return new (_DoubleLinkedQueueIteratorOfE())(this[_sentinel]);
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, '{', '}');
    }
  }
  DoubleLinkedQueue[dart.implements] = () => [QueueOfE()];
  dart.setSignature(DoubleLinkedQueue, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), []),
      from: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), [core.Iterable])
    }),
    fields: () => ({
      [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
      [_elementCount]: core.int
    }),
    getters: () => ({iterator: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [])}),
    methods: () => ({
      addLast: dart.definiteFunctionType(dart.void, [E]),
      addFirst: dart.definiteFunctionType(dart.void, [E]),
      add: dart.definiteFunctionType(dart.void, [E]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      removeLast: dart.definiteFunctionType(E, []),
      removeFirst: dart.definiteFunctionType(E, []),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
      firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
      clear: dart.definiteFunctionType(dart.void, []),
      forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
    })
  });
  dart.defineExtensionMembers(DoubleLinkedQueue, [
    'toString',
    'length',
    'first',
    'last',
    'single',
    'isEmpty',
    'iterator'
  ]);
  return DoubleLinkedQueue;
});
collection.DoubleLinkedQueue = DoubleLinkedQueue();
const _nextEntry = Symbol('_nextEntry');
collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
  class _DoubleLinkedQueueIterator extends core.Object {
    new(sentinel) {
      this[_sentinel] = sentinel;
      this[_nextEntry] = sentinel[_nextLink];
      this[_current$2] = null;
    }
    moveNext() {
      if (core.identical(this[_nextEntry], this[_sentinel])) {
        this[_current$2] = null;
        this[_nextEntry] = null;
        this[_sentinel] = null;
        return false;
      }
      let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
      if (elementEntry[_queue] == null) {
        dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
      }
      this[_current$2] = elementEntry.element;
      this[_nextEntry] = elementEntry[_nextLink];
      return true;
    }
    get current() {
      return this[_current$2];
    }
  }
  dart.addTypeTests(_DoubleLinkedQueueIterator);
  _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_DoubleLinkedQueueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [_DoubleLinkedQueueSentinelOfE()])}),
    fields: () => ({
      [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
      [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
      [_current$2]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _DoubleLinkedQueueIterator;
});
collection._DoubleLinkedQueueIterator = _DoubleLinkedQueueIterator();
const _head = Symbol('_head');
const _tail = Symbol('_tail');
const _table = Symbol('_table');
const _checkModification = Symbol('_checkModification');
const _writeToList = Symbol('_writeToList');
const _preGrow = Symbol('_preGrow');
const _grow = Symbol('_grow');
collection.ListQueue$ = dart.generic(E => {
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
  let _ListQueueIteratorOfE = () => (_ListQueueIteratorOfE = dart.constFn(collection._ListQueueIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  class ListQueue extends core.Iterable$(E) {
    new(initialCapacity) {
      if (initialCapacity === void 0) initialCapacity = null;
      this[_head] = 0;
      this[_tail] = 0;
      this[_table] = null;
      this[_modificationCount] = 0;
      super.new();
      if (initialCapacity == null || dart.notNull(initialCapacity) < collection.ListQueue._INITIAL_CAPACITY) {
        initialCapacity = collection.ListQueue._INITIAL_CAPACITY;
      } else if (!dart.test(collection.ListQueue._isPowerOf2(initialCapacity))) {
        initialCapacity = collection.ListQueue._nextPowerOf2(initialCapacity);
      }
      dart.assert(collection.ListQueue._isPowerOf2(initialCapacity));
      this[_table] = ListOfE().new(initialCapacity);
    }
    static from(elements) {
      if (core.List.is(elements)) {
        let length = elements[dartx.length];
        let queue = new (ListQueueOfE())(dart.notNull(length) + 1);
        dart.assert(dart.notNull(queue[_table][dartx.length]) > dart.notNull(length));
        for (let i = 0; i < dart.notNull(length); i++) {
          queue[_table][dartx._set](i, E.as(elements[dartx._get](i)));
        }
        queue[_tail] = length;
        return queue;
      } else {
        let capacity = collection.ListQueue._INITIAL_CAPACITY;
        if (_internal.EfficientLength.is(elements)) {
          capacity = elements[dartx.length];
        }
        let result = new (ListQueueOfE())(capacity);
        for (let element of elements) {
          result.addLast(E.as(element));
        }
        return result;
      }
    }
    get iterator() {
      return new (_ListQueueIteratorOfE())(this);
    }
    forEach(action) {
      let modificationCount = this[_modificationCount];
      for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
        action(this[_table][dartx._get](i));
        this[_checkModification](modificationCount);
      }
    }
    get isEmpty() {
      return this[_head] == this[_tail];
    }
    get length() {
      return (dart.notNull(this[_tail]) - dart.notNull(this[_head]) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
    }
    get first() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      return this[_table][dartx._get](this[_head]);
    }
    get last() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      return this[_table][dartx._get]((dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
    }
    get single() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this[_table][dartx._get](this[_head]);
    }
    elementAt(index) {
      core.RangeError.checkValidIndex(index, this);
      return this[_table][dartx._get]((dart.notNull(this[_head]) + dart.notNull(index) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let list = null;
      if (dart.test(growable)) {
        list = ListOfE().new();
        list[dartx.length] = this.length;
      } else {
        list = ListOfE().new(this.length);
      }
      this[_writeToList](list);
      return list;
    }
    add(value) {
      E._check(value);
      this[_add$0](value);
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      if (ListOfE().is(elements)) {
        let list = elements;
        let addCount = list[dartx.length];
        let length = this.length;
        if (dart.notNull(length) + dart.notNull(addCount) >= dart.notNull(this[_table][dartx.length])) {
          this[_preGrow](dart.notNull(length) + dart.notNull(addCount));
          this[_table][dartx.setRange](length, dart.notNull(length) + dart.notNull(addCount), list, 0);
          this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
        } else {
          let endSpace = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_tail]);
          if (dart.notNull(addCount) < endSpace) {
            this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + dart.notNull(addCount), list, 0);
            this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
          } else {
            let preSpace = dart.notNull(addCount) - endSpace;
            this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + endSpace, list, 0);
            this[_table][dartx.setRange](0, preSpace, list, endSpace);
            this[_tail] = preSpace;
          }
        }
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      } else {
        for (let element of elements)
          this[_add$0](element);
      }
    }
    remove(value) {
      for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
        let element = this[_table][dartx._get](i);
        if (dart.equals(element, value)) {
          this[_remove](i);
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
          return true;
        }
      }
      return false;
    }
    [_filterWhere](test, removeMatching) {
      let modificationCount = this[_modificationCount];
      let i = this[_head];
      while (i != this[_tail]) {
        let element = this[_table][dartx._get](i);
        let remove = core.identical(removeMatching, test(element));
        this[_checkModification](modificationCount);
        if (remove) {
          i = this[_remove](i);
          modificationCount = this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        } else {
          i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        }
      }
    }
    removeWhere(test) {
      this[_filterWhere](test, true);
    }
    retainWhere(test) {
      this[_filterWhere](test, false);
    }
    clear() {
      if (this[_head] != this[_tail]) {
        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
          this[_table][dartx._set](i, null);
        }
        this[_head] = this[_tail] = 0;
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, "{", "}");
    }
    addLast(value) {
      E._check(value);
      this[_add$0](value);
    }
    addFirst(value) {
      E._check(value);
      this[_head] = (dart.notNull(this[_head]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
      this[_table][dartx._set](this[_head], value);
      if (this[_head] == this[_tail]) this[_grow]();
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
    }
    removeFirst() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      let result = this[_table][dartx._get](this[_head]);
      this[_table][dartx._set](this[_head], null);
      this[_head] = (dart.notNull(this[_head]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
      return result;
    }
    removeLast() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      this[_tail] = (dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
      let result = this[_table][dartx._get](this[_tail]);
      this[_table][dartx._set](this[_tail], null);
      return result;
    }
    static _isPowerOf2(number) {
      return (dart.notNull(number) & dart.notNull(number) - 1) == 0;
    }
    static _nextPowerOf2(number) {
      dart.assert(dart.notNull(number) > 0);
      number = (dart.notNull(number) << 1 >>> 0) - 1;
      for (;;) {
        let nextNumber = (dart.notNull(number) & dart.notNull(number) - 1) >>> 0;
        if (nextNumber == 0) return number;
        number = nextNumber;
      }
    }
    [_checkModification](expectedModificationCount) {
      if (expectedModificationCount != this[_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError(this));
      }
    }
    [_add$0](element) {
      E._check(element);
      this[_table][dartx._set](this[_tail], element);
      this[_tail] = (dart.notNull(this[_tail]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
      if (this[_head] == this[_tail]) this[_grow]();
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
    }
    [_remove](offset) {
      let mask = dart.notNull(this[_table][dartx.length]) - 1;
      let startDistance = (dart.notNull(offset) - dart.notNull(this[_head]) & mask) >>> 0;
      let endDistance = (dart.notNull(this[_tail]) - dart.notNull(offset) & mask) >>> 0;
      if (startDistance < endDistance) {
        let i = offset;
        while (i != this[_head]) {
          let prevOffset = (dart.notNull(i) - 1 & mask) >>> 0;
          this[_table][dartx._set](i, this[_table][dartx._get](prevOffset));
          i = prevOffset;
        }
        this[_table][dartx._set](this[_head], null);
        this[_head] = (dart.notNull(this[_head]) + 1 & mask) >>> 0;
        return (dart.notNull(offset) + 1 & mask) >>> 0;
      } else {
        this[_tail] = (dart.notNull(this[_tail]) - 1 & mask) >>> 0;
        let i = offset;
        while (i != this[_tail]) {
          let nextOffset = (dart.notNull(i) + 1 & mask) >>> 0;
          this[_table][dartx._set](i, this[_table][dartx._get](nextOffset));
          i = nextOffset;
        }
        this[_table][dartx._set](this[_tail], null);
        return offset;
      }
    }
    [_grow]() {
      let newTable = ListOfE().new(dart.notNull(this[_table][dartx.length]) * 2);
      let split = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
      newTable[dartx.setRange](0, split, this[_table], this[_head]);
      newTable[dartx.setRange](split, split + dart.notNull(this[_head]), this[_table], 0);
      this[_head] = 0;
      this[_tail] = this[_table][dartx.length];
      this[_table] = newTable;
    }
    [_writeToList](target) {
      ListOfE()._check(target);
      dart.assert(dart.notNull(target[dartx.length]) >= dart.notNull(this.length));
      if (dart.notNull(this[_head]) <= dart.notNull(this[_tail])) {
        let length = dart.notNull(this[_tail]) - dart.notNull(this[_head]);
        target[dartx.setRange](0, length, this[_table], this[_head]);
        return length;
      } else {
        let firstPartSize = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
        target[dartx.setRange](0, firstPartSize, this[_table], this[_head]);
        target[dartx.setRange](firstPartSize, firstPartSize + dart.notNull(this[_tail]), this[_table], 0);
        return dart.notNull(this[_tail]) + firstPartSize;
      }
    }
    [_preGrow](newElementCount) {
      dart.assert(dart.notNull(newElementCount) >= dart.notNull(this.length));
      newElementCount = dart.notNull(newElementCount) + newElementCount[dartx['>>']](1);
      let newCapacity = collection.ListQueue._nextPowerOf2(newElementCount);
      let newTable = ListOfE().new(newCapacity);
      this[_tail] = this[_writeToList](newTable);
      this[_table] = newTable;
      this[_head] = 0;
    }
  }
  ListQueue[dart.implements] = () => [QueueOfE()];
  dart.setSignature(ListQueue, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.ListQueue$(E), [], [core.int]),
      from: dart.definiteFunctionType(collection.ListQueue$(E), [core.Iterable])
    }),
    fields: () => ({
      [_table]: ListOfE(),
      [_head]: core.int,
      [_tail]: core.int,
      [_modificationCount]: core.int
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [E]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      clear: dart.definiteFunctionType(dart.void, []),
      addLast: dart.definiteFunctionType(dart.void, [E]),
      addFirst: dart.definiteFunctionType(dart.void, [E]),
      removeFirst: dart.definiteFunctionType(E, []),
      removeLast: dart.definiteFunctionType(E, []),
      [_checkModification]: dart.definiteFunctionType(dart.void, [core.int]),
      [_add$0]: dart.definiteFunctionType(dart.void, [E]),
      [_remove]: dart.definiteFunctionType(core.int, [core.int]),
      [_grow]: dart.definiteFunctionType(dart.void, []),
      [_writeToList]: dart.definiteFunctionType(core.int, [ListOfE()]),
      [_preGrow]: dart.definiteFunctionType(dart.void, [core.int])
    }),
    sfields: () => ({_INITIAL_CAPACITY: core.int}),
    statics: () => ({
      _isPowerOf2: dart.definiteFunctionType(core.bool, [core.int]),
      _nextPowerOf2: dart.definiteFunctionType(core.int, [core.int])
    }),
    names: ['_isPowerOf2', '_nextPowerOf2']
  });
  dart.defineExtensionMembers(ListQueue, [
    'forEach',
    'elementAt',
    'toList',
    'toString',
    'iterator',
    'isEmpty',
    'length',
    'first',
    'last',
    'single'
  ]);
  return ListQueue;
});
collection.ListQueue = ListQueue();
collection.ListQueue._INITIAL_CAPACITY = 8;
const _end = Symbol('_end');
const _position = Symbol('_position');
collection._ListQueueIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
  class _ListQueueIterator extends core.Object {
    new(queue) {
      this[_queue] = queue;
      this[_end] = queue[_tail];
      this[_modificationCount] = queue[_modificationCount];
      this[_position] = queue[_head];
      this[_current$2] = null;
    }
    get current() {
      return this[_current$2];
    }
    moveNext() {
      this[_queue][_checkModification](this[_modificationCount]);
      if (this[_position] == this[_end]) {
        this[_current$2] = null;
        return false;
      }
      this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
      this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
      return true;
    }
  }
  dart.addTypeTests(_ListQueueIterator);
  _ListQueueIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_ListQueueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._ListQueueIterator$(E), [ListQueueOfE()])}),
    fields: () => ({
      [_queue]: ListQueueOfE(),
      [_end]: core.int,
      [_modificationCount]: core.int,
      [_position]: core.int,
      [_current$2]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _ListQueueIterator;
});
collection._ListQueueIterator = _ListQueueIterator();
collection._Predicate$ = dart.generic(T => {
  const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
  return _Predicate;
});
collection._Predicate = _Predicate$();
collection._SplayTreeNode$ = dart.generic(K => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  class _SplayTreeNode extends core.Object {
    new(key) {
      this.key = key;
      this.left = null;
      this.right = null;
    }
  }
  dart.addTypeTests(_SplayTreeNode);
  dart.setSignature(_SplayTreeNode, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeNode$(K), [K])}),
    fields: () => ({
      key: K,
      left: _SplayTreeNodeOfK(),
      right: _SplayTreeNodeOfK()
    })
  });
  return _SplayTreeNode;
});
collection._SplayTreeNode = _SplayTreeNode();
collection._SplayTreeMapNode$ = dart.generic((K, V) => {
  class _SplayTreeMapNode extends collection._SplayTreeNode$(K) {
    new(key, value) {
      this.value = value;
      super.new(key);
    }
  }
  dart.setSignature(_SplayTreeMapNode, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeMapNode$(K, V), [K, V])}),
    fields: () => ({value: V})
  });
  return _SplayTreeMapNode;
});
collection._SplayTreeMapNode = _SplayTreeMapNode();
const _count$ = Symbol('_count');
const _splayCount = Symbol('_splayCount');
const _root = Symbol('_root');
const _dummy = Symbol('_dummy');
const _comparator = Symbol('_comparator');
const _compare = Symbol('_compare');
const _splay = Symbol('_splay');
const _splayMin = Symbol('_splayMin');
const _splayMax = Symbol('_splayMax');
const _addNewRoot = Symbol('_addNewRoot');
const _clear$ = Symbol('_clear');
collection._SplayTree$ = dart.generic((K, Node) => {
  class _SplayTree extends core.Object {
    new() {
      this[_count$] = 0;
      this[_modificationCount] = 0;
      this[_splayCount] = 0;
    }
    [_splay](key) {
      K._check(key);
      if (this[_root] == null) return -1;
      let left = this[_dummy];
      let right = this[_dummy];
      let current = this[_root];
      let comp = null;
      while (true) {
        comp = this[_compare](current.key, key);
        if (dart.notNull(comp) > 0) {
          if (current.left == null) break;
          comp = this[_compare](current.left.key, key);
          if (dart.notNull(comp) > 0) {
            let tmp = current.left;
            current.left = tmp.right;
            tmp.right = current;
            current = Node._check(tmp);
            if (current.left == null) break;
          }
          right.left = current;
          right = current;
          current = Node._check(current.left);
        } else if (dart.notNull(comp) < 0) {
          if (current.right == null) break;
          comp = this[_compare](current.right.key, key);
          if (dart.notNull(comp) < 0) {
            let tmp = Node._check(current.right);
            current.right = tmp.left;
            tmp.left = current;
            current = tmp;
            if (current.right == null) break;
          }
          left.right = current;
          left = current;
          current = Node._check(current.right);
        } else {
          break;
        }
      }
      left.right = current.left;
      right.left = current.right;
      current.left = this[_dummy].right;
      current.right = this[_dummy].left;
      this[_root] = current;
      this[_dummy].right = null;
      this[_dummy].left = null;
      this[_splayCount] = dart.notNull(this[_splayCount]) + 1;
      return comp;
    }
    [_splayMin](node) {
      Node._check(node);
      let current = node;
      while (current.left != null) {
        let left = Node._check(current.left);
        current.left = left.right;
        left.right = current;
        current = left;
      }
      return current;
    }
    [_splayMax](node) {
      Node._check(node);
      let current = node;
      while (current.right != null) {
        let right = Node._check(current.right);
        current.right = right.left;
        right.left = current;
        current = right;
      }
      return current;
    }
    [_remove](key) {
      K._check(key);
      if (this[_root] == null) return null;
      let comp = this[_splay](key);
      if (comp != 0) return null;
      let result = this[_root];
      this[_count$] = dart.notNull(this[_count$]) - 1;
      if (this[_root].left == null) {
        this[_root] = Node._check(this[_root].right);
      } else {
        let right = Node._check(this[_root].right);
        this[_root] = this[_splayMax](Node._check(this[_root].left));
        this[_root].right = right;
      }
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      return result;
    }
    [_addNewRoot](node, comp) {
      Node._check(node);
      this[_count$] = dart.notNull(this[_count$]) + 1;
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      if (this[_root] == null) {
        this[_root] = node;
        return;
      }
      if (dart.notNull(comp) < 0) {
        node.left = this[_root];
        node.right = this[_root].right;
        this[_root].right = null;
      } else {
        node.right = this[_root];
        node.left = this[_root].left;
        this[_root].left = null;
      }
      this[_root] = node;
    }
    get [_first$]() {
      if (this[_root] == null) return null;
      this[_root] = this[_splayMin](this[_root]);
      return this[_root];
    }
    get [_last$]() {
      if (this[_root] == null) return null;
      this[_root] = this[_splayMax](this[_root]);
      return this[_root];
    }
    [_clear$]() {
      this[_root] = null;
      this[_count$] = 0;
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
    }
  }
  dart.addTypeTests(_SplayTree);
  dart.setSignature(_SplayTree, {
    fields: () => ({
      [_count$]: core.int,
      [_modificationCount]: core.int,
      [_splayCount]: core.int
    }),
    getters: () => ({
      [_first$]: dart.definiteFunctionType(Node, []),
      [_last$]: dart.definiteFunctionType(Node, [])
    }),
    methods: () => ({
      [_splay]: dart.definiteFunctionType(core.int, [K]),
      [_splayMin]: dart.definiteFunctionType(Node, [Node]),
      [_splayMax]: dart.definiteFunctionType(Node, [Node]),
      [_remove]: dart.definiteFunctionType(Node, [K]),
      [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
      [_clear$]: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _SplayTree;
});
collection._SplayTree = _SplayTree();
collection._TypeTest$ = dart.generic(T => {
  class _TypeTest extends core.Object {
    test(v) {
      return T.is(v);
    }
  }
  dart.addTypeTests(_TypeTest);
  dart.setSignature(_TypeTest, {
    methods: () => ({test: dart.definiteFunctionType(core.bool, [dart.dynamic])})
  });
  return _TypeTest;
});
collection._TypeTest = _TypeTest();
collection.SplayTreeMap$ = dart.generic((K, V) => {
  let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
  let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
  let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
  let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
  class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
    new(compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
      this[_comparator] = (() => {
        let l = compare;
        return l != null ? l : ComparatorOfK().as(core.Comparable.compare);
      })();
      this[_validKey] = (() => {
        let l = isValidKey;
        return l != null ? l : dart.fn(v => K.is(v), dynamicTobool$());
      })();
      this[_root] = null;
      super.new();
    }
    static from(other, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
      other[dartx.forEach](dart.fn((k, v) => {
        result._set(K.as(k), V.as(v));
      }, dynamicAnddynamicToNull()));
      return result;
    }
    static fromIterable(iterable, opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let compare = opts && 'compare' in opts ? opts.compare : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
      collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
      return map;
    }
    static fromIterables(keys, values, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
      collection.Maps._fillMapWithIterables(map, keys, values);
      return map;
    }
    [_compare](key1, key2) {
      K._check(key1);
      K._check(key2);
      return this[_comparator](key1, key2);
    }
    _internal() {
      this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
      this[_root] = null;
      this[_comparator] = null;
      this[_validKey] = null;
      super.new();
    }
    _get(key) {
      if (!dart.test(dart.dcall(this[_validKey], key))) return null;
      if (this[_root] != null) {
        let comp = this[_splay](K.as(key));
        if (comp == 0) {
          return this[_root].value;
        }
      }
      return null;
    }
    remove(key) {
      if (!dart.test(dart.dcall(this[_validKey], key))) return null;
      let mapRoot = this[_remove](K.as(key));
      if (mapRoot != null) return mapRoot.value;
      return null;
    }
    _set(key, value) {
      (() => {
        K._check(key);
        V._check(value);
        if (key == null) dart.throw(new core.ArgumentError(key));
        let comp = this[_splay](key);
        if (comp == 0) {
          this[_root].value = value;
          return;
        }
        this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
      })();
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (key == null) dart.throw(new core.ArgumentError(key));
      let comp = this[_splay](key);
      if (comp == 0) {
        return this[_root].value;
      }
      let modificationCount = this[_modificationCount];
      let splayCount = this[_splayCount];
      let value = ifAbsent();
      if (modificationCount != this[_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError(this));
      }
      if (splayCount != this[_splayCount]) {
        comp = this[_splay](key);
        dart.assert(comp != 0);
      }
      this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      other[dartx.forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, KAndVToNull()));
    }
    get isEmpty() {
      return this[_root] == null;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    forEach(f) {
      let nodes = new (_SplayTreeNodeIteratorOfK())(this);
      while (dart.test(nodes.moveNext())) {
        let node = _SplayTreeMapNodeOfK$V()._check(nodes.current);
        f(node.key, node.value);
      }
    }
    get length() {
      return this[_count$];
    }
    clear() {
      this[_clear$]();
    }
    containsKey(key) {
      return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
    }
    containsValue(value) {
      let found = false;
      let initialSplayCount = this[_splayCount];
      const visit = (function(node) {
        while (node != null) {
          if (dart.equals(node.value, value)) return true;
          if (initialSplayCount != this[_splayCount]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          if (node.right != null && dart.test(visit(collection._SplayTreeMapNode._check(node.right)))) return true;
          node = collection._SplayTreeMapNode._check(node.left);
        }
        return false;
      }).bind(this);
      dart.fn(visit, _SplayTreeMapNodeTobool());
      return visit(this[_root]);
    }
    get keys() {
      return new (_SplayTreeKeyIterableOfK())(this);
    }
    get values() {
      return new (_SplayTreeValueIterableOfK$V())(this);
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
    firstKey() {
      if (this[_root] == null) return null;
      return this[_first$].key;
    }
    lastKey() {
      if (this[_root] == null) return null;
      return this[_last$].key;
    }
    lastKeyBefore(key) {
      K._check(key);
      if (key == null) dart.throw(new core.ArgumentError(key));
      if (this[_root] == null) return null;
      let comp = this[_splay](key);
      if (dart.notNull(comp) < 0) return this[_root].key;
      let node = this[_root].left;
      if (node == null) return null;
      while (node.right != null) {
        node = node.right;
      }
      return node.key;
    }
    firstKeyAfter(key) {
      K._check(key);
      if (key == null) dart.throw(new core.ArgumentError(key));
      if (this[_root] == null) return null;
      let comp = this[_splay](key);
      if (dart.notNull(comp) > 0) return this[_root].key;
      let node = this[_root].right;
      if (node == null) return null;
      while (node.left != null) {
        node = node.left;
      }
      return node.key;
    }
  }
  dart.defineNamedConstructor(SplayTreeMap, '_internal');
  SplayTreeMap[dart.implements] = () => [MapOfK$V()];
  dart.setSignature(SplayTreeMap, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [], [ComparatorOfK(), dynamicTobool()]),
      from: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Map], [ComparatorOfK(), dynamicTobool()]),
      fromIterable: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV(), compare: ComparatorOfK(), isValidKey: dynamicTobool()}),
      fromIterables: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [IterableOfK(), IterableOfV()], [ComparatorOfK(), dynamicTobool()]),
      _internal: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [])
    }),
    fields: () => ({
      [_root]: _SplayTreeMapNodeOfK$V(),
      [_dummy]: _SplayTreeMapNodeOfK$V(),
      [_comparator]: ComparatorOfK(),
      [_validKey]: collection._Predicate
    }),
    getters: () => ({
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      length: dart.definiteFunctionType(core.int, []),
      keys: dart.definiteFunctionType(core.Iterable$(K), []),
      values: dart.definiteFunctionType(core.Iterable$(V), [])
    }),
    methods: () => ({
      [_compare]: dart.definiteFunctionType(core.int, [K, K]),
      _get: dart.definiteFunctionType(V, [core.Object]),
      remove: dart.definiteFunctionType(V, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [K, V]),
      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
      clear: dart.definiteFunctionType(dart.void, []),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      firstKey: dart.definiteFunctionType(K, []),
      lastKey: dart.definiteFunctionType(K, []),
      lastKeyBefore: dart.definiteFunctionType(K, [K]),
      firstKeyAfter: dart.definiteFunctionType(K, [K])
    })
  });
  dart.defineExtensionMembers(SplayTreeMap, [
    '_get',
    'remove',
    '_set',
    'putIfAbsent',
    'addAll',
    'forEach',
    'clear',
    'containsKey',
    'containsValue',
    'isEmpty',
    'isNotEmpty',
    'length',
    'keys',
    'values'
  ]);
  return SplayTreeMap;
});
collection.SplayTreeMap = SplayTreeMap();
const _workList = Symbol('_workList');
const _tree = Symbol('_tree');
const _currentNode = Symbol('_currentNode');
const _findLeftMostDescendent = Symbol('_findLeftMostDescendent');
const _getValue = Symbol('_getValue');
const _rebuildWorkList = Symbol('_rebuildWorkList');
collection._SplayTreeIterator$ = dart.generic((K, T) => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let JSArrayOf_SplayTreeNodeOfK = () => (JSArrayOf_SplayTreeNodeOfK = dart.constFn(_interceptors.JSArray$(_SplayTreeNodeOfK())))();
  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
  let ListOf_SplayTreeNodeOfK = () => (ListOf_SplayTreeNodeOfK = dart.constFn(core.List$(_SplayTreeNodeOfK())))();
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  class _SplayTreeIterator extends core.Object {
    new(tree) {
      this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
      this[_tree] = tree;
      this[_modificationCount] = tree[_modificationCount];
      this[_splayCount] = tree[_splayCount];
      this[_currentNode] = null;
      this[_findLeftMostDescendent](tree[_root]);
    }
    startAt(tree, startKey) {
      this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
      this[_tree] = tree;
      this[_modificationCount] = tree[_modificationCount];
      this[_splayCount] = null;
      this[_currentNode] = null;
      if (tree[_root] == null) return;
      let compare = tree[_splay](startKey);
      this[_splayCount] = tree[_splayCount];
      if (dart.notNull(compare) < 0) {
        this[_findLeftMostDescendent](tree[_root].right);
      } else {
        this[_workList][dartx.add](tree[_root]);
      }
    }
    get current() {
      if (this[_currentNode] == null) return null;
      return this[_getValue](this[_currentNode]);
    }
    [_findLeftMostDescendent](node) {
      _SplayTreeNodeOfK()._check(node);
      while (node != null) {
        this[_workList][dartx.add](node);
        node = node.left;
      }
    }
    [_rebuildWorkList](currentNode) {
      _SplayTreeNodeOfK()._check(currentNode);
      dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
      this[_workList][dartx.clear]();
      if (currentNode == null) {
        this[_findLeftMostDescendent](this[_tree][_root]);
      } else {
        this[_tree][_splay](currentNode.key);
        this[_findLeftMostDescendent](this[_tree][_root].right);
        dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
      }
    }
    moveNext() {
      if (this[_modificationCount] != this[_tree][_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError(this[_tree]));
      }
      if (dart.test(this[_workList][dartx.isEmpty])) {
        this[_currentNode] = null;
        return false;
      }
      if (this[_tree][_splayCount] != this[_splayCount] && this[_currentNode] != null) {
        this[_rebuildWorkList](this[_currentNode]);
      }
      this[_currentNode] = this[_workList][dartx.removeLast]();
      this[_findLeftMostDescendent](this[_currentNode].right);
      return true;
    }
  }
  dart.addTypeTests(_SplayTreeIterator);
  dart.defineNamedConstructor(_SplayTreeIterator, 'startAt');
  _SplayTreeIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(_SplayTreeIterator, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
      startAt: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
    }),
    fields: () => ({
      [_tree]: _SplayTreeOfK$_SplayTreeNodeOfK(),
      [_workList]: ListOf_SplayTreeNodeOfK(),
      [_modificationCount]: core.int,
      [_splayCount]: core.int,
      [_currentNode]: _SplayTreeNodeOfK()
    }),
    getters: () => ({current: dart.definiteFunctionType(T, [])}),
    methods: () => ({
      [_findLeftMostDescendent]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
      [_rebuildWorkList]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
      moveNext: dart.definiteFunctionType(core.bool, [])
    })
  });
  return _SplayTreeIterator;
});
collection._SplayTreeIterator = _SplayTreeIterator();
const _copyNode = Symbol('_copyNode');
collection._SplayTreeKeyIterable$ = dart.generic(K => {
  let _SplayTreeKeyIteratorOfK = () => (_SplayTreeKeyIteratorOfK = dart.constFn(collection._SplayTreeKeyIterator$(K)))();
  let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
  class _SplayTreeKeyIterable extends core.Iterable$(K) {
    new(tree) {
      this[_tree] = tree;
      super.new();
    }
    get length() {
      return this[_tree][_count$];
    }
    get isEmpty() {
      return this[_tree][_count$] == 0;
    }
    get iterator() {
      return new (_SplayTreeKeyIteratorOfK())(this[_tree]);
    }
    toSet() {
      let set = new (SplayTreeSetOfK())(this[_tree][_comparator], this[_tree][_validKey]);
      set[_count$] = this[_tree][_count$];
      set[_root] = set[_copyNode](this[_tree][_root]);
      return set;
    }
  }
  _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_SplayTreeKeyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterable$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
    fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])})
  });
  dart.defineExtensionMembers(_SplayTreeKeyIterable, ['toSet', 'length', 'isEmpty', 'iterator']);
  return _SplayTreeKeyIterable;
});
collection._SplayTreeKeyIterable = _SplayTreeKeyIterable();
collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
  let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
  class _SplayTreeValueIterable extends core.Iterable$(V) {
    new(map) {
      this[_map$0] = map;
      super.new();
    }
    get length() {
      return this[_map$0][_count$];
    }
    get isEmpty() {
      return this[_map$0][_count$] == 0;
    }
    get iterator() {
      return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
    }
  }
  _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_SplayTreeValueIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
    fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
  });
  dart.defineExtensionMembers(_SplayTreeValueIterable, ['length', 'isEmpty', 'iterator']);
  return _SplayTreeValueIterable;
});
collection._SplayTreeValueIterable = _SplayTreeValueIterable();
collection._SplayTreeKeyIterator$ = dart.generic(K => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
  class _SplayTreeKeyIterator extends collection._SplayTreeIterator$(K, K) {
    new(map) {
      super.new(map);
    }
    [_getValue](node) {
      _SplayTreeNodeOfK()._check(node);
      return node.key;
    }
  }
  dart.setSignature(_SplayTreeKeyIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
    methods: () => ({[_getValue]: dart.definiteFunctionType(K, [_SplayTreeNodeOfK()])})
  });
  return _SplayTreeKeyIterator;
});
collection._SplayTreeKeyIterator = _SplayTreeKeyIterator();
collection._SplayTreeValueIterator$ = dart.generic((K, V) => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
  class _SplayTreeValueIterator extends collection._SplayTreeIterator$(K, V) {
    new(map) {
      super.new(map);
    }
    [_getValue](node) {
      _SplayTreeNodeOfK()._check(node);
      let mapNode = _SplayTreeMapNodeOfK$V().as(node);
      return mapNode.value;
    }
  }
  dart.setSignature(_SplayTreeValueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterator$(K, V), [SplayTreeMapOfK$V()])}),
    methods: () => ({[_getValue]: dart.definiteFunctionType(V, [_SplayTreeNodeOfK()])})
  });
  return _SplayTreeValueIterator;
});
collection._SplayTreeValueIterator = _SplayTreeValueIterator();
collection._SplayTreeNodeIterator$ = dart.generic(K => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
  class _SplayTreeNodeIterator extends collection._SplayTreeIterator$(K, collection._SplayTreeNode$(K)) {
    new(tree) {
      super.new(tree);
    }
    startAt(tree, startKey) {
      super.startAt(tree, startKey);
    }
    [_getValue](node) {
      _SplayTreeNodeOfK()._check(node);
      return node;
    }
  }
  dart.defineNamedConstructor(_SplayTreeNodeIterator, 'startAt');
  dart.setSignature(_SplayTreeNodeIterator, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
      startAt: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
    }),
    methods: () => ({[_getValue]: dart.definiteFunctionType(collection._SplayTreeNode$(K), [_SplayTreeNodeOfK()])})
  });
  return _SplayTreeNodeIterator;
});
collection._SplayTreeNodeIterator = _SplayTreeNodeIterator();
const _clone = Symbol('_clone');
collection.SplayTreeSet$ = dart.generic(E => {
  let _SplayTreeNodeOfE = () => (_SplayTreeNodeOfE = dart.constFn(collection._SplayTreeNode$(E)))();
  let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
  let SplayTreeSetOfE = () => (SplayTreeSetOfE = dart.constFn(collection.SplayTreeSet$(E)))();
  let _SplayTreeKeyIteratorOfE = () => (_SplayTreeKeyIteratorOfE = dart.constFn(collection._SplayTreeKeyIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  class SplayTreeSet extends dart.mixin(collection._SplayTree$(E, collection._SplayTreeNode$(E)), collection.IterableMixin$(E), collection.SetMixin$(E)) {
    new(compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      this[_dummy] = new (_SplayTreeNodeOfE())(null);
      this[_comparator] = (() => {
        let l = compare;
        return l != null ? l : ComparatorOfE().as(core.Comparable.compare);
      })();
      this[_validKey] = (() => {
        let l = isValidKey;
        return l != null ? l : dart.fn(v => E.is(v), dynamicTobool$());
      })();
      this[_root] = null;
      super.new();
    }
    static from(elements, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let result = new (SplayTreeSetOfE())(compare, isValidKey);
      for (let element of elements) {
        let e = E.as(element);
        result.add(e);
      }
      return result;
    }
    [_compare](e1, e2) {
      E._check(e1);
      E._check(e2);
      return this[_comparator](e1, e2);
    }
    get iterator() {
      return new (_SplayTreeKeyIteratorOfE())(this);
    }
    get length() {
      return this[_count$];
    }
    get isEmpty() {
      return this[_root] == null;
    }
    get isNotEmpty() {
      return this[_root] != null;
    }
    get first() {
      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
      return this[_first$].key;
    }
    get last() {
      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
      return this[_last$].key;
    }
    get single() {
      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this[_count$]) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this[_root].key;
    }
    contains(object) {
      return dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0;
    }
    add(element) {
      E._check(element);
      let compare = this[_splay](element);
      if (compare == 0) return false;
      this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
      return true;
    }
    remove(object) {
      if (!dart.test(dart.dcall(this[_validKey], object))) return false;
      return this[_remove](E.as(object)) != null;
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      for (let element of elements) {
        let compare = this[_splay](element);
        if (compare != 0) {
          this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
        }
      }
    }
    removeAll(elements) {
      for (let element of elements) {
        if (dart.test(dart.dcall(this[_validKey], element))) this[_remove](E.as(element));
      }
    }
    retainAll(elements) {
      let retainSet = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
      let modificationCount = this[_modificationCount];
      for (let object of elements) {
        if (modificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        if (dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0) {
          retainSet.add(this[_root].key);
        }
      }
      if (retainSet[_count$] != this[_count$]) {
        this[_root] = retainSet[_root];
        this[_count$] = retainSet[_count$];
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
    }
    lookup(object) {
      if (!dart.test(dart.dcall(this[_validKey], object))) return null;
      let comp = this[_splay](E.as(object));
      if (comp != 0) return null;
      return this[_root].key;
    }
    intersection(other) {
      let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
      for (let element of this) {
        if (dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    difference(other) {
      let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
      for (let element of this) {
        if (!dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    union(other) {
      SetOfE()._check(other);
      let _ = this[_clone]();
      _.addAll(other);
      return _;
    }
    [_clone]() {
      let set = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
      set[_count$] = this[_count$];
      set[_root] = this[_copyNode](this[_root]);
      return set;
    }
    [_copyNode](node) {
      _SplayTreeNodeOfE()._check(node);
      if (node == null) return null;
      let _ = new (_SplayTreeNodeOfE())(node.key);
      _.left = this[_copyNode](node.left);
      _.right = this[_copyNode](node.right);
      return _;
    }
    clear() {
      this[_clear$]();
    }
    toSet() {
      return this[_clone]();
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, '{', '}');
    }
  }
  dart.setSignature(SplayTreeSet, {
    constructors: () => ({
      new: dart.definiteFunctionType(collection.SplayTreeSet$(E), [], [ComparatorOfE(), dynamicTobool()]),
      from: dart.definiteFunctionType(collection.SplayTreeSet$(E), [core.Iterable], [ComparatorOfE(), dynamicTobool()])
    }),
    fields: () => ({
      [_root]: _SplayTreeNodeOfE(),
      [_dummy]: _SplayTreeNodeOfE(),
      [_comparator]: ComparatorOfE(),
      [_validKey]: collection._Predicate
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    methods: () => ({
      [_compare]: dart.definiteFunctionType(core.int, [E, E]),
      add: dart.definiteFunctionType(core.bool, [E]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      lookup: dart.definiteFunctionType(E, [core.Object]),
      [_clone]: dart.definiteFunctionType(collection.SplayTreeSet$(E), []),
      [_copyNode]: dart.definiteFunctionType(collection._SplayTreeNode$(E), [_SplayTreeNodeOfE()])
    })
  });
  dart.defineExtensionMembers(SplayTreeSet, [
    'contains',
    'toSet',
    'toString',
    'iterator',
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single'
  ]);
  return SplayTreeSet;
});
collection.SplayTreeSet = SplayTreeSet();
const _processed = Symbol('_processed');
const _computeKeys$ = Symbol('_computeKeys');
const _original = Symbol('_original');
convert._convertJsonToDart = function(json, reviver) {
  dart.assert(reviver != null);
  function walk(e) {
    if (e == null || typeof e != "object") {
      return e;
    }
    if (Object.getPrototypeOf(e) === Array.prototype) {
      for (let i = 0; i < e.length; i++) {
        let item = e[i];
        e[i] = dart.dcall(reviver, i, walk(item));
      }
      return e;
    }
    let map = new convert._JsonMap(e);
    let processed = map[_processed];
    let keys = map[_computeKeys$]();
    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
      let key = keys[dartx._get](i);
      let revived = dart.dcall(reviver, key, walk(e[key]));
      processed[key] = revived;
    }
    map[_original] = processed;
    return map;
  }
  dart.fn(walk, dynamicTodynamic$());
  return dart.dcall(reviver, null, walk(json));
};
dart.fn(convert._convertJsonToDart, dynamicAndFnTodynamic());
convert._convertJsonToDartLazy = function(object) {
  if (object == null) return null;
  if (typeof object != "object") {
    return object;
  }
  if (Object.getPrototypeOf(object) !== Array.prototype) {
    return new convert._JsonMap(object);
  }
  for (let i = 0; i < object.length; i++) {
    let item = object[i];
    object[i] = convert._convertJsonToDartLazy(item);
  }
  return object;
};
dart.fn(convert._convertJsonToDartLazy, dynamicTodynamic$());
const _data = Symbol('_data');
const _isUpgraded = Symbol('_isUpgraded');
const _upgradedMap = Symbol('_upgradedMap');
const _process$ = Symbol('_process');
const _upgrade = Symbol('_upgrade');
convert._JsonMap = class _JsonMap extends core.Object {
  new(original) {
    this[_processed] = convert._JsonMap._newJavaScriptObject();
    this[_original] = original;
    this[_data] = null;
  }
  _get(key) {
    if (dart.test(this[_isUpgraded])) {
      return this[_upgradedMap][dartx._get](key);
    } else if (!(typeof key == 'string')) {
      return null;
    } else {
      let result = convert._JsonMap._getProperty(this[_processed], core.String._check(key));
      if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process$](core.String._check(key));
      return result;
    }
  }
  get length() {
    return dart.test(this[_isUpgraded]) ? this[_upgradedMap][dartx.length] : this[_computeKeys$]()[dartx.length];
  }
  get isEmpty() {
    return this.length == 0;
  }
  get isNotEmpty() {
    return dart.notNull(this.length) > 0;
  }
  get keys() {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.keys];
    return new convert._JsonMapKeyIterable(this);
  }
  get values() {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.values];
    return MappedIterableOfString$dynamic().new(this[_computeKeys$](), dart.fn(each => this._get(each), dynamicTodynamic$()));
  }
  _set(key, value) {
    if (dart.test(this[_isUpgraded])) {
      this[_upgradedMap][dartx._set](key, value);
    } else if (dart.test(this.containsKey(key))) {
      let processed = this[_processed];
      convert._JsonMap._setProperty(processed, core.String._check(key), value);
      let original = this[_original];
      if (!core.identical(original, processed)) {
        convert._JsonMap._setProperty(original, core.String._check(key), null);
      }
    } else {
      this[_upgrade]()[dartx._set](key, value);
    }
    return value;
  }
  addAll(other) {
    other[dartx.forEach](dart.fn((key, value) => {
      this._set(key, value);
    }, dynamicAnddynamicToNull()));
  }
  containsValue(value) {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
    let keys = this[_computeKeys$]();
    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
      let key = keys[dartx._get](i);
      if (dart.equals(this._get(key), value)) return true;
    }
    return false;
  }
  containsKey(key) {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsKey](key);
    if (!(typeof key == 'string')) return false;
    return convert._JsonMap._hasProperty(this[_original], core.String._check(key));
  }
  putIfAbsent(key, ifAbsent) {
    if (dart.test(this.containsKey(key))) return this._get(key);
    let value = ifAbsent();
    this._set(key, value);
    return value;
  }
  remove(key) {
    if (!dart.test(this[_isUpgraded]) && !dart.test(this.containsKey(key))) return null;
    return this[_upgrade]()[dartx.remove](key);
  }
  clear() {
    if (dart.test(this[_isUpgraded])) {
      this[_upgradedMap][dartx.clear]();
    } else {
      if (this[_data] != null) {
        dart.dsend(this[_data], 'clear');
      }
      this[_original] = this[_processed] = null;
      this[_data] = dart.map();
    }
  }
  forEach(f) {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.forEach](f);
    let keys = this[_computeKeys$]();
    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
      let key = keys[dartx._get](i);
      let value = convert._JsonMap._getProperty(this[_processed], key);
      if (dart.test(convert._JsonMap._isUnprocessed(value))) {
        value = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
        convert._JsonMap._setProperty(this[_processed], key, value);
      }
      dart.dcall(f, key, value);
      if (!core.identical(keys, this[_data])) {
        dart.throw(new core.ConcurrentModificationError(this));
      }
    }
  }
  toString() {
    return collection.Maps.mapToString(this);
  }
  get [_isUpgraded]() {
    return this[_processed] == null;
  }
  get [_upgradedMap]() {
    dart.assert(this[_isUpgraded]);
    return this[_data];
  }
  [_computeKeys$]() {
    dart.assert(!dart.test(this[_isUpgraded]));
    let keys = core.List._check(this[_data]);
    if (keys == null) {
      keys = this[_data] = convert._JsonMap._getPropertyNames(this[_original]);
    }
    return keys;
  }
  [_upgrade]() {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap];
    let result = dart.map();
    let keys = this[_computeKeys$]();
    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
      let key = keys[dartx._get](i);
      result[dartx._set](key, this._get(key));
    }
    if (dart.test(keys[dartx.isEmpty])) {
      keys[dartx.add](null);
    } else {
      keys[dartx.clear]();
    }
    this[_original] = this[_processed] = null;
    this[_data] = result;
    dart.assert(this[_isUpgraded]);
    return result;
  }
  [_process$](key) {
    if (!dart.test(convert._JsonMap._hasProperty(this[_original], key))) return null;
    let result = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
    return convert._JsonMap._setProperty(this[_processed], key, result);
  }
  static _hasProperty(object, key) {
    return Object.prototype.hasOwnProperty.call(object, key);
  }
  static _getProperty(object, key) {
    return object[key];
  }
  static _setProperty(object, key, value) {
    return object[key] = value;
  }
  static _getPropertyNames(object) {
    return Object.keys(object);
  }
  static _isUnprocessed(object) {
    return typeof object == "undefined";
  }
  static _newJavaScriptObject() {
    return Object.create(null);
  }
};
convert._JsonMap[dart.implements] = () => [collection.LinkedHashMap];
dart.setSignature(convert._JsonMap, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonMap, [dart.dynamic])}),
  fields: () => ({
    [_original]: dart.dynamic,
    [_processed]: dart.dynamic,
    [_data]: dart.dynamic
  }),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, []),
    keys: dart.definiteFunctionType(core.Iterable, []),
    values: dart.definiteFunctionType(core.Iterable, []),
    [_isUpgraded]: dart.definiteFunctionType(core.bool, []),
    [_upgradedMap]: dart.definiteFunctionType(core.Map, [])
  }),
  methods: () => ({
    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    addAll: dart.definiteFunctionType(dart.void, [core.Map]),
    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
    putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
    remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    clear: dart.definiteFunctionType(dart.void, []),
    forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()]),
    [_computeKeys$]: dart.definiteFunctionType(core.List$(core.String), []),
    [_upgrade]: dart.definiteFunctionType(core.Map, []),
    [_process$]: dart.definiteFunctionType(dart.dynamic, [core.String])
  }),
  statics: () => ({
    _hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String]),
    _getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String]),
    _setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
    _getPropertyNames: dart.definiteFunctionType(core.List, [dart.dynamic]),
    _isUnprocessed: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    _newJavaScriptObject: dart.definiteFunctionType(dart.dynamic, [])
  }),
  names: ['_hasProperty', '_getProperty', '_setProperty', '_getPropertyNames', '_isUnprocessed', '_newJavaScriptObject']
});
dart.defineExtensionMembers(convert._JsonMap, [
  '_get',
  '_set',
  'addAll',
  'containsValue',
  'containsKey',
  'putIfAbsent',
  'remove',
  'clear',
  'forEach',
  'length',
  'isEmpty',
  'isNotEmpty',
  'keys',
  'values'
]);
const _parent = Symbol('_parent');
convert._JsonMapKeyIterable = class _JsonMapKeyIterable extends _internal.ListIterable {
  new(parent) {
    this[_parent] = parent;
    super.new();
  }
  get length() {
    return this[_parent].length;
  }
  elementAt(index) {
    return core.String._check(dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.elementAt](index) : this[_parent][_computeKeys$]()[dartx._get](index));
  }
  get iterator() {
    return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.iterator] : this[_parent][_computeKeys$]()[dartx.iterator];
  }
  contains(key) {
    return this[_parent].containsKey(key);
  }
};
dart.addSimpleTypeTests(convert._JsonMapKeyIterable);
dart.setSignature(convert._JsonMapKeyIterable, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonMapKeyIterable, [convert._JsonMap])}),
  fields: () => ({[_parent]: convert._JsonMap}),
  methods: () => ({elementAt: dart.definiteFunctionType(core.String, [core.int])})
});
dart.defineExtensionMembers(convert._JsonMapKeyIterable, ['elementAt', 'contains', 'length', 'iterator']);
const _reviver = Symbol('_reviver');
const _sink$ = Symbol('_sink');
const _stringSink = Symbol('_stringSink');
convert.StringConversionSinkMixin = class StringConversionSinkMixin extends core.Object {
  add(str) {
    this.addSlice(str, 0, str[dartx.length], false);
  }
  asUtf8Sink(allowMalformed) {
    return new convert._Utf8ConversionSink(this, allowMalformed);
  }
  asStringSink() {
    return new convert._StringConversionSinkAsStringSinkAdapter(this);
  }
};
convert.StringConversionSinkMixin[dart.implements] = () => [convert.StringConversionSink];
dart.setSignature(convert.StringConversionSinkMixin, {
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [core.String]),
    asUtf8Sink: dart.definiteFunctionType(convert.ByteConversionSink, [core.bool]),
    asStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [])
  })
});
convert.StringConversionSinkBase = class StringConversionSinkBase extends convert.StringConversionSinkMixin {};
convert._StringSinkConversionSink = class _StringSinkConversionSink extends convert.StringConversionSinkBase {
  new(stringSink) {
    this[_stringSink] = stringSink;
  }
  close() {}
  addSlice(str, start, end, isLast) {
    if (start != 0 || end != str[dartx.length]) {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        this[_stringSink].writeCharCode(str[dartx.codeUnitAt](i));
      }
    } else {
      this[_stringSink].write(str);
    }
    if (dart.test(isLast)) this.close();
  }
  add(str) {
    this[_stringSink].write(str);
  }
  asUtf8Sink(allowMalformed) {
    return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
  }
  asStringSink() {
    return convert.ClosableStringSink.fromStringSink(this[_stringSink], dart.bind(this, 'close'));
  }
};
dart.setSignature(convert._StringSinkConversionSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._StringSinkConversionSink, [core.StringSink])}),
  fields: () => ({[_stringSink]: core.StringSink}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
  })
});
convert._JsonDecoderSink = class _JsonDecoderSink extends convert._StringSinkConversionSink {
  new(reviver, sink) {
    this[_reviver] = reviver;
    this[_sink$] = sink;
    super.new(new core.StringBuffer());
  }
  close() {
    super.close();
    let buffer = core.StringBuffer._check(this[_stringSink]);
    let accumulated = dart.toString(buffer);
    buffer.clear();
    let decoded = convert._parseJson(accumulated, this[_reviver]);
    this[_sink$].add(decoded);
    this[_sink$].close();
  }
};
dart.setSignature(convert._JsonDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonDecoderSink, [convert._Reviver, SinkOfObject()])}),
  fields: () => ({
    [_reviver]: convert._Reviver,
    [_sink$]: SinkOfObject()
  })
});
const _allowInvalid = Symbol('_allowInvalid');
let const$25;
let const$26;
let const$27;
let const$28;
let const$29;
convert.Codec$ = dart.generic((S, T) => {
  let _InvertedCodecOfT$S = () => (_InvertedCodecOfT$S = dart.constFn(convert._InvertedCodec$(T, S)))();
  class Codec extends core.Object {
    new() {
    }
    encode(input) {
      S._check(input);
      return this.encoder.convert(input);
    }
    decode(encoded) {
      T._check(encoded);
      return this.decoder.convert(encoded);
    }
    fuse(R) {
      return other => {
        convert.Codec$(T, R)._check(other);
        return new (convert._FusedCodec$(S, T, R))(this, other);
      };
    }
    get inverted() {
      return new (_InvertedCodecOfT$S())(this);
    }
  }
  dart.addTypeTests(Codec);
  dart.setSignature(Codec, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Codec$(S, T), [])}),
    getters: () => ({inverted: dart.definiteFunctionType(convert.Codec$(T, S), [])}),
    methods: () => ({
      encode: dart.definiteFunctionType(T, [S]),
      decode: dart.definiteFunctionType(S, [T]),
      fuse: dart.definiteFunctionType(R => [convert.Codec$(S, R), [convert.Codec$(T, R)]])
    })
  });
  return Codec;
});
convert.Codec = Codec();
core.String = class String extends core.Object {
  static fromCharCodes(charCodes, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (_interceptors.JSArray.is(charCodes)) {
      return core.String._stringFromJSArray(JSArrayOfint()._check(charCodes), start, end);
    }
    if (_native_typed_data.NativeUint8List.is(charCodes)) {
      return core.String._stringFromUint8List(charCodes, start, end);
    }
    return core.String._stringFromIterable(charCodes, start, end);
  }
  static fromCharCode(charCode) {
    return _js_helper.Primitives.stringFromCharCode(charCode);
  }
  static fromEnvironment(name, opts) {
    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
    dart.throw(new core.UnsupportedError('String.fromEnvironment can only be used as a const constructor'));
  }
  static _stringFromJSArray(list, start, endOrNull) {
    let len = list[dartx.length];
    let end = core.RangeError.checkValidRange(start, endOrNull, len);
    if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(len)) {
      list = JSArrayOfint()._check(list[dartx.sublist](start, end));
    }
    return _js_helper.Primitives.stringFromCharCodes(list);
  }
  static _stringFromUint8List(charCodes, start, endOrNull) {
    let len = charCodes[dartx.length];
    let end = core.RangeError.checkValidRange(start, endOrNull, len);
    return _js_helper.Primitives.stringFromNativeUint8List(charCodes, start, end);
  }
  static _stringFromIterable(charCodes, start, end) {
    if (dart.notNull(start) < 0) dart.throw(new core.RangeError.range(start, 0, charCodes[dartx.length]));
    if (end != null && dart.notNull(end) < dart.notNull(start)) {
      dart.throw(new core.RangeError.range(end, start, charCodes[dartx.length]));
    }
    let it = charCodes[dartx.iterator];
    for (let i = 0; i < dart.notNull(start); i++) {
      if (!dart.test(it.moveNext())) {
        dart.throw(new core.RangeError.range(start, 0, i));
      }
    }
    let list = JSArrayOfint().of([]);
    if (end == null) {
      while (dart.test(it.moveNext()))
        list[dartx.add](it.current);
    } else {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if (!dart.test(it.moveNext())) {
          dart.throw(new core.RangeError.range(end, start, i));
        }
        list[dartx.add](it.current);
      }
    }
    return _js_helper.Primitives.stringFromCharCodes(JSArrayOfint()._check(list));
  }
};
core.String.is = function is_String(o) {
  return typeof o == "string";
};
core.String.as = function as_String(o) {
  if (typeof o == "string" || o == null) return o;
  return dart.as(o, core.String);
};
core.String._check = function check_String(o) {
  if (typeof o == "string" || o == null) return o;
  return dart.check(o, core.String);
};
core.String[dart.implements] = () => [ComparableOfString(), core.Pattern];
dart.setSignature(core.String, {
  constructors: () => ({
    fromCharCodes: dart.definiteFunctionType(core.String, [IterableOfint()], [core.int, core.int]),
    fromCharCode: dart.definiteFunctionType(core.String, [core.int]),
    fromEnvironment: dart.definiteFunctionType(core.String, [core.String], {defaultValue: core.String})
  }),
  statics: () => ({
    _stringFromJSArray: dart.definiteFunctionType(core.String, [JSArrayOfint(), core.int, core.int]),
    _stringFromUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
    _stringFromIterable: dart.definiteFunctionType(core.String, [IterableOfint(), core.int, core.int])
  }),
  names: ['_stringFromJSArray', '_stringFromUint8List', '_stringFromIterable']
});
core.List$ = dart.generic(E => {
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
  class List extends core.Object {
    static new(length) {
      if (length === void 0) length = null;
      let list = null;
      if (length == null) {
        list = [];
      } else {
        if (!(typeof length == 'number') || dart.notNull(length) < 0) {
          dart.throw(new core.ArgumentError(dart.str`Length must be a non-negative integer: ${length}`));
        }
        list = _interceptors.JSArray.markFixedList(new Array(length));
      }
      return JSArrayOfE().typed(list);
    }
    static filled(length, fill) {
      let result = ListOfE().new(length);
      if (length != 0 && fill != null) {
        for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
          result[dartx._set](i, fill);
        }
      }
      return result;
    }
    static from(elements, opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let list = ListOfE().new();
      for (let e of elements) {
        list[dartx.add](E._check(e));
      }
      if (dart.test(growable)) return list;
      return _internal.makeListFixedLength(E)(list);
    }
    static generate(length, generator, opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = null;
      if (dart.test(growable)) {
        result = JSArrayOfE().of([]);
        result[dartx.length] = length;
      } else {
        result = ListOfE().new(length);
      }
      for (let i = 0; i < dart.notNull(length); i++) {
        result[dartx._set](i, generator(i));
      }
      return result;
    }
    static unmodifiable(elements) {
      let result = ListOfE().from(elements, {growable: false});
      return _internal.makeFixedListUnmodifiable(E)(result);
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this[dartx.iterator]);
    }
  }
  dart.addTypeTests(List);
  List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
  dart.setSignature(List, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.List$(E), [], [core.int]),
      filled: dart.definiteFunctionType(core.List$(E), [core.int, E]),
      from: dart.definiteFunctionType(core.List$(E), [core.Iterable], {growable: core.bool}),
      generate: dart.definiteFunctionType(core.List$(E), [core.int, intToE()], {growable: core.bool}),
      unmodifiable: dart.definiteFunctionType(core.List$(E), [core.Iterable])
    })
  });
  return List;
});
core.List = List();
convert.Encoding = class Encoding extends convert.Codec$(core.String, core.List$(core.int)) {
  new() {
    super.new();
  }
  decodeStream(byteStream) {
    return byteStream.transform(core.String)(this.decoder).fold(dart.dynamic)(new core.StringBuffer(), dart.fn((buffer, string) => ((() => {
      dart.dsend(buffer, 'write', string);
      return buffer;
    })()), dynamicAndStringTodynamic())).then(core.String)(dart.fn(buffer => dart.toString(buffer), dynamicToString()));
  }
  static getByName(name) {
    if (name == null) return null;
    name = name[dartx.toLowerCase]();
    return convert.Encoding._nameToEncoding[dartx._get](name);
  }
};
dart.addSimpleTypeTests(convert.Encoding);
dart.setSignature(convert.Encoding, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Encoding, [])}),
  methods: () => ({decodeStream: dart.definiteFunctionType(async.Future$(core.String), [StreamOfListOfint()])}),
  sfields: () => ({_nameToEncoding: MapOfString$Encoding()}),
  statics: () => ({getByName: dart.definiteFunctionType(convert.Encoding, [core.String])}),
  names: ['getByName']
});
dart.defineLazy(convert.Encoding, {
  get _nameToEncoding() {
    return dart.map({"iso_8859-1:1987": convert.LATIN1, "iso-ir-100": convert.LATIN1, "iso_8859-1": convert.LATIN1, "iso-8859-1": convert.LATIN1, latin1: convert.LATIN1, l1: convert.LATIN1, ibm819: convert.LATIN1, cp819: convert.LATIN1, csisolatin1: convert.LATIN1, "iso-ir-6": convert.ASCII, "ansi_x3.4-1968": convert.ASCII, "ansi_x3.4-1986": convert.ASCII, "iso_646.irv:1991": convert.ASCII, "iso646-us": convert.ASCII, "us-ascii": convert.ASCII, us: convert.ASCII, ibm367: convert.ASCII, cp367: convert.ASCII, csascii: convert.ASCII, ascii: convert.ASCII, csutf8: convert.UTF8, "utf-8": convert.UTF8}, core.String, convert.Encoding);
  },
  set _nameToEncoding(_) {}
});
convert.AsciiCodec = class AsciiCodec extends convert.Encoding {
  new(opts) {
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
    this[_allowInvalid] = allowInvalid;
    super.new();
  }
  get name() {
    return "us-ascii";
  }
  decode(bytes, opts) {
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
    if (allowInvalid == null) allowInvalid = this[_allowInvalid];
    if (dart.test(allowInvalid)) {
      return (const$25 || (const$25 = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
    } else {
      return (const$26 || (const$26 = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const$27 || (const$27 = dart.const(new convert.AsciiEncoder()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const$28 || (const$28 = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const$29 || (const$29 = dart.const(new convert.AsciiDecoder({allowInvalid: false})));
  }
};
dart.setSignature(convert.AsciiCodec, {
  constructors: () => ({new: dart.definiteFunctionType(convert.AsciiCodec, [], {allowInvalid: core.bool})}),
  fields: () => ({[_allowInvalid]: core.bool}),
  getters: () => ({
    name: dart.definiteFunctionType(core.String, []),
    encoder: dart.definiteFunctionType(convert.AsciiEncoder, []),
    decoder: dart.definiteFunctionType(convert.AsciiDecoder, [])
  }),
  methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
});
convert.ASCII = dart.const(new convert.AsciiCodec());
convert._ASCII_MASK = 127;
const _subsetMask = Symbol('_subsetMask');
convert.Converter$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _ConverterStreamEventSinkOfS$dynamic = () => (_ConverterStreamEventSinkOfS$dynamic = dart.constFn(convert._ConverterStreamEventSink$(S, dart.dynamic)))();
  let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let EventSinkTo_ConverterStreamEventSinkOfS$dynamic = () => (EventSinkTo_ConverterStreamEventSinkOfS$dynamic = dart.constFn(dart.definiteFunctionType(_ConverterStreamEventSinkOfS$dynamic(), [async.EventSink])))();
  class Converter extends core.Object {
    new() {
    }
    fuse(TT) {
      return other => {
        convert.Converter$(T, TT)._check(other);
        return new (convert._FusedConverter$(S, T, TT))(this, other);
      };
    }
    startChunkedConversion(sink) {
      SinkOfT()._check(sink);
      dart.throw(new core.UnsupportedError(dart.str`This converter does not support chunked conversions: ${this}`));
    }
    bind(stream) {
      StreamOfS()._check(stream);
      return StreamOfT().eventTransformed(stream, dart.fn(sink => new (_ConverterStreamEventSinkOfS$dynamic())(this, sink), EventSinkTo_ConverterStreamEventSinkOfS$dynamic()));
    }
  }
  dart.addTypeTests(Converter);
  Converter[dart.implements] = () => [StreamTransformerOfS$T()];
  dart.setSignature(Converter, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Converter$(S, T), [])}),
    methods: () => ({
      fuse: dart.definiteFunctionType(TT => [convert.Converter$(S, TT), [convert.Converter$(T, TT)]]),
      startChunkedConversion: dart.definiteFunctionType(core.Sink$(S), [SinkOfT()]),
      bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])
    })
  });
  return Converter;
});
convert.Converter = Converter();
convert._UnicodeSubsetEncoder = class _UnicodeSubsetEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
  new(subsetMask) {
    this[_subsetMask] = subsetMask;
    super.new();
  }
  convert(string, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let stringLength = string[dartx.length];
    core.RangeError.checkValidRange(start, end, stringLength);
    if (end == null) end = stringLength;
    let length = dart.notNull(end) - dart.notNull(start);
    let result = typed_data.Uint8List.new(length);
    for (let i = 0; i < length; i++) {
      let codeUnit = string[dartx.codeUnitAt](dart.notNull(start) + i);
      if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
        dart.throw(new core.ArgumentError("String contains invalid characters."));
      }
      result[dartx._set](i, codeUnit);
    }
    return result;
  }
  startChunkedConversion(sink) {
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new convert._UnicodeSubsetEncoderSink(this[_subsetMask], convert.ByteConversionSink._check(sink));
  }
  bind(stream) {
    return super.bind(stream);
  }
};
dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
dart.setSignature(convert._UnicodeSubsetEncoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoder, [core.int])}),
  fields: () => ({[_subsetMask]: core.int}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
  })
});
convert.AsciiEncoder = class AsciiEncoder extends convert._UnicodeSubsetEncoder {
  new() {
    super.new(convert._ASCII_MASK);
  }
};
dart.setSignature(convert.AsciiEncoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.AsciiEncoder, [])})
});
convert._UnicodeSubsetEncoderSink = class _UnicodeSubsetEncoderSink extends convert.StringConversionSinkBase {
  new(subsetMask, sink) {
    this[_subsetMask] = subsetMask;
    this[_sink$] = sink;
  }
  close() {
    this[_sink$].close();
  }
  addSlice(source, start, end, isLast) {
    core.RangeError.checkValidRange(start, end, source[dartx.length]);
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let codeUnit = source[dartx.codeUnitAt](i);
      if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
        dart.throw(new core.ArgumentError(dart.str`Source contains invalid character with code point: ${codeUnit}.`));
      }
    }
    this[_sink$].add(source[dartx.codeUnits][dartx.sublist](start, end));
    if (dart.test(isLast)) {
      this.close();
    }
  }
};
dart.setSignature(convert._UnicodeSubsetEncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoderSink, [core.int, convert.ByteConversionSink])}),
  fields: () => ({
    [_sink$]: convert.ByteConversionSink,
    [_subsetMask]: core.int
  }),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
  })
});
const _convertInvalid = Symbol('_convertInvalid');
convert._UnicodeSubsetDecoder = class _UnicodeSubsetDecoder extends convert.Converter$(core.List$(core.int), core.String) {
  new(allowInvalid, subsetMask) {
    this[_allowInvalid] = allowInvalid;
    this[_subsetMask] = subsetMask;
    super.new();
  }
  convert(bytes, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let byteCount = bytes[dartx.length];
    core.RangeError.checkValidRange(start, end, byteCount);
    if (end == null) end = byteCount;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let byte = bytes[dartx._get](i);
      if ((dart.notNull(byte) & ~dart.notNull(this[_subsetMask])) != 0) {
        if (!dart.test(this[_allowInvalid])) {
          dart.throw(new core.FormatException(dart.str`Invalid value in input: ${byte}`));
        }
        return this[_convertInvalid](bytes, start, end);
      }
    }
    return core.String.fromCharCodes(bytes, start, end);
  }
  [_convertInvalid](bytes, start, end) {
    let buffer = new core.StringBuffer();
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let value = bytes[dartx._get](i);
      if ((dart.notNull(value) & ~dart.notNull(this[_subsetMask])) != 0) value = 65533;
      buffer.writeCharCode(value);
    }
    return buffer.toString();
  }
  bind(stream) {
    return super.bind(stream);
  }
};
dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
dart.setSignature(convert._UnicodeSubsetDecoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetDecoder, [core.bool, core.int])}),
  fields: () => ({
    [_allowInvalid]: core.bool,
    [_subsetMask]: core.int
  }),
  methods: () => ({
    convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
    [_convertInvalid]: dart.definiteFunctionType(core.String, [ListOfint(), core.int, core.int])
  })
});
convert.AsciiDecoder = class AsciiDecoder extends convert._UnicodeSubsetDecoder {
  new(opts) {
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
    super.new(allowInvalid, convert._ASCII_MASK);
  }
  startChunkedConversion(sink) {
    let stringSink = null;
    if (convert.StringConversionSink.is(sink)) {
      stringSink = sink;
    } else {
      stringSink = convert.StringConversionSink.from(sink);
    }
    if (dart.test(this[_allowInvalid])) {
      return new convert._ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
    } else {
      return new convert._SimpleAsciiDecoderSink(stringSink);
    }
  }
};
dart.setSignature(convert.AsciiDecoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.AsciiDecoder, [], {allowInvalid: core.bool})})
});
const _utf8Sink = Symbol('_utf8Sink');
let const$30;
convert.ChunkedConversionSink$ = dart.generic(T => {
  let _SimpleCallbackSinkOfT = () => (_SimpleCallbackSinkOfT = dart.constFn(convert._SimpleCallbackSink$(T)))();
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  let ListOfTTovoid = () => (ListOfTTovoid = dart.constFn(dart.functionType(dart.void, [ListOfT()])))();
  class ChunkedConversionSink extends core.Object {
    new() {
    }
    static withCallback(callback) {
      return new (_SimpleCallbackSinkOfT())(callback);
    }
  }
  dart.addTypeTests(ChunkedConversionSink);
  ChunkedConversionSink[dart.implements] = () => [SinkOfT()];
  dart.setSignature(ChunkedConversionSink, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), []),
      withCallback: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), [ListOfTTovoid()])
    })
  });
  return ChunkedConversionSink;
});
convert.ChunkedConversionSink = ChunkedConversionSink();
convert.ByteConversionSink = class ByteConversionSink extends convert.ChunkedConversionSink$(core.List$(core.int)) {
  new() {
    super.new();
  }
  static withCallback(callback) {
    return new convert._ByteCallbackSink(callback);
  }
  static from(sink) {
    return new convert._ByteAdapterSink(sink);
  }
};
dart.addSimpleTypeTests(convert.ByteConversionSink);
dart.setSignature(convert.ByteConversionSink, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert.ByteConversionSink, []),
    withCallback: dart.definiteFunctionType(convert.ByteConversionSink, [ListOfintTovoid()]),
    from: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
  })
});
convert.ByteConversionSinkBase = class ByteConversionSinkBase extends convert.ByteConversionSink {
  new() {
    super.new();
  }
  addSlice(chunk, start, end, isLast) {
    this.add(chunk[dartx.sublist](start, end));
    if (dart.test(isLast)) this.close();
  }
};
dart.setSignature(convert.ByteConversionSinkBase, {
  methods: () => ({addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
});
convert._ErrorHandlingAsciiDecoderSink = class _ErrorHandlingAsciiDecoderSink extends convert.ByteConversionSinkBase {
  new(utf8Sink) {
    this[_utf8Sink] = utf8Sink;
    super.new();
  }
  close() {
    this[_utf8Sink].close();
  }
  add(source) {
    this.addSlice(source, 0, source[dartx.length], false);
  }
  addSlice(source, start, end, isLast) {
    core.RangeError.checkValidRange(start, end, source[dartx.length]);
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
        if (dart.notNull(i) > dart.notNull(start)) this[_utf8Sink].addSlice(source, start, i, false);
        this[_utf8Sink].add(const$30 || (const$30 = dart.constList([239, 191, 189], core.int)));
        start = dart.notNull(i) + 1;
      }
    }
    if (dart.notNull(start) < dart.notNull(end)) {
      this[_utf8Sink].addSlice(source, start, end, isLast);
    } else if (dart.test(isLast)) {
      this.close();
    }
  }
};
dart.setSignature(convert._ErrorHandlingAsciiDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._ErrorHandlingAsciiDecoderSink, [convert.ByteConversionSink])}),
  fields: () => ({[_utf8Sink]: convert.ByteConversionSink}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()])
  })
});
convert._SimpleAsciiDecoderSink = class _SimpleAsciiDecoderSink extends convert.ByteConversionSinkBase {
  new(sink) {
    this[_sink$] = sink;
    super.new();
  }
  close() {
    this[_sink$].close();
  }
  add(source) {
    for (let i = 0; i < dart.notNull(source[dartx.length]); i++) {
      if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
        dart.throw(new core.FormatException("Source contains non-ASCII bytes."));
      }
    }
    this[_sink$].add(core.String.fromCharCodes(source));
  }
  addSlice(source, start, end, isLast) {
    let length = source[dartx.length];
    core.RangeError.checkValidRange(start, end, length);
    if (dart.notNull(start) < dart.notNull(end)) {
      if (start != 0 || end != length) {
        source = source[dartx.sublist](start, end);
      }
      this.add(source);
    }
    if (dart.test(isLast)) this.close();
  }
};
dart.setSignature(convert._SimpleAsciiDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._SimpleAsciiDecoderSink, [core.Sink])}),
  fields: () => ({[_sink$]: core.Sink}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()])
  })
});
const _urlSafe = Symbol('_urlSafe');
convert.Base64Encoder = class Base64Encoder extends convert.Converter$(core.List$(core.int), core.String) {
  new() {
    this[_urlSafe] = false;
    super.new();
  }
  urlSafe() {
    this[_urlSafe] = true;
    super.new();
  }
  convert(input) {
    if (dart.test(input[dartx.isEmpty])) return "";
    let encoder = new convert._Base64Encoder(this[_urlSafe]);
    let buffer = encoder.encode(input, 0, input[dartx.length], true);
    return core.String.fromCharCodes(buffer);
  }
  startChunkedConversion(sink) {
    if (convert.StringConversionSink.is(sink)) {
      return new convert._Utf8Base64EncoderSink(sink.asUtf8Sink(false), this[_urlSafe]);
    }
    return new convert._AsciiBase64EncoderSink(sink, this[_urlSafe]);
  }
};
dart.addSimpleTypeTests(convert.Base64Encoder);
dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
dart.setSignature(convert.Base64Encoder, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert.Base64Encoder, []),
    urlSafe: dart.definiteFunctionType(convert.Base64Encoder, [])
  }),
  fields: () => ({[_urlSafe]: core.bool}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.String, [ListOfint()]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
  })
});
let const$31;
const _encoder = Symbol('_encoder');
let const$32;
let const$33;
convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
  new() {
    this[_encoder] = const$31 || (const$31 = dart.const(new convert.Base64Encoder()));
    super.new();
  }
  urlSafe() {
    this[_encoder] = const$32 || (const$32 = dart.const(new convert.Base64Encoder.urlSafe()));
    super.new();
  }
  get encoder() {
    return this[_encoder];
  }
  get decoder() {
    return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
  }
};
dart.addSimpleTypeTests(convert.Base64Codec);
dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
dart.setSignature(convert.Base64Codec, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert.Base64Codec, []),
    urlSafe: dart.definiteFunctionType(convert.Base64Codec, [])
  }),
  fields: () => ({[_encoder]: convert.Base64Encoder}),
  getters: () => ({
    encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
    decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
  })
});
convert.BASE64 = dart.const(new convert.Base64Codec());
convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
convert._paddingChar = 61;
const _alphabet = Symbol('_alphabet');
const _state$0 = Symbol('_state');
convert._Base64Encoder = class _Base64Encoder extends core.Object {
  new(urlSafe) {
    this[_alphabet] = dart.test(urlSafe) ? convert._Base64Encoder._base64urlAlphabet : convert._Base64Encoder._base64Alphabet;
    this[_state$0] = 0;
  }
  static _encodeState(count, bits) {
    dart.assert(dart.notNull(count) <= convert._Base64Encoder._countMask);
    return (dart.notNull(bits) << convert._Base64Encoder._valueShift | dart.notNull(count)) >>> 0;
  }
  static _stateBits(state) {
    return state[dartx['>>']](convert._Base64Encoder._valueShift);
  }
  static _stateCount(state) {
    return dart.notNull(state) & convert._Base64Encoder._countMask;
  }
  createBuffer(bufferLength) {
    return typed_data.Uint8List.new(bufferLength);
  }
  encode(bytes, start, end, isLast) {
    dart.assert(0 <= dart.notNull(start));
    dart.assert(dart.notNull(start) <= dart.notNull(end));
    dart.assert(bytes == null || dart.notNull(end) <= dart.notNull(bytes[dartx.length]));
    let length = dart.notNull(end) - dart.notNull(start);
    let count = convert._Base64Encoder._stateCount(this[_state$0]);
    let byteCount = dart.notNull(count) + length;
    let fullChunks = (byteCount / 3)[dartx.truncate]();
    let partialChunkLength = byteCount - fullChunks * 3;
    let bufferLength = fullChunks * 4;
    if (dart.test(isLast) && partialChunkLength > 0) {
      bufferLength = bufferLength + 4;
    }
    let output = this.createBuffer(bufferLength);
    this[_state$0] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state$0]);
    if (bufferLength > 0) return output;
    return null;
  }
  static encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
    let bits = convert._Base64Encoder._stateBits(state);
    let expectedChars = 3 - dart.notNull(convert._Base64Encoder._stateCount(state));
    let byteOr = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let byte = bytes[dartx._get](i);
      byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
      bits = (dart.notNull(bits) << 8 | dart.notNull(byte)) & 16777215;
      expectedChars--;
      if (expectedChars == 0) {
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 18 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 12 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 6 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) & convert._Base64Encoder._sixBitMask));
        expectedChars = 3;
        bits = 0;
      }
    }
    if (dart.notNull(byteOr) >= 0 && dart.notNull(byteOr) <= 255) {
      if (dart.test(isLast) && expectedChars < 3) {
        convert._Base64Encoder.writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
        return 0;
      }
      return convert._Base64Encoder._encodeState(3 - expectedChars, bits);
    }
    let i = start;
    while (dart.notNull(i) < dart.notNull(end)) {
      let byte = bytes[dartx._get](i);
      if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) break;
      i = dart.notNull(i) + 1;
    }
    dart.throw(new core.ArgumentError.value(bytes, dart.str`Not a byte value at index ${i}: 0x${bytes[dartx._get](i)[dartx.toRadixString](16)}`));
  }
  static writeFinalChunk(alphabet, output, outputIndex, count, bits) {
    dart.assert(dart.notNull(count) > 0);
    if (count == 1) {
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 2 & convert._Base64Encoder._sixBitMask));
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 4 & convert._Base64Encoder._sixBitMask));
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), convert._paddingChar);
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), convert._paddingChar);
    } else {
      dart.assert(count == 2);
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 10 & convert._Base64Encoder._sixBitMask));
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 4 & convert._Base64Encoder._sixBitMask));
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 2 & convert._Base64Encoder._sixBitMask));
      output[dartx._set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), convert._paddingChar);
    }
  }
};
dart.setSignature(convert._Base64Encoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Base64Encoder, [core.bool])}),
  fields: () => ({
    [_state$0]: core.int,
    [_alphabet]: core.String
  }),
  methods: () => ({
    createBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
    encode: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint(), core.int, core.int, core.bool])
  }),
  sfields: () => ({
    _base64Alphabet: core.String,
    _base64urlAlphabet: core.String,
    _valueShift: core.int,
    _countMask: core.int,
    _sixBitMask: core.int
  }),
  statics: () => ({
    _encodeState: dart.definiteFunctionType(core.int, [core.int, core.int]),
    _stateBits: dart.definiteFunctionType(core.int, [core.int]),
    _stateCount: dart.definiteFunctionType(core.int, [core.int]),
    encodeChunk: dart.definiteFunctionType(core.int, [core.String, ListOfint(), core.int, core.int, core.bool, typed_data.Uint8List, core.int, core.int]),
    writeFinalChunk: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List, core.int, core.int, core.int])
  }),
  names: ['_encodeState', '_stateBits', '_stateCount', 'encodeChunk', 'writeFinalChunk']
});
convert._Base64Encoder._base64Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
convert._Base64Encoder._base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
convert._Base64Encoder._valueShift = 2;
convert._Base64Encoder._countMask = 3;
convert._Base64Encoder._sixBitMask = 63;
convert._BufferCachingBase64Encoder = class _BufferCachingBase64Encoder extends convert._Base64Encoder {
  new(urlSafe) {
    this.bufferCache = null;
    super.new(urlSafe);
  }
  createBuffer(bufferLength) {
    if (this.bufferCache == null || dart.notNull(this.bufferCache[dartx.length]) < dart.notNull(bufferLength)) {
      this.bufferCache = typed_data.Uint8List.new(bufferLength);
    }
    return typed_data.Uint8List.view(this.bufferCache[dartx.buffer], 0, bufferLength);
  }
};
dart.setSignature(convert._BufferCachingBase64Encoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert._BufferCachingBase64Encoder, [core.bool])}),
  fields: () => ({bufferCache: typed_data.Uint8List})
});
const _add$1 = Symbol('_add');
convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
  new() {
    super.new();
  }
  add(source) {
    this[_add$1](source, 0, source[dartx.length], false);
  }
  close() {
    this[_add$1](null, 0, 0, true);
  }
  addSlice(source, start, end, isLast) {
    if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
    core.RangeError.checkValidRange(start, end, source[dartx.length]);
    this[_add$1](source, start, end, isLast);
  }
};
dart.setSignature(convert._Base64EncoderSink, {
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
convert._AsciiBase64EncoderSink = class _AsciiBase64EncoderSink extends convert._Base64EncoderSink {
  new(sink, urlSafe) {
    this[_sink$] = sink;
    this[_encoder] = new convert._BufferCachingBase64Encoder(urlSafe);
    super.new();
  }
  [_add$1](source, start, end, isLast) {
    let buffer = this[_encoder].encode(source, start, end, isLast);
    if (buffer != null) {
      let string = core.String.fromCharCodes(buffer);
      this[_sink$].add(string);
    }
    if (dart.test(isLast)) {
      this[_sink$].close();
    }
  }
};
dart.setSignature(convert._AsciiBase64EncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._AsciiBase64EncoderSink, [SinkOfString(), core.bool])}),
  fields: () => ({
    [_sink$]: SinkOfString(),
    [_encoder]: convert._Base64Encoder
  }),
  methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
});
convert._Utf8Base64EncoderSink = class _Utf8Base64EncoderSink extends convert._Base64EncoderSink {
  new(sink, urlSafe) {
    this[_sink$] = sink;
    this[_encoder] = new convert._Base64Encoder(urlSafe);
    super.new();
  }
  [_add$1](source, start, end, isLast) {
    let buffer = this[_encoder].encode(source, start, end, isLast);
    if (buffer != null) {
      this[_sink$].addSlice(buffer, 0, buffer[dartx.length], isLast);
    }
  }
};
dart.setSignature(convert._Utf8Base64EncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Base64EncoderSink, [convert.ByteConversionSink, core.bool])}),
  fields: () => ({
    [_sink$]: convert.ByteConversionSink,
    [_encoder]: convert._Base64Encoder
  }),
  methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
});
convert.Base64Decoder = class Base64Decoder extends convert.Converter$(core.String, core.List$(core.int)) {
  new() {
    super.new();
  }
  convert(input, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    end = core.RangeError.checkValidRange(start, end, input[dartx.length]);
    if (start == end) return typed_data.Uint8List.new(0);
    let decoder = new convert._Base64Decoder();
    let buffer = decoder.decode(input, start, end);
    decoder.close(input, end);
    return buffer;
  }
  startChunkedConversion(sink) {
    return new convert._Base64DecoderSink(sink);
  }
};
dart.addSimpleTypeTests(convert.Base64Decoder);
dart.setSignature(convert.Base64Decoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Base64Decoder, [])}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
  })
});
convert._Base64Decoder = class _Base64Decoder extends core.Object {
  new() {
    this[_state$0] = 0;
  }
  static _encodeCharacterState(count, bits) {
    dart.assert(count == (dart.notNull(count) & convert._Base64Decoder._countMask));
    return (dart.notNull(bits) << convert._Base64Decoder._valueShift | dart.notNull(count)) >>> 0;
  }
  static _stateCount(state) {
    dart.assert(dart.notNull(state) >= 0);
    return dart.notNull(state) & convert._Base64Decoder._countMask;
  }
  static _stateBits(state) {
    dart.assert(dart.notNull(state) >= 0);
    return state[dartx['>>']](convert._Base64Decoder._valueShift);
  }
  static _encodePaddingState(expectedPadding) {
    dart.assert(dart.notNull(expectedPadding) >= 0);
    dart.assert(dart.notNull(expectedPadding) <= 5);
    return -dart.notNull(expectedPadding) - 1;
  }
  static _statePadding(state) {
    dart.assert(dart.notNull(state) < 0);
    return -dart.notNull(state) - 1;
  }
  static _hasSeenPadding(state) {
    return dart.notNull(state) < 0;
  }
  decode(input, start, end) {
    dart.assert(0 <= dart.notNull(start));
    dart.assert(dart.notNull(start) <= dart.notNull(end));
    dart.assert(dart.notNull(end) <= dart.notNull(input[dartx.length]));
    if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state$0]))) {
      this[_state$0] = convert._Base64Decoder._checkPadding(input, start, end, this[_state$0]);
      return null;
    }
    if (start == end) return typed_data.Uint8List.new(0);
    let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state$0]);
    this[_state$0] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state$0]);
    return buffer;
  }
  close(input, end) {
    if (dart.notNull(this[_state$0]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
      dart.throw(new core.FormatException("Missing padding character", input, end));
    }
    if (dart.notNull(this[_state$0]) > 0) {
      dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
    }
    this[_state$0] = convert._Base64Decoder._encodePaddingState(0);
  }
  static decodeChunk(input, start, end, output, outIndex, state) {
    dart.assert(!dart.test(convert._Base64Decoder._hasSeenPadding(state)));
    let asciiMask = 127;
    let asciiMax = 127;
    let eightBitMask = 255;
    let bitsPerCharacter = 6;
    let bits = convert._Base64Decoder._stateBits(state);
    let count = convert._Base64Decoder._stateCount(state);
    let charOr = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = input[dartx.codeUnitAt](i);
      charOr = (dart.notNull(charOr) | dart.notNull(char)) >>> 0;
      let code = convert._Base64Decoder._inverseAlphabet[dartx._get]((dart.notNull(char) & asciiMask) >>> 0);
      if (dart.notNull(code) >= 0) {
        bits = (bits[dartx['<<']](bitsPerCharacter) | dart.notNull(code)) & 16777215;
        count = dart.notNull(count) + 1 & 3;
        if (count == 0) {
          dart.assert(dart.notNull(outIndex) + 3 <= dart.notNull(output[dartx.length]));
          output[dartx._set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), (bits[dartx['>>']](16) & eightBitMask) >>> 0);
          output[dartx._set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), (bits[dartx['>>']](8) & eightBitMask) >>> 0);
          output[dartx._set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), (dart.notNull(bits) & eightBitMask) >>> 0);
          bits = 0;
        }
        continue;
      } else if (code == convert._Base64Decoder._padding && dart.notNull(count) > 1) {
        if (dart.notNull(charOr) < 0 || dart.notNull(charOr) > asciiMax) break;
        if (count == 3) {
          if ((dart.notNull(bits) & 3) != 0) {
            dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
          }
          output[dartx._set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), bits[dartx['>>']](10));
          output[dartx._set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), bits[dartx['>>']](2));
        } else {
          if ((dart.notNull(bits) & 15) != 0) {
            dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
          }
          output[dartx._set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), bits[dartx['>>']](4));
        }
        let expectedPadding = (3 - dart.notNull(count)) * 3;
        if (char == convert._Base64Decoder._char_percent) {
          expectedPadding = expectedPadding + 2;
        }
        state = convert._Base64Decoder._encodePaddingState(expectedPadding);
        return convert._Base64Decoder._checkPadding(input, dart.notNull(i) + 1, end, state);
      }
      dart.throw(new core.FormatException("Invalid character", input, i));
    }
    if (dart.notNull(charOr) >= 0 && dart.notNull(charOr) <= asciiMax) {
      return convert._Base64Decoder._encodeCharacterState(count, bits);
    }
    let i = null;
    for (i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = input[dartx.codeUnitAt](i);
      if (dart.notNull(char) < 0 || dart.notNull(char) > asciiMax) break;
    }
    dart.throw(new core.FormatException("Invalid character", input, i));
  }
  static _allocateBuffer(input, start, end, state) {
    dart.assert(dart.notNull(state) >= 0);
    let paddingStart = convert._Base64Decoder._trimPaddingChars(input, start, end);
    let length = dart.notNull(convert._Base64Decoder._stateCount(state)) + (dart.notNull(paddingStart) - dart.notNull(start));
    let bufferLength = length[dartx['>>']](2) * 3;
    let remainderLength = length & 3;
    if (remainderLength != 0 && dart.notNull(paddingStart) < dart.notNull(end)) {
      bufferLength = bufferLength + (remainderLength - 1);
    }
    if (bufferLength > 0) return typed_data.Uint8List.new(bufferLength);
    return null;
  }
  static _trimPaddingChars(input, start, end) {
    let padding = 0;
    let index = end;
    let newEnd = end;
    while (dart.notNull(index) > dart.notNull(start) && padding < 2) {
      index = dart.notNull(index) - 1;
      let char = input[dartx.codeUnitAt](index);
      if (char == convert._paddingChar) {
        padding++;
        newEnd = index;
        continue;
      }
      if ((dart.notNull(char) | 32) == convert._Base64Decoder._char_d) {
        if (index == start) break;
        index = dart.notNull(index) - 1;
        char = input[dartx.codeUnitAt](index);
      }
      if (char == convert._Base64Decoder._char_3) {
        if (index == start) break;
        index = dart.notNull(index) - 1;
        char = input[dartx.codeUnitAt](index);
      }
      if (char == convert._Base64Decoder._char_percent) {
        padding++;
        newEnd = index;
        continue;
      }
      break;
    }
    return newEnd;
  }
  static _checkPadding(input, start, end, state) {
    dart.assert(convert._Base64Decoder._hasSeenPadding(state));
    if (start == end) return state;
    let expectedPadding = convert._Base64Decoder._statePadding(state);
    dart.assert(dart.notNull(expectedPadding) >= 0);
    dart.assert(dart.notNull(expectedPadding) < 6);
    while (dart.notNull(expectedPadding) > 0) {
      let char = input[dartx.codeUnitAt](start);
      if (expectedPadding == 3) {
        if (char == convert._paddingChar) {
          expectedPadding = dart.notNull(expectedPadding) - 3;
          start = dart.notNull(start) + 1;
          break;
        }
        if (char == convert._Base64Decoder._char_percent) {
          expectedPadding = dart.notNull(expectedPadding) - 1;
          start = dart.notNull(start) + 1;
          if (start == end) break;
          char = input[dartx.codeUnitAt](start);
        } else {
          break;
        }
      }
      let expectedPartialPadding = expectedPadding;
      if (dart.notNull(expectedPartialPadding) > 3) {
        expectedPartialPadding = dart.notNull(expectedPartialPadding) - 3;
      }
      if (expectedPartialPadding == 2) {
        if (char != convert._Base64Decoder._char_3) break;
        start = dart.notNull(start) + 1;
        expectedPadding = dart.notNull(expectedPadding) - 1;
        if (start == end) break;
        char = input[dartx.codeUnitAt](start);
      }
      if ((dart.notNull(char) | 32) != convert._Base64Decoder._char_d) break;
      start = dart.notNull(start) + 1;
      expectedPadding = dart.notNull(expectedPadding) - 1;
      if (start == end) break;
    }
    if (start != end) {
      dart.throw(new core.FormatException("Invalid padding character", input, start));
    }
    return convert._Base64Decoder._encodePaddingState(expectedPadding);
  }
};
dart.setSignature(convert._Base64Decoder, {
  fields: () => ({[_state$0]: core.int}),
  methods: () => ({
    decode: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int]),
    close: dart.definiteFunctionType(dart.void, [core.String, core.int])
  }),
  sfields: () => ({
    _valueShift: core.int,
    _countMask: core.int,
    _invalid: core.int,
    _padding: core.int,
    __: core.int,
    _p: core.int,
    _inverseAlphabet: ListOfint(),
    _char_percent: core.int,
    _char_3: core.int,
    _char_d: core.int
  }),
  statics: () => ({
    _encodeCharacterState: dart.definiteFunctionType(core.int, [core.int, core.int]),
    _stateCount: dart.definiteFunctionType(core.int, [core.int]),
    _stateBits: dart.definiteFunctionType(core.int, [core.int]),
    _encodePaddingState: dart.definiteFunctionType(core.int, [core.int]),
    _statePadding: dart.definiteFunctionType(core.int, [core.int]),
    _hasSeenPadding: dart.definiteFunctionType(core.bool, [core.int]),
    decodeChunk: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, typed_data.Uint8List, core.int, core.int]),
    _allocateBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int, core.int]),
    _trimPaddingChars: dart.definiteFunctionType(core.int, [core.String, core.int, core.int]),
    _checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int])
  }),
  names: ['_encodeCharacterState', '_stateCount', '_stateBits', '_encodePaddingState', '_statePadding', '_hasSeenPadding', 'decodeChunk', '_allocateBuffer', '_trimPaddingChars', '_checkPadding']
});
convert._Base64Decoder._valueShift = 2;
convert._Base64Decoder._countMask = 3;
convert._Base64Decoder._invalid = -2;
convert._Base64Decoder._padding = -1;
convert._Base64Decoder._char_percent = 37;
convert._Base64Decoder._char_3 = 51;
convert._Base64Decoder._char_d = 100;
dart.defineLazy(convert._Base64Decoder, {
  get __() {
    return convert._Base64Decoder._invalid;
  },
  get _p() {
    return convert._Base64Decoder._padding;
  },
  get _inverseAlphabet() {
    return typed_data.Int8List.fromList(JSArrayOfint().of([convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 63, convert._Base64Decoder.__, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__]));
  }
});
const _decoder = Symbol('_decoder');
convert._Base64DecoderSink = class _Base64DecoderSink extends convert.StringConversionSinkBase {
  new(sink) {
    this[_decoder] = new convert._Base64Decoder();
    this[_sink$] = sink;
  }
  add(string) {
    if (dart.test(string[dartx.isEmpty])) return;
    let buffer = this[_decoder].decode(string, 0, string[dartx.length]);
    if (buffer != null) this[_sink$].add(buffer);
  }
  close() {
    this[_decoder].close(null, null);
    this[_sink$].close();
  }
  addSlice(string, start, end, isLast) {
    end = core.RangeError.checkValidRange(start, end, string[dartx.length]);
    if (start == end) return;
    let buffer = this[_decoder].decode(string, start, end);
    if (buffer != null) this[_sink$].add(buffer);
    if (dart.test(isLast)) {
      this[_decoder].close(string, end);
      this[_sink$].close();
    }
  }
};
dart.setSignature(convert._Base64DecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Base64DecoderSink, [SinkOfListOfint()])}),
  fields: () => ({
    [_sink$]: SinkOfListOfint(),
    [_decoder]: convert._Base64Decoder
  }),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
  })
});
convert._ByteAdapterSink = class _ByteAdapterSink extends convert.ByteConversionSinkBase {
  new(sink) {
    this[_sink$] = sink;
    super.new();
  }
  add(chunk) {
    this[_sink$].add(chunk);
  }
  close() {
    this[_sink$].close();
  }
};
dart.setSignature(convert._ByteAdapterSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._ByteAdapterSink, [SinkOfListOfint()])}),
  fields: () => ({[_sink$]: SinkOfListOfint()}),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
const _buffer = Symbol('_buffer');
const _callback = Symbol('_callback');
const _bufferIndex = Symbol('_bufferIndex');
convert._ByteCallbackSink = class _ByteCallbackSink extends convert.ByteConversionSinkBase {
  new(callback) {
    this[_buffer] = typed_data.Uint8List.new(convert._ByteCallbackSink._INITIAL_BUFFER_SIZE);
    this[_callback] = callback;
    this[_bufferIndex] = 0;
    super.new();
  }
  add(chunk) {
    let freeCount = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_bufferIndex]);
    if (dart.notNull(chunk[dartx.length]) > freeCount) {
      let oldLength = this[_buffer][dartx.length];
      let newLength = dart.notNull(convert._ByteCallbackSink._roundToPowerOf2(dart.notNull(chunk[dartx.length]) + dart.notNull(oldLength))) * 2;
      let grown = typed_data.Uint8List.new(newLength);
      grown[dartx.setRange](0, this[_buffer][dartx.length], this[_buffer]);
      this[_buffer] = grown;
    }
    this[_buffer][dartx.setRange](this[_bufferIndex], dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]), chunk);
    this[_bufferIndex] = dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]);
  }
  static _roundToPowerOf2(v) {
    dart.assert(dart.notNull(v) > 0);
    v = dart.notNull(v) - 1;
    v = (dart.notNull(v) | v[dartx['>>']](1)) >>> 0;
    v = (dart.notNull(v) | v[dartx['>>']](2)) >>> 0;
    v = (dart.notNull(v) | v[dartx['>>']](4)) >>> 0;
    v = (dart.notNull(v) | v[dartx['>>']](8)) >>> 0;
    v = (dart.notNull(v) | v[dartx['>>']](16)) >>> 0;
    v = dart.notNull(v) + 1;
    return v;
  }
  close() {
    this[_callback](this[_buffer][dartx.sublist](0, this[_bufferIndex]));
  }
};
dart.setSignature(convert._ByteCallbackSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._ByteCallbackSink, [ListOfintTovoid()])}),
  fields: () => ({
    [_callback]: ListOfintTovoid(),
    [_buffer]: ListOfint(),
    [_bufferIndex]: core.int
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [IterableOfint()]),
    close: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({_INITIAL_BUFFER_SIZE: core.int}),
  statics: () => ({_roundToPowerOf2: dart.definiteFunctionType(core.int, [core.int])}),
  names: ['_roundToPowerOf2']
});
convert._ByteCallbackSink._INITIAL_BUFFER_SIZE = 1024;
convert._ChunkedConversionCallback$ = dart.generic(T => {
  const _ChunkedConversionCallback = dart.typedef('_ChunkedConversionCallback', () => dart.functionType(dart.void, [T]));
  return _ChunkedConversionCallback;
});
convert._ChunkedConversionCallback = _ChunkedConversionCallback();
convert.ChunkedConverter$ = dart.generic((S, T, S2, T2) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  class ChunkedConverter extends convert.Converter$(S, T) {
    new() {
      super.new();
    }
    bind(other) {
      return super.bind(StreamOfS()._check(other));
    }
    startChunkedConversion(sink) {
      return super.startChunkedConversion(SinkOfT()._check(sink));
    }
  }
  dart.setSignature(ChunkedConverter, {
    constructors: () => ({new: dart.definiteFunctionType(convert.ChunkedConverter$(S, T, S2, T2), [])}),
    methods: () => ({
      bind: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      startChunkedConversion: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  return ChunkedConverter;
});
convert.ChunkedConverter = ChunkedConverter();
const _accumulated = Symbol('_accumulated');
convert._SimpleCallbackSink$ = dart.generic(T => {
  let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  let _ChunkedConversionCallbackOfListOfT = () => (_ChunkedConversionCallbackOfListOfT = dart.constFn(convert._ChunkedConversionCallback$(ListOfT())))();
  class _SimpleCallbackSink extends convert.ChunkedConversionSink$(T) {
    new(callback) {
      this[_accumulated] = JSArrayOfT().of([]);
      this[_callback] = callback;
      super.new();
    }
    add(chunk) {
      T._check(chunk);
      this[_accumulated][dartx.add](chunk);
    }
    close() {
      this[_callback](this[_accumulated]);
    }
  }
  dart.setSignature(_SimpleCallbackSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._SimpleCallbackSink$(T), [_ChunkedConversionCallbackOfListOfT()])}),
    fields: () => ({
      [_callback]: _ChunkedConversionCallbackOfListOfT(),
      [_accumulated]: ListOfT()
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [T]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _SimpleCallbackSink;
});
convert._SimpleCallbackSink = _SimpleCallbackSink();
const _eventSink = Symbol('_eventSink');
const _chunkedSink = Symbol('_chunkedSink');
convert._ConverterStreamEventSink$ = dart.generic((S, T) => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let SinkOfS = () => (SinkOfS = dart.constFn(core.Sink$(S)))();
  let ConverterOfS$T = () => (ConverterOfS$T = dart.constFn(convert.Converter$(S, T)))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _ConverterStreamEventSink extends core.Object {
    new(converter, sink) {
      this[_eventSink] = sink;
      this[_chunkedSink] = converter.startChunkedConversion(sink);
    }
    add(o) {
      S._check(o);
      this[_chunkedSink].add(o);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_eventSink].addError(error, stackTrace);
    }
    close() {
      this[_chunkedSink].close();
    }
  }
  dart.addTypeTests(_ConverterStreamEventSink);
  _ConverterStreamEventSink[dart.implements] = () => [EventSinkOfS()];
  dart.setSignature(_ConverterStreamEventSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ConverterStreamEventSink$(S, T), [ConverterOfS$T(), EventSinkOfT()])}),
    fields: () => ({
      [_eventSink]: EventSinkOfT(),
      [_chunkedSink]: SinkOfS()
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [S]),
      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _ConverterStreamEventSink;
});
convert._ConverterStreamEventSink = _ConverterStreamEventSink();
const _second = Symbol('_second');
const _first$0 = Symbol('_first');
convert._FusedCodec$ = dart.generic((S, M, T) => {
  let CodecOfS$M = () => (CodecOfS$M = dart.constFn(convert.Codec$(S, M)))();
  let CodecOfM$T = () => (CodecOfM$T = dart.constFn(convert.Codec$(M, T)))();
  class _FusedCodec extends convert.Codec$(S, T) {
    get encoder() {
      return this[_first$0].encoder.fuse(T)(this[_second].encoder);
    }
    get decoder() {
      return this[_second].decoder.fuse(S)(this[_first$0].decoder);
    }
    new(first, second) {
      this[_first$0] = first;
      this[_second] = second;
      super.new();
    }
  }
  dart.setSignature(_FusedCodec, {
    constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
    fields: () => ({
      [_first$0]: CodecOfS$M(),
      [_second]: CodecOfM$T()
    }),
    getters: () => ({
      encoder: dart.definiteFunctionType(convert.Converter$(S, T), []),
      decoder: dart.definiteFunctionType(convert.Converter$(T, S), [])
    })
  });
  return _FusedCodec;
});
convert._FusedCodec = _FusedCodec();
const _codec = Symbol('_codec');
convert._InvertedCodec$ = dart.generic((T, S) => {
  let CodecOfS$T = () => (CodecOfS$T = dart.constFn(convert.Codec$(S, T)))();
  class _InvertedCodec extends convert.Codec$(T, S) {
    new(codec) {
      this[_codec] = codec;
      super.new();
    }
    get encoder() {
      return this[_codec].decoder;
    }
    get decoder() {
      return this[_codec].encoder;
    }
    get inverted() {
      return this[_codec];
    }
  }
  dart.setSignature(_InvertedCodec, {
    constructors: () => ({new: dart.definiteFunctionType(convert._InvertedCodec$(T, S), [CodecOfS$T()])}),
    fields: () => ({[_codec]: CodecOfS$T()}),
    getters: () => ({
      encoder: dart.definiteFunctionType(convert.Converter$(T, S), []),
      decoder: dart.definiteFunctionType(convert.Converter$(S, T), [])
    })
  });
  return _InvertedCodec;
});
convert._InvertedCodec = _InvertedCodec();
convert._FusedConverter$ = dart.generic((S, M, T) => {
  let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
  let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  class _FusedConverter extends convert.Converter$(S, T) {
    new(first, second) {
      this[_first$0] = first;
      this[_second] = second;
      super.new();
    }
    convert(input) {
      S._check(input);
      return this[_second].convert(this[_first$0].convert(input));
    }
    startChunkedConversion(sink) {
      SinkOfT()._check(sink);
      return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
    }
  }
  dart.setSignature(_FusedConverter, {
    constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
    fields: () => ({
      [_first$0]: ConverterOfS$M(),
      [_second]: ConverterOfM$T()
    }),
    methods: () => ({convert: dart.definiteFunctionType(T, [S])})
  });
  return _FusedConverter;
});
convert._FusedConverter = _FusedConverter();
const _name$1 = Symbol('_name');
let const$34;
let const$35;
let const$36;
let const$37;
let const$38;
let const$39;
let const$40;
let const$41;
convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
  _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
    this[_name$1] = name;
    this.escapeLtGt = escapeLtGt;
    this.escapeQuot = escapeQuot;
    this.escapeApos = escapeApos;
    this.escapeSlash = escapeSlash;
  }
  new(opts) {
    let name = opts && 'name' in opts ? opts.name : "custom";
    let escapeLtGt = opts && 'escapeLtGt' in opts ? opts.escapeLtGt : false;
    let escapeQuot = opts && 'escapeQuot' in opts ? opts.escapeQuot : false;
    let escapeApos = opts && 'escapeApos' in opts ? opts.escapeApos : false;
    let escapeSlash = opts && 'escapeSlash' in opts ? opts.escapeSlash : false;
    this.escapeLtGt = escapeLtGt;
    this.escapeQuot = escapeQuot;
    this.escapeApos = escapeApos;
    this.escapeSlash = escapeSlash;
    this[_name$1] = name;
  }
  toString() {
    return this[_name$1];
  }
};
dart.defineNamedConstructor(convert.HtmlEscapeMode, '_');
dart.setSignature(convert.HtmlEscapeMode, {
  constructors: () => ({
    _: dart.definiteFunctionType(convert.HtmlEscapeMode, [core.String, core.bool, core.bool, core.bool, core.bool]),
    new: dart.definiteFunctionType(convert.HtmlEscapeMode, [], {name: core.String, escapeLtGt: core.bool, escapeQuot: core.bool, escapeApos: core.bool, escapeSlash: core.bool})
  }),
  fields: () => ({
    [_name$1]: core.String,
    escapeLtGt: core.bool,
    escapeQuot: core.bool,
    escapeApos: core.bool,
    escapeSlash: core.bool
  }),
  sfields: () => ({
    UNKNOWN: convert.HtmlEscapeMode,
    ATTRIBUTE: convert.HtmlEscapeMode,
    SQ_ATTRIBUTE: convert.HtmlEscapeMode,
    ELEMENT: convert.HtmlEscapeMode
  })
});
dart.defineLazy(convert.HtmlEscapeMode, {
  get UNKNOWN() {
    return const$38 || (const$38 = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
  },
  get ATTRIBUTE() {
    return const$39 || (const$39 = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
  },
  get SQ_ATTRIBUTE() {
    return const$40 || (const$40 = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
  },
  get ELEMENT() {
    return const$41 || (const$41 = dart.const(new convert.HtmlEscapeMode._('element', true, false, false, false)));
  }
});
const _convert = Symbol('_convert');
convert.HtmlEscape = class HtmlEscape extends convert.Converter$(core.String, core.String) {
  new(mode) {
    if (mode === void 0) mode = convert.HtmlEscapeMode.UNKNOWN;
    this.mode = mode;
    super.new();
  }
  convert(text) {
    let val = this[_convert](text, 0, text[dartx.length]);
    return val == null ? text : val;
  }
  [_convert](text, start, end) {
    let result = null;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let ch = text[dartx._get](i);
      let replacement = null;
      switch (ch) {
        case '&':
        {
          replacement = '&amp;';
          break;
        }
        case '"':
        {
          if (dart.test(this.mode.escapeQuot)) replacement = '&quot;';
          break;
        }
        case "'":
        {
          if (dart.test(this.mode.escapeApos)) replacement = '&#39;';
          break;
        }
        case '<':
        {
          if (dart.test(this.mode.escapeLtGt)) replacement = '&lt;';
          break;
        }
        case '>':
        {
          if (dart.test(this.mode.escapeLtGt)) replacement = '&gt;';
          break;
        }
        case '/':
        {
          if (dart.test(this.mode.escapeSlash)) replacement = '&#47;';
          break;
        }
      }
      if (replacement != null) {
        if (result == null) result = new core.StringBuffer();
        if (dart.notNull(i) > dart.notNull(start)) result.write(text[dartx.substring](start, i));
        result.write(replacement);
        start = dart.notNull(i) + 1;
      }
    }
    if (result == null) return null;
    if (dart.notNull(end) > dart.notNull(start)) result.write(text[dartx.substring](start, end));
    return dart.toString(result);
  }
  startChunkedConversion(sink) {
    if (!convert.StringConversionSink.is(sink)) {
      sink = convert.StringConversionSink.from(sink);
    }
    return new convert._HtmlEscapeSink(this, convert.StringConversionSink._check(sink));
  }
};
dart.addSimpleTypeTests(convert.HtmlEscape);
dart.setSignature(convert.HtmlEscape, {
  constructors: () => ({new: dart.definiteFunctionType(convert.HtmlEscape, [], [convert.HtmlEscapeMode])}),
  fields: () => ({mode: convert.HtmlEscapeMode}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.String, [core.String]),
    [_convert]: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()])
  })
});
convert.HTML_ESCAPE = dart.const(new convert.HtmlEscape());
const _escape = Symbol('_escape');
convert._HtmlEscapeSink = class _HtmlEscapeSink extends convert.StringConversionSinkBase {
  new(escape, sink) {
    this[_escape] = escape;
    this[_sink$] = sink;
  }
  addSlice(chunk, start, end, isLast) {
    let val = this[_escape][_convert](chunk, start, end);
    if (val == null) {
      this[_sink$].addSlice(chunk, start, end, isLast);
    } else {
      this[_sink$].add(val);
      if (dart.test(isLast)) this[_sink$].close();
    }
  }
  close() {
    this[_sink$].close();
  }
};
dart.setSignature(convert._HtmlEscapeSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._HtmlEscapeSink, [convert.HtmlEscape, convert.StringConversionSink])}),
  fields: () => ({
    [_escape]: convert.HtmlEscape,
    [_sink$]: convert.StringConversionSink
  }),
  methods: () => ({
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
convert.JsonUnsupportedObjectError = class JsonUnsupportedObjectError extends core.Error {
  new(unsupportedObject, opts) {
    let cause = opts && 'cause' in opts ? opts.cause : null;
    this.unsupportedObject = unsupportedObject;
    this.cause = cause;
    super.new();
  }
  toString() {
    if (this.cause != null) {
      return "Converting object to an encodable object failed.";
    } else {
      return "Converting object did not return an encodable object.";
    }
  }
};
dart.setSignature(convert.JsonUnsupportedObjectError, {
  constructors: () => ({new: dart.definiteFunctionType(convert.JsonUnsupportedObjectError, [dart.dynamic], {cause: dart.dynamic})}),
  fields: () => ({
    unsupportedObject: dart.dynamic,
    cause: dart.dynamic
  })
});
convert.JsonCyclicError = class JsonCyclicError extends convert.JsonUnsupportedObjectError {
  new(object) {
    super.new(object);
  }
  toString() {
    return "Cyclic error in JSON stringify";
  }
};
dart.setSignature(convert.JsonCyclicError, {
  constructors: () => ({new: dart.definiteFunctionType(convert.JsonCyclicError, [core.Object])})
});
const _toEncodable = Symbol('_toEncodable');
let const$42;
let const$43;
convert.JsonCodec = class JsonCodec extends convert.Codec$(core.Object, core.String) {
  new(opts) {
    let reviver = opts && 'reviver' in opts ? opts.reviver : null;
    let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
    this[_reviver] = reviver;
    this[_toEncodable] = toEncodable;
    super.new();
  }
  withReviver(reviver) {
    JsonCodec.prototype.new.call(this, {reviver: reviver});
  }
  decode(source, opts) {
    let reviver = opts && 'reviver' in opts ? opts.reviver : null;
    if (reviver == null) reviver = this[_reviver];
    if (reviver == null) return this.decoder.convert(source);
    return new convert.JsonDecoder(reviver).convert(source);
  }
  encode(value, opts) {
    let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
    if (toEncodable == null) toEncodable = this[_toEncodable];
    if (toEncodable == null) return this.encoder.convert(value);
    return new convert.JsonEncoder(toEncodable).convert(value);
  }
  get encoder() {
    if (this[_toEncodable] == null) return const$42 || (const$42 = dart.const(new convert.JsonEncoder()));
    return new convert.JsonEncoder(this[_toEncodable]);
  }
  get decoder() {
    if (this[_reviver] == null) return const$43 || (const$43 = dart.const(new convert.JsonDecoder()));
    return new convert.JsonDecoder(this[_reviver]);
  }
};
dart.addSimpleTypeTests(convert.JsonCodec);
dart.defineNamedConstructor(convert.JsonCodec, 'withReviver');
dart.setSignature(convert.JsonCodec, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert.JsonCodec, [], {reviver: dynamicAnddynamicTodynamic(), toEncodable: dynamicTodynamic()}),
    withReviver: dart.definiteFunctionType(convert.JsonCodec, [dynamicAnddynamicTodynamic()])
  }),
  fields: () => ({
    [_reviver]: convert._Reviver,
    [_toEncodable]: convert._ToEncodable
  }),
  getters: () => ({
    encoder: dart.definiteFunctionType(convert.JsonEncoder, []),
    decoder: dart.definiteFunctionType(convert.JsonDecoder, [])
  }),
  methods: () => ({
    decode: dart.definiteFunctionType(dart.dynamic, [core.String], {reviver: dynamicAnddynamicTodynamic()}),
    encode: dart.definiteFunctionType(core.String, [core.Object], {toEncodable: dynamicTodynamic()})
  })
});
convert.JSON = dart.const(new convert.JsonCodec());
convert._Reviver = dart.typedef('_Reviver', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
convert._ToEncodable = dart.typedef('_ToEncodable', () => dart.functionType(dart.dynamic, [dart.dynamic]));
convert.JsonEncoder = class JsonEncoder extends convert.Converter$(core.Object, core.String) {
  new(toEncodable) {
    if (toEncodable === void 0) toEncodable = null;
    this.indent = null;
    this[_toEncodable] = toEncodable;
    super.new();
  }
  withIndent(indent, toEncodable) {
    if (toEncodable === void 0) toEncodable = null;
    this.indent = indent;
    this[_toEncodable] = toEncodable;
    super.new();
  }
  convert(object) {
    return convert._JsonStringStringifier.stringify(object, this[_toEncodable], this.indent);
  }
  startChunkedConversion(sink) {
    if (!convert.StringConversionSink.is(sink)) {
      sink = convert.StringConversionSink.from(sink);
    } else if (convert._Utf8EncoderSink.is(sink)) {
      return new convert._JsonUtf8EncoderSink(sink[_sink$], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
    }
    return new convert._JsonEncoderSink(convert.StringConversionSink._check(sink), this[_toEncodable], this.indent);
  }
  bind(stream) {
    return super.bind(stream);
  }
  fuse(T) {
    return other => {
      if (convert.Utf8Encoder.is(other)) {
        return convert.Converter$(core.Object, T).as(new convert.JsonUtf8Encoder(this.indent, this[_toEncodable]));
      }
      return super.fuse(T)(other);
    };
  }
};
dart.addSimpleTypeTests(convert.JsonEncoder);
dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
dart.setSignature(convert.JsonEncoder, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert.JsonEncoder, [], [dynamicTodynamic()]),
    withIndent: dart.definiteFunctionType(convert.JsonEncoder, [core.String], [dynamicTodynamic()])
  }),
  fields: () => ({
    indent: core.String,
    [_toEncodable]: convert._ToEncodable
  }),
  methods: () => ({
    convert: dart.definiteFunctionType(core.String, [core.Object]),
    startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfString()])
  })
});
const _indent = Symbol('_indent');
const _bufferSize = Symbol('_bufferSize');
convert.JsonUtf8Encoder = class JsonUtf8Encoder extends convert.Converter$(core.Object, core.List$(core.int)) {
  new(indent, toEncodable, bufferSize) {
    if (indent === void 0) indent = null;
    if (toEncodable === void 0) toEncodable = null;
    if (bufferSize === void 0) bufferSize = convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE;
    this[_indent] = convert.JsonUtf8Encoder._utf8Encode(indent);
    this[_toEncodable] = toEncodable;
    this[_bufferSize] = bufferSize;
    super.new();
  }
  static _utf8Encode(string) {
    if (string == null) return null;
    if (dart.test(string[dartx.isEmpty])) return typed_data.Uint8List.new(0);
    checkAscii: {
      for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
        if (dart.notNull(string[dartx.codeUnitAt](i)) >= 128) break checkAscii;
      }
      return string[dartx.codeUnits];
    }
    return convert.UTF8.encode(string);
  }
  convert(object) {
    let bytes = JSArrayOfListOfint().of([]);
    function addChunk(chunk, start, end) {
      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(chunk[dartx.length])) {
        let length = dart.notNull(end) - dart.notNull(start);
        chunk = typed_data.Uint8List.view(chunk[dartx.buffer], dart.notNull(chunk[dartx.offsetInBytes]) + dart.notNull(start), length);
      }
      bytes[dartx.add](chunk);
    }
    dart.fn(addChunk, Uint8ListAndintAndintTovoid$());
    convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], addChunk);
    if (bytes[dartx.length] == 1) return bytes[dartx._get](0);
    let length = 0;
    for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
      length = dart.notNull(length) + dart.notNull(bytes[dartx._get](i)[dartx.length]);
    }
    let result = typed_data.Uint8List.new(length);
    for (let i = 0, offset = 0; i < dart.notNull(bytes[dartx.length]); i++) {
      let byteList = bytes[dartx._get](i);
      let end = offset + dart.notNull(byteList[dartx.length]);
      result[dartx.setRange](offset, end, byteList);
      offset = end;
    }
    return result;
  }
  startChunkedConversion(sink) {
    let byteSink = null;
    if (convert.ByteConversionSink.is(sink)) {
      byteSink = sink;
    } else {
      byteSink = convert.ByteConversionSink.from(sink);
    }
    return new convert._JsonUtf8EncoderSink(byteSink, this[_toEncodable], this[_indent], this[_bufferSize]);
  }
  bind(stream) {
    return super.bind(stream);
  }
};
dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
dart.setSignature(convert.JsonUtf8Encoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.JsonUtf8Encoder, [], [core.String, dynamicTodynamic(), core.int])}),
  fields: () => ({
    [_indent]: ListOfint(),
    [_toEncodable]: convert._ToEncodable,
    [_bufferSize]: core.int
  }),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [core.Object]),
    startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfListOfint()])
  }),
  sfields: () => ({DEFAULT_BUFFER_SIZE: core.int}),
  statics: () => ({_utf8Encode: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
  names: ['_utf8Encode']
});
convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE = 256;
const _isDone = Symbol('_isDone');
convert._JsonEncoderSink = class _JsonEncoderSink extends convert.ChunkedConversionSink$(core.Object) {
  new(sink, toEncodable, indent) {
    this[_sink$] = sink;
    this[_toEncodable] = toEncodable;
    this[_indent] = indent;
    this[_isDone] = false;
    super.new();
  }
  add(o) {
    if (dart.test(this[_isDone])) {
      dart.throw(new core.StateError("Only one call to add allowed"));
    }
    this[_isDone] = true;
    let stringSink = this[_sink$].asStringSink();
    convert._JsonStringStringifier.printOn(o, stringSink, this[_toEncodable], this[_indent]);
    stringSink.close();
  }
  close() {}
};
dart.addSimpleTypeTests(convert._JsonEncoderSink);
dart.setSignature(convert._JsonEncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonEncoderSink, [convert.StringConversionSink, convert._ToEncodable, core.String])}),
  fields: () => ({
    [_indent]: core.String,
    [_toEncodable]: convert._ToEncodable,
    [_sink$]: convert.StringConversionSink,
    [_isDone]: core.bool
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [core.Object]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
const _addChunk = Symbol('_addChunk');
convert._JsonUtf8EncoderSink = class _JsonUtf8EncoderSink extends convert.ChunkedConversionSink$(core.Object) {
  new(sink, toEncodable, indent, bufferSize) {
    this[_sink$] = sink;
    this[_toEncodable] = toEncodable;
    this[_indent] = indent;
    this[_bufferSize] = bufferSize;
    this[_isDone] = false;
    super.new();
  }
  [_addChunk](chunk, start, end) {
    this[_sink$].addSlice(chunk, start, end, false);
  }
  add(object) {
    if (dart.test(this[_isDone])) {
      dart.throw(new core.StateError("Only one call to add allowed"));
    }
    this[_isDone] = true;
    convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], dart.bind(this, _addChunk));
    this[_sink$].close();
  }
  close() {
    if (!dart.test(this[_isDone])) {
      this[_isDone] = true;
      this[_sink$].close();
    }
  }
};
dart.addSimpleTypeTests(convert._JsonUtf8EncoderSink);
dart.setSignature(convert._JsonUtf8EncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8EncoderSink, [convert.ByteConversionSink, convert._ToEncodable, ListOfint(), core.int])}),
  fields: () => ({
    [_sink$]: convert.ByteConversionSink,
    [_indent]: ListOfint(),
    [_toEncodable]: convert._ToEncodable,
    [_bufferSize]: core.int,
    [_isDone]: core.bool
  }),
  methods: () => ({
    [_addChunk]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int]),
    add: dart.definiteFunctionType(dart.void, [core.Object]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
convert.JsonDecoder = class JsonDecoder extends convert.Converter$(core.String, core.Object) {
  new(reviver) {
    if (reviver === void 0) reviver = null;
    this[_reviver] = reviver;
    super.new();
  }
  convert(input) {
    return convert._parseJson(input, this[_reviver]);
  }
  startChunkedConversion(sink) {
    return new convert._JsonDecoderSink(this[_reviver], sink);
  }
  bind(stream) {
    return super.bind(stream);
  }
};
dart.addSimpleTypeTests(convert.JsonDecoder);
dart.setSignature(convert.JsonDecoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.JsonDecoder, [], [dynamicAnddynamicTodynamic()])}),
  fields: () => ({[_reviver]: convert._Reviver}),
  methods: () => ({
    convert: dart.definiteFunctionType(dart.dynamic, [core.String]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfObject()])
  })
});
convert._parseJson = function(source, reviver) {
  if (!(typeof source == 'string')) dart.throw(_js_helper.argumentErrorValue(source));
  let parsed = null;
  try {
    parsed = JSON.parse(source);
  } catch (e) {
    dart.throw(new core.FormatException(String(e)));
  }

  if (reviver == null) {
    return convert._convertJsonToDartLazy(parsed);
  } else {
    return convert._convertJsonToDart(parsed, reviver);
  }
};
dart.fn(convert._parseJson, StringAndFnTodynamic());
convert._defaultToEncodable = function(object) {
  return dart.dsend(object, 'toJson');
};
dart.fn(convert._defaultToEncodable, dynamicTodynamic$());
const _seen = Symbol('_seen');
const _checkCycle = Symbol('_checkCycle');
const _removeSeen = Symbol('_removeSeen');
convert._JsonStringifier = class _JsonStringifier extends core.Object {
  new(toEncodable) {
    this[_seen] = core.List.new();
    this[_toEncodable] = (() => {
      let l = toEncodable;
      return l != null ? l : convert._defaultToEncodable;
    })();
  }
  static hexDigit(x) {
    return dart.notNull(x) < 10 ? 48 + dart.notNull(x) : 87 + dart.notNull(x);
  }
  writeStringContent(s) {
    let offset = 0;
    let length = s[dartx.length];
    for (let i = 0; i < dart.notNull(length); i++) {
      let charCode = s[dartx.codeUnitAt](i);
      if (dart.notNull(charCode) > convert._JsonStringifier.BACKSLASH) continue;
      if (dart.notNull(charCode) < 32) {
        if (i > offset) this.writeStringSlice(s, offset, i);
        offset = i + 1;
        this.writeCharCode(convert._JsonStringifier.BACKSLASH);
        switch (charCode) {
          case convert._JsonStringifier.BACKSPACE:
          {
            this.writeCharCode(convert._JsonStringifier.CHAR_b);
            break;
          }
          case convert._JsonStringifier.TAB:
          {
            this.writeCharCode(convert._JsonStringifier.CHAR_t);
            break;
          }
          case convert._JsonStringifier.NEWLINE:
          {
            this.writeCharCode(convert._JsonStringifier.CHAR_n);
            break;
          }
          case convert._JsonStringifier.FORM_FEED:
          {
            this.writeCharCode(convert._JsonStringifier.CHAR_f);
            break;
          }
          case convert._JsonStringifier.CARRIAGE_RETURN:
          {
            this.writeCharCode(convert._JsonStringifier.CHAR_r);
            break;
          }
          default:
          {
            this.writeCharCode(convert._JsonStringifier.CHAR_u);
            this.writeCharCode(convert._JsonStringifier.CHAR_0);
            this.writeCharCode(convert._JsonStringifier.CHAR_0);
            this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) >> 4 & 15));
            this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) & 15));
            break;
          }
        }
      } else if (charCode == convert._JsonStringifier.QUOTE || charCode == convert._JsonStringifier.BACKSLASH) {
        if (i > offset) this.writeStringSlice(s, offset, i);
        offset = i + 1;
        this.writeCharCode(convert._JsonStringifier.BACKSLASH);
        this.writeCharCode(charCode);
      }
    }
    if (offset == 0) {
      this.writeString(s);
    } else if (offset < dart.notNull(length)) {
      this.writeStringSlice(s, offset, length);
    }
  }
  [_checkCycle](object) {
    for (let i = 0; i < dart.notNull(this[_seen][dartx.length]); i++) {
      if (core.identical(object, this[_seen][dartx._get](i))) {
        dart.throw(new convert.JsonCyclicError(object));
      }
    }
    this[_seen][dartx.add](object);
  }
  [_removeSeen](object) {
    dart.assert(!dart.test(this[_seen][dartx.isEmpty]));
    dart.assert(core.identical(this[_seen][dartx.last], object));
    this[_seen][dartx.removeLast]();
  }
  writeObject(object) {
    if (dart.test(this.writeJsonValue(object))) return;
    this[_checkCycle](object);
    try {
      let customJson = dart.dcall(this[_toEncodable], object);
      if (!dart.test(this.writeJsonValue(customJson))) {
        dart.throw(new convert.JsonUnsupportedObjectError(object));
      }
      this[_removeSeen](object);
    } catch (e) {
      dart.throw(new convert.JsonUnsupportedObjectError(object, {cause: e}));
    }

  }
  writeJsonValue(object) {
    if (typeof object == 'number') {
      if (!dart.test(object[dartx.isFinite])) return false;
      this.writeNumber(object);
      return true;
    } else if (core.identical(object, true)) {
      this.writeString('true');
      return true;
    } else if (core.identical(object, false)) {
      this.writeString('false');
      return true;
    } else if (object == null) {
      this.writeString('null');
      return true;
    } else if (typeof object == 'string') {
      this.writeString('"');
      this.writeStringContent(object);
      this.writeString('"');
      return true;
    } else if (core.List.is(object)) {
      this[_checkCycle](object);
      this.writeList(object);
      this[_removeSeen](object);
      return true;
    } else if (core.Map.is(object)) {
      this[_checkCycle](object);
      let success = this.writeMap(object);
      this[_removeSeen](object);
      return success;
    } else {
      return false;
    }
  }
  writeList(list) {
    this.writeString('[');
    if (dart.notNull(list[dartx.length]) > 0) {
      this.writeObject(list[dartx._get](0));
      for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
        this.writeString(',');
        this.writeObject(list[dartx._get](i));
      }
    }
    this.writeString(']');
  }
  writeMap(map) {
    if (dart.test(map[dartx.isEmpty])) {
      this.writeString("{}");
      return true;
    }
    let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
    let i = 0;
    let allStringKeys = true;
    map[dartx.forEach](dart.fn((key, value) => {
      if (!(typeof key == 'string')) {
        allStringKeys = false;
      }
      keyValueList[dartx._set](i++, key);
      keyValueList[dartx._set](i++, value);
    }, dynamicAnddynamicToNull()));
    if (!allStringKeys) return false;
    this.writeString('{');
    let separator = '"';
    for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
      this.writeString(separator);
      separator = ',"';
      this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
      this.writeString('":');
      this.writeObject(keyValueList[dartx._get](i + 1));
    }
    this.writeString('}');
    return true;
  }
};
dart.setSignature(convert._JsonStringifier, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringifier, [dynamicTodynamic()])}),
  fields: () => ({
    [_seen]: core.List,
    [_toEncodable]: convert._ToEncodable
  }),
  methods: () => ({
    writeStringContent: dart.definiteFunctionType(dart.void, [core.String]),
    [_checkCycle]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_removeSeen]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    writeObject: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    writeJsonValue: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    writeList: dart.definiteFunctionType(dart.void, [core.List]),
    writeMap: dart.definiteFunctionType(core.bool, [core.Map])
  }),
  sfields: () => ({
    BACKSPACE: core.int,
    TAB: core.int,
    NEWLINE: core.int,
    CARRIAGE_RETURN: core.int,
    FORM_FEED: core.int,
    QUOTE: core.int,
    CHAR_0: core.int,
    BACKSLASH: core.int,
    CHAR_b: core.int,
    CHAR_f: core.int,
    CHAR_n: core.int,
    CHAR_r: core.int,
    CHAR_t: core.int,
    CHAR_u: core.int
  }),
  statics: () => ({hexDigit: dart.definiteFunctionType(core.int, [core.int])}),
  names: ['hexDigit']
});
convert._JsonStringifier.BACKSPACE = 8;
convert._JsonStringifier.TAB = 9;
convert._JsonStringifier.NEWLINE = 10;
convert._JsonStringifier.CARRIAGE_RETURN = 13;
convert._JsonStringifier.FORM_FEED = 12;
convert._JsonStringifier.QUOTE = 34;
convert._JsonStringifier.CHAR_0 = 48;
convert._JsonStringifier.BACKSLASH = 92;
convert._JsonStringifier.CHAR_b = 98;
convert._JsonStringifier.CHAR_f = 102;
convert._JsonStringifier.CHAR_n = 110;
convert._JsonStringifier.CHAR_r = 114;
convert._JsonStringifier.CHAR_t = 116;
convert._JsonStringifier.CHAR_u = 117;
const _indentLevel = Symbol('_indentLevel');
convert._JsonPrettyPrintMixin = class _JsonPrettyPrintMixin extends core.Object {
  new() {
    this[_indentLevel] = 0;
  }
  writeList(list) {
    if (dart.test(list[dartx.isEmpty])) {
      this.writeString('[]');
    } else {
      this.writeString('[\n');
      this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
      this.writeIndentation(this[_indentLevel]);
      this.writeObject(list[dartx._get](0));
      for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
        this.writeString(',\n');
        this.writeIndentation(this[_indentLevel]);
        this.writeObject(list[dartx._get](i));
      }
      this.writeString('\n');
      this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
      this.writeIndentation(this[_indentLevel]);
      this.writeString(']');
    }
  }
  writeMap(map) {
    if (dart.test(map[dartx.isEmpty])) {
      this.writeString("{}");
      return true;
    }
    let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
    let i = 0;
    let allStringKeys = true;
    map[dartx.forEach](dart.fn((key, value) => {
      if (!(typeof key == 'string')) {
        allStringKeys = false;
      }
      keyValueList[dartx._set](i++, key);
      keyValueList[dartx._set](i++, value);
    }, dynamicAnddynamicToNull()));
    if (!allStringKeys) return false;
    this.writeString('{\n');
    this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
    let separator = "";
    for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
      this.writeString(separator);
      separator = ",\n";
      this.writeIndentation(this[_indentLevel]);
      this.writeString('"');
      this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
      this.writeString('": ');
      this.writeObject(keyValueList[dartx._get](i + 1));
    }
    this.writeString('\n');
    this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
    this.writeIndentation(this[_indentLevel]);
    this.writeString('}');
    return true;
  }
};
convert._JsonPrettyPrintMixin[dart.implements] = () => [convert._JsonStringifier];
dart.setSignature(convert._JsonPrettyPrintMixin, {
  fields: () => ({[_indentLevel]: core.int}),
  methods: () => ({
    writeList: dart.definiteFunctionType(dart.void, [core.List]),
    writeMap: dart.definiteFunctionType(core.bool, [core.Map])
  })
});
convert._JsonStringStringifier = class _JsonStringStringifier extends convert._JsonStringifier {
  new(sink, _toEncodable) {
    this[_sink$] = sink;
    super.new(dynamicTodynamic()._check(_toEncodable));
  }
  static stringify(object, toEncodable, indent) {
    let output = new core.StringBuffer();
    convert._JsonStringStringifier.printOn(object, output, toEncodable, indent);
    return output.toString();
  }
  static printOn(object, output, toEncodable, indent) {
    let stringifier = null;
    if (indent == null) {
      stringifier = new convert._JsonStringStringifier(output, toEncodable);
    } else {
      stringifier = new convert._JsonStringStringifierPretty(output, toEncodable, indent);
    }
    dart.dsend(stringifier, 'writeObject', object);
  }
  writeNumber(number) {
    this[_sink$].write(dart.toString(number));
  }
  writeString(string) {
    this[_sink$].write(string);
  }
  writeStringSlice(string, start, end) {
    this[_sink$].write(string[dartx.substring](start, end));
  }
  writeCharCode(charCode) {
    this[_sink$].writeCharCode(charCode);
  }
};
dart.setSignature(convert._JsonStringStringifier, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifier, [core.StringSink, dart.dynamic])}),
  fields: () => ({[_sink$]: core.StringSink}),
  methods: () => ({
    writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
    writeString: dart.definiteFunctionType(dart.void, [core.String]),
    writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
  }),
  statics: () => ({
    stringify: dart.definiteFunctionType(core.String, [dart.dynamic, dynamicTodynamic(), core.String]),
    printOn: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StringSink, dynamicTodynamic(), core.String])
  }),
  names: ['stringify', 'printOn']
});
convert._JsonStringStringifierPretty = class _JsonStringStringifierPretty extends dart.mixin(convert._JsonStringStringifier, convert._JsonPrettyPrintMixin) {
  new(sink, toEncodable, indent) {
    this[_indent] = indent;
    super.new(sink, toEncodable);
  }
  writeIndentation(count) {
    for (let i = 0; i < dart.notNull(count); i++)
      this.writeString(this[_indent]);
  }
};
dart.setSignature(convert._JsonStringStringifierPretty, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifierPretty, [core.StringSink, dynamicTodynamic(), core.String])}),
  fields: () => ({[_indent]: core.String}),
  methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
});
convert._AddChunk = dart.typedef('_AddChunk', () => dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int]));
convert._JsonUtf8Stringifier = class _JsonUtf8Stringifier extends convert._JsonStringifier {
  new(toEncodable, bufferSize, addChunk) {
    this.addChunk = addChunk;
    this.bufferSize = bufferSize;
    this.buffer = typed_data.Uint8List.new(bufferSize);
    this.index = 0;
    super.new(toEncodable);
  }
  static stringify(object, indent, toEncodable, bufferSize, addChunk) {
    let stringifier = null;
    if (indent != null) {
      stringifier = new convert._JsonUtf8StringifierPretty(toEncodable, indent, bufferSize, addChunk);
    } else {
      stringifier = new convert._JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
    }
    stringifier.writeObject(object);
    stringifier.flush();
  }
  flush() {
    if (dart.notNull(this.index) > 0) {
      this.addChunk(this.buffer, 0, this.index);
    }
    this.buffer = null;
    this.index = 0;
  }
  writeNumber(number) {
    this.writeAsciiString(dart.toString(number));
  }
  writeAsciiString(string) {
    for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
      let char = string[dartx.codeUnitAt](i);
      dart.assert(dart.notNull(char) <= 127);
      this.writeByte(char);
    }
  }
  writeString(string) {
    this.writeStringSlice(string, 0, string[dartx.length]);
  }
  writeStringSlice(string, start, end) {
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = string[dartx.codeUnitAt](i);
      if (dart.notNull(char) <= 127) {
        this.writeByte(char);
      } else {
        if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(i) + 1 < dart.notNull(end)) {
          let nextChar = string[dartx.codeUnitAt](dart.notNull(i) + 1);
          if ((dart.notNull(nextChar) & 64512) == 56320) {
            char = 65536 + ((dart.notNull(char) & 1023) << 10) + (dart.notNull(nextChar) & 1023);
            this.writeFourByteCharCode(char);
            i = dart.notNull(i) + 1;
            continue;
          }
        }
        this.writeMultiByteCharCode(char);
      }
    }
  }
  writeCharCode(charCode) {
    if (dart.notNull(charCode) <= 127) {
      this.writeByte(charCode);
      return;
    }
    this.writeMultiByteCharCode(charCode);
  }
  writeMultiByteCharCode(charCode) {
    if (dart.notNull(charCode) <= 2047) {
      this.writeByte((192 | charCode[dartx['>>']](6)) >>> 0);
      this.writeByte(128 | dart.notNull(charCode) & 63);
      return;
    }
    if (dart.notNull(charCode) <= 65535) {
      this.writeByte((224 | charCode[dartx['>>']](12)) >>> 0);
      this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
      this.writeByte(128 | dart.notNull(charCode) & 63);
      return;
    }
    this.writeFourByteCharCode(charCode);
  }
  writeFourByteCharCode(charCode) {
    dart.assert(dart.notNull(charCode) <= 1114111);
    this.writeByte((240 | charCode[dartx['>>']](18)) >>> 0);
    this.writeByte(128 | dart.notNull(charCode) >> 12 & 63);
    this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
    this.writeByte(128 | dart.notNull(charCode) & 63);
  }
  writeByte(byte) {
    dart.assert(dart.notNull(byte) <= 255);
    if (this.index == this.buffer[dartx.length]) {
      this.addChunk(this.buffer, 0, this.index);
      this.buffer = typed_data.Uint8List.new(this.bufferSize);
      this.index = 0;
    }
    this.buffer[dartx._set]((() => {
      let x = this.index;
      this.index = dart.notNull(x) + 1;
      return x;
    })(), byte);
  }
};
dart.setSignature(convert._JsonUtf8Stringifier, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8Stringifier, [dynamicTodynamic(), core.int, convert._AddChunk])}),
  fields: () => ({
    bufferSize: core.int,
    addChunk: convert._AddChunk,
    buffer: typed_data.Uint8List,
    index: core.int
  }),
  methods: () => ({
    flush: dart.definiteFunctionType(dart.void, []),
    writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
    writeAsciiString: dart.definiteFunctionType(dart.void, [core.String]),
    writeString: dart.definiteFunctionType(dart.void, [core.String]),
    writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    writeMultiByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    writeFourByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    writeByte: dart.definiteFunctionType(dart.void, [core.int])
  }),
  statics: () => ({stringify: dart.definiteFunctionType(dart.void, [core.Object, ListOfint(), dynamicTodynamic(), core.int, Uint8ListAndintAndintTovoid()])}),
  names: ['stringify']
});
convert._JsonUtf8StringifierPretty = class _JsonUtf8StringifierPretty extends dart.mixin(convert._JsonUtf8Stringifier, convert._JsonPrettyPrintMixin) {
  new(toEncodable, indent, bufferSize, addChunk) {
    this.indent = indent;
    super.new(toEncodable, core.int._check(bufferSize), addChunk);
  }
  writeIndentation(count) {
    let indent = this.indent;
    let indentLength = indent[dartx.length];
    if (indentLength == 1) {
      let char = indent[dartx._get](0);
      while (dart.notNull(count) > 0) {
        this.writeByte(char);
        count = dart.notNull(count) - 1;
      }
      return;
    }
    while (dart.notNull(count) > 0) {
      count = dart.notNull(count) - 1;
      let end = dart.notNull(this.index) + dart.notNull(indentLength);
      if (end <= dart.notNull(this.buffer[dartx.length])) {
        this.buffer[dartx.setRange](this.index, end, indent);
        this.index = end;
      } else {
        for (let i = 0; i < dart.notNull(indentLength); i++) {
          this.writeByte(indent[dartx._get](i));
        }
      }
    }
  }
};
dart.setSignature(convert._JsonUtf8StringifierPretty, {
  constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8StringifierPretty, [dynamicTodynamic(), ListOfint(), dart.dynamic, Uint8ListAndintAndintTovoid()])}),
  fields: () => ({indent: ListOfint()}),
  methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
});
let const$44;
let const$45;
let const$46;
let const$47;
let const$48;
convert.Latin1Codec = class Latin1Codec extends convert.Encoding {
  new(opts) {
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
    this[_allowInvalid] = allowInvalid;
    super.new();
  }
  get name() {
    return "iso-8859-1";
  }
  decode(bytes, opts) {
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
    if (allowInvalid == null) allowInvalid = this[_allowInvalid];
    if (dart.test(allowInvalid)) {
      return (const$44 || (const$44 = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
    } else {
      return (const$45 || (const$45 = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const$46 || (const$46 = dart.const(new convert.Latin1Encoder()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const$47 || (const$47 = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const$48 || (const$48 = dart.const(new convert.Latin1Decoder({allowInvalid: false})));
  }
};
dart.setSignature(convert.Latin1Codec, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Codec, [], {allowInvalid: core.bool})}),
  fields: () => ({[_allowInvalid]: core.bool}),
  getters: () => ({
    name: dart.definiteFunctionType(core.String, []),
    encoder: dart.definiteFunctionType(convert.Latin1Encoder, []),
    decoder: dart.definiteFunctionType(convert.Latin1Decoder, [])
  }),
  methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
});
convert.LATIN1 = dart.const(new convert.Latin1Codec());
convert._LATIN1_MASK = 255;
convert.Latin1Encoder = class Latin1Encoder extends convert._UnicodeSubsetEncoder {
  new() {
    super.new(convert._LATIN1_MASK);
  }
};
dart.setSignature(convert.Latin1Encoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Encoder, [])})
});
convert.Latin1Decoder = class Latin1Decoder extends convert._UnicodeSubsetDecoder {
  new(opts) {
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
    super.new(allowInvalid, convert._LATIN1_MASK);
  }
  startChunkedConversion(sink) {
    let stringSink = null;
    if (convert.StringConversionSink.is(sink)) {
      stringSink = sink;
    } else {
      stringSink = convert.StringConversionSink.from(sink);
    }
    if (!dart.test(this[_allowInvalid])) return new convert._Latin1DecoderSink(stringSink);
    return new convert._Latin1AllowInvalidDecoderSink(stringSink);
  }
};
dart.setSignature(convert.Latin1Decoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Decoder, [], {allowInvalid: core.bool})})
});
const _addSliceToSink = Symbol('_addSliceToSink');
convert._Latin1DecoderSink = class _Latin1DecoderSink extends convert.ByteConversionSinkBase {
  new(sink) {
    this[_sink$] = sink;
    super.new();
  }
  close() {
    this[_sink$].close();
    this[_sink$] = null;
  }
  add(source) {
    this.addSlice(source, 0, source[dartx.length], false);
  }
  [_addSliceToSink](source, start, end, isLast) {
    this[_sink$].add(core.String.fromCharCodes(source, start, end));
    if (dart.test(isLast)) this.close();
  }
  addSlice(source, start, end, isLast) {
    end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
    if (start == end) return;
    if (!typed_data.Uint8List.is(source)) {
      convert._Latin1DecoderSink._checkValidLatin1(source, start, end);
    }
    this[_addSliceToSink](source, start, end, isLast);
  }
  static _checkValidLatin1(source, start, end) {
    let mask = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      mask = (dart.notNull(mask) | dart.notNull(source[dartx._get](i))) >>> 0;
    }
    if (dart.notNull(mask) >= 0 && dart.notNull(mask) <= convert._LATIN1_MASK) {
      return;
    }
    convert._Latin1DecoderSink._reportInvalidLatin1(source, start, end);
  }
  static _reportInvalidLatin1(source, start, end) {
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = source[dartx._get](i);
      if (dart.notNull(char) < 0 || dart.notNull(char) > convert._LATIN1_MASK) {
        dart.throw(new core.FormatException("Source contains non-Latin-1 characters.", source, i));
      }
    }
    dart.assert(false);
  }
};
dart.setSignature(convert._Latin1DecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Latin1DecoderSink, [convert.StringConversionSink])}),
  fields: () => ({[_sink$]: convert.StringConversionSink}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    [_addSliceToSink]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
  }),
  statics: () => ({
    _checkValidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int]),
    _reportInvalidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
  }),
  names: ['_checkValidLatin1', '_reportInvalidLatin1']
});
let const$49;
convert._Latin1AllowInvalidDecoderSink = class _Latin1AllowInvalidDecoderSink extends convert._Latin1DecoderSink {
  new(sink) {
    super.new(sink);
  }
  addSlice(source, start, end, isLast) {
    core.RangeError.checkValidRange(start, end, source[dartx.length]);
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = source[dartx._get](i);
      if (dart.notNull(char) > convert._LATIN1_MASK || dart.notNull(char) < 0) {
        if (dart.notNull(i) > dart.notNull(start)) this[_addSliceToSink](source, start, i, false);
        this[_addSliceToSink](const$49 || (const$49 = dart.constList([65533], core.int)), 0, 1, false);
        start = dart.notNull(i) + 1;
      }
    }
    if (dart.notNull(start) < dart.notNull(end)) {
      this[_addSliceToSink](source, start, end, isLast);
    }
    if (dart.test(isLast)) {
      this.close();
    }
  }
};
dart.setSignature(convert._Latin1AllowInvalidDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Latin1AllowInvalidDecoderSink, [convert.StringConversionSink])})
});
convert._LF = 10;
convert._CR = 13;
convert.LineSplitter = class LineSplitter extends core.Object {
  new() {
  }
  static split(lines, start, end) {
    return dart.syncStar(function*(lines, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      end = core.RangeError.checkValidRange(start, end, lines[dartx.length]);
      let sliceStart = start;
      let char = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let previousChar = char;
        char = lines[dartx.codeUnitAt](i);
        if (char != convert._CR) {
          if (char != convert._LF) continue;
          if (previousChar == convert._CR) {
            sliceStart = dart.notNull(i) + 1;
            continue;
          }
        }
        yield lines[dartx.substring](sliceStart, i);
        sliceStart = dart.notNull(i) + 1;
      }
      if (dart.notNull(sliceStart) < dart.notNull(end)) {
        yield lines[dartx.substring](sliceStart, end);
      }
    }, core.String, lines, start, end);
  }
  convert(data) {
    let lines = JSArrayOfString().of([]);
    let end = data[dartx.length];
    let sliceStart = 0;
    let char = 0;
    for (let i = 0; i < dart.notNull(end); i++) {
      let previousChar = char;
      char = data[dartx.codeUnitAt](i);
      if (char != convert._CR) {
        if (char != convert._LF) continue;
        if (previousChar == convert._CR) {
          sliceStart = i + 1;
          continue;
        }
      }
      lines[dartx.add](data[dartx.substring](sliceStart, i));
      sliceStart = i + 1;
    }
    if (sliceStart < dart.notNull(end)) {
      lines[dartx.add](data[dartx.substring](sliceStart, end));
    }
    return lines;
  }
  startChunkedConversion(sink) {
    if (!convert.StringConversionSink.is(sink)) {
      sink = convert.StringConversionSink.from(sink);
    }
    return new convert._LineSplitterSink(convert.StringConversionSink._check(sink));
  }
  bind(stream) {
    return StreamOfString().eventTransformed(stream, dart.fn(sink => new convert._LineSplitterEventSink(sink), EventSinkOfStringTo_LineSplitterEventSink()));
  }
};
convert.LineSplitter[dart.implements] = () => [StreamTransformerOfString$String()];
dart.setSignature(convert.LineSplitter, {
  constructors: () => ({new: dart.definiteFunctionType(convert.LineSplitter, [])}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.String), [core.String]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
    bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfString()])
  }),
  statics: () => ({split: dart.definiteFunctionType(core.Iterable$(core.String), [core.String], [core.int, core.int])}),
  names: ['split']
});
const _carry = Symbol('_carry');
const _skipLeadingLF = Symbol('_skipLeadingLF');
const _addLines = Symbol('_addLines');
convert._LineSplitterSink = class _LineSplitterSink extends convert.StringConversionSinkBase {
  new(sink) {
    this[_sink$] = sink;
    this[_carry] = null;
    this[_skipLeadingLF] = false;
  }
  addSlice(chunk, start, end, isLast) {
    end = core.RangeError.checkValidRange(start, end, chunk[dartx.length]);
    if (dart.notNull(start) >= dart.notNull(end)) {
      if (dart.test(isLast)) this.close();
      return;
    }
    if (this[_carry] != null) {
      dart.assert(!dart.test(this[_skipLeadingLF]));
      chunk = dart.notNull(this[_carry]) + dart.notNull(chunk[dartx.substring](start, end));
      start = 0;
      end = chunk[dartx.length];
      this[_carry] = null;
    } else if (dart.test(this[_skipLeadingLF])) {
      if (chunk[dartx.codeUnitAt](start) == convert._LF) {
        start = dart.notNull(start) + 1;
      }
      this[_skipLeadingLF] = false;
    }
    this[_addLines](chunk, start, end);
    if (dart.test(isLast)) this.close();
  }
  close() {
    if (this[_carry] != null) {
      this[_sink$].add(this[_carry]);
      this[_carry] = null;
    }
    this[_sink$].close();
  }
  [_addLines](lines, start, end) {
    let sliceStart = start;
    let char = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let previousChar = char;
      char = lines[dartx.codeUnitAt](i);
      if (char != convert._CR) {
        if (char != convert._LF) continue;
        if (previousChar == convert._CR) {
          sliceStart = dart.notNull(i) + 1;
          continue;
        }
      }
      this[_sink$].add(lines[dartx.substring](sliceStart, i));
      sliceStart = dart.notNull(i) + 1;
    }
    if (dart.notNull(sliceStart) < dart.notNull(end)) {
      this[_carry] = lines[dartx.substring](sliceStart, end);
    } else {
      this[_skipLeadingLF] = char == convert._CR;
    }
  }
};
dart.setSignature(convert._LineSplitterSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterSink, [convert.StringConversionSink])}),
  fields: () => ({
    [_sink$]: convert.StringConversionSink,
    [_carry]: core.String,
    [_skipLeadingLF]: core.bool
  }),
  methods: () => ({
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, []),
    [_addLines]: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int])
  })
});
convert._LineSplitterEventSink = class _LineSplitterEventSink extends convert._LineSplitterSink {
  new(eventSink) {
    this[_eventSink] = eventSink;
    super.new(convert.StringConversionSink.from(eventSink));
  }
  addError(o, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink].addError(o, stackTrace);
  }
};
convert._LineSplitterEventSink[dart.implements] = () => [EventSinkOfString()];
dart.setSignature(convert._LineSplitterEventSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])}),
  fields: () => ({[_eventSink]: EventSinkOfString()}),
  methods: () => ({addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
});
convert.StringConversionSink = class StringConversionSink extends convert.ChunkedConversionSink$(core.String) {
  new() {
    super.new();
  }
  static withCallback(callback) {
    return new convert._StringCallbackSink(callback);
  }
  static from(sink) {
    return new convert._StringAdapterSink(sink);
  }
  static fromStringSink(sink) {
    return new convert._StringSinkConversionSink(sink);
  }
};
dart.addSimpleTypeTests(convert.StringConversionSink);
dart.setSignature(convert.StringConversionSink, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert.StringConversionSink, []),
    withCallback: dart.definiteFunctionType(convert.StringConversionSink, [StringTovoid()]),
    from: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
    fromStringSink: dart.definiteFunctionType(convert.StringConversionSink, [core.StringSink])
  })
});
core.StringSink = class StringSink extends core.Object {};
convert.ClosableStringSink = class ClosableStringSink extends core.StringSink {
  static fromStringSink(sink, onClose) {
    return new convert._ClosableStringSink(sink, onClose);
  }
};
dart.setSignature(convert.ClosableStringSink, {
  constructors: () => ({fromStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [core.StringSink, VoidTovoid()])})
});
convert._StringSinkCloseCallback = dart.typedef('_StringSinkCloseCallback', () => dart.functionType(dart.void, []));
convert._ClosableStringSink = class _ClosableStringSink extends core.Object {
  new(sink, callback) {
    this[_sink$] = sink;
    this[_callback] = callback;
  }
  close() {
    this[_callback]();
  }
  writeCharCode(charCode) {
    this[_sink$].writeCharCode(charCode);
  }
  write(o) {
    this[_sink$].write(o);
  }
  writeln(o) {
    if (o === void 0) o = "";
    this[_sink$].writeln(o);
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    this[_sink$].writeAll(objects, separator);
  }
};
convert._ClosableStringSink[dart.implements] = () => [convert.ClosableStringSink];
dart.setSignature(convert._ClosableStringSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._ClosableStringSink, [core.StringSink, convert._StringSinkCloseCallback])}),
  fields: () => ({
    [_callback]: convert._StringSinkCloseCallback,
    [_sink$]: core.StringSink
  }),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String])
  })
});
const _flush = Symbol('_flush');
convert._StringConversionSinkAsStringSinkAdapter = class _StringConversionSinkAsStringSinkAdapter extends core.Object {
  new(chunkedSink) {
    this[_chunkedSink] = chunkedSink;
    this[_buffer] = new core.StringBuffer();
  }
  close() {
    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
    this[_chunkedSink].close();
  }
  writeCharCode(charCode) {
    this[_buffer].writeCharCode(charCode);
    if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
  }
  write(o) {
    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
    this[_chunkedSink].add(dart.toString(o));
  }
  writeln(o) {
    if (o === void 0) o = "";
    this[_buffer].writeln(o);
    if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
    let iterator = objects[dartx.iterator];
    if (!dart.test(iterator.moveNext())) return;
    if (dart.test(separator[dartx.isEmpty])) {
      do {
        this[_chunkedSink].add(dart.toString(iterator.current));
      } while (dart.test(iterator.moveNext()));
    } else {
      this[_chunkedSink].add(dart.toString(iterator.current));
      while (dart.test(iterator.moveNext())) {
        this.write(separator);
        this[_chunkedSink].add(dart.toString(iterator.current));
      }
    }
  }
  [_flush]() {
    let accumulated = dart.toString(this[_buffer]);
    this[_buffer].clear();
    this[_chunkedSink].add(accumulated);
  }
};
convert._StringConversionSinkAsStringSinkAdapter[dart.implements] = () => [convert.ClosableStringSink];
dart.setSignature(convert._StringConversionSinkAsStringSinkAdapter, {
  constructors: () => ({new: dart.definiteFunctionType(convert._StringConversionSinkAsStringSinkAdapter, [convert.StringConversionSink])}),
  fields: () => ({
    [_buffer]: core.StringBuffer,
    [_chunkedSink]: convert.StringConversionSink
  }),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    [_flush]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({_MIN_STRING_SIZE: core.int})
});
convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE = 16;
convert._StringCallbackSink = class _StringCallbackSink extends convert._StringSinkConversionSink {
  new(callback) {
    this[_callback] = callback;
    super.new(new core.StringBuffer());
  }
  close() {
    let buffer = core.StringBuffer._check(this[_stringSink]);
    let accumulated = dart.toString(buffer);
    buffer.clear();
    this[_callback](accumulated);
  }
  asUtf8Sink(allowMalformed) {
    return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
  }
};
dart.setSignature(convert._StringCallbackSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._StringCallbackSink, [StringTovoid()])}),
  fields: () => ({[_callback]: StringTovoid()})
});
convert._StringAdapterSink = class _StringAdapterSink extends convert.StringConversionSinkBase {
  new(sink) {
    this[_sink$] = sink;
  }
  add(str) {
    this[_sink$].add(str);
  }
  addSlice(str, start, end, isLast) {
    if (start == 0 && end == str[dartx.length]) {
      this.add(str);
    } else {
      this.add(str[dartx.substring](start, end));
    }
    if (dart.test(isLast)) this.close();
  }
  close() {
    this[_sink$].close();
  }
};
dart.setSignature(convert._StringAdapterSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._StringAdapterSink, [SinkOfString()])}),
  fields: () => ({[_sink$]: SinkOfString()}),
  methods: () => ({
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
convert._Utf8StringSinkAdapter = class _Utf8StringSinkAdapter extends convert.ByteConversionSink {
  new(sink, stringSink, allowMalformed) {
    this[_sink$] = sink;
    this[_decoder] = new convert._Utf8Decoder(stringSink, allowMalformed);
    super.new();
  }
  close() {
    this[_decoder].close();
    if (this[_sink$] != null) this[_sink$].close();
  }
  add(chunk) {
    this.addSlice(chunk, 0, chunk[dartx.length], false);
  }
  addSlice(codeUnits, startIndex, endIndex, isLast) {
    this[_decoder].convert(codeUnits, startIndex, endIndex);
    if (dart.test(isLast)) this.close();
  }
};
dart.setSignature(convert._Utf8StringSinkAdapter, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8StringSinkAdapter, [core.Sink, core.StringSink, core.bool])}),
  fields: () => ({
    [_decoder]: convert._Utf8Decoder,
    [_sink$]: core.Sink
  }),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
  })
});
convert._Utf8ConversionSink = class _Utf8ConversionSink extends convert.ByteConversionSink {
  new(sink, allowMalformed) {
    _Utf8ConversionSink.prototype._.call(this, sink, new core.StringBuffer(), allowMalformed);
  }
  _(chunkedSink, stringBuffer, allowMalformed) {
    this[_chunkedSink] = chunkedSink;
    this[_decoder] = new convert._Utf8Decoder(stringBuffer, allowMalformed);
    this[_buffer] = stringBuffer;
    super.new();
  }
  close() {
    this[_decoder].close();
    if (dart.test(this[_buffer].isNotEmpty)) {
      let accumulated = dart.toString(this[_buffer]);
      this[_buffer].clear();
      this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], true);
    } else {
      this[_chunkedSink].close();
    }
  }
  add(chunk) {
    this.addSlice(chunk, 0, chunk[dartx.length], false);
  }
  addSlice(chunk, startIndex, endIndex, isLast) {
    this[_decoder].convert(chunk, startIndex, endIndex);
    if (dart.test(this[_buffer].isNotEmpty)) {
      let accumulated = dart.toString(this[_buffer]);
      this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], isLast);
      this[_buffer].clear();
      return;
    }
    if (dart.test(isLast)) this.close();
  }
};
dart.defineNamedConstructor(convert._Utf8ConversionSink, '_');
dart.setSignature(convert._Utf8ConversionSink, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.bool]),
    _: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.StringBuffer, core.bool])
  }),
  fields: () => ({
    [_decoder]: convert._Utf8Decoder,
    [_chunkedSink]: convert.StringConversionSink,
    [_buffer]: core.StringBuffer
  }),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
  })
});
convert.UNICODE_REPLACEMENT_CHARACTER_RUNE = 65533;
convert.UNICODE_BOM_CHARACTER_RUNE = 65279;
const _allowMalformed = Symbol('_allowMalformed');
let const$50;
convert.Utf8Codec = class Utf8Codec extends convert.Encoding {
  new(opts) {
    let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
    this[_allowMalformed] = allowMalformed;
    super.new();
  }
  get name() {
    return "utf-8";
  }
  decode(codeUnits, opts) {
    let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : null;
    if (allowMalformed == null) allowMalformed = this[_allowMalformed];
    return new convert.Utf8Decoder({allowMalformed: allowMalformed}).convert(codeUnits);
  }
  get encoder() {
    return const$50 || (const$50 = dart.const(new convert.Utf8Encoder()));
  }
  get decoder() {
    return new convert.Utf8Decoder({allowMalformed: this[_allowMalformed]});
  }
};
dart.setSignature(convert.Utf8Codec, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Codec, [], {allowMalformed: core.bool})}),
  fields: () => ({[_allowMalformed]: core.bool}),
  getters: () => ({
    name: dart.definiteFunctionType(core.String, []),
    encoder: dart.definiteFunctionType(convert.Utf8Encoder, []),
    decoder: dart.definiteFunctionType(convert.Utf8Decoder, [])
  }),
  methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowMalformed: core.bool})})
});
convert.UTF8 = dart.const(new convert.Utf8Codec());
const _fillBuffer = Symbol('_fillBuffer');
const _writeSurrogate = Symbol('_writeSurrogate');
convert.Utf8Encoder = class Utf8Encoder extends convert.Converter$(core.String, core.List$(core.int)) {
  new() {
    super.new();
  }
  convert(string, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let stringLength = string[dartx.length];
    core.RangeError.checkValidRange(start, end, stringLength);
    if (end == null) end = stringLength;
    let length = dart.notNull(end) - dart.notNull(start);
    if (length == 0) return typed_data.Uint8List.new(0);
    let encoder = new convert._Utf8Encoder.withBufferSize(length * 3);
    let endPosition = encoder[_fillBuffer](string, start, end);
    dart.assert(dart.notNull(endPosition) >= dart.notNull(end) - 1);
    if (endPosition != end) {
      let lastCodeUnit = string[dartx.codeUnitAt](dart.notNull(end) - 1);
      dart.assert(convert._isLeadSurrogate(lastCodeUnit));
      let wasCombined = encoder[_writeSurrogate](lastCodeUnit, 0);
      dart.assert(!dart.test(wasCombined));
    }
    return encoder[_buffer][dartx.sublist](0, encoder[_bufferIndex]);
  }
  startChunkedConversion(sink) {
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new convert._Utf8EncoderSink(convert.ByteConversionSink._check(sink));
  }
  bind(stream) {
    return super.bind(stream);
  }
};
dart.addSimpleTypeTests(convert.Utf8Encoder);
dart.setSignature(convert.Utf8Encoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Encoder, [])}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
  })
});
convert._Utf8Encoder = class _Utf8Encoder extends core.Object {
  new() {
    _Utf8Encoder.prototype.withBufferSize.call(this, convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE);
  }
  withBufferSize(bufferSize) {
    this[_buffer] = convert._Utf8Encoder._createBuffer(bufferSize);
    this[_carry] = 0;
    this[_bufferIndex] = 0;
  }
  static _createBuffer(size) {
    return typed_data.Uint8List.new(size);
  }
  [_writeSurrogate](leadingSurrogate, nextCodeUnit) {
    if (dart.test(convert._isTailSurrogate(nextCodeUnit))) {
      let rune = convert._combineSurrogatePair(leadingSurrogate, nextCodeUnit);
      dart.assert(dart.notNull(rune) > convert._THREE_BYTE_LIMIT);
      dart.assert(dart.notNull(rune) <= convert._FOUR_BYTE_LIMIT);
      this[_buffer][dartx._set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), (240 | rune[dartx['>>']](18)) >>> 0);
      this[_buffer][dartx._set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(rune) >> 12 & 63);
      this[_buffer][dartx._set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(rune) >> 6 & 63);
      this[_buffer][dartx._set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(rune) & 63);
      return true;
    } else {
      this[_buffer][dartx._set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), (224 | leadingSurrogate[dartx['>>']](12)) >>> 0);
      this[_buffer][dartx._set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(leadingSurrogate) >> 6 & 63);
      this[_buffer][dartx._set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(leadingSurrogate) & 63);
      return false;
    }
  }
  [_fillBuffer](str, start, end) {
    if (start != end && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](dart.notNull(end) - 1)))) {
      end = dart.notNull(end) - 1;
    }
    let stringIndex = null;
    for (stringIndex = start; dart.notNull(stringIndex) < dart.notNull(end); stringIndex = dart.notNull(stringIndex) + 1) {
      let codeUnit = str[dartx.codeUnitAt](stringIndex);
      if (dart.notNull(codeUnit) <= convert._ONE_BYTE_LIMIT) {
        if (dart.notNull(this[_bufferIndex]) >= dart.notNull(this[_buffer][dartx.length])) break;
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), codeUnit);
      } else if (dart.test(convert._isLeadSurrogate(codeUnit))) {
        if (dart.notNull(this[_bufferIndex]) + 3 >= dart.notNull(this[_buffer][dartx.length])) break;
        let nextCodeUnit = str[dartx.codeUnitAt](dart.notNull(stringIndex) + 1);
        let wasCombined = this[_writeSurrogate](codeUnit, nextCodeUnit);
        if (dart.test(wasCombined)) {
          stringIndex = dart.notNull(stringIndex) + 1;
        }
      } else {
        let rune = codeUnit;
        if (dart.notNull(rune) <= convert._TWO_BYTE_LIMIT) {
          if (dart.notNull(this[_bufferIndex]) + 1 >= dart.notNull(this[_buffer][dartx.length])) break;
          this[_buffer][dartx._set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), (192 | rune[dartx['>>']](6)) >>> 0);
          this[_buffer][dartx._set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), 128 | dart.notNull(rune) & 63);
        } else {
          dart.assert(dart.notNull(rune) <= convert._THREE_BYTE_LIMIT);
          if (dart.notNull(this[_bufferIndex]) + 2 >= dart.notNull(this[_buffer][dartx.length])) break;
          this[_buffer][dartx._set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), (224 | rune[dartx['>>']](12)) >>> 0);
          this[_buffer][dartx._set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), 128 | dart.notNull(rune) >> 6 & 63);
          this[_buffer][dartx._set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), 128 | dart.notNull(rune) & 63);
        }
      }
    }
    return stringIndex;
  }
};
dart.defineNamedConstructor(convert._Utf8Encoder, 'withBufferSize');
dart.setSignature(convert._Utf8Encoder, {
  constructors: () => ({
    new: dart.definiteFunctionType(convert._Utf8Encoder, []),
    withBufferSize: dart.definiteFunctionType(convert._Utf8Encoder, [core.int])
  }),
  fields: () => ({
    [_carry]: core.int,
    [_bufferIndex]: core.int,
    [_buffer]: ListOfint()
  }),
  methods: () => ({
    [_writeSurrogate]: dart.definiteFunctionType(core.bool, [core.int, core.int]),
    [_fillBuffer]: dart.definiteFunctionType(core.int, [core.String, core.int, core.int])
  }),
  sfields: () => ({_DEFAULT_BYTE_BUFFER_SIZE: core.int}),
  statics: () => ({_createBuffer: dart.definiteFunctionType(core.List$(core.int), [core.int])}),
  names: ['_createBuffer']
});
convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE = 1024;
convert._Utf8EncoderSink = class _Utf8EncoderSink extends dart.mixin(convert._Utf8Encoder, convert.StringConversionSinkMixin) {
  new(sink) {
    this[_sink$] = sink;
    super.new();
  }
  close() {
    if (this[_carry] != 0) {
      this.addSlice("", 0, 0, true);
      return;
    }
    this[_sink$].close();
  }
  addSlice(str, start, end, isLast) {
    this[_bufferIndex] = 0;
    if (start == end && !dart.test(isLast)) {
      return;
    }
    if (this[_carry] != 0) {
      let nextCodeUnit = 0;
      if (start != end) {
        nextCodeUnit = str[dartx.codeUnitAt](start);
      } else {
        dart.assert(isLast);
      }
      let wasCombined = this[_writeSurrogate](this[_carry], nextCodeUnit);
      dart.assert(!dart.test(wasCombined) || start != end);
      if (dart.test(wasCombined)) {
        start = dart.notNull(start) + 1;
      }
      this[_carry] = 0;
    }
    do {
      start = this[_fillBuffer](str, start, end);
      let isLastSlice = dart.test(isLast) && start == end;
      if (start == dart.notNull(end) - 1 && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](start)))) {
        if (dart.test(isLast) && dart.notNull(this[_bufferIndex]) < dart.notNull(this[_buffer][dartx.length]) - 3) {
          let hasBeenCombined = this[_writeSurrogate](str[dartx.codeUnitAt](start), 0);
          dart.assert(!dart.test(hasBeenCombined));
        } else {
          this[_carry] = str[dartx.codeUnitAt](start);
        }
        start = dart.notNull(start) + 1;
      }
      this[_sink$].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
      this[_bufferIndex] = 0;
    } while (dart.notNull(start) < dart.notNull(end));
    if (dart.test(isLast)) this.close();
  }
};
dart.setSignature(convert._Utf8EncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8EncoderSink, [convert.ByteConversionSink])}),
  fields: () => ({[_sink$]: convert.ByteConversionSink}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
  })
});
convert.Utf8Decoder = class Utf8Decoder extends convert.Converter$(core.List$(core.int), core.String) {
  new(opts) {
    let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
    this[_allowMalformed] = allowMalformed;
    super.new();
  }
  convert(codeUnits, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let result = convert.Utf8Decoder._convertIntercepted(this[_allowMalformed], codeUnits, start, end);
    if (result != null) {
      return result;
    }
    let length = codeUnits[dartx.length];
    core.RangeError.checkValidRange(start, end, length);
    if (end == null) end = length;
    let buffer = new core.StringBuffer();
    let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
    decoder.convert(codeUnits, start, end);
    decoder.close();
    return buffer.toString();
  }
  startChunkedConversion(sink) {
    let stringSink = null;
    if (convert.StringConversionSink.is(sink)) {
      stringSink = sink;
    } else {
      stringSink = convert.StringConversionSink.from(sink);
    }
    return stringSink.asUtf8Sink(this[_allowMalformed]);
  }
  bind(stream) {
    return super.bind(stream);
  }
  fuse(T) {
    return next => {
      return super.fuse(T)(next);
    };
  }
  static _convertIntercepted(allowMalformed, codeUnits, start, end) {
    return null;
  }
};
dart.addSimpleTypeTests(convert.Utf8Decoder);
dart.setSignature(convert.Utf8Decoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Decoder, [], {allowMalformed: core.bool})}),
  fields: () => ({[_allowMalformed]: core.bool}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
  }),
  statics: () => ({_convertIntercepted: dart.definiteFunctionType(core.String, [core.bool, ListOfint(), core.int, core.int])}),
  names: ['_convertIntercepted']
});
convert._ONE_BYTE_LIMIT = 127;
convert._TWO_BYTE_LIMIT = 2047;
convert._THREE_BYTE_LIMIT = 65535;
convert._FOUR_BYTE_LIMIT = 1114111;
convert._SURROGATE_MASK = 63488;
convert._SURROGATE_TAG_MASK = 64512;
convert._SURROGATE_VALUE_MASK = 1023;
convert._LEAD_SURROGATE_MIN = 55296;
convert._TAIL_SURROGATE_MIN = 56320;
convert._isLeadSurrogate = function(codeUnit) {
  return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._LEAD_SURROGATE_MIN;
};
dart.lazyFn(convert._isLeadSurrogate, () => intTobool());
convert._isTailSurrogate = function(codeUnit) {
  return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._TAIL_SURROGATE_MIN;
};
dart.lazyFn(convert._isTailSurrogate, () => intTobool());
convert._combineSurrogatePair = function(lead, tail) {
  return (65536 + ((dart.notNull(lead) & convert._SURROGATE_VALUE_MASK) << 10) | dart.notNull(tail) & convert._SURROGATE_VALUE_MASK) >>> 0;
};
dart.fn(convert._combineSurrogatePair, intAndintToint());
const _isFirstCharacter = Symbol('_isFirstCharacter');
const _value = Symbol('_value');
const _expectedUnits = Symbol('_expectedUnits');
const _extraUnits = Symbol('_extraUnits');
convert._Utf8Decoder = class _Utf8Decoder extends core.Object {
  new(stringSink, allowMalformed) {
    this[_stringSink] = stringSink;
    this[_allowMalformed] = allowMalformed;
    this[_isFirstCharacter] = true;
    this[_value] = 0;
    this[_expectedUnits] = 0;
    this[_extraUnits] = 0;
  }
  get hasPartialInput() {
    return dart.notNull(this[_expectedUnits]) > 0;
  }
  close() {
    this.flush();
  }
  flush() {
    if (dart.test(this.hasPartialInput)) {
      if (!dart.test(this[_allowMalformed])) {
        dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
      }
      this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
      this[_value] = 0;
      this[_expectedUnits] = 0;
      this[_extraUnits] = 0;
    }
  }
  convert(codeUnits, startIndex, endIndex) {
    let value = this[_value];
    let expectedUnits = this[_expectedUnits];
    let extraUnits = this[_extraUnits];
    this[_value] = 0;
    this[_expectedUnits] = 0;
    this[_extraUnits] = 0;
    function scanOneByteCharacters(units, from) {
      let to = endIndex;
      let mask = convert._ONE_BYTE_LIMIT;
      for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(i) + 1) {
        let unit = dart.dindex(units, i);
        if (!dart.equals(dart.dsend(unit, '&', mask), unit)) return dart.notNull(i) - dart.notNull(from);
      }
      return dart.notNull(to) - dart.notNull(from);
    }
    dart.fn(scanOneByteCharacters, dynamicAndintToint());
    const addSingleBytes = (function(from, to) {
      dart.assert(dart.notNull(from) >= dart.notNull(startIndex) && dart.notNull(from) <= dart.notNull(endIndex));
      dart.assert(dart.notNull(to) >= dart.notNull(startIndex) && dart.notNull(to) <= dart.notNull(endIndex));
      this[_stringSink].write(core.String.fromCharCodes(codeUnits, from, to));
    }).bind(this);
    dart.fn(addSingleBytes, intAndintTovoid());
    let i = startIndex;
    loop:
      while (true) {
        multibyte:
          if (dart.notNull(expectedUnits) > 0) {
            do {
              if (i == endIndex) {
                break loop;
              }
              let unit = codeUnits[dartx._get](i);
              if ((dart.notNull(unit) & 192) != 128) {
                expectedUnits = 0;
                if (!dart.test(this[_allowMalformed])) {
                  dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
                }
                this[_isFirstCharacter] = false;
                this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
                break multibyte;
              } else {
                value = (dart.notNull(value) << 6 | dart.notNull(unit) & 63) >>> 0;
                expectedUnits = dart.notNull(expectedUnits) - 1;
                i = dart.notNull(i) + 1;
              }
            } while (dart.notNull(expectedUnits) > 0);
            if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
              }
              expectedUnits = extraUnits = 0;
              value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
            }
            if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
              }
              value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
            }
            if (!dart.test(this[_isFirstCharacter]) || value != convert.UNICODE_BOM_CHARACTER_RUNE) {
              this[_stringSink].writeCharCode(value);
            }
            this[_isFirstCharacter] = false;
          }
        while (dart.notNull(i) < dart.notNull(endIndex)) {
          let oneBytes = scanOneByteCharacters(codeUnits, i);
          if (dart.notNull(oneBytes) > 0) {
            this[_isFirstCharacter] = false;
            addSingleBytes(i, dart.notNull(i) + dart.notNull(oneBytes));
            i = dart.notNull(i) + dart.notNull(oneBytes);
            if (i == endIndex) break;
          }
          let unit = codeUnits[dartx._get]((() => {
            let x = i;
            i = dart.notNull(x) + 1;
            return x;
          })());
          if (dart.notNull(unit) < 0) {
            if (!dart.test(this[_allowMalformed])) {
              dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
            }
            this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
          } else {
            dart.assert(dart.notNull(unit) > convert._ONE_BYTE_LIMIT);
            if ((dart.notNull(unit) & 224) == 192) {
              value = dart.notNull(unit) & 31;
              expectedUnits = extraUnits = 1;
              continue loop;
            }
            if ((dart.notNull(unit) & 240) == 224) {
              value = dart.notNull(unit) & 15;
              expectedUnits = extraUnits = 2;
              continue loop;
            }
            if ((dart.notNull(unit) & 248) == 240 && dart.notNull(unit) < 245) {
              value = dart.notNull(unit) & 7;
              expectedUnits = extraUnits = 3;
              continue loop;
            }
            if (!dart.test(this[_allowMalformed])) {
              dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
            }
            value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
            expectedUnits = extraUnits = 0;
            this[_isFirstCharacter] = false;
            this[_stringSink].writeCharCode(value);
          }
        }
        break loop;
      }
    if (dart.notNull(expectedUnits) > 0) {
      this[_value] = value;
      this[_expectedUnits] = expectedUnits;
      this[_extraUnits] = extraUnits;
    }
  }
};
dart.setSignature(convert._Utf8Decoder, {
  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Decoder, [core.StringSink, core.bool])}),
  fields: () => ({
    [_allowMalformed]: core.bool,
    [_stringSink]: core.StringSink,
    [_isFirstCharacter]: core.bool,
    [_value]: core.int,
    [_expectedUnits]: core.int,
    [_extraUnits]: core.int
  }),
  getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    flush: dart.definiteFunctionType(dart.void, []),
    convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
  }),
  sfields: () => ({_LIMITS: ListOfint()})
});
convert._Utf8Decoder._LIMITS = dart.constList([convert._ONE_BYTE_LIMIT, convert._TWO_BYTE_LIMIT, convert._THREE_BYTE_LIMIT, convert._FOUR_BYTE_LIMIT], core.int);
core._symbolToString = function(symbol) {
  return _internal.Symbol.getName(_internal.Symbol._check(symbol));
};
dart.lazyFn(core._symbolToString, () => SymbolToString());
core.StrongModeError = class StrongModeError extends core.Error {
  new() {
    super.new();
  }
};
core.Deprecated = class Deprecated extends core.Object {
  new(expires) {
    this.expires = expires;
  }
  toString() {
    return dart.str`Deprecated feature. Will be removed ${this.expires}`;
  }
};
dart.setSignature(core.Deprecated, {
  constructors: () => ({new: dart.definiteFunctionType(core.Deprecated, [core.String])}),
  fields: () => ({expires: core.String})
});
core._Override = class _Override extends core.Object {
  new() {
  }
};
dart.setSignature(core._Override, {
  constructors: () => ({new: dart.definiteFunctionType(core._Override, [])})
});
core.deprecated = dart.const(new core.Deprecated("next release"));
core.override = dart.const(new core._Override());
core._Proxy = class _Proxy extends core.Object {
  new() {
  }
};
dart.setSignature(core._Proxy, {
  constructors: () => ({new: dart.definiteFunctionType(core._Proxy, [])})
});
core.proxy = dart.const(new core._Proxy());
dart.defineExtensionNames([
  'toString'
]);
core.bool = class bool extends core.Object {
  static fromEnvironment(name, opts) {
    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
    dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
  }
  [dartx.toString]() {
    return this ? "true" : "false";
  }
};
core.bool.is = function is_bool(o) {
  return o === true || o === false;
};
core.bool.as = function as_bool(o) {
  if (o === true || o === false || o == null) return o;
  return dart.as(o, core.bool);
};
core.bool._check = function check_bool(o) {
  if (o === true || o === false || o == null) return o;
  return dart.check(o, core.bool);
};
dart.setSignature(core.bool, {
  constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.bool, [core.String], {defaultValue: core.bool})})
});
core.Comparator$ = dart.generic(T => {
  const Comparator = dart.typedef('Comparator', () => dart.functionType(core.int, [T, T]));
  return Comparator;
});
core.Comparator = Comparator();
core.Comparable$ = dart.generic(T => {
  class Comparable extends core.Object {
    static compare(a, b) {
      return a[dartx.compareTo](b);
    }
  }
  dart.addTypeTests(Comparable);
  dart.setSignature(Comparable, {
    statics: () => ({compare: dart.definiteFunctionType(core.int, [core.Comparable, core.Comparable])}),
    names: ['compare']
  });
  return Comparable;
});
core.Comparable = Comparable();
const _value$ = Symbol('_value');
core.DateTime = class DateTime extends core.Object {
  new(year, month, day, hour, minute, second, millisecond, microsecond) {
    if (month === void 0) month = 1;
    if (day === void 0) day = 1;
    if (hour === void 0) hour = 0;
    if (minute === void 0) minute = 0;
    if (second === void 0) second = 0;
    if (millisecond === void 0) millisecond = 0;
    if (microsecond === void 0) microsecond = 0;
    DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, false);
  }
  utc(year, month, day, hour, minute, second, millisecond, microsecond) {
    if (month === void 0) month = 1;
    if (day === void 0) day = 1;
    if (hour === void 0) hour = 0;
    if (minute === void 0) minute = 0;
    if (second === void 0) second = 0;
    if (millisecond === void 0) millisecond = 0;
    if (microsecond === void 0) microsecond = 0;
    DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, true);
  }
  now() {
    DateTime.prototype._now.call(this);
  }
  static parse(formattedString) {
    let re = core.RegExp.new('^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)' + '(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{1,6}))?)?)?' + '( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$');
    let match = re.firstMatch(formattedString);
    if (match != null) {
      function parseIntOrZero(matched) {
        if (matched == null) return 0;
        return core.int.parse(matched);
      }
      dart.fn(parseIntOrZero, StringToint$());
      function parseMilliAndMicroseconds(matched) {
        if (matched == null) return 0;
        let length = matched[dartx.length];
        dart.assert(dart.notNull(length) >= 1);
        dart.assert(dart.notNull(length) <= 6);
        let result = 0;
        for (let i = 0; i < 6; i++) {
          result = result * 10;
          if (i < dart.notNull(matched[dartx.length])) {
            result = result + ((dart.notNull(matched[dartx.codeUnitAt](i)) ^ 48) >>> 0);
          }
        }
        return result;
      }
      dart.fn(parseMilliAndMicroseconds, StringToint$());
      let years = core.int.parse(match._get(1));
      let month = core.int.parse(match._get(2));
      let day = core.int.parse(match._get(3));
      let hour = parseIntOrZero(match._get(4));
      let minute = parseIntOrZero(match._get(5));
      let second = parseIntOrZero(match._get(6));
      let addOneMillisecond = false;
      let milliAndMicroseconds = parseMilliAndMicroseconds(match._get(7));
      let millisecond = (dart.notNull(milliAndMicroseconds) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
      let microsecond = dart.asInt(milliAndMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_MILLISECOND));
      let isUtc = false;
      if (match._get(8) != null) {
        isUtc = true;
        if (match._get(9) != null) {
          let sign = match._get(9) == '-' ? -1 : 1;
          let hourDifference = core.int.parse(match._get(10));
          let minuteDifference = parseIntOrZero(match._get(11));
          minuteDifference = dart.notNull(minuteDifference) + 60 * dart.notNull(hourDifference);
          minute = dart.notNull(minute) - sign * dart.notNull(minuteDifference);
        }
      }
      let value = core.DateTime._brokenDownDateToValue(years, month, day, hour, minute, second, millisecond, microsecond, isUtc);
      if (value == null) {
        dart.throw(new core.FormatException("Time out of range", formattedString));
      }
      return new core.DateTime._withValue(value, {isUtc: isUtc});
    } else {
      dart.throw(new core.FormatException("Invalid date format", formattedString));
    }
  }
  fromMillisecondsSinceEpoch(millisecondsSinceEpoch, opts) {
    let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
    DateTime.prototype._withValue.call(this, millisecondsSinceEpoch, {isUtc: isUtc});
  }
  fromMicrosecondsSinceEpoch(microsecondsSinceEpoch, opts) {
    let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
    DateTime.prototype._withValue.call(this, core.DateTime._microsecondInRoundedMilliseconds(microsecondsSinceEpoch), {isUtc: isUtc});
  }
  _withValue(value, opts) {
    let isUtc = opts && 'isUtc' in opts ? opts.isUtc : null;
    this[_value$] = value;
    this.isUtc = isUtc;
    if (dart.notNull(this.millisecondsSinceEpoch[dartx.abs]()) > core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH || this.millisecondsSinceEpoch[dartx.abs]() == core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH && this.microsecond != 0) {
      dart.throw(new core.ArgumentError(this.millisecondsSinceEpoch));
    }
    if (this.isUtc == null) dart.throw(new core.ArgumentError(this.isUtc));
  }
  ['=='](other) {
    if (!core.DateTime.is(other)) return false;
    return dart.equals(this[_value$], dart.dload(other, _value$)) && dart.equals(this.isUtc, dart.dload(other, 'isUtc'));
  }
  isBefore(other) {
    return dart.notNull(this[_value$]) < dart.notNull(other[_value$]);
  }
  isAfter(other) {
    return dart.notNull(this[_value$]) > dart.notNull(other[_value$]);
  }
  isAtSameMomentAs(other) {
    return this[_value$] == other[_value$];
  }
  compareTo(other) {
    return this[_value$][dartx.compareTo](other[_value$]);
  }
  get hashCode() {
    return (dart.notNull(this[_value$]) ^ this[_value$][dartx['>>']](30)) & 1073741823;
  }
  toLocal() {
    if (dart.test(this.isUtc)) {
      return new core.DateTime._withValue(this[_value$], {isUtc: false});
    }
    return this;
  }
  toUtc() {
    if (dart.test(this.isUtc)) return this;
    return new core.DateTime._withValue(this[_value$], {isUtc: true});
  }
  static _fourDigits(n) {
    let absN = n[dartx.abs]();
    let sign = dart.notNull(n) < 0 ? "-" : "";
    if (dart.notNull(absN) >= 1000) return dart.str`${n}`;
    if (dart.notNull(absN) >= 100) return dart.str`${sign}0${absN}`;
    if (dart.notNull(absN) >= 10) return dart.str`${sign}00${absN}`;
    return dart.str`${sign}000${absN}`;
  }
  static _sixDigits(n) {
    dart.assert(dart.notNull(n) < -9999 || dart.notNull(n) > 9999);
    let absN = n[dartx.abs]();
    let sign = dart.notNull(n) < 0 ? "-" : "+";
    if (dart.notNull(absN) >= 100000) return dart.str`${sign}${absN}`;
    return dart.str`${sign}0${absN}`;
  }
  static _threeDigits(n) {
    if (dart.notNull(n) >= 100) return dart.str`${n}`;
    if (dart.notNull(n) >= 10) return dart.str`0${n}`;
    return dart.str`00${n}`;
  }
  static _twoDigits(n) {
    if (dart.notNull(n) >= 10) return dart.str`${n}`;
    return dart.str`0${n}`;
  }
  toString() {
    let y = core.DateTime._fourDigits(this.year);
    let m = core.DateTime._twoDigits(this.month);
    let d = core.DateTime._twoDigits(this.day);
    let h = core.DateTime._twoDigits(this.hour);
    let min = core.DateTime._twoDigits(this.minute);
    let sec = core.DateTime._twoDigits(this.second);
    let ms = core.DateTime._threeDigits(this.millisecond);
    let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
    if (dart.test(this.isUtc)) {
      return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}Z`;
    } else {
      return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}`;
    }
  }
  toIso8601String() {
    let y = dart.notNull(this.year) >= -9999 && dart.notNull(this.year) <= 9999 ? core.DateTime._fourDigits(this.year) : core.DateTime._sixDigits(this.year);
    let m = core.DateTime._twoDigits(this.month);
    let d = core.DateTime._twoDigits(this.day);
    let h = core.DateTime._twoDigits(this.hour);
    let min = core.DateTime._twoDigits(this.minute);
    let sec = core.DateTime._twoDigits(this.second);
    let ms = core.DateTime._threeDigits(this.millisecond);
    let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
    if (dart.test(this.isUtc)) {
      return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}Z`;
    } else {
      return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}`;
    }
  }
  add(duration) {
    return new core.DateTime._withValue(dart.notNull(this[_value$]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
  }
  subtract(duration) {
    return new core.DateTime._withValue(dart.notNull(this[_value$]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
  }
  difference(other) {
    return new core.Duration({milliseconds: dart.notNull(this[_value$]) - dart.notNull(other[_value$])});
  }
  _internal(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
    this.isUtc = typeof isUtc == 'boolean' ? isUtc : dart.throw(new core.ArgumentError.value(isUtc, 'isUtc'));
    this[_value$] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
  }
  _now() {
    this.isUtc = false;
    this[_value$] = _js_helper.Primitives.dateNow();
  }
  static _brokenDownDateToValue(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
    return dart.asInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc));
  }
  get millisecondsSinceEpoch() {
    return this[_value$];
  }
  get microsecondsSinceEpoch() {
    return dart.notNull(this[_value$]) * 1000;
  }
  get timeZoneName() {
    if (dart.test(this.isUtc)) return "UTC";
    return _js_helper.Primitives.getTimeZoneName(this);
  }
  get timeZoneOffset() {
    if (dart.test(this.isUtc)) return new core.Duration();
    return new core.Duration({minutes: _js_helper.Primitives.getTimeZoneOffsetInMinutes(this)});
  }
  get year() {
    return core.int._check(_js_helper.Primitives.getYear(this));
  }
  get month() {
    return core.int._check(_js_helper.Primitives.getMonth(this));
  }
  get day() {
    return core.int._check(_js_helper.Primitives.getDay(this));
  }
  get hour() {
    return core.int._check(_js_helper.Primitives.getHours(this));
  }
  get minute() {
    return core.int._check(_js_helper.Primitives.getMinutes(this));
  }
  get second() {
    return core.int._check(_js_helper.Primitives.getSeconds(this));
  }
  get millisecond() {
    return core.int._check(_js_helper.Primitives.getMilliseconds(this));
  }
  get microsecond() {
    return 0;
  }
  get weekday() {
    return core.int._check(_js_helper.Primitives.getWeekday(this));
  }
  static _microsecondInRoundedMilliseconds(microsecond) {
    return (dart.notNull(microsecond) / 1000)[dartx.round]();
  }
};
dart.defineNamedConstructor(core.DateTime, 'utc');
dart.defineNamedConstructor(core.DateTime, 'now');
dart.defineNamedConstructor(core.DateTime, 'fromMillisecondsSinceEpoch');
dart.defineNamedConstructor(core.DateTime, 'fromMicrosecondsSinceEpoch');
dart.defineNamedConstructor(core.DateTime, '_withValue');
dart.defineNamedConstructor(core.DateTime, '_internal');
dart.defineNamedConstructor(core.DateTime, '_now');
core.DateTime[dart.implements] = () => [ComparableOfDateTime()];
dart.setSignature(core.DateTime, {
  constructors: () => ({
    new: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
    utc: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
    now: dart.definiteFunctionType(core.DateTime, []),
    fromMillisecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
    fromMicrosecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
    _withValue: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
    _internal: dart.definiteFunctionType(core.DateTime, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
    _now: dart.definiteFunctionType(core.DateTime, [])
  }),
  fields: () => ({
    [_value$]: core.int,
    isUtc: core.bool
  }),
  getters: () => ({
    millisecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
    microsecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
    timeZoneName: dart.definiteFunctionType(core.String, []),
    timeZoneOffset: dart.definiteFunctionType(core.Duration, []),
    year: dart.definiteFunctionType(core.int, []),
    month: dart.definiteFunctionType(core.int, []),
    day: dart.definiteFunctionType(core.int, []),
    hour: dart.definiteFunctionType(core.int, []),
    minute: dart.definiteFunctionType(core.int, []),
    second: dart.definiteFunctionType(core.int, []),
    millisecond: dart.definiteFunctionType(core.int, []),
    microsecond: dart.definiteFunctionType(core.int, []),
    weekday: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    isBefore: dart.definiteFunctionType(core.bool, [core.DateTime]),
    isAfter: dart.definiteFunctionType(core.bool, [core.DateTime]),
    isAtSameMomentAs: dart.definiteFunctionType(core.bool, [core.DateTime]),
    compareTo: dart.definiteFunctionType(core.int, [core.DateTime]),
    toLocal: dart.definiteFunctionType(core.DateTime, []),
    toUtc: dart.definiteFunctionType(core.DateTime, []),
    toIso8601String: dart.definiteFunctionType(core.String, []),
    add: dart.definiteFunctionType(core.DateTime, [core.Duration]),
    subtract: dart.definiteFunctionType(core.DateTime, [core.Duration]),
    difference: dart.definiteFunctionType(core.Duration, [core.DateTime])
  }),
  sfields: () => ({
    MONDAY: core.int,
    TUESDAY: core.int,
    WEDNESDAY: core.int,
    THURSDAY: core.int,
    FRIDAY: core.int,
    SATURDAY: core.int,
    SUNDAY: core.int,
    DAYS_PER_WEEK: core.int,
    JANUARY: core.int,
    FEBRUARY: core.int,
    MARCH: core.int,
    APRIL: core.int,
    MAY: core.int,
    JUNE: core.int,
    JULY: core.int,
    AUGUST: core.int,
    SEPTEMBER: core.int,
    OCTOBER: core.int,
    NOVEMBER: core.int,
    DECEMBER: core.int,
    MONTHS_PER_YEAR: core.int,
    _MAX_MILLISECONDS_SINCE_EPOCH: core.int
  }),
  statics: () => ({
    parse: dart.definiteFunctionType(core.DateTime, [core.String]),
    _fourDigits: dart.definiteFunctionType(core.String, [core.int]),
    _sixDigits: dart.definiteFunctionType(core.String, [core.int]),
    _threeDigits: dart.definiteFunctionType(core.String, [core.int]),
    _twoDigits: dart.definiteFunctionType(core.String, [core.int]),
    _brokenDownDateToValue: dart.definiteFunctionType(core.int, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
    _microsecondInRoundedMilliseconds: dart.definiteFunctionType(core.int, [core.int])
  }),
  names: ['parse', '_fourDigits', '_sixDigits', '_threeDigits', '_twoDigits', '_brokenDownDateToValue', '_microsecondInRoundedMilliseconds']
});
dart.defineExtensionMembers(core.DateTime, ['compareTo']);
core.DateTime.MONDAY = 1;
core.DateTime.TUESDAY = 2;
core.DateTime.WEDNESDAY = 3;
core.DateTime.THURSDAY = 4;
core.DateTime.FRIDAY = 5;
core.DateTime.SATURDAY = 6;
core.DateTime.SUNDAY = 7;
core.DateTime.DAYS_PER_WEEK = 7;
core.DateTime.JANUARY = 1;
core.DateTime.FEBRUARY = 2;
core.DateTime.MARCH = 3;
core.DateTime.APRIL = 4;
core.DateTime.MAY = 5;
core.DateTime.JUNE = 6;
core.DateTime.JULY = 7;
core.DateTime.AUGUST = 8;
core.DateTime.SEPTEMBER = 9;
core.DateTime.OCTOBER = 10;
core.DateTime.NOVEMBER = 11;
core.DateTime.DECEMBER = 12;
core.DateTime.MONTHS_PER_YEAR = 12;
core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
const _duration = Symbol('_duration');
core.Duration = class Duration extends core.Object {
  new(opts) {
    let days = opts && 'days' in opts ? opts.days : 0;
    let hours = opts && 'hours' in opts ? opts.hours : 0;
    let minutes = opts && 'minutes' in opts ? opts.minutes : 0;
    let seconds = opts && 'seconds' in opts ? opts.seconds : 0;
    let milliseconds = opts && 'milliseconds' in opts ? opts.milliseconds : 0;
    let microseconds = opts && 'microseconds' in opts ? opts.microseconds : 0;
    Duration.prototype._microseconds.call(this, core.Duration.MICROSECONDS_PER_DAY * dart.notNull(days) + core.Duration.MICROSECONDS_PER_HOUR * dart.notNull(hours) + core.Duration.MICROSECONDS_PER_MINUTE * dart.notNull(minutes) + core.Duration.MICROSECONDS_PER_SECOND * dart.notNull(seconds) + core.Duration.MICROSECONDS_PER_MILLISECOND * dart.notNull(milliseconds) + dart.notNull(microseconds));
  }
  _microseconds(duration) {
    this[_duration] = duration;
  }
  ['+'](other) {
    return new core.Duration._microseconds(dart.notNull(this[_duration]) + dart.notNull(other[_duration]));
  }
  ['-'](other) {
    return new core.Duration._microseconds(dart.notNull(this[_duration]) - dart.notNull(other[_duration]));
  }
  ['*'](factor) {
    return new core.Duration._microseconds((dart.notNull(this[_duration]) * dart.notNull(factor))[dartx.round]());
  }
  ['~/'](quotient) {
    if (quotient == 0) dart.throw(new core.IntegerDivisionByZeroException());
    return new core.Duration._microseconds((dart.notNull(this[_duration]) / dart.notNull(quotient))[dartx.truncate]());
  }
  ['<'](other) {
    return dart.notNull(this[_duration]) < dart.notNull(other[_duration]);
  }
  ['>'](other) {
    return dart.notNull(this[_duration]) > dart.notNull(other[_duration]);
  }
  ['<='](other) {
    return dart.notNull(this[_duration]) <= dart.notNull(other[_duration]);
  }
  ['>='](other) {
    return dart.notNull(this[_duration]) >= dart.notNull(other[_duration]);
  }
  get inDays() {
    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_DAY)[dartx.truncate]();
  }
  get inHours() {
    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_HOUR)[dartx.truncate]();
  }
  get inMinutes() {
    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MINUTE)[dartx.truncate]();
  }
  get inSeconds() {
    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_SECOND)[dartx.truncate]();
  }
  get inMilliseconds() {
    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
  }
  get inMicroseconds() {
    return this[_duration];
  }
  ['=='](other) {
    if (!core.Duration.is(other)) return false;
    return dart.equals(this[_duration], dart.dload(other, _duration));
  }
  get hashCode() {
    return dart.hashCode(this[_duration]);
  }
  compareTo(other) {
    return this[_duration][dartx.compareTo](other[_duration]);
  }
  toString() {
    function sixDigits(n) {
      if (dart.notNull(n) >= 100000) return dart.str`${n}`;
      if (dart.notNull(n) >= 10000) return dart.str`0${n}`;
      if (dart.notNull(n) >= 1000) return dart.str`00${n}`;
      if (dart.notNull(n) >= 100) return dart.str`000${n}`;
      if (dart.notNull(n) >= 10) return dart.str`0000${n}`;
      return dart.str`00000${n}`;
    }
    dart.fn(sixDigits, intToString());
    function twoDigits(n) {
      if (dart.notNull(n) >= 10) return dart.str`${n}`;
      return dart.str`0${n}`;
    }
    dart.fn(twoDigits, intToString());
    if (dart.notNull(this.inMicroseconds) < 0) {
      return dart.str`-${this._negate()}`;
    }
    let twoDigitMinutes = twoDigits(dart.asInt(this.inMinutes[dartx.remainder](core.Duration.MINUTES_PER_HOUR)));
    let twoDigitSeconds = twoDigits(dart.asInt(this.inSeconds[dartx.remainder](core.Duration.SECONDS_PER_MINUTE)));
    let sixDigitUs = sixDigits(dart.asInt(this.inMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_SECOND)));
    return dart.str`${this.inHours}:${twoDigitMinutes}:${twoDigitSeconds}.${sixDigitUs}`;
  }
  get isNegative() {
    return dart.notNull(this[_duration]) < 0;
  }
  abs() {
    return new core.Duration._microseconds(this[_duration][dartx.abs]());
  }
  _negate() {
    return new core.Duration._microseconds(-dart.notNull(this[_duration]));
  }
};
dart.defineNamedConstructor(core.Duration, '_microseconds');
core.Duration[dart.implements] = () => [ComparableOfDuration()];
dart.setSignature(core.Duration, {
  constructors: () => ({
    new: dart.definiteFunctionType(core.Duration, [], {days: core.int, hours: core.int, minutes: core.int, seconds: core.int, milliseconds: core.int, microseconds: core.int}),
    _microseconds: dart.definiteFunctionType(core.Duration, [core.int])
  }),
  fields: () => ({[_duration]: core.int}),
  getters: () => ({
    inDays: dart.definiteFunctionType(core.int, []),
    inHours: dart.definiteFunctionType(core.int, []),
    inMinutes: dart.definiteFunctionType(core.int, []),
    inSeconds: dart.definiteFunctionType(core.int, []),
    inMilliseconds: dart.definiteFunctionType(core.int, []),
    inMicroseconds: dart.definiteFunctionType(core.int, []),
    isNegative: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    '+': dart.definiteFunctionType(core.Duration, [core.Duration]),
    '-': dart.definiteFunctionType(core.Duration, [core.Duration]),
    '*': dart.definiteFunctionType(core.Duration, [core.num]),
    '~/': dart.definiteFunctionType(core.Duration, [core.int]),
    '<': dart.definiteFunctionType(core.bool, [core.Duration]),
    '>': dart.definiteFunctionType(core.bool, [core.Duration]),
    '<=': dart.definiteFunctionType(core.bool, [core.Duration]),
    '>=': dart.definiteFunctionType(core.bool, [core.Duration]),
    compareTo: dart.definiteFunctionType(core.int, [core.Duration]),
    abs: dart.definiteFunctionType(core.Duration, []),
    _negate: dart.definiteFunctionType(core.Duration, [])
  }),
  sfields: () => ({
    MICROSECONDS_PER_MILLISECOND: core.int,
    MILLISECONDS_PER_SECOND: core.int,
    SECONDS_PER_MINUTE: core.int,
    MINUTES_PER_HOUR: core.int,
    HOURS_PER_DAY: core.int,
    MICROSECONDS_PER_SECOND: core.int,
    MICROSECONDS_PER_MINUTE: core.int,
    MICROSECONDS_PER_HOUR: core.int,
    MICROSECONDS_PER_DAY: core.int,
    MILLISECONDS_PER_MINUTE: core.int,
    MILLISECONDS_PER_HOUR: core.int,
    MILLISECONDS_PER_DAY: core.int,
    SECONDS_PER_HOUR: core.int,
    SECONDS_PER_DAY: core.int,
    MINUTES_PER_DAY: core.int,
    ZERO: core.Duration
  })
});
dart.defineExtensionMembers(core.Duration, ['compareTo']);
core.Duration.MICROSECONDS_PER_MILLISECOND = 1000;
core.Duration.MILLISECONDS_PER_SECOND = 1000;
core.Duration.SECONDS_PER_MINUTE = 60;
core.Duration.MINUTES_PER_HOUR = 60;
core.Duration.HOURS_PER_DAY = 24;
dart.defineLazy(core.Duration, {
  get MICROSECONDS_PER_SECOND() {
    return core.Duration.MICROSECONDS_PER_MILLISECOND * core.Duration.MILLISECONDS_PER_SECOND;
  },
  get MICROSECONDS_PER_MINUTE() {
    return core.Duration.MICROSECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
  },
  get MICROSECONDS_PER_HOUR() {
    return core.Duration.MICROSECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
  },
  get MICROSECONDS_PER_DAY() {
    return core.Duration.MICROSECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
  },
  get MILLISECONDS_PER_MINUTE() {
    return core.Duration.MILLISECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
  },
  get MILLISECONDS_PER_HOUR() {
    return core.Duration.MILLISECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
  },
  get MILLISECONDS_PER_DAY() {
    return core.Duration.MILLISECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
  },
  get SECONDS_PER_HOUR() {
    return core.Duration.SECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
  },
  get SECONDS_PER_DAY() {
    return core.Duration.SECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
  },
  get MINUTES_PER_DAY() {
    return core.Duration.MINUTES_PER_HOUR * core.Duration.HOURS_PER_DAY;
  },
  get ZERO() {
    return dart.const(new core.Duration({seconds: 0}));
  }
});
core.TypeError = class TypeError extends core.AssertionError {
  new() {
    super.new();
  }
};
core.CastError = class CastError extends core.Error {
  new() {
    super.new();
  }
};
core.NullThrownError = class NullThrownError extends core.Error {
  new() {
    super.new();
  }
  toString() {
    return "Throw of null.";
  }
};
const _hasValue = Symbol('_hasValue');
const _errorName = Symbol('_errorName');
const _errorExplanation = Symbol('_errorExplanation');
core.ArgumentError = class ArgumentError extends core.Error {
  new(message) {
    if (message === void 0) message = null;
    this.message = message;
    this.invalidValue = null;
    this[_hasValue] = false;
    this.name = null;
    super.new();
  }
  value(value, name, message) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    this.name = name;
    this.message = message;
    this.invalidValue = value;
    this[_hasValue] = true;
    super.new();
  }
  notNull(name) {
    if (name === void 0) name = null;
    this.name = name;
    this[_hasValue] = false;
    this.message = "Must not be null";
    this.invalidValue = null;
    super.new();
  }
  get [_errorName]() {
    return dart.str`Invalid argument${!dart.test(this[_hasValue]) ? "(s)" : ""}`;
  }
  get [_errorExplanation]() {
    return "";
  }
  toString() {
    let nameString = "";
    if (this.name != null) {
      nameString = dart.str` (${this.name})`;
    }
    let message = this.message == null ? "" : dart.str`: ${this.message}`;
    let prefix = dart.str`${this[_errorName]}${nameString}${message}`;
    if (!dart.test(this[_hasValue])) return prefix;
    let explanation = this[_errorExplanation];
    let errorValue = core.Error.safeToString(this.invalidValue);
    return dart.str`${prefix}${explanation}: ${errorValue}`;
  }
};
dart.defineNamedConstructor(core.ArgumentError, 'value');
dart.defineNamedConstructor(core.ArgumentError, 'notNull');
dart.setSignature(core.ArgumentError, {
  constructors: () => ({
    new: dart.definiteFunctionType(core.ArgumentError, [], [dart.dynamic]),
    value: dart.definiteFunctionType(core.ArgumentError, [dart.dynamic], [core.String, core.String]),
    notNull: dart.definiteFunctionType(core.ArgumentError, [], [core.String])
  }),
  fields: () => ({
    [_hasValue]: core.bool,
    invalidValue: dart.dynamic,
    name: core.String,
    message: dart.dynamic
  }),
  getters: () => ({
    [_errorName]: dart.definiteFunctionType(core.String, []),
    [_errorExplanation]: dart.definiteFunctionType(core.String, [])
  })
});
core.RangeError = class RangeError extends core.ArgumentError {
  new(message) {
    this.start = null;
    this.end = null;
    super.new(message);
  }
  value(value, name, message) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    this.start = null;
    this.end = null;
    super.value(value, name, message != null ? message : "Value not in range");
  }
  range(invalidValue, minValue, maxValue, name, message) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    this.start = minValue;
    this.end = maxValue;
    super.value(invalidValue, name, message != null ? message : "Invalid value");
  }
  static index(index, indexable, name, message, length) {
    return new core.IndexError(index, indexable, name, message, length);
  }
  static checkValueInInterval(value, minValue, maxValue, name, message) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    if (dart.notNull(value) < dart.notNull(minValue) || dart.notNull(value) > dart.notNull(maxValue)) {
      dart.throw(new core.RangeError.range(value, minValue, maxValue, name, message));
    }
  }
  static checkValidIndex(index, indexable, name, length, message) {
    if (name === void 0) name = null;
    if (length === void 0) length = null;
    if (message === void 0) message = null;
    if (length == null) length = core.int._check(dart.dload(indexable, 'length'));
    if (0 > dart.notNull(index) || dart.notNull(index) >= dart.notNull(length)) {
      if (name == null) name = "index";
      dart.throw(core.RangeError.index(index, indexable, name, message, length));
    }
  }
  static checkValidRange(start, end, length, startName, endName, message) {
    if (startName === void 0) startName = null;
    if (endName === void 0) endName = null;
    if (message === void 0) message = null;
    if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(length)) {
      if (startName == null) startName = "start";
      dart.throw(new core.RangeError.range(start, 0, length, startName, message));
    }
    if (end != null) {
      if (dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length)) {
        if (endName == null) endName = "end";
        dart.throw(new core.RangeError.range(end, start, length, endName, message));
      }
      return end;
    }
    return length;
  }
  static checkNotNegative(value, name, message) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    if (dart.notNull(value) < 0) dart.throw(new core.RangeError.range(value, 0, null, name, message));
  }
  get [_errorName]() {
    return "RangeError";
  }
  get [_errorExplanation]() {
    dart.assert(this[_hasValue]);
    let explanation = "";
    if (this.start == null) {
      if (this.end != null) {
        explanation = dart.str`: Not less than or equal to ${this.end}`;
      }
    } else if (this.end == null) {
      explanation = dart.str`: Not greater than or equal to ${this.start}`;
    } else if (dart.notNull(this.end) > dart.notNull(this.start)) {
      explanation = dart.str`: Not in range ${this.start}..${this.end}, inclusive`;
    } else if (dart.notNull(this.end) < dart.notNull(this.start)) {
      explanation = ": Valid value range is empty";
    } else {
      explanation = dart.str`: Only valid value is ${this.start}`;
    }
    return explanation;
  }
};
dart.defineNamedConstructor(core.RangeError, 'value');
dart.defineNamedConstructor(core.RangeError, 'range');
dart.setSignature(core.RangeError, {
  constructors: () => ({
    new: dart.definiteFunctionType(core.RangeError, [dart.dynamic]),
    value: dart.definiteFunctionType(core.RangeError, [core.num], [core.String, core.String]),
    range: dart.definiteFunctionType(core.RangeError, [core.num, core.int, core.int], [core.String, core.String]),
    index: dart.definiteFunctionType(core.RangeError, [core.int, dart.dynamic], [core.String, core.String, core.int])
  }),
  fields: () => ({
    start: core.num,
    end: core.num
  }),
  statics: () => ({
    checkValueInInterval: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.String, core.String]),
    checkValidIndex: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic], [core.String, core.int, core.String]),
    checkValidRange: dart.definiteFunctionType(core.int, [core.int, core.int, core.int], [core.String, core.String, core.String]),
    checkNotNegative: dart.definiteFunctionType(dart.void, [core.int], [core.String, core.String])
  }),
  names: ['checkValueInInterval', 'checkValidIndex', 'checkValidRange', 'checkNotNegative']
});
core.IndexError = class IndexError extends core.ArgumentError {
  new(invalidValue, indexable, name, message, length) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    if (length === void 0) length = null;
    this.indexable = indexable;
    this.length = core.int._check(length != null ? length : dart.dload(indexable, 'length'));
    super.value(invalidValue, name, message != null ? message : "Index out of range");
  }
  get start() {
    return 0;
  }
  get end() {
    return dart.notNull(this.length) - 1;
  }
  get [_errorName]() {
    return "RangeError";
  }
  get [_errorExplanation]() {
    dart.assert(this[_hasValue]);
    if (dart.test(dart.dsend(this.invalidValue, '<', 0))) {
      return ": index must not be negative";
    }
    if (this.length == 0) {
      return ": no indices are valid";
    }
    return dart.str`: index should be less than ${this.length}`;
  }
};
core.IndexError[dart.implements] = () => [core.RangeError];
dart.setSignature(core.IndexError, {
  constructors: () => ({new: dart.definiteFunctionType(core.IndexError, [core.int, dart.dynamic], [core.String, core.String, core.int])}),
  fields: () => ({
    indexable: dart.dynamic,
    length: core.int
  }),
  getters: () => ({
    start: dart.definiteFunctionType(core.int, []),
    end: dart.definiteFunctionType(core.int, [])
  })
});
const _className = Symbol('_className');
core.AbstractClassInstantiationError = class AbstractClassInstantiationError extends core.Error {
  new(className) {
    this[_className] = className;
    super.new();
  }
  toString() {
    return dart.str`Cannot instantiate abstract class: '${this[_className]}'`;
  }
};
dart.setSignature(core.AbstractClassInstantiationError, {
  constructors: () => ({new: dart.definiteFunctionType(core.AbstractClassInstantiationError, [core.String])}),
  fields: () => ({[_className]: core.String})
});
const _receiver$ = Symbol('_receiver');
const _memberName = Symbol('_memberName');
const _arguments = Symbol('_arguments');
const _namedArguments = Symbol('_namedArguments');
const _existingArgumentNames = Symbol('_existingArgumentNames');
core.NoSuchMethodError = class NoSuchMethodError extends core.Error {
  new(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
    if (existingArgumentNames === void 0) existingArgumentNames = null;
    this[_receiver$] = receiver;
    this[_memberName] = memberName;
    this[_arguments] = positionalArguments;
    this[_namedArguments] = namedArguments;
    this[_existingArgumentNames] = existingArgumentNames;
    super.new();
  }
  toString() {
    let sb = new core.StringBuffer();
    let i = 0;
    if (this[_arguments] != null) {
      for (; i < dart.notNull(this[_arguments][dartx.length]); i++) {
        if (i > 0) {
          sb.write(", ");
        }
        sb.write(core.Error.safeToString(this[_arguments][dartx._get](i)));
      }
    }
    if (this[_namedArguments] != null) {
      this[_namedArguments][dartx.forEach](dart.fn((key, value) => {
        if (i > 0) {
          sb.write(", ");
        }
        sb.write(core._symbolToString(key));
        sb.write(": ");
        sb.write(core.Error.safeToString(value));
        i++;
      }, SymbolAnddynamicToNull()));
    }
    if (this[_existingArgumentNames] == null) {
      return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
    } else {
      let actualParameters = sb.toString();
      sb = new core.StringBuffer();
      for (let i = 0; i < dart.notNull(this[_existingArgumentNames][dartx.length]); i++) {
        if (i > 0) {
          sb.write(", ");
        }
        sb.write(this[_existingArgumentNames][dartx._get](i));
      }
      let formalParameters = sb.toString();
      return "NoSuchMethodError: incorrect number of arguments passed to " + dart.str`method named '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Tried calling: ${this[_memberName]}(${actualParameters})\n` + dart.str`Found: ${this[_memberName]}(${formalParameters})`;
    }
  }
};
dart.setSignature(core.NoSuchMethodError, {
  constructors: () => ({new: dart.definiteFunctionType(core.NoSuchMethodError, [core.Object, core.Symbol, core.List, MapOfSymbol$dynamic()], [core.List])}),
  fields: () => ({
    [_receiver$]: core.Object,
    [_memberName]: core.Symbol,
    [_arguments]: core.List,
    [_namedArguments]: MapOfSymbol$dynamic(),
    [_existingArgumentNames]: core.List
  })
});
core.UnsupportedError = class UnsupportedError extends core.Error {
  new(message) {
    this.message = message;
    super.new();
  }
  toString() {
    return dart.str`Unsupported operation: ${this.message}`;
  }
};
dart.setSignature(core.UnsupportedError, {
  constructors: () => ({new: dart.definiteFunctionType(core.UnsupportedError, [core.String])}),
  fields: () => ({message: core.String})
});
core.UnimplementedError = class UnimplementedError extends core.Error {
  new(message) {
    if (message === void 0) message = null;
    this.message = message;
    super.new();
  }
  toString() {
    return this.message != null ? dart.str`UnimplementedError: ${this.message}` : "UnimplementedError";
  }
};
core.UnimplementedError[dart.implements] = () => [core.UnsupportedError];
dart.setSignature(core.UnimplementedError, {
  constructors: () => ({new: dart.definiteFunctionType(core.UnimplementedError, [], [core.String])}),
  fields: () => ({message: core.String})
});
core.StateError = class StateError extends core.Error {
  new(message) {
    this.message = message;
    super.new();
  }
  toString() {
    return dart.str`Bad state: ${this.message}`;
  }
};
dart.setSignature(core.StateError, {
  constructors: () => ({new: dart.definiteFunctionType(core.StateError, [core.String])}),
  fields: () => ({message: core.String})
});
core.ConcurrentModificationError = class ConcurrentModificationError extends core.Error {
  new(modifiedObject) {
    if (modifiedObject === void 0) modifiedObject = null;
    this.modifiedObject = modifiedObject;
    super.new();
  }
  toString() {
    if (this.modifiedObject == null) {
      return "Concurrent modification during iteration.";
    }
    return "Concurrent modification during iteration: " + dart.str`${core.Error.safeToString(this.modifiedObject)}.`;
  }
};
dart.setSignature(core.ConcurrentModificationError, {
  constructors: () => ({new: dart.definiteFunctionType(core.ConcurrentModificationError, [], [core.Object])}),
  fields: () => ({modifiedObject: core.Object})
});
core.OutOfMemoryError = class OutOfMemoryError extends core.Object {
  new() {
  }
  toString() {
    return "Out of Memory";
  }
  get stackTrace() {
    return null;
  }
};
core.OutOfMemoryError[dart.implements] = () => [core.Error];
dart.setSignature(core.OutOfMemoryError, {
  constructors: () => ({new: dart.definiteFunctionType(core.OutOfMemoryError, [])}),
  getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
});
core.StackOverflowError = class StackOverflowError extends core.Object {
  new() {
  }
  toString() {
    return "Stack Overflow";
  }
  get stackTrace() {
    return null;
  }
};
core.StackOverflowError[dart.implements] = () => [core.Error];
dart.setSignature(core.StackOverflowError, {
  constructors: () => ({new: dart.definiteFunctionType(core.StackOverflowError, [])}),
  getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
});
core.CyclicInitializationError = class CyclicInitializationError extends core.Error {
  new(variableName) {
    if (variableName === void 0) variableName = null;
    this.variableName = variableName;
    super.new();
  }
  toString() {
    return this.variableName == null ? "Reading static variable during its initialization" : dart.str`Reading static variable '${this.variableName}' during its initialization`;
  }
};
dart.setSignature(core.CyclicInitializationError, {
  constructors: () => ({new: dart.definiteFunctionType(core.CyclicInitializationError, [], [core.String])}),
  fields: () => ({variableName: core.String})
});
core.Exception = class Exception extends core.Object {
  static new(message) {
    if (message === void 0) message = null;
    return new core._Exception(message);
  }
};
dart.setSignature(core.Exception, {
  constructors: () => ({new: dart.definiteFunctionType(core.Exception, [], [dart.dynamic])})
});
core._Exception = class _Exception extends core.Object {
  new(message) {
    if (message === void 0) message = null;
    this.message = message;
  }
  toString() {
    if (this.message == null) return "Exception";
    return dart.str`Exception: ${this.message}`;
  }
};
core._Exception[dart.implements] = () => [core.Exception];
dart.setSignature(core._Exception, {
  constructors: () => ({new: dart.definiteFunctionType(core._Exception, [], [dart.dynamic])}),
  fields: () => ({message: dart.dynamic})
});
core.FormatException = class FormatException extends core.Object {
  new(message, source, offset) {
    if (message === void 0) message = "";
    if (source === void 0) source = null;
    if (offset === void 0) offset = null;
    this.message = message;
    this.source = source;
    this.offset = offset;
  }
  toString() {
    let report = "FormatException";
    if (this.message != null && "" != this.message) {
      report = dart.str`${report}: ${this.message}`;
    }
    let offset = this.offset;
    if (!(typeof this.source == 'string')) {
      if (offset != null) {
        report = report + dart.str` (at offset ${offset})`;
      }
      return report;
    }
    if (offset != null && (dart.notNull(offset) < 0 || dart.notNull(offset) > dart.notNull(core.num._check(dart.dload(this.source, 'length'))))) {
      offset = null;
    }
    if (offset == null) {
      let source = core.String._check(this.source);
      if (dart.notNull(source[dartx.length]) > 78) {
        source = dart.notNull(source[dartx.substring](0, 75)) + "...";
      }
      return dart.str`${report}\n${source}`;
    }
    let lineNum = 1;
    let lineStart = 0;
    let lastWasCR = null;
    for (let i = 0; i < dart.notNull(offset); i++) {
      let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
      if (char == 10) {
        if (lineStart != i || !dart.test(lastWasCR)) {
          lineNum++;
        }
        lineStart = i + 1;
        lastWasCR = false;
      } else if (char == 13) {
        lineNum++;
        lineStart = i + 1;
        lastWasCR = true;
      }
    }
    if (lineNum > 1) {
      report = report + dart.str` (at line ${lineNum}, character ${dart.notNull(offset) - lineStart + 1})\n`;
    } else {
      report = report + dart.str` (at character ${dart.notNull(offset) + 1})\n`;
    }
    let lineEnd = core.int._check(dart.dload(this.source, 'length'));
    for (let i = offset; dart.notNull(i) < dart.notNull(core.num._check(dart.dload(this.source, 'length'))); i = dart.notNull(i) + 1) {
      let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
      if (char == 10 || char == 13) {
        lineEnd = i;
        break;
      }
    }
    let length = dart.notNull(lineEnd) - lineStart;
    let start = lineStart;
    let end = lineEnd;
    let prefix = "";
    let postfix = "";
    if (length > 78) {
      let index = dart.notNull(offset) - lineStart;
      if (index < 75) {
        end = start + 75;
        postfix = "...";
      } else if (dart.notNull(end) - dart.notNull(offset) < 75) {
        start = dart.notNull(end) - 75;
        prefix = "...";
      } else {
        start = dart.notNull(offset) - 36;
        end = dart.notNull(offset) + 36;
        prefix = postfix = "...";
      }
    }
    let slice = core.String._check(dart.dsend(this.source, 'substring', start, end));
    let markOffset = dart.notNull(offset) - start + dart.notNull(prefix[dartx.length]);
    return dart.str`${report}${prefix}${slice}${postfix}\n${" "[dartx['*']](markOffset)}^\n`;
  }
};
core.FormatException[dart.implements] = () => [core.Exception];
dart.setSignature(core.FormatException, {
  constructors: () => ({new: dart.definiteFunctionType(core.FormatException, [], [core.String, dart.dynamic, core.int])}),
  fields: () => ({
    message: core.String,
    source: dart.dynamic,
    offset: core.int
  })
});
core.IntegerDivisionByZeroException = class IntegerDivisionByZeroException extends core.Object {
  new() {
  }
  toString() {
    return "IntegerDivisionByZeroException";
  }
};
core.IntegerDivisionByZeroException[dart.implements] = () => [core.Exception];
dart.setSignature(core.IntegerDivisionByZeroException, {
  constructors: () => ({new: dart.definiteFunctionType(core.IntegerDivisionByZeroException, [])})
});
const _getKey = Symbol('_getKey');
core.Expando$ = dart.generic(T => {
  class Expando extends core.Object {
    new(name) {
      if (name === void 0) name = null;
      this.name = name;
    }
    toString() {
      return dart.str`Expando:${this.name}`;
    }
    _get(object) {
      let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
      return T._check(values == null ? null : _js_helper.Primitives.getProperty(values, this[_getKey]()));
    }
    _set(object, value) {
      T._check(value);
      let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
      if (values == null) {
        values = new core.Object();
        _js_helper.Primitives.setProperty(object, core.Expando._EXPANDO_PROPERTY_NAME, values);
      }
      _js_helper.Primitives.setProperty(values, this[_getKey](), value);
      return value;
    }
    [_getKey]() {
      let key = core.String._check(_js_helper.Primitives.getProperty(this, core.Expando._KEY_PROPERTY_NAME));
      if (key == null) {
        key = dart.str`expando\$key\$${(() => {
          let x = core.Expando._keyCount;
          core.Expando._keyCount = dart.notNull(x) + 1;
          return x;
        })()}`;
        _js_helper.Primitives.setProperty(this, core.Expando._KEY_PROPERTY_NAME, key);
      }
      return key;
    }
  }
  dart.addTypeTests(Expando);
  dart.setSignature(Expando, {
    constructors: () => ({new: dart.definiteFunctionType(core.Expando$(T), [], [core.String])}),
    fields: () => ({name: core.String}),
    methods: () => ({
      _get: dart.definiteFunctionType(T, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.Object, T]),
      [_getKey]: dart.definiteFunctionType(core.String, [])
    }),
    sfields: () => ({
      _KEY_PROPERTY_NAME: core.String,
      _EXPANDO_PROPERTY_NAME: core.String,
      _keyCount: core.int
    })
  });
  return Expando;
});
core.Expando = Expando();
core.Expando._KEY_PROPERTY_NAME = 'expando$key';
core.Expando._EXPANDO_PROPERTY_NAME = 'expando$values';
core.Expando._keyCount = 0;
core.Function = class Function extends core.Object {
  static apply(f, positionalArguments, namedArguments) {
    if (namedArguments === void 0) namedArguments = null;
    return dart.dcall.apply(null, [f].concat(positionalArguments));
  }
  static _toMangledNames(namedArguments) {
    let result = dart.map({}, core.String, dart.dynamic);
    namedArguments[dartx.forEach](dart.fn((symbol, value) => {
      result[dartx._set](core._symbolToString(symbol), value);
    }, SymbolAnddynamicToNull()));
    return result;
  }
};
core.Function.is = function is_Function(o) {
  return typeof o == "function";
};
core.Function.as = function as_Function(o) {
  if (typeof o == "function" || o == null) return o;
  return dart.as(o, core.Function);
};
core.Function._check = function check_String(o) {
  if (typeof o == "function" || o == null) return o;
  return dart.check(o, core.Function);
};
dart.setSignature(core.Function, {
  statics: () => ({
    apply: dart.definiteFunctionType(dart.dynamic, [core.Function, core.List], [MapOfSymbol$dynamic()]),
    _toMangledNames: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [MapOfSymbol$dynamic()])
  }),
  names: ['apply', '_toMangledNames']
});
core.identical = function(a, b) {
  return a == null ? b == null : a === b;
};
dart.fn(core.identical, ObjectAndObjectTobool());
core.identityHashCode = function(object) {
  return _js_helper.objectHashCode(object);
};
dart.fn(core.identityHashCode, ObjectToint());
core._Generator$ = dart.generic(E => {
  const _Generator = dart.typedef('_Generator', () => dart.functionType(E, [core.int]));
  return _Generator;
});
core._Generator = _Generator();
const _end$ = Symbol('_end');
const _start$0 = Symbol('_start');
const _generator$ = Symbol('_generator');
core._GeneratorIterable$ = dart.generic(E => {
  let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
  let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
  let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
  class _GeneratorIterable extends core.Iterable$(E) {
    new(end, generator) {
      this[_end$] = end;
      this[_start$0] = 0;
      this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
      super.new();
    }
    slice(start, end, generator) {
      this[_start$0] = start;
      this[_end$] = end;
      this[_generator$] = generator;
      super.new();
    }
    get iterator() {
      return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
    }
    get length() {
      return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
    }
    skip(count) {
      core.RangeError.checkNotNegative(count, "count");
      if (count == 0) return this;
      let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
      if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
      return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
    }
    take(count) {
      core.RangeError.checkNotNegative(count, "count");
      if (count == 0) return new (EmptyIterableOfE())();
      let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
      if (newEnd >= dart.notNull(this[_end$])) return this;
      return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
    }
    static _id(n) {
      return n;
    }
  }
  dart.defineNamedConstructor(_GeneratorIterable, 'slice');
  _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_GeneratorIterable, {
    constructors: () => ({
      new: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, _GeneratorOfE()]),
      slice: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, core.int, _GeneratorOfE()])
    }),
    fields: () => ({
      [_start$0]: core.int,
      [_end$]: core.int,
      [_generator$]: _GeneratorOfE()
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
    names: ['_id']
  });
  dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
  return _GeneratorIterable;
});
core._GeneratorIterable = _GeneratorIterable();
const _index$1 = Symbol('_index');
const _current$3 = Symbol('_current');
core._GeneratorIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
  class _GeneratorIterator extends core.Object {
    new(index, end, generator) {
      this[_index$1] = index;
      this[_end$] = end;
      this[_generator$] = generator;
      this[_current$3] = null;
    }
    moveNext() {
      if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
        this[_current$3] = this[_generator$](this[_index$1]);
        this[_index$1] = dart.notNull(this[_index$1]) + 1;
        return true;
      } else {
        this[_current$3] = null;
        return false;
      }
    }
    get current() {
      return this[_current$3];
    }
  }
  dart.addTypeTests(_GeneratorIterator);
  _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_GeneratorIterator, {
    constructors: () => ({new: dart.definiteFunctionType(core._GeneratorIterator$(E), [core.int, core.int, _GeneratorOfE()])}),
    fields: () => ({
      [_end$]: core.int,
      [_generator$]: _GeneratorOfE(),
      [_index$1]: core.int,
      [_current$3]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _GeneratorIterator;
});
core._GeneratorIterator = _GeneratorIterator();
core.BidirectionalIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class BidirectionalIterator extends core.Object {}
  dart.addTypeTests(BidirectionalIterator);
  BidirectionalIterator[dart.implements] = () => [IteratorOfE()];
  return BidirectionalIterator;
});
core.BidirectionalIterator = BidirectionalIterator();
core.Map$ = dart.generic((K, V) => {
  let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
  let UnmodifiableMapViewOfK$V = () => (UnmodifiableMapViewOfK$V = dart.constFn(collection.UnmodifiableMapView$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
  class Map extends core.Object {
    static new() {
      return JsLinkedHashMapOfK$V().es6();
    }
    static from(other) {
      return LinkedHashMapOfK$V().from(other);
    }
    static unmodifiable(other) {
      return new (UnmodifiableMapViewOfK$V())(MapOfK$V().from(other));
    }
    static identity() {
      return LinkedHashMapOfK$V().identity();
    }
    static fromIterable(iterable, opts) {
      return LinkedHashMapOfK$V().fromIterable(iterable, opts);
    }
    static fromIterables(keys, values) {
      return LinkedHashMapOfK$V().fromIterables(keys, values);
    }
  }
  dart.addTypeTests(Map);
  dart.setSignature(Map, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.Map$(K, V), []),
      from: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
      unmodifiable: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
      identity: dart.definiteFunctionType(core.Map$(K, V), []),
      fromIterable: dart.definiteFunctionType(core.Map$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
      fromIterables: dart.definiteFunctionType(core.Map$(K, V), [IterableOfK(), IterableOfV()])
    })
  });
  return Map;
});
core.Map = Map$();
core.Null = class Null extends core.Object {
  static _uninstantiable() {
    dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
  }
  toString() {
    return "null";
  }
};
core.Null.is = function is_Null(o) {
  return o == null;
};
core.Null.as = function as_Null(o) {
  if (o == null) return o;
  return dart.as(o, core.Null);
};
core.Null._check = function check_Null(o) {
  if (o == null) return o;
  return dart.check(o, core.Null);
};
dart.setSignature(core.Null, {
  constructors: () => ({_uninstantiable: dart.definiteFunctionType(core.Null, [])})
});
core.Pattern = class Pattern extends core.Object {};
core.print = function(object) {
  let line = dart.str`${object}`;
  if (_internal.printToZone == null) {
    _internal.printToConsole(line);
  } else {
    dart.dcall(_internal.printToZone, line);
  }
};
dart.fn(core.print, ObjectTovoid());
core.RegExp = class RegExp extends core.Object {
  static new(source, opts) {
    let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
    let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
    return new _js_helper.JSSyntaxRegExp(source, {multiLine: multiLine, caseSensitive: caseSensitive});
  }
};
core.RegExp[dart.implements] = () => [core.Pattern];
dart.setSignature(core.RegExp, {
  constructors: () => ({new: dart.definiteFunctionType(core.RegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})})
});
core.Set$ = dart.generic(E => {
  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class Set extends core.Iterable$(E) {
    static new() {
      return LinkedHashSetOfE().new();
    }
    static identity() {
      return LinkedHashSetOfE().identity();
    }
    static from(elements) {
      return LinkedHashSetOfE().from(elements);
    }
  }
  Set[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(Set, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.Set$(E), []),
      identity: dart.definiteFunctionType(core.Set$(E), []),
      from: dart.definiteFunctionType(core.Set$(E), [IterableOfE()])
    })
  });
  return Set;
});
core.Set = Set();
core.Sink$ = dart.generic(T => {
  class Sink extends core.Object {}
  dart.addTypeTests(Sink);
  return Sink;
});
core.Sink = Sink();
core.StackTrace = class StackTrace extends core.Object {
  new() {
  }
  static fromString(stackTraceString) {
    return new core._StringStackTrace(stackTraceString);
  }
  static get current() {
    return _js_helper.getTraceFromException(new Error());
  }
};
dart.setSignature(core.StackTrace, {
  constructors: () => ({
    new: dart.definiteFunctionType(core.StackTrace, []),
    fromString: dart.definiteFunctionType(core.StackTrace, [core.String])
  }),
  sgetters: () => ({current: dart.definiteFunctionType(core.StackTrace, [])})
});
const _stackTrace = Symbol('_stackTrace');
core._StringStackTrace = class _StringStackTrace extends core.Object {
  new(stackTrace) {
    this[_stackTrace] = stackTrace;
  }
  toString() {
    return this[_stackTrace];
  }
};
core._StringStackTrace[dart.implements] = () => [core.StackTrace];
dart.setSignature(core._StringStackTrace, {
  constructors: () => ({new: dart.definiteFunctionType(core._StringStackTrace, [core.String])}),
  fields: () => ({[_stackTrace]: core.String})
});
const _stop = Symbol('_stop');
core.Stopwatch = class Stopwatch extends core.Object {
  get frequency() {
    return core.Stopwatch._frequency;
  }
  new() {
    this[_start$0] = null;
    this[_stop] = null;
    core.Stopwatch._initTicker();
  }
  start() {
    if (dart.test(this.isRunning)) return;
    if (this[_start$0] == null) {
      this[_start$0] = core.Stopwatch._now();
    } else {
      this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
      this[_stop] = null;
    }
  }
  stop() {
    if (!dart.test(this.isRunning)) return;
    this[_stop] = core.Stopwatch._now();
  }
  reset() {
    if (this[_start$0] == null) return;
    this[_start$0] = core.Stopwatch._now();
    if (this[_stop] != null) {
      this[_stop] = this[_start$0];
    }
  }
  get elapsedTicks() {
    if (this[_start$0] == null) {
      return 0;
    }
    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
  }
  get elapsed() {
    return new core.Duration({microseconds: this.elapsedMicroseconds});
  }
  get elapsedMicroseconds() {
    return (dart.notNull(this.elapsedTicks) * 1000000 / dart.notNull(this.frequency))[dartx.truncate]();
  }
  get elapsedMilliseconds() {
    return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
  }
  get isRunning() {
    return this[_start$0] != null && this[_stop] == null;
  }
  static _initTicker() {
    _js_helper.Primitives.initTicker();
    core.Stopwatch._frequency = _js_helper.Primitives.timerFrequency;
  }
  static _now() {
    return core.int._check(dart.dsend(_js_helper.Primitives, 'timerTicks'));
  }
};
dart.setSignature(core.Stopwatch, {
  constructors: () => ({new: dart.definiteFunctionType(core.Stopwatch, [])}),
  fields: () => ({
    [_start$0]: core.int,
    [_stop]: core.int
  }),
  getters: () => ({
    frequency: dart.definiteFunctionType(core.int, []),
    elapsedTicks: dart.definiteFunctionType(core.int, []),
    elapsed: dart.definiteFunctionType(core.Duration, []),
    elapsedMicroseconds: dart.definiteFunctionType(core.int, []),
    elapsedMilliseconds: dart.definiteFunctionType(core.int, []),
    isRunning: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    start: dart.definiteFunctionType(dart.void, []),
    stop: dart.definiteFunctionType(dart.void, []),
    reset: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({_frequency: core.int}),
  statics: () => ({
    _initTicker: dart.definiteFunctionType(dart.void, []),
    _now: dart.definiteFunctionType(core.int, [])
  }),
  names: ['_initTicker', '_now']
});
core.Stopwatch._frequency = null;
core.Runes = class Runes extends core.Iterable$(core.int) {
  new(string) {
    this.string = string;
    super.new();
  }
  get iterator() {
    return new core.RuneIterator(this.string);
  }
  get last() {
    if (this.string[dartx.length] == 0) {
      dart.throw(new core.StateError('No elements.'));
    }
    let length = this.string[dartx.length];
    let code = this.string[dartx.codeUnitAt](dart.notNull(length) - 1);
    if (dart.test(core._isTrailSurrogate(code)) && dart.notNull(this.string[dartx.length]) > 1) {
      let previousCode = this.string[dartx.codeUnitAt](dart.notNull(length) - 2);
      if (dart.test(core._isLeadSurrogate(previousCode))) {
        return core._combineSurrogatePair(previousCode, code);
      }
    }
    return code;
  }
};
dart.addSimpleTypeTests(core.Runes);
dart.setSignature(core.Runes, {
  constructors: () => ({new: dart.definiteFunctionType(core.Runes, [core.String])}),
  fields: () => ({string: core.String}),
  getters: () => ({iterator: dart.definiteFunctionType(core.RuneIterator, [])})
});
dart.defineExtensionMembers(core.Runes, ['iterator', 'last']);
core._isLeadSurrogate = function(code) {
  return (dart.notNull(code) & 64512) == 55296;
};
dart.fn(core._isLeadSurrogate, intTobool());
core._isTrailSurrogate = function(code) {
  return (dart.notNull(code) & 64512) == 56320;
};
dart.fn(core._isTrailSurrogate, intTobool());
core._combineSurrogatePair = function(start, end) {
  return 65536 + ((dart.notNull(start) & 1023) << 10) + (dart.notNull(end) & 1023);
};
dart.fn(core._combineSurrogatePair, intAndintToint());
const _position$ = Symbol('_position');
const _nextPosition = Symbol('_nextPosition');
const _currentCodePoint = Symbol('_currentCodePoint');
const _checkSplitSurrogate = Symbol('_checkSplitSurrogate');
core.RuneIterator = class RuneIterator extends core.Object {
  new(string) {
    this.string = string;
    this[_position$] = 0;
    this[_nextPosition] = 0;
    this[_currentCodePoint] = null;
  }
  at(string, index) {
    this.string = string;
    this[_position$] = index;
    this[_nextPosition] = index;
    this[_currentCodePoint] = null;
    core.RangeError.checkValueInInterval(index, 0, string[dartx.length]);
    this[_checkSplitSurrogate](index);
  }
  [_checkSplitSurrogate](index) {
    if (dart.notNull(index) > 0 && dart.notNull(index) < dart.notNull(this.string[dartx.length]) && dart.test(core._isLeadSurrogate(this.string[dartx.codeUnitAt](dart.notNull(index) - 1))) && dart.test(core._isTrailSurrogate(this.string[dartx.codeUnitAt](index)))) {
      dart.throw(new core.ArgumentError(dart.str`Index inside surrogate pair: ${index}`));
    }
  }
  get rawIndex() {
    return this[_position$] != this[_nextPosition] ? this[_position$] : null;
  }
  set rawIndex(rawIndex) {
    core.RangeError.checkValidIndex(rawIndex, this.string, "rawIndex");
    this.reset(rawIndex);
    this.moveNext();
  }
  reset(rawIndex) {
    if (rawIndex === void 0) rawIndex = 0;
    core.RangeError.checkValueInInterval(rawIndex, 0, this.string[dartx.length], "rawIndex");
    this[_checkSplitSurrogate](rawIndex);
    this[_position$] = this[_nextPosition] = rawIndex;
    this[_currentCodePoint] = null;
  }
  get current() {
    return this[_currentCodePoint];
  }
  get currentSize() {
    return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position$]);
  }
  get currentAsString() {
    if (this[_position$] == this[_nextPosition]) return null;
    if (dart.notNull(this[_position$]) + 1 == this[_nextPosition]) return this.string[dartx._get](this[_position$]);
    return this.string[dartx.substring](this[_position$], this[_nextPosition]);
  }
  moveNext() {
    this[_position$] = this[_nextPosition];
    if (this[_position$] == this.string[dartx.length]) {
      this[_currentCodePoint] = null;
      return false;
    }
    let codeUnit = this.string[dartx.codeUnitAt](this[_position$]);
    let nextPosition = dart.notNull(this[_position$]) + 1;
    if (dart.test(core._isLeadSurrogate(codeUnit)) && nextPosition < dart.notNull(this.string[dartx.length])) {
      let nextCodeUnit = this.string[dartx.codeUnitAt](nextPosition);
      if (dart.test(core._isTrailSurrogate(nextCodeUnit))) {
        this[_nextPosition] = nextPosition + 1;
        this[_currentCodePoint] = core._combineSurrogatePair(codeUnit, nextCodeUnit);
        return true;
      }
    }
    this[_nextPosition] = nextPosition;
    this[_currentCodePoint] = codeUnit;
    return true;
  }
  movePrevious() {
    this[_nextPosition] = this[_position$];
    if (this[_position$] == 0) {
      this[_currentCodePoint] = null;
      return false;
    }
    let position = dart.notNull(this[_position$]) - 1;
    let codeUnit = this.string[dartx.codeUnitAt](position);
    if (dart.test(core._isTrailSurrogate(codeUnit)) && position > 0) {
      let prevCodeUnit = this.string[dartx.codeUnitAt](position - 1);
      if (dart.test(core._isLeadSurrogate(prevCodeUnit))) {
        this[_position$] = position - 1;
        this[_currentCodePoint] = core._combineSurrogatePair(prevCodeUnit, codeUnit);
        return true;
      }
    }
    this[_position$] = position;
    this[_currentCodePoint] = codeUnit;
    return true;
  }
};
dart.defineNamedConstructor(core.RuneIterator, 'at');
core.RuneIterator[dart.implements] = () => [BidirectionalIteratorOfint()];
dart.setSignature(core.RuneIterator, {
  constructors: () => ({
    new: dart.definiteFunctionType(core.RuneIterator, [core.String]),
    at: dart.definiteFunctionType(core.RuneIterator, [core.String, core.int])
  }),
  fields: () => ({
    string: core.String,
    [_position$]: core.int,
    [_nextPosition]: core.int,
    [_currentCodePoint]: core.int
  }),
  getters: () => ({
    rawIndex: dart.definiteFunctionType(core.int, []),
    current: dart.definiteFunctionType(core.int, []),
    currentSize: dart.definiteFunctionType(core.int, []),
    currentAsString: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({rawIndex: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [_checkSplitSurrogate]: dart.definiteFunctionType(dart.void, [core.int]),
    reset: dart.definiteFunctionType(dart.void, [], [core.int]),
    moveNext: dart.definiteFunctionType(core.bool, []),
    movePrevious: dart.definiteFunctionType(core.bool, [])
  })
});
const _contents = Symbol('_contents');
const _writeString = Symbol('_writeString');
core.StringBuffer = class StringBuffer extends core.Object {
  new(content) {
    if (content === void 0) content = "";
    this[_contents] = dart.str`${content}`;
  }
  get length() {
    return this[_contents][dartx.length];
  }
  get isEmpty() {
    return this.length == 0;
  }
  get isNotEmpty() {
    return !dart.test(this.isEmpty);
  }
  write(obj) {
    this[_writeString](dart.str`${obj}`);
  }
  writeCharCode(charCode) {
    this[_writeString](core.String.fromCharCode(charCode));
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    this[_contents] = core.StringBuffer._writeAll(this[_contents], objects, separator);
  }
  writeln(obj) {
    if (obj === void 0) obj = "";
    this[_writeString](dart.str`${obj}\n`);
  }
  clear() {
    this[_contents] = "";
  }
  toString() {
    return _js_helper.Primitives.flattenString(this[_contents]);
  }
  [_writeString](str) {
    this[_contents] = _js_helper.Primitives.stringConcatUnchecked(this[_contents], core.String._check(str));
  }
  static _writeAll(string, objects, separator) {
    let iterator = objects[dartx.iterator];
    if (!dart.test(iterator.moveNext())) return string;
    if (dart.test(separator[dartx.isEmpty])) {
      do {
        string = core.StringBuffer._writeOne(string, iterator.current);
      } while (dart.test(iterator.moveNext()));
    } else {
      string = core.StringBuffer._writeOne(string, iterator.current);
      while (dart.test(iterator.moveNext())) {
        string = core.StringBuffer._writeOne(string, separator);
        string = core.StringBuffer._writeOne(string, iterator.current);
      }
    }
    return string;
  }
  static _writeOne(string, obj) {
    return _js_helper.Primitives.stringConcatUnchecked(string, dart.str`${obj}`);
  }
};
core.StringBuffer[dart.implements] = () => [core.StringSink];
dart.setSignature(core.StringBuffer, {
  constructors: () => ({new: dart.definiteFunctionType(core.StringBuffer, [], [core.Object])}),
  fields: () => ({[_contents]: core.String}),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    clear: dart.definiteFunctionType(dart.void, []),
    [_writeString]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  statics: () => ({
    _writeAll: dart.definiteFunctionType(core.String, [core.String, core.Iterable, core.String]),
    _writeOne: dart.definiteFunctionType(core.String, [core.String, core.Object])
  }),
  names: ['_writeAll', '_writeOne']
});
core.Symbol = class Symbol extends core.Object {
  static new(name) {
    return new _internal.Symbol(name);
  }
};
dart.setSignature(core.Symbol, {
  constructors: () => ({new: dart.definiteFunctionType(core.Symbol, [core.String])})
});
const _userInfo = Symbol('_userInfo');
const _host = Symbol('_host');
const _port = Symbol('_port');
const _path = Symbol('_path');
const _query = Symbol('_query');
const _fragment = Symbol('_fragment');
const _pathSegments = Symbol('_pathSegments');
const _queryParameters = Symbol('_queryParameters');
const _queryParameterLists = Symbol('_queryParameterLists');
const _writeAuthority = Symbol('_writeAuthority');
let const$51;
const _mergePaths = Symbol('_mergePaths');
const _toWindowsFilePath = Symbol('_toWindowsFilePath');
const _toFilePath = Symbol('_toFilePath');
const _isPathAbsolute = Symbol('_isPathAbsolute');
core.Uri = class Uri extends core.Object {
  _internal(scheme, userInfo, host, port, path, query, fragment) {
    this.scheme = scheme;
    this[_userInfo] = userInfo;
    this[_host] = host;
    this[_port] = port;
    this[_path] = path;
    this[_query] = query;
    this[_fragment] = fragment;
    this[_pathSegments] = null;
    this[_queryParameters] = null;
    this[_queryParameterLists] = null;
  }
  static new(opts) {
    let scheme = opts && 'scheme' in opts ? opts.scheme : "";
    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
    let host = opts && 'host' in opts ? opts.host : null;
    let port = opts && 'port' in opts ? opts.port : null;
    let path = opts && 'path' in opts ? opts.path : null;
    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
    let query = opts && 'query' in opts ? opts.query : null;
    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
    scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
    userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
    host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
    if (query == "") query = null;
    query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
    fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
    port = core.Uri._makePort(port, scheme);
    let isFile = scheme == "file";
    if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
      host = "";
    }
    let hasAuthority = host != null;
    path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
    if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
      path = core.Uri._normalizeRelativePath(path);
    } else {
      path = core.Uri._removeDotSegments(path);
    }
    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
  }
  static http(authority, unencodedPath, queryParameters) {
    if (queryParameters === void 0) queryParameters = null;
    return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
  }
  static https(authority, unencodedPath, queryParameters) {
    if (queryParameters === void 0) queryParameters = null;
    return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
  }
  get authority() {
    if (!dart.test(this.hasAuthority)) return "";
    let sb = new core.StringBuffer();
    this[_writeAuthority](sb);
    return sb.toString();
  }
  get userInfo() {
    return this[_userInfo];
  }
  get host() {
    if (this[_host] == null) return "";
    if (dart.test(this[_host][dartx.startsWith]('['))) {
      return this[_host][dartx.substring](1, dart.notNull(this[_host][dartx.length]) - 1);
    }
    return this[_host];
  }
  get port() {
    if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
    return this[_port];
  }
  static _defaultPort(scheme) {
    if (scheme == "http") return 80;
    if (scheme == "https") return 443;
    return 0;
  }
  get path() {
    return this[_path];
  }
  get query() {
    return this[_query] == null ? "" : this[_query];
  }
  get fragment() {
    return this[_fragment] == null ? "" : this[_fragment];
  }
  static parse(uri, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let EOI = -1;
    let scheme = "";
    let userinfo = "";
    let host = null;
    let port = null;
    let path = null;
    let query = null;
    let fragment = null;
    if (end == null) end = uri[dartx.length];
    let index = start;
    let pathStart = start;
    let char = EOI;
    function parseAuth() {
      if (index == end) {
        char = EOI;
        return;
      }
      let authStart = index;
      let lastColon = -1;
      let lastAt = -1;
      char = uri[dartx.codeUnitAt](index);
      while (dart.notNull(index) < dart.notNull(end)) {
        char = uri[dartx.codeUnitAt](index);
        if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
          break;
        }
        if (char == core.Uri._AT_SIGN) {
          lastAt = index;
          lastColon = -1;
        } else if (char == core.Uri._COLON) {
          lastColon = index;
        } else if (char == core.Uri._LEFT_BRACKET) {
          lastColon = -1;
          let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
          if (endBracket == -1) {
            index = end;
            char = EOI;
            break;
          } else {
            index = endBracket;
          }
        }
        index = dart.notNull(index) + 1;
        char = EOI;
      }
      let hostStart = authStart;
      let hostEnd = index;
      if (dart.notNull(lastAt) >= 0) {
        userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
        hostStart = dart.notNull(lastAt) + 1;
      }
      if (dart.notNull(lastColon) >= 0) {
        let portNumber = null;
        if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
          portNumber = 0;
          for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
            let digit = uri[dartx.codeUnitAt](i);
            if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
              core.Uri._fail(uri, i, "Invalid port number");
            }
            portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
          }
        }
        port = core.Uri._makePort(portNumber, scheme);
        hostEnd = lastColon;
      }
      host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
      if (dart.notNull(index) < dart.notNull(end)) {
        char = uri[dartx.codeUnitAt](index);
      }
    }
    dart.fn(parseAuth, VoidTovoid$());
    let NOT_IN_PATH = 0;
    let IN_PATH = 1;
    let ALLOW_AUTH = 2;
    let state = NOT_IN_PATH;
    let i = index;
    while (dart.notNull(i) < dart.notNull(end)) {
      char = uri[dartx.codeUnitAt](i);
      if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
        state = NOT_IN_PATH;
        break;
      }
      if (char == core.Uri._SLASH) {
        state = i == start ? ALLOW_AUTH : IN_PATH;
        break;
      }
      if (char == core.Uri._COLON) {
        if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
        scheme = core.Uri._makeScheme(uri, start, i);
        i = dart.notNull(i) + 1;
        pathStart = i;
        if (i == end) {
          char = EOI;
          state = NOT_IN_PATH;
        } else {
          char = uri[dartx.codeUnitAt](i);
          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
            state = NOT_IN_PATH;
          } else if (char == core.Uri._SLASH) {
            state = ALLOW_AUTH;
          } else {
            state = IN_PATH;
          }
        }
        break;
      }
      i = dart.notNull(i) + 1;
      char = EOI;
    }
    index = i;
    if (state == ALLOW_AUTH) {
      dart.assert(char == core.Uri._SLASH);
      index = dart.notNull(index) + 1;
      if (index == end) {
        char = EOI;
        state = NOT_IN_PATH;
      } else {
        char = uri[dartx.codeUnitAt](index);
        if (char == core.Uri._SLASH) {
          index = dart.notNull(index) + 1;
          parseAuth();
          pathStart = index;
        }
        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
          state = NOT_IN_PATH;
        } else {
          state = IN_PATH;
        }
      }
    }
    dart.assert(state == IN_PATH || state == NOT_IN_PATH);
    if (state == IN_PATH) {
      while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
        char = uri[dartx.codeUnitAt](index);
        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
          break;
        }
        char = EOI;
      }
      state = NOT_IN_PATH;
    }
    dart.assert(state == NOT_IN_PATH);
    let hasAuthority = host != null;
    path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
    if (char == core.Uri._QUESTION) {
      let numberSignIndex = -1;
      for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
        if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
          numberSignIndex = i;
          break;
        }
      }
      if (numberSignIndex < 0) {
        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
      } else {
        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
        fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
      }
    } else if (char == core.Uri._NUMBER_SIGN) {
      fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
    }
    return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
  }
  static _fail(uri, index, message) {
    dart.throw(new core.FormatException(message, uri, index));
  }
  static _makeHttpUri(scheme, authority, unencodedPath, queryParameters) {
    let userInfo = "";
    let host = null;
    let port = null;
    if (authority != null && dart.test(authority[dartx.isNotEmpty])) {
      let hostStart = 0;
      let hasUserInfo = false;
      for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
        if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
          hasUserInfo = true;
          userInfo = authority[dartx.substring](0, i);
          hostStart = i + 1;
          break;
        }
      }
      let hostEnd = hostStart;
      if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
        for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
        }
        if (hostEnd == authority[dartx.length]) {
          dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
        }
        core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
        hostEnd++;
        if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
          dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
        }
      }
      let hasPort = false;
      for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
        if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
          let portString = authority[dartx.substring](hostEnd + 1);
          if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
          break;
        }
      }
      host = authority[dartx.substring](hostStart, hostEnd);
    }
    return core.Uri.new({scheme: scheme, userInfo: userInfo, host: core.String._check(host), port: core.int._check(port), pathSegments: unencodedPath[dartx.split]("/"), queryParameters: queryParameters});
  }
  static file(path, opts) {
    let windows = opts && 'windows' in opts ? opts.windows : null;
    windows = windows == null ? core.Uri._isWindows : windows;
    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
  }
  static directory(path, opts) {
    let windows = opts && 'windows' in opts ? opts.windows : null;
    windows = windows == null ? core.Uri._isWindows : windows;
    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
  }
  static dataFromString(content, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let base64 = opts && 'base64' in opts ? opts.base64 : false;
    let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
    return data.uri;
  }
  static dataFromBytes(bytes, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
    let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
    return data.uri;
  }
  static get base() {
    let uri = _js_helper.Primitives.currentUri();
    if (uri != null) return core.Uri.parse(uri);
    dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
  }
  static get _isWindows() {
    return false;
  }
  static _checkNonWindowsPathReservedCharacters(segments, argumentError) {
    segments[dartx.forEach](dart.fn(segment => {
      if (dart.test(segment[dartx.contains]("/"))) {
        if (dart.test(argumentError)) {
          dart.throw(new core.ArgumentError(dart.str`Illegal path character ${segment}`));
        } else {
          dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
        }
      }
    }, StringToNull()));
  }
  static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
    if (firstSegment === void 0) firstSegment = 0;
    for (let segment of segments[dartx.skip](firstSegment)) {
      if (dart.test(segment[dartx.contains](core.RegExp.new('["*/:<>?\\\\|]')))) {
        if (dart.test(argumentError)) {
          dart.throw(new core.ArgumentError("Illegal character in path"));
        } else {
          dart.throw(new core.UnsupportedError("Illegal character in path"));
        }
      }
    }
  }
  static _checkWindowsDriveLetter(charCode, argumentError) {
    if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
      return;
    }
    if (dart.test(argumentError)) {
      dart.throw(new core.ArgumentError("Illegal drive letter " + core.String.fromCharCode(charCode)));
    } else {
      dart.throw(new core.UnsupportedError("Illegal drive letter " + core.String.fromCharCode(charCode)));
    }
  }
  static _makeFileUri(path, slashTerminated) {
    let sep = "/";
    let segments = path[dartx.split](sep);
    if (dart.test(slashTerminated) && dart.test(segments[dartx.isNotEmpty]) && dart.test(segments[dartx.last][dartx.isNotEmpty])) {
      segments[dartx.add]("");
    }
    if (dart.test(path[dartx.startsWith](sep))) {
      return core.Uri.new({scheme: "file", pathSegments: segments});
    } else {
      return core.Uri.new({pathSegments: segments});
    }
  }
  static _makeWindowsFileUrl(path, slashTerminated) {
    if (dart.test(path[dartx.startsWith]("\\\\?\\"))) {
      if (dart.test(path[dartx.startsWith]("UNC\\", 4))) {
        path = path[dartx.replaceRange](0, 7, '\\');
      } else {
        path = path[dartx.substring](4);
        if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
          dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
        }
      }
    } else {
      path = path[dartx.replaceAll]("/", '\\');
    }
    let sep = '\\';
    if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
      core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
      if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
        dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
      }
      let pathSegments = path[dartx.split](sep);
      if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
        pathSegments[dartx.add]("");
      }
      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
      return core.Uri.new({scheme: "file", pathSegments: pathSegments});
    }
    if (dart.test(path[dartx.startsWith](sep))) {
      if (dart.test(path[dartx.startsWith](sep, 1))) {
        let pathStart = path[dartx.indexOf]('\\', 2);
        let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
        let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
        let pathSegments = pathPart[dartx.split](sep);
        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
          pathSegments[dartx.add]("");
        }
        return core.Uri.new({scheme: "file", host: hostPart, pathSegments: pathSegments});
      } else {
        let pathSegments = path[dartx.split](sep);
        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
          pathSegments[dartx.add]("");
        }
        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
        return core.Uri.new({scheme: "file", pathSegments: pathSegments});
      }
    } else {
      let pathSegments = path[dartx.split](sep);
      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
      if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
        pathSegments[dartx.add]("");
      }
      return core.Uri.new({pathSegments: pathSegments});
    }
  }
  replace(opts) {
    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
    let host = opts && 'host' in opts ? opts.host : null;
    let port = opts && 'port' in opts ? opts.port : null;
    let path = opts && 'path' in opts ? opts.path : null;
    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
    let query = opts && 'query' in opts ? opts.query : null;
    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
    let schemeChanged = false;
    if (scheme != null) {
      scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
      schemeChanged = true;
    } else {
      scheme = this.scheme;
    }
    let isFile = scheme == "file";
    if (userInfo != null) {
      userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
    } else {
      userInfo = this[_userInfo];
    }
    if (port != null) {
      port = core.Uri._makePort(port, scheme);
    } else {
      port = this[_port];
      if (schemeChanged) {
        port = core.Uri._makePort(port, scheme);
      }
    }
    if (host != null) {
      host = core.Uri._makeHost(host, 0, host[dartx.length], false);
    } else if (dart.test(this.hasAuthority)) {
      host = this[_host];
    } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
      host = "";
    }
    let hasAuthority = host != null;
    if (path != null || pathSegments != null) {
      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
    } else {
      path = this[_path];
      if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
        path = "/" + dart.notNull(path);
      }
    }
    if (query != null || queryParameters != null) {
      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
    } else {
      query = this[_query];
    }
    if (fragment != null) {
      fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
    } else {
      fragment = this[_fragment];
    }
    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
  }
  removeFragment() {
    if (!dart.test(this.hasFragment)) return this;
    return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
  }
  get pathSegments() {
    let result = this[_pathSegments];
    if (result != null) return result;
    let pathToSplit = this.path;
    if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
      pathToSplit = pathToSplit[dartx.substring](1);
    }
    result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
    this[_pathSegments] = result;
    return result;
  }
  get queryParameters() {
    if (this[_queryParameters] == null) {
      this[_queryParameters] = new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
    }
    return this[_queryParameters];
  }
  get queryParametersAll() {
    if (this[_queryParameterLists] == null) {
      let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
      for (let key of queryParameterLists[dartx.keys]) {
        queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
      }
      this[_queryParameterLists] = MapOfString$ListOfString().unmodifiable(queryParameterLists);
    }
    return this[_queryParameterLists];
  }
  normalizePath() {
    let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
    if (core.identical(path, this[_path])) return this;
    return this.replace({path: path});
  }
  static _makePort(port, scheme) {
    if (port != null && port == core.Uri._defaultPort(scheme)) return null;
    return port;
  }
  static _makeHost(host, start, end, strictIPv6) {
    if (host == null) return null;
    if (start == end) return "";
    if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
      if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
        core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
      }
      core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
      return host[dartx.substring](start, end)[dartx.toLowerCase]();
    }
    if (!dart.test(strictIPv6)) {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
          core.Uri.parseIPv6Address(host, start, end);
          return dart.str`[${host}]`;
        }
      }
    }
    return core.Uri._normalizeRegName(host, start, end);
  }
  static _isRegNameChar(char) {
    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
  }
  static _normalizeRegName(host, start, end) {
    let buffer = null;
    let sectionStart = start;
    let index = start;
    let isNormalized = true;
    while (dart.notNull(index) < dart.notNull(end)) {
      let char = host[dartx.codeUnitAt](index);
      if (char == core.Uri._PERCENT) {
        let replacement = core.Uri._normalizeEscape(host, index, true);
        if (replacement == null && isNormalized) {
          index = dart.notNull(index) + 3;
          continue;
        }
        if (buffer == null) buffer = new core.StringBuffer();
        let slice = host[dartx.substring](sectionStart, index);
        if (!isNormalized) slice = slice[dartx.toLowerCase]();
        buffer.write(slice);
        let sourceLength = 3;
        if (replacement == null) {
          replacement = host[dartx.substring](index, dart.notNull(index) + 3);
        } else if (replacement == "%") {
          replacement = "%25";
          sourceLength = 1;
        }
        buffer.write(replacement);
        index = dart.notNull(index) + sourceLength;
        sectionStart = index;
        isNormalized = true;
      } else if (dart.test(core.Uri._isRegNameChar(char))) {
        if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
          if (buffer == null) buffer = new core.StringBuffer();
          if (dart.notNull(sectionStart) < dart.notNull(index)) {
            buffer.write(host[dartx.substring](sectionStart, index));
            sectionStart = index;
          }
          isNormalized = false;
        }
        index = dart.notNull(index) + 1;
      } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
        core.Uri._fail(host, index, "Invalid character");
      } else {
        let sourceLength = 1;
        if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
          let tail = host[dartx.codeUnitAt](dart.notNull(index) + 1);
          if ((dart.notNull(tail) & 64512) == 56320) {
            char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
            sourceLength = 2;
          }
        }
        if (buffer == null) buffer = new core.StringBuffer();
        let slice = host[dartx.substring](sectionStart, index);
        if (!isNormalized) slice = slice[dartx.toLowerCase]();
        buffer.write(slice);
        buffer.write(core.Uri._escapeChar(char));
        index = dart.notNull(index) + sourceLength;
        sectionStart = index;
      }
    }
    if (buffer == null) return host[dartx.substring](start, end);
    if (dart.notNull(sectionStart) < dart.notNull(end)) {
      let slice = host[dartx.substring](sectionStart, end);
      if (!isNormalized) slice = slice[dartx.toLowerCase]();
      buffer.write(slice);
    }
    return dart.toString(buffer);
  }
  static _makeScheme(scheme, start, end) {
    if (start == end) return "";
    let firstCodeUnit = scheme[dartx.codeUnitAt](start);
    if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
      core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
    }
    let containsUpperCase = false;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let codeUnit = scheme[dartx.codeUnitAt](i);
      if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
        core.Uri._fail(scheme, i, "Illegal scheme character");
      }
      if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
        containsUpperCase = true;
      }
    }
    scheme = scheme[dartx.substring](start, end);
    if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
    return scheme;
  }
  static _makeUserInfo(userInfo, start, end) {
    if (userInfo == null) return "";
    return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
  }
  static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
    let isFile = scheme == "file";
    let ensureLeadingSlash = isFile || dart.test(hasAuthority);
    if (path == null && pathSegments == null) return isFile ? "/" : "";
    if (path != null && pathSegments != null) {
      dart.throw(new core.ArgumentError('Both path and pathSegments specified'));
    }
    let result = null;
    if (path != null) {
      result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
    } else {
      result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
    }
    if (dart.test(dart.dload(result, 'isEmpty'))) {
      if (isFile) return "/";
    } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
      result = "/" + dart.notNull(core.String._check(result));
    }
    result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
    return core.String._check(result);
  }
  static _normalizePath(path, scheme, hasAuthority) {
    if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
      return core.Uri._normalizeRelativePath(path);
    }
    return core.Uri._removeDotSegments(path);
  }
  static _makeQuery(query, start, end, queryParameters) {
    if (query == null && queryParameters == null) return null;
    if (query != null && queryParameters != null) {
      dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
    }
    if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
    let result = new core.StringBuffer();
    let separator = "";
    function writeParameter(key, value) {
      result.write(separator);
      separator = "&";
      result.write(core.Uri.encodeQueryComponent(key));
      if (value != null && dart.test(value[dartx.isNotEmpty])) {
        result.write("=");
        result.write(core.Uri.encodeQueryComponent(value));
      }
    }
    dart.fn(writeParameter, StringAndStringTovoid$());
    queryParameters[dartx.forEach](dart.fn((key, value) => {
      if (value == null || typeof value == 'string') {
        writeParameter(key, core.String._check(value));
      } else {
        let values = core.Iterable._check(value);
        for (let value of values) {
          core.String._check(value);
          writeParameter(key, value);
        }
      }
    }, StringAnddynamicToNull()));
    return result.toString();
  }
  static _makeFragment(fragment, start, end) {
    if (fragment == null) return null;
    return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
  }
  static _stringOrNullLength(s) {
    return s == null ? 0 : s[dartx.length];
  }
  static _normalizeEscape(source, index, lowerCase) {
    dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
    if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
      return "%";
    }
    let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
    let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
    let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
    let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
    if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
      return "%";
    }
    let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
    if (dart.test(core.Uri._isUnreservedChar(value))) {
      if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
        value = (value | 32) >>> 0;
      }
      return core.String.fromCharCode(value);
    }
    if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
      return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
    }
    return null;
  }
  static _parseHexDigit(char) {
    let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
    if (digit <= 9) return digit;
    let lowerCase = (dart.notNull(char) | 32) >>> 0;
    if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
      return lowerCase - (core.Uri._LOWER_CASE_A - 10);
    }
    return -1;
  }
  static _escapeChar(char) {
    dart.assert(dart.notNull(char) <= 1114111);
    let codeUnits = null;
    if (dart.notNull(char) < 128) {
      codeUnits = ListOfint().new(3);
      codeUnits[dartx._set](0, core.Uri._PERCENT);
      codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
      codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
    } else {
      let flag = 192;
      let encodedBytes = 2;
      if (dart.notNull(char) > 2047) {
        flag = 224;
        encodedBytes = 3;
        if (dart.notNull(char) > 65535) {
          encodedBytes = 4;
          flag = 240;
        }
      }
      codeUnits = ListOfint().new(3 * encodedBytes);
      let index = 0;
      while (--encodedBytes >= 0) {
        let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
        codeUnits[dartx._set](index, core.Uri._PERCENT);
        codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
        codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
        index = index + 3;
        flag = 128;
      }
    }
    return core.String.fromCharCodes(codeUnits);
  }
  static _normalize(component, start, end, charTable) {
    let buffer = null;
    let sectionStart = start;
    let index = start;
    while (dart.notNull(index) < dart.notNull(end)) {
      let char = component[dartx.codeUnitAt](index);
      if (dart.notNull(char) < 127 && (dart.notNull(charTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0) {
        index = dart.notNull(index) + 1;
      } else {
        let replacement = null;
        let sourceLength = null;
        if (char == core.Uri._PERCENT) {
          replacement = core.Uri._normalizeEscape(component, index, false);
          if (replacement == null) {
            index = dart.notNull(index) + 3;
            continue;
          }
          if ("%" == replacement) {
            replacement = "%25";
            sourceLength = 1;
          } else {
            sourceLength = 3;
          }
        } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
          core.Uri._fail(component, index, "Invalid character");
        } else {
          sourceLength = 1;
          if ((dart.notNull(char) & 64512) == 55296) {
            if (dart.notNull(index) + 1 < dart.notNull(end)) {
              let tail = component[dartx.codeUnitAt](dart.notNull(index) + 1);
              if ((dart.notNull(tail) & 64512) == 56320) {
                sourceLength = 2;
                char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
              }
            }
          }
          replacement = core.Uri._escapeChar(char);
        }
        if (buffer == null) buffer = new core.StringBuffer();
        buffer.write(component[dartx.substring](sectionStart, index));
        buffer.write(replacement);
        index = dart.notNull(index) + dart.notNull(sourceLength);
        sectionStart = index;
      }
    }
    if (buffer == null) {
      return component[dartx.substring](start, end);
    }
    if (dart.notNull(sectionStart) < dart.notNull(end)) {
      buffer.write(component[dartx.substring](sectionStart, end));
    }
    return dart.toString(buffer);
  }
  static _isSchemeCharacter(ch) {
    return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
  }
  static _isGeneralDelimiter(ch) {
    return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
  }
  get isAbsolute() {
    return this.scheme != "" && this.fragment == "";
  }
  [_mergePaths](base, reference) {
    let backCount = 0;
    let refStart = 0;
    while (dart.test(reference[dartx.startsWith]("../", refStart))) {
      refStart = refStart + 3;
      backCount++;
    }
    let baseEnd = base[dartx.lastIndexOf]('/');
    while (dart.notNull(baseEnd) > 0 && backCount > 0) {
      let newEnd = base[dartx.lastIndexOf]('/', dart.notNull(baseEnd) - 1);
      if (dart.notNull(newEnd) < 0) {
        break;
      }
      let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
      if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
        break;
      }
      baseEnd = newEnd;
      backCount--;
    }
    return base[dartx.replaceRange](dart.notNull(baseEnd) + 1, null, reference[dartx.substring](refStart - 3 * backCount));
  }
  static _mayContainDotSegments(path) {
    if (dart.test(path[dartx.startsWith]('.'))) return true;
    let index = path[dartx.indexOf]("/.");
    return index != -1;
  }
  static _removeDotSegments(path) {
    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
    dart.assert(path[dartx.isNotEmpty]);
    let output = JSArrayOfString().of([]);
    let appendSlash = false;
    for (let segment of path[dartx.split]("/")) {
      appendSlash = false;
      if (segment == "..") {
        if (dart.test(output[dartx.isNotEmpty])) {
          output[dartx.removeLast]();
          if (dart.test(output[dartx.isEmpty])) {
            output[dartx.add]("");
          }
        }
        appendSlash = true;
      } else if ("." == segment) {
        appendSlash = true;
      } else {
        output[dartx.add](segment);
      }
    }
    if (appendSlash) output[dartx.add]("");
    return output[dartx.join]("/");
  }
  static _normalizeRelativePath(path) {
    dart.assert(!dart.test(path[dartx.startsWith]('/')));
    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
    dart.assert(path[dartx.isNotEmpty]);
    let output = JSArrayOfString().of([]);
    let appendSlash = false;
    for (let segment of path[dartx.split]("/")) {
      appendSlash = false;
      if (".." == segment) {
        if (!dart.test(output[dartx.isEmpty]) && output[dartx.last] != "..") {
          output[dartx.removeLast]();
          appendSlash = true;
        } else {
          output[dartx.add]("..");
        }
      } else if ("." == segment) {
        appendSlash = true;
      } else {
        output[dartx.add](segment);
      }
    }
    if (dart.test(output[dartx.isEmpty]) || output[dartx.length] == 1 && dart.test(output[dartx._get](0)[dartx.isEmpty])) {
      return "./";
    }
    if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
    return output[dartx.join]("/");
  }
  resolve(reference) {
    return this.resolveUri(core.Uri.parse(reference));
  }
  resolveUri(reference) {
    let targetScheme = null;
    let targetUserInfo = "";
    let targetHost = null;
    let targetPort = null;
    let targetPath = null;
    let targetQuery = null;
    if (dart.test(reference.scheme[dartx.isNotEmpty])) {
      targetScheme = reference.scheme;
      if (dart.test(reference.hasAuthority)) {
        targetUserInfo = reference.userInfo;
        targetHost = reference.host;
        targetPort = dart.test(reference.hasPort) ? reference.port : null;
      }
      targetPath = core.Uri._removeDotSegments(reference.path);
      if (dart.test(reference.hasQuery)) {
        targetQuery = reference.query;
      }
    } else {
      targetScheme = this.scheme;
      if (dart.test(reference.hasAuthority)) {
        targetUserInfo = reference.userInfo;
        targetHost = reference.host;
        targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
        targetPath = core.Uri._removeDotSegments(reference.path);
        if (dart.test(reference.hasQuery)) targetQuery = reference.query;
      } else {
        targetUserInfo = this[_userInfo];
        targetHost = this[_host];
        targetPort = this[_port];
        if (reference.path == "") {
          targetPath = this[_path];
          if (dart.test(reference.hasQuery)) {
            targetQuery = reference.query;
          } else {
            targetQuery = this[_query];
          }
        } else {
          if (dart.test(reference.hasAbsolutePath)) {
            targetPath = core.Uri._removeDotSegments(reference.path);
          } else {
            if (dart.test(this.hasEmptyPath)) {
              if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
                targetPath = reference.path;
              } else {
                targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
              }
            } else {
              let mergedPath = this[_mergePaths](this[_path], reference.path);
              if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
                targetPath = core.Uri._removeDotSegments(mergedPath);
              } else {
                targetPath = core.Uri._normalizeRelativePath(mergedPath);
              }
            }
          }
          if (dart.test(reference.hasQuery)) targetQuery = reference.query;
        }
      }
    }
    let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
    return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
  }
  get hasScheme() {
    return this.scheme[dartx.isNotEmpty];
  }
  get hasAuthority() {
    return this[_host] != null;
  }
  get hasPort() {
    return this[_port] != null;
  }
  get hasQuery() {
    return this[_query] != null;
  }
  get hasFragment() {
    return this[_fragment] != null;
  }
  get hasEmptyPath() {
    return this[_path][dartx.isEmpty];
  }
  get hasAbsolutePath() {
    return this[_path][dartx.startsWith]('/');
  }
  get origin() {
    if (this.scheme == "" || this[_host] == null || this[_host] == "") {
      dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
    }
    if (this.scheme != "http" && this.scheme != "https") {
      dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
    }
    if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
    return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
  }
  toFilePath(opts) {
    let windows = opts && 'windows' in opts ? opts.windows : null;
    if (this.scheme != "" && this.scheme != "file") {
      dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
    }
    if (this.query != "") {
      dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
    }
    if (this.fragment != "") {
      dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
    }
    if (windows == null) windows = core.Uri._isWindows;
    return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
  }
  [_toFilePath]() {
    if (this.host != "") {
      dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
    }
    core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
    let result = new core.StringBuffer();
    if (dart.test(this[_isPathAbsolute])) result.write("/");
    result.writeAll(this.pathSegments, "/");
    return result.toString();
  }
  [_toWindowsFilePath]() {
    let hasDriveLetter = false;
    let segments = this.pathSegments;
    if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
      core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
      core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
      hasDriveLetter = true;
    } else {
      core.Uri._checkWindowsPathReservedCharacters(segments, false);
    }
    let result = new core.StringBuffer();
    if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
    if (this.host != "") {
      result.write("\\");
      result.write(this.host);
      result.write("\\");
    }
    result.writeAll(segments, "\\");
    if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
    return result.toString();
  }
  get [_isPathAbsolute]() {
    if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
    return this.path[dartx.startsWith]('/');
  }
  [_writeAuthority](ss) {
    if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
      ss.write(this[_userInfo]);
      ss.write("@");
    }
    if (this[_host] != null) ss.write(this[_host]);
    if (this[_port] != null) {
      ss.write(":");
      ss.write(this[_port]);
    }
  }
  get data() {
    return this.scheme == "data" ? core.UriData.fromUri(this) : null;
  }
  toString() {
    let sb = new core.StringBuffer();
    core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
    if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
      sb.write("//");
      this[_writeAuthority](sb);
    }
    sb.write(this.path);
    if (this[_query] != null) {
      sb.write("?");
      sb.write(this[_query]);
    }
    if (this[_fragment] != null) {
      sb.write("#");
      sb.write(this[_fragment]);
    }
    return sb.toString();
  }
  ['=='](other) {
    if (!core.Uri.is(other)) return false;
    let uri = core.Uri._check(other);
    return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
  }
  get hashCode() {
    function combine(part, current) {
      return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
    }
    dart.fn(combine, dynamicAnddynamicToint());
    return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
  }
  static _addIfNonEmpty(sb, test, first, second) {
    if ("" != test) {
      sb.write(first);
      sb.write(second);
    }
  }
  static encodeComponent(component) {
    return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
  }
  static encodeQueryComponent(component, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
  }
  static decodeComponent(encodedComponent) {
    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
  }
  static decodeQueryComponent(encodedComponent, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
  }
  static encodeFull(uri) {
    return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
  }
  static decodeFull(uri) {
    return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
  }
  static splitQueryString(query, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
      let index = element[dartx.indexOf]("=");
      if (index == -1) {
        if (element != "") {
          map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
        }
      } else if (index != 0) {
        let key = element[dartx.substring](0, index);
        let value = element[dartx.substring](dart.notNull(index) + 1);
        map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
      }
      return map;
    }, MapOfString$StringAndStringToMapOfString$String()));
  }
  static _createList() {
    return [];
  }
  static _splitQueryStringAll(query, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    let result = dart.map();
    let i = 0;
    let start = 0;
    let equalsIndex = -1;
    function parsePair(start, equalsIndex, end) {
      let key = null;
      let value = null;
      if (start == end) return;
      if (dart.notNull(equalsIndex) < 0) {
        key = core.Uri._uriDecode(query, start, end, encoding, true);
        value = "";
      } else {
        key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
        value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
      }
      dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
    }
    dart.fn(parsePair, intAndintAndintTovoid());
    let _equals = 61;
    let _ampersand = 38;
    while (i < dart.notNull(query[dartx.length])) {
      let char = query[dartx.codeUnitAt](i);
      if (char == _equals) {
        if (equalsIndex < 0) equalsIndex = i;
      } else if (char == _ampersand) {
        parsePair(start, equalsIndex, i);
        start = i + 1;
        equalsIndex = -1;
      }
      i++;
    }
    parsePair(start, equalsIndex, i);
    return result;
  }
  static parseIPv4Address(host) {
    function error(msg) {
      dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
    }
    dart.fn(error, StringTovoid$());
    let bytes = host[dartx.split]('.');
    if (bytes[dartx.length] != 4) {
      error('IPv4 address should contain exactly 4 parts');
    }
    return bytes[dartx.map](core.int)(dart.fn(byteString => {
      let byte = core.int.parse(byteString);
      if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
        error('each part must be in the range of `0..255`');
      }
      return byte;
    }, StringToint$()))[dartx.toList]();
  }
  static parseIPv6Address(host, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (end == null) end = host[dartx.length];
    function error(msg, position) {
      if (position === void 0) position = null;
      dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
    }
    dart.fn(error, String__Tovoid());
    function parseHex(start, end) {
      if (dart.notNull(end) - dart.notNull(start) > 4) {
        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
      }
      let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
      if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
        error('each part must be in the range of `0x0..0xFFFF`', start);
      }
      return value;
    }
    dart.fn(parseHex, intAndintToint());
    if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
    let parts = JSArrayOfint().of([]);
    let wildcardSeen = false;
    let partStart = start;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
        if (i == start) {
          i = dart.notNull(i) + 1;
          if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
            error('invalid start colon.', i);
          }
          partStart = i;
        }
        if (i == partStart) {
          if (wildcardSeen) {
            error('only one wildcard `::` is allowed', i);
          }
          wildcardSeen = true;
          parts[dartx.add](-1);
        } else {
          parts[dartx.add](parseHex(partStart, i));
        }
        partStart = dart.notNull(i) + 1;
      }
    }
    if (parts[dartx.length] == 0) error('too few parts');
    let atEnd = partStart == end;
    let isLastWildcard = parts[dartx.last] == -1;
    if (atEnd && !isLastWildcard) {
      error('expected a part after last `:`', end);
    }
    if (!atEnd) {
      try {
        parts[dartx.add](parseHex(partStart, end));
      } catch (e) {
        try {
          let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
          parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
          parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
        } catch (e) {
          error('invalid end of IPv6 address.', partStart);
        }

      }

    }
    if (wildcardSeen) {
      if (dart.notNull(parts[dartx.length]) > 7) {
        error('an address with a wildcard must have less than 7 parts');
      }
    } else if (parts[dartx.length] != 8) {
      error('an address without a wildcard must contain exactly 8 parts');
    }
    let bytes = typed_data.Uint8List.new(16);
    for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
      let value = parts[dartx._get](i);
      if (value == -1) {
        let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
        for (let j = 0; j < wildCardLength; j++) {
          bytes[dartx._set](index, 0);
          bytes[dartx._set](index + 1, 0);
          index = index + 2;
        }
      } else {
        bytes[dartx._set](index, value[dartx['>>']](8));
        bytes[dartx._set](index + 1, dart.notNull(value) & 255);
        index = index + 2;
      }
    }
    return bytes;
  }
  static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
    if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
      return text;
    }
    let result = new core.StringBuffer();
    let bytes = encoding.encode(text);
    for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
      let byte = bytes[dartx._get](i);
      if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
        result.writeCharCode(byte);
      } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
        result.write('+');
      } else {
        let hexDigits = '0123456789ABCDEF';
        result.write('%');
        result.write(hexDigits[dartx._get](dart.notNull(byte) >> 4 & 15));
        result.write(hexDigits[dartx._get](dart.notNull(byte) & 15));
      }
    }
    return result.toString();
  }
  static _hexCharPairToByte(s, pos) {
    let byte = 0;
    for (let i = 0; i < 2; i++) {
      let charCode = s[dartx.codeUnitAt](dart.notNull(pos) + i);
      if (48 <= dart.notNull(charCode) && dart.notNull(charCode) <= 57) {
        byte = byte * 16 + dart.notNull(charCode) - 48;
      } else {
        charCode = (dart.notNull(charCode) | 32) >>> 0;
        if (97 <= dart.notNull(charCode) && dart.notNull(charCode) <= 102) {
          byte = byte * 16 + dart.notNull(charCode) - 87;
        } else {
          dart.throw(new core.ArgumentError("Invalid URL encoding"));
        }
      }
    }
    return byte;
  }
  static _uriDecode(text, start, end, encoding, plusToSpace) {
    dart.assert(0 <= dart.notNull(start));
    dart.assert(dart.notNull(start) <= dart.notNull(end));
    dart.assert(dart.notNull(end) <= dart.notNull(text[dartx.length]));
    dart.assert(encoding != null);
    let simple = true;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let codeUnit = text[dartx.codeUnitAt](i);
      if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
        simple = false;
        break;
      }
    }
    let bytes = null;
    if (simple) {
      if (dart.equals(convert.UTF8, encoding) || dart.equals(convert.LATIN1, encoding) || dart.equals(convert.ASCII, encoding)) {
        return text[dartx.substring](start, end);
      } else {
        bytes = text[dartx.substring](start, end)[dartx.codeUnits];
      }
    } else {
      bytes = ListOfint().new();
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = text[dartx.codeUnitAt](i);
        if (dart.notNull(codeUnit) > 127) {
          dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
        }
        if (codeUnit == core.Uri._PERCENT) {
          if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
            dart.throw(new core.ArgumentError('Truncated URI'));
          }
          bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
          i = dart.notNull(i) + 2;
        } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
          bytes[dartx.add](core.Uri._SPACE);
        } else {
          bytes[dartx.add](codeUnit);
        }
      }
    }
    return encoding.decode(bytes);
  }
  static _isAlphabeticCharacter(codeUnit) {
    let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
    return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
  }
  static _isUnreservedChar(char) {
    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
  }
};
dart.defineNamedConstructor(core.Uri, '_internal');
dart.setSignature(core.Uri, {
  constructors: () => ({
    _internal: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, core.int, core.String, core.String, core.String]),
    new: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
    http: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
    https: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
    file: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
    directory: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
    dataFromString: dart.definiteFunctionType(core.Uri, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
    dataFromBytes: dart.definiteFunctionType(core.Uri, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic})
  }),
  fields: () => ({
    scheme: core.String,
    [_userInfo]: core.String,
    [_host]: core.String,
    [_port]: core.int,
    [_path]: core.String,
    [_query]: core.String,
    [_fragment]: core.String,
    [_pathSegments]: ListOfString(),
    [_queryParameters]: MapOfString$String(),
    [_queryParameterLists]: MapOfString$ListOfString()
  }),
  getters: () => ({
    authority: dart.definiteFunctionType(core.String, []),
    userInfo: dart.definiteFunctionType(core.String, []),
    host: dart.definiteFunctionType(core.String, []),
    port: dart.definiteFunctionType(core.int, []),
    path: dart.definiteFunctionType(core.String, []),
    query: dart.definiteFunctionType(core.String, []),
    fragment: dart.definiteFunctionType(core.String, []),
    pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
    queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
    isAbsolute: dart.definiteFunctionType(core.bool, []),
    hasScheme: dart.definiteFunctionType(core.bool, []),
    hasAuthority: dart.definiteFunctionType(core.bool, []),
    hasPort: dart.definiteFunctionType(core.bool, []),
    hasQuery: dart.definiteFunctionType(core.bool, []),
    hasFragment: dart.definiteFunctionType(core.bool, []),
    hasEmptyPath: dart.definiteFunctionType(core.bool, []),
    hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
    origin: dart.definiteFunctionType(core.String, []),
    [_isPathAbsolute]: dart.definiteFunctionType(core.bool, []),
    data: dart.definiteFunctionType(core.UriData, [])
  }),
  methods: () => ({
    replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
    removeFragment: dart.definiteFunctionType(core.Uri, []),
    normalizePath: dart.definiteFunctionType(core.Uri, []),
    [_mergePaths]: dart.definiteFunctionType(core.String, [core.String, core.String]),
    resolve: dart.definiteFunctionType(core.Uri, [core.String]),
    resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
    toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
    [_toFilePath]: dart.definiteFunctionType(core.String, []),
    [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
    [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
  }),
  sfields: () => ({
    _SPACE: core.int,
    _DOUBLE_QUOTE: core.int,
    _NUMBER_SIGN: core.int,
    _PERCENT: core.int,
    _ASTERISK: core.int,
    _PLUS: core.int,
    _DOT: core.int,
    _SLASH: core.int,
    _ZERO: core.int,
    _NINE: core.int,
    _COLON: core.int,
    _LESS: core.int,
    _GREATER: core.int,
    _QUESTION: core.int,
    _AT_SIGN: core.int,
    _UPPER_CASE_A: core.int,
    _UPPER_CASE_F: core.int,
    _UPPER_CASE_Z: core.int,
    _LEFT_BRACKET: core.int,
    _BACKSLASH: core.int,
    _RIGHT_BRACKET: core.int,
    _LOWER_CASE_A: core.int,
    _LOWER_CASE_F: core.int,
    _LOWER_CASE_Z: core.int,
    _BAR: core.int,
    _hexDigits: core.String,
    _unreservedTable: ListOfint(),
    _unreserved2396Table: ListOfint(),
    _encodeFullTable: ListOfint(),
    _schemeTable: ListOfint(),
    _schemeLowerTable: ListOfint(),
    _subDelimitersTable: ListOfint(),
    _genDelimitersTable: ListOfint(),
    _userinfoTable: ListOfint(),
    _regNameTable: ListOfint(),
    _pathCharTable: ListOfint(),
    _pathCharOrSlashTable: ListOfint(),
    _queryCharTable: ListOfint(),
    _needsNoEncoding: core.RegExp
  }),
  sgetters: () => ({
    base: dart.definiteFunctionType(core.Uri, []),
    _isWindows: dart.definiteFunctionType(core.bool, [])
  }),
  statics: () => ({
    _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
    parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
    _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
    _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
    _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
    _checkWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool], [core.int]),
    _checkWindowsDriveLetter: dart.definiteFunctionType(dart.dynamic, [core.int, core.bool]),
    _makeFileUri: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
    _makeWindowsFileUrl: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
    _makePort: dart.definiteFunctionType(core.int, [core.int, core.String]),
    _makeHost: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.bool]),
    _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
    _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
    _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
    _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
    _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
    _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
    _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
    _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
    _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
    _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
    _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
    _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
    _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
    _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
    _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
    _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
    _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
    _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
    _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
    encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
    encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
    decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
    decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
    encodeFull: dart.definiteFunctionType(core.String, [core.String]),
    decodeFull: dart.definiteFunctionType(core.String, [core.String]),
    splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
    _createList: dart.definiteFunctionType(core.List, []),
    _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
    parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
    parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
    _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
    _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
    _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
    _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
    _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
  }),
  names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
});
core.Uri._SPACE = 32;
core.Uri._DOUBLE_QUOTE = 34;
core.Uri._NUMBER_SIGN = 35;
core.Uri._PERCENT = 37;
core.Uri._ASTERISK = 42;
core.Uri._PLUS = 43;
core.Uri._DOT = 46;
core.Uri._SLASH = 47;
core.Uri._ZERO = 48;
core.Uri._NINE = 57;
core.Uri._COLON = 58;
core.Uri._LESS = 60;
core.Uri._GREATER = 62;
core.Uri._QUESTION = 63;
core.Uri._AT_SIGN = 64;
core.Uri._UPPER_CASE_A = 65;
core.Uri._UPPER_CASE_F = 70;
core.Uri._UPPER_CASE_Z = 90;
core.Uri._LEFT_BRACKET = 91;
core.Uri._BACKSLASH = 92;
core.Uri._RIGHT_BRACKET = 93;
core.Uri._LOWER_CASE_A = 97;
core.Uri._LOWER_CASE_F = 102;
core.Uri._LOWER_CASE_Z = 122;
core.Uri._BAR = 124;
core.Uri._hexDigits = "0123456789ABCDEF";
core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
dart.defineLazy(core.Uri, {
  get _needsNoEncoding() {
    return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
  }
});
const _text = Symbol('_text');
const _separatorIndices = Symbol('_separatorIndices');
const _uriCache = Symbol('_uriCache');
core.UriData = class UriData extends core.Object {
  _(text, separatorIndices, uriCache) {
    this[_text] = text;
    this[_separatorIndices] = separatorIndices;
    this[_uriCache] = uriCache;
  }
  static fromString(content, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let base64 = opts && 'base64' in opts ? opts.base64 : false;
    let buffer = new core.StringBuffer();
    let indices = JSArrayOfint().of([core.UriData._noScheme]);
    let charsetName = null;
    let encodingName = null;
    if (parameters != null) charsetName = parameters[dartx._get]("charset");
    if (encoding == null) {
      if (charsetName != null) {
        encoding = convert.Encoding.getByName(charsetName);
      }
    } else if (charsetName == null) {
      encodingName = encoding.name;
    }
    let t = encoding;
    t == null ? encoding = convert.ASCII : t;
    core.UriData._writeUri(mimeType, encodingName, parameters, buffer, indices);
    indices[dartx.add](buffer.length);
    if (dart.test(base64)) {
      buffer.write(';base64,');
      indices[dartx.add](dart.notNull(buffer.length) - 1);
      buffer.write(encoding.fuse(core.String)(convert.BASE64).encode(content));
    } else {
      buffer.write(',');
      core.UriData._uriEncodeBytes(core.UriData._uricTable, encoding.encode(content), buffer);
    }
    return new core.UriData._(buffer.toString(), indices, null);
  }
  static fromBytes(bytes, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
    let buffer = new core.StringBuffer();
    let indices = JSArrayOfint().of([core.UriData._noScheme]);
    core.UriData._writeUri(core.String._check(mimeType), null, parameters, buffer, indices);
    indices[dartx.add](buffer.length);
    if (dart.test(percentEncoded)) {
      buffer.write(',');
      core.UriData._uriEncodeBytes(core.UriData._uricTable, bytes, buffer);
    } else {
      buffer.write(';base64,');
      indices[dartx.add](dart.notNull(buffer.length) - 1);
      convert.BASE64.encoder.startChunkedConversion(convert.StringConversionSink.fromStringSink(buffer)).addSlice(bytes, 0, bytes[dartx.length], true);
    }
    return new core.UriData._(buffer.toString(), indices, null);
  }
  static fromUri(uri) {
    if (uri.scheme != "data") {
      dart.throw(new core.ArgumentError.value(uri, "uri", "Scheme must be 'data'"));
    }
    if (dart.test(uri.hasAuthority)) {
      dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have authority"));
    }
    if (dart.test(uri.hasFragment)) {
      dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have a fragment part"));
    }
    if (!dart.test(uri.hasQuery)) {
      return core.UriData._parse(uri.path, 0, uri);
    }
    return core.UriData._parse(dart.str`${uri}`, 5, uri);
  }
  static _writeUri(mimeType, charsetName, parameters, buffer, indices) {
    if (mimeType == null || mimeType == "text/plain") {
      mimeType = "";
    }
    if (dart.test(mimeType[dartx.isEmpty]) || core.identical(mimeType, "application/octet-stream")) {
      buffer.write(mimeType);
    } else {
      let slashIndex = core.UriData._validateMimeType(mimeType);
      if (dart.notNull(slashIndex) < 0) {
        dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
      }
      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
      buffer.write("/");
      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
    }
    if (charsetName != null) {
      if (indices != null) {
        indices[dartx.add](buffer.length);
        indices[dartx.add](dart.notNull(buffer.length) + 8);
      }
      buffer.write(";charset=");
      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
    }
    dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
      if (dart.test(key[dartx.isEmpty])) {
        dart.throw(new core.ArgumentError.value("", "Parameter names must not be empty"));
      }
      if (dart.test(value[dartx.isEmpty])) {
        dart.throw(new core.ArgumentError.value("", "Parameter values must not be empty", dart.str`parameters["${key}"]`));
      }
      if (indices != null) indices[dartx.add](buffer.length);
      buffer.write(';');
      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
      if (indices != null) indices[dartx.add](buffer.length);
      buffer.write('=');
      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
    }, StringAndStringToNull())));
  }
  static _validateMimeType(mimeType) {
    let slashIndex = -1;
    for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
      let char = mimeType[dartx.codeUnitAt](i);
      if (char != core.Uri._SLASH) continue;
      if (slashIndex < 0) {
        slashIndex = i;
        continue;
      }
      return -1;
    }
    return slashIndex;
  }
  static parse(uri) {
    if (!dart.test(uri[dartx.startsWith]("data:"))) {
      dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
    }
    return core.UriData._parse(uri, 5, null);
  }
  get uri() {
    if (this[_uriCache] != null) return this[_uriCache];
    let path = this[_text];
    let query = null;
    let colonIndex = this[_separatorIndices][dartx._get](0);
    let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
    let end = null;
    if (dart.notNull(queryIndex) >= 0) {
      query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
      end = queryIndex;
    }
    path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
    this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
    return this[_uriCache];
  }
  get mimeType() {
    let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
    let end = this[_separatorIndices][dartx._get](1);
    if (start == end) return "text/plain";
    return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
  }
  get charset() {
    let parameterStart = 1;
    let parameterEnd = dart.notNull(this[_separatorIndices][dartx.length]) - 1;
    if (dart.test(this.isBase64)) {
      parameterEnd = parameterEnd - 1;
    }
    for (let i = parameterStart; i < parameterEnd; i = i + 2) {
      let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
      let keyEnd = this[_separatorIndices][dartx._get](i + 1);
      if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
        return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
      }
    }
    return "US-ASCII";
  }
  get isBase64() {
    return this[_separatorIndices][dartx.length][dartx.isOdd];
  }
  get contentText() {
    return this[_text][dartx.substring](dart.notNull(this[_separatorIndices][dartx.last]) + 1);
  }
  contentAsBytes() {
    let text = this[_text];
    let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
    if (dart.test(this.isBase64)) {
      return convert.BASE64.decoder.convert(text, start);
    }
    let percent = 37;
    let length = dart.notNull(text[dartx.length]) - start;
    for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
      let codeUnit = text[dartx.codeUnitAt](i);
      if (codeUnit == percent) {
        i = i + 2;
        length = length - 2;
      }
    }
    let result = typed_data.Uint8List.new(length);
    if (length == text[dartx.length]) {
      result[dartx.setRange](0, length, text[dartx.codeUnits], start);
      return result;
    }
    let index = 0;
    for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
      let codeUnit = text[dartx.codeUnitAt](i);
      if (codeUnit != percent) {
        result[dartx._set](index++, codeUnit);
      } else {
        if (i + 2 < dart.notNull(text[dartx.length])) {
          let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
          let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
          if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
            let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
            result[dartx._set](index++, byte);
            i = i + 2;
            continue;
          }
        }
        dart.throw(new core.FormatException("Invalid percent escape", text, i));
      }
    }
    dart.assert(index == result[dartx.length]);
    return result;
  }
  contentAsString(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
    if (encoding == null) {
      let charset = this.charset;
      encoding = convert.Encoding.getByName(charset);
      if (encoding == null) {
        dart.throw(new core.UnsupportedError(dart.str`Unknown charset: ${charset}`));
      }
    }
    let text = this[_text];
    let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
    if (dart.test(this.isBase64)) {
      let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
      return converter.convert(text[dartx.substring](start));
    }
    return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
  }
  get parameters() {
    let result = dart.map({}, core.String, core.String);
    for (let i = 3; i < dart.notNull(this[_separatorIndices][dartx.length]); i = i + 2) {
      let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
      let equals = this[_separatorIndices][dartx._get](i - 1);
      let end = this[_separatorIndices][dartx._get](i);
      let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
      let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
      result[dartx._set](key, value);
    }
    return result;
  }
  static _parse(text, start, sourceUri) {
    dart.assert(start == 0 || start == 5);
    dart.assert(start == 5 == text[dartx.startsWith]("data:"));
    let comma = 44;
    let slash = 47;
    let semicolon = 59;
    let equals = 61;
    let indices = JSArrayOfint().of([dart.notNull(start) - 1]);
    let slashIndex = -1;
    let char = null;
    let i = start;
    for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
      char = text[dartx.codeUnitAt](i);
      if (dart.equals(char, comma) || dart.equals(char, semicolon)) break;
      if (dart.equals(char, slash)) {
        if (dart.notNull(slashIndex) < 0) {
          slashIndex = i;
          continue;
        }
        dart.throw(new core.FormatException("Invalid MIME type", text, i));
      }
    }
    if (dart.notNull(slashIndex) < 0 && dart.notNull(i) > dart.notNull(start)) {
      dart.throw(new core.FormatException("Invalid MIME type", text, i));
    }
    while (!dart.equals(char, comma)) {
      indices[dartx.add](i);
      i = dart.notNull(i) + 1;
      let equalsIndex = -1;
      for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
        char = text[dartx.codeUnitAt](i);
        if (dart.equals(char, equals)) {
          if (dart.notNull(equalsIndex) < 0) equalsIndex = i;
        } else if (dart.equals(char, semicolon) || dart.equals(char, comma)) {
          break;
        }
      }
      if (dart.notNull(equalsIndex) >= 0) {
        indices[dartx.add](equalsIndex);
      } else {
        let lastSeparator = indices[dartx.last];
        if (!dart.equals(char, comma) || i != dart.notNull(lastSeparator) + 7 || !dart.test(text[dartx.startsWith]("base64", dart.notNull(lastSeparator) + 1))) {
          dart.throw(new core.FormatException("Expecting '='", text, i));
        }
        break;
      }
    }
    indices[dartx.add](i);
    return new core.UriData._(text, indices, sourceUri);
  }
  static _uriEncodeBytes(canonicalTable, bytes, buffer) {
    let byteOr = 0;
    for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
      let byte = bytes[dartx._get](i);
      byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
      if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
        buffer.writeCharCode(byte);
      } else {
        buffer.writeCharCode(core.Uri._PERCENT);
        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
      }
    }
    if ((dart.notNull(byteOr) & ~255) != 0) {
      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        let byte = bytes[dartx._get](i);
        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
          dart.throw(new core.ArgumentError.value(byte, "non-byte value"));
        }
      }
    }
  }
  toString() {
    return this[_separatorIndices][dartx._get](0) == core.UriData._noScheme ? dart.str`data:${this[_text]}` : this[_text];
  }
};
dart.defineNamedConstructor(core.UriData, '_');
dart.setSignature(core.UriData, {
  constructors: () => ({
    _: dart.definiteFunctionType(core.UriData, [core.String, ListOfint(), core.Uri]),
    fromString: dart.definiteFunctionType(core.UriData, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
    fromBytes: dart.definiteFunctionType(core.UriData, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic}),
    fromUri: dart.definiteFunctionType(core.UriData, [core.Uri])
  }),
  fields: () => ({
    [_text]: core.String,
    [_separatorIndices]: ListOfint(),
    [_uriCache]: core.Uri
  }),
  getters: () => ({
    uri: dart.definiteFunctionType(core.Uri, []),
    mimeType: dart.definiteFunctionType(core.String, []),
    charset: dart.definiteFunctionType(core.String, []),
    isBase64: dart.definiteFunctionType(core.bool, []),
    contentText: dart.definiteFunctionType(core.String, []),
    parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
  }),
  methods: () => ({
    contentAsBytes: dart.definiteFunctionType(core.List$(core.int), []),
    contentAsString: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding})
  }),
  sfields: () => ({
    _noScheme: core.int,
    _tokenCharTable: ListOfint(),
    _uricTable: ListOfint()
  }),
  statics: () => ({
    _writeUri: dart.definiteFunctionType(dart.void, [core.String, core.String, MapOfString$String(), core.StringBuffer, core.List]),
    _validateMimeType: dart.definiteFunctionType(core.int, [core.String]),
    parse: dart.definiteFunctionType(core.UriData, [core.String]),
    _parse: dart.definiteFunctionType(core.UriData, [core.String, core.int, core.Uri]),
    _uriEncodeBytes: dart.definiteFunctionType(dart.void, [ListOfint(), ListOfint(), core.StringSink])
  }),
  names: ['_writeUri', '_validateMimeType', 'parse', '_parse', '_uriEncodeBytes']
});
core.UriData._noScheme = -1;
core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
core.UriData._uricTable = core.Uri._queryCharTable;
developer.debugger = function(opts) {
  let when = opts && 'when' in opts ? opts.when : true;
  let message = opts && 'message' in opts ? opts.message : null;
  if (dart.test(when)) {
    debugger;
  }
  return when;
};
dart.fn(developer.debugger, __Tobool());
developer.inspect = function(object) {
  return object;
};
dart.fn(developer.inspect, ObjectToObject());
developer.log = function(message, opts) {
  let time = opts && 'time' in opts ? opts.time : null;
  let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
  let level = opts && 'level' in opts ? opts.level : 0;
  let name = opts && 'name' in opts ? opts.name : '';
  let zone = opts && 'zone' in opts ? opts.zone : null;
  let error = opts && 'error' in opts ? opts.error : null;
  let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
};
dart.fn(developer.log, String__Tovoid$());
dart.defineLazy(developer, {
  get _extensions() {
    return MapOfString$ServiceExtensionHandler().new();
  }
});
developer._clockValue = 0;
const _result = Symbol('_result');
const _errorCode = Symbol('_errorCode');
const _errorDetail = Symbol('_errorDetail');
const _isError = Symbol('_isError');
const _toString = Symbol('_toString');
developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
  result(result) {
    this[_result] = result;
    this[_errorCode] = null;
    this[_errorDetail] = null;
    if (!(typeof this[_result] == 'string')) {
      dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
    }
  }
  error(errorCode, errorDetail) {
    this[_result] = null;
    this[_errorCode] = errorCode;
    this[_errorDetail] = errorDetail;
    developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
    if (!(typeof this[_errorDetail] == 'string')) {
      dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
    }
  }
  static _errorCodeMessage(errorCode) {
    developer.ServiceExtensionResponse._validateErrorCode(errorCode);
    if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
      return "Invalid params";
    }
    return "Server error";
  }
  static _validateErrorCode(errorCode) {
    if (!(typeof errorCode == 'number')) {
      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
    }
    if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
      return;
    }
    if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
      return;
    }
    dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
  }
  [_isError]() {
    return this[_errorCode] != null && this[_errorDetail] != null;
  }
  [_toString]() {
    if (this[_result] != null) {
      return this[_result];
    } else {
      dart.assert(this[_errorCode] != null);
      dart.assert(this[_errorDetail] != null);
      return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
    }
  }
};
dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
dart.setSignature(developer.ServiceExtensionResponse, {
  constructors: () => ({
    result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
    error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
  }),
  fields: () => ({
    [_result]: core.String,
    [_errorCode]: core.int,
    [_errorDetail]: core.String
  }),
  methods: () => ({
    [_isError]: dart.definiteFunctionType(core.bool, []),
    [_toString]: dart.definiteFunctionType(core.String, [])
  }),
  sfields: () => ({
    kInvalidParams: core.int,
    kExtensionError: core.int,
    kExtensionErrorMax: core.int,
    kExtensionErrorMin: core.int,
    invalidParams: core.int,
    extensionError: core.int,
    extensionErrorMax: core.int,
    extensionErrorMin: core.int
  }),
  statics: () => ({
    _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
    _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
  }),
  names: ['_errorCodeMessage', '_validateErrorCode']
});
developer.ServiceExtensionResponse.invalidParams = -32602;
developer.ServiceExtensionResponse.extensionError = -32000;
developer.ServiceExtensionResponse.extensionErrorMax = -32000;
developer.ServiceExtensionResponse.extensionErrorMin = -32016;
dart.defineLazy(developer.ServiceExtensionResponse, {
  get kInvalidParams() {
    return developer.ServiceExtensionResponse.invalidParams;
  },
  get kExtensionError() {
    return developer.ServiceExtensionResponse.extensionError;
  },
  get kExtensionErrorMax() {
    return developer.ServiceExtensionResponse.extensionErrorMax;
  },
  get kExtensionErrorMin() {
    return developer.ServiceExtensionResponse.extensionErrorMin;
  }
});
developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
developer.registerExtension = function(method, handler) {
  if (!(typeof method == 'string')) {
    dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
  }
  if (!dart.test(method[dartx.startsWith]('ext.'))) {
    dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
  }
  if (developer._lookupExtension(method) != null) {
    dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
  }
  if (!developer.ServiceExtensionHandler.is(handler)) {
    dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
  }
  developer._registerExtension(method, handler);
};
dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
developer.postEvent = function(eventKind, eventData) {
  if (!(typeof eventKind == 'string')) {
    dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
  }
  if (!core.Map.is(eventData)) {
    dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
  }
  let eventDataAsString = convert.JSON.encode(eventData);
  developer._postEvent(eventKind, eventDataAsString);
};
dart.fn(developer.postEvent, StringAndMapTovoid());
developer._postEvent = function(eventKind, eventData) {
};
dart.fn(developer._postEvent, StringAndStringTodynamic());
developer._lookupExtension = function(method) {
  return developer._extensions[dartx._get](method);
};
dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
developer._registerExtension = function(method, handler) {
  developer._extensions[dartx._set](method, handler);
};
dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
developer.UserTag = class UserTag extends core.Object {
  static new(label) {
    return developer._FakeUserTag.new(label);
  }
  static get defaultTag() {
    return developer._FakeUserTag._defaultTag;
  }
};
dart.setSignature(developer.UserTag, {
  constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
  sfields: () => ({MAX_USER_TAGS: core.int}),
  sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
});
developer.UserTag.MAX_USER_TAGS = 64;
developer._FakeUserTag = class _FakeUserTag extends core.Object {
  real(label) {
    this.label = label;
  }
  static new(label) {
    let existingTag = developer._FakeUserTag._instances[dartx._get](label);
    if (existingTag != null) {
      return developer._FakeUserTag._check(existingTag);
    }
    if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
      dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
    }
    let instance = new developer._FakeUserTag.real(label);
    developer._FakeUserTag._instances[dartx._set](label, instance);
    return instance;
  }
  makeCurrent() {
    let old = developer._currentTag;
    developer._currentTag = this;
    return old;
  }
};
dart.defineNamedConstructor(developer._FakeUserTag, 'real');
developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
dart.setSignature(developer._FakeUserTag, {
  constructors: () => ({
    real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
    new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
  }),
  fields: () => ({label: core.String}),
  methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
  sfields: () => ({
    _instances: core.Map,
    _defaultTag: developer.UserTag
  })
});
dart.defineLazy(developer._FakeUserTag, {
  get _instances() {
    return dart.map();
  },
  set _instances(_) {},
  get _defaultTag() {
    return developer._FakeUserTag.new('Default');
  }
});
dart.defineLazy(developer, {
  get _currentTag() {
    return developer._FakeUserTag._defaultTag;
  },
  set _currentTag(_) {}
});
developer.getCurrentTag = function() {
  return developer._currentTag;
};
dart.fn(developer.getCurrentTag, VoidToUserTag());
developer.Metric = class Metric extends core.Object {
  new(name, description) {
    this.name = name;
    this.description = description;
    if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
      dart.throw(new core.ArgumentError('Invalid Metric name.'));
    }
  }
};
dart.setSignature(developer.Metric, {
  constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
  fields: () => ({
    name: core.String,
    description: core.String
  })
});
const _value$0 = Symbol('_value');
const _toJSON = Symbol('_toJSON');
developer.Gauge = class Gauge extends developer.Metric {
  get value() {
    return this[_value$0];
  }
  set value(v) {
    if (dart.notNull(v) < dart.notNull(this.min)) {
      v = this.min;
    } else if (dart.notNull(v) > dart.notNull(this.max)) {
      v = this.max;
    }
    this[_value$0] = v;
  }
  new(name, description, min, max) {
    this.min = min;
    this.max = max;
    this[_value$0] = null;
    super.new(name, description);
    if (!(typeof this.min == 'number')) {
      dart.throw(new core.ArgumentError('min must be a double'));
    }
    if (!(typeof this.max == 'number')) {
      dart.throw(new core.ArgumentError('max must be a double'));
    }
    if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
      dart.throw(new core.ArgumentError('min must be less than max'));
    }
    this[_value$0] = this.min;
  }
  [_toJSON]() {
    let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
    return map;
  }
};
dart.setSignature(developer.Gauge, {
  constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
  fields: () => ({
    min: core.double,
    max: core.double,
    [_value$0]: core.double
  }),
  getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
  setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
  methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
});
developer.Counter = class Counter extends developer.Metric {
  new(name, description) {
    this[_value$0] = 0.0;
    super.new(name, description);
  }
  get value() {
    return this[_value$0];
  }
  set value(v) {
    this[_value$0] = v;
  }
  [_toJSON]() {
    let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
    return map;
  }
};
dart.setSignature(developer.Counter, {
  constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
  fields: () => ({[_value$0]: core.double}),
  getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
  setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
  methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
});
developer.Metrics = class Metrics extends core.Object {
  static register(metric) {
    if (!developer.Metric.is(metric)) {
      dart.throw(new core.ArgumentError('metric must be a Metric'));
    }
    if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
      dart.throw(new core.ArgumentError('Registered metrics have unique names'));
    }
    developer.Metrics._metrics[dartx._set](metric.name, metric);
  }
  static deregister(metric) {
    if (!developer.Metric.is(metric)) {
      dart.throw(new core.ArgumentError('metric must be a Metric'));
    }
    developer.Metrics._metrics[dartx.remove](metric.name);
  }
  static _printMetric(id) {
    let metric = developer.Metrics._metrics[dartx._get](id);
    if (metric == null) {
      return null;
    }
    return convert.JSON.encode(metric[_toJSON]());
  }
  static _printMetrics() {
    let metrics = [];
    for (let metric of developer.Metrics._metrics[dartx.values]) {
      metrics[dartx.add](metric[_toJSON]());
    }
    let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
    return convert.JSON.encode(map);
  }
};
dart.setSignature(developer.Metrics, {
  sfields: () => ({_metrics: MapOfString$Metric()}),
  statics: () => ({
    register: dart.definiteFunctionType(dart.void, [developer.Metric]),
    deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
    _printMetric: dart.definiteFunctionType(core.String, [core.String]),
    _printMetrics: dart.definiteFunctionType(core.String, [])
  }),
  names: ['register', 'deregister', '_printMetric', '_printMetrics']
});
dart.defineLazy(developer.Metrics, {
  get _metrics() {
    return MapOfString$Metric().new();
  }
});
developer._isProduct = false;
developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
const _appendArguments = Symbol('_appendArguments');
developer.Timeline = class Timeline extends core.Object {
  static startSync(name, opts) {
    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
    if (developer._isProduct) {
      return;
    }
    if (!(typeof name == 'string')) {
      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
    }
    if (!dart.test(developer._isDartStreamEnabled())) {
      developer.Timeline._stack[dartx.add](null);
      return;
    }
    let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
    if (core.Map.is(arguments$)) {
      block[_appendArguments](arguments$);
    }
    developer.Timeline._stack[dartx.add](block);
  }
  static finishSync() {
    if (developer._isProduct) {
      return;
    }
    if (developer.Timeline._stack[dartx.length] == 0) {
      dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
    }
    let block = developer.Timeline._stack[dartx.removeLast]();
    if (block == null) {
      return;
    }
    block.finish();
  }
  static instantSync(name, opts) {
    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
    if (developer._isProduct) {
      return;
    }
    if (!(typeof name == 'string')) {
      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
    }
    if (!dart.test(developer._isDartStreamEnabled())) {
      return;
    }
    let instantArguments = null;
    if (core.Map.is(arguments$)) {
      instantArguments = core.Map.from(arguments$);
    }
    developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
  }
  static timeSync(name, func, opts) {
    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
    developer.Timeline.startSync(name, {arguments: arguments$});
    try {
      return func();
    } finally {
      developer.Timeline.finishSync();
    }
  }
  static get now() {
    return developer._getTraceClock();
  }
};
dart.setSignature(developer.Timeline, {
  sfields: () => ({
    _stack: ListOf_SyncBlock(),
    _isolateId: core.int,
    _isolateIdString: core.String
  }),
  sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
  statics: () => ({
    startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
    finishSync: dart.definiteFunctionType(dart.void, []),
    instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
    timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
  }),
  names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
});
dart.defineLazy(developer.Timeline, {
  get _stack() {
    return ListOf_SyncBlock().new();
  },
  get _isolateId() {
    return developer._getIsolateNum();
  },
  get _isolateIdString() {
    return dart.toString(developer.Timeline._isolateId);
  }
});
const _stack = Symbol('_stack');
const _taskId = Symbol('_taskId');
const _start$1 = Symbol('_start');
const _finish = Symbol('_finish');
developer.TimelineTask = class TimelineTask extends core.Object {
  new() {
    this[_stack] = JSArrayOf_AsyncBlock().of([]);
    this[_taskId] = developer._getNextAsyncId();
  }
  withTaskId(taskId) {
    this[_stack] = JSArrayOf_AsyncBlock().of([]);
    this[_taskId] = taskId;
    if (!(typeof taskId == 'number')) {
      dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
    }
  }
  start(name, opts) {
    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
    if (developer._isProduct) {
      return;
    }
    if (!(typeof name == 'string')) {
      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
    }
    let block = new developer._AsyncBlock._(name, this[_taskId]);
    if (core.Map.is(arguments$)) {
      block[_appendArguments](arguments$);
    }
    this[_stack][dartx.add](block);
    block[_start$1]();
  }
  instant(name, opts) {
    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
    if (developer._isProduct) {
      return;
    }
    if (!(typeof name == 'string')) {
      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
    }
    let instantArguments = null;
    if (core.Map.is(arguments$)) {
      instantArguments = core.Map.from(arguments$);
    }
    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
  }
  finish() {
    if (developer._isProduct) {
      return;
    }
    if (this[_stack][dartx.length] == 0) {
      dart.throw(new core.StateError('Uneven calls to start and finish'));
    }
    let block = this[_stack][dartx.removeLast]();
    block[_finish]();
  }
  pass() {
    if (dart.notNull(this[_stack][dartx.length]) > 0) {
      dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
    }
    let r = this[_taskId];
    return r;
  }
};
dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
dart.setSignature(developer.TimelineTask, {
  constructors: () => ({
    new: dart.definiteFunctionType(developer.TimelineTask, []),
    withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
  }),
  fields: () => ({
    [_taskId]: core.int,
    [_stack]: ListOf_AsyncBlock()
  }),
  methods: () => ({
    start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
    instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
    finish: dart.definiteFunctionType(dart.void, []),
    pass: dart.definiteFunctionType(core.int, [])
  })
});
const _arguments$ = Symbol('_arguments');
developer._AsyncBlock = class _AsyncBlock extends core.Object {
  _(name, taskId) {
    this.name = name;
    this[_taskId] = taskId;
    this.category = 'Dart';
    this[_arguments$] = null;
  }
  [_start$1]() {
    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
  }
  [_finish]() {
    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
  }
  [_appendArguments](arguments$) {
    if (this[_arguments$] == null) {
      this[_arguments$] = dart.map();
    }
    this[_arguments$][dartx.addAll](arguments$);
  }
};
dart.defineNamedConstructor(developer._AsyncBlock, '_');
dart.setSignature(developer._AsyncBlock, {
  constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
  fields: () => ({
    category: core.String,
    name: core.String,
    [_taskId]: core.int,
    [_arguments$]: core.Map
  }),
  methods: () => ({
    [_start$1]: dart.definiteFunctionType(dart.void, []),
    [_finish]: dart.definiteFunctionType(dart.void, []),
    [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
  })
});
const _startCpu = Symbol('_startCpu');
developer._SyncBlock = class _SyncBlock extends core.Object {
  _(name, start, startCpu) {
    this.name = name;
    this[_start$1] = start;
    this[_startCpu] = startCpu;
    this.category = 'Dart';
    this[_arguments$] = null;
  }
  finish() {
    developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
  }
  [_appendArguments](arguments$) {
    if (arguments$ == null) {
      return;
    }
    if (this[_arguments$] == null) {
      this[_arguments$] = dart.map();
    }
    this[_arguments$][dartx.addAll](arguments$);
  }
};
dart.defineNamedConstructor(developer._SyncBlock, '_');
dart.setSignature(developer._SyncBlock, {
  constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
  fields: () => ({
    category: core.String,
    name: core.String,
    [_arguments$]: core.Map,
    [_start$1]: core.int,
    [_startCpu]: core.int
  }),
  methods: () => ({
    finish: dart.definiteFunctionType(dart.void, []),
    [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
  })
});
developer._fastPathArguments = null;
developer._argumentsAsJson = function(arguments$) {
  if (arguments$ == null || arguments$[dartx.length] == 0) {
    if (developer._fastPathArguments == null) {
      developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
    }
    return developer._fastPathArguments;
  }
  arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
  return convert.JSON.encode(arguments$);
};
dart.fn(developer._argumentsAsJson, MapToString());
developer._isDartStreamEnabled = function() {
  return false;
};
dart.fn(developer._isDartStreamEnabled, VoidTobool());
developer._getNextAsyncId = function() {
  return 0;
};
dart.fn(developer._getNextAsyncId, VoidToint());
developer._getTraceClock = function() {
  let x = developer._clockValue;
  developer._clockValue = dart.notNull(x) + 1;
  return x;
};
dart.fn(developer._getTraceClock, VoidToint());
developer._getThreadCpuClock = function() {
  return -1;
};
dart.fn(developer._getThreadCpuClock, VoidToint());
developer._getIsolateNum = function() {
  return 0;
};
dart.fn(developer._getIsolateNum, VoidToint());
developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
};
dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
};
dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
};
dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
  new(serverUri) {
    this.majorVersion = developer._getServiceMajorVersion();
    this.minorVersion = developer._getServiceMinorVersion();
    this.serverUri = serverUri;
  }
  toString() {
    if (this.serverUri != null) {
      return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
    } else {
      return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
    }
  }
};
dart.setSignature(developer.ServiceProtocolInfo, {
  constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
  fields: () => ({
    majorVersion: core.int,
    minorVersion: core.int,
    serverUri: core.Uri
  })
});
developer.Service = class Service extends core.Object {
  static getInfo() {
    return dart.async(function*() {
      let receivePort = isolate.RawReceivePort.new();
      let uriCompleter = CompleterOfUri().new();
      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
      developer._getServerInfo(receivePort.sendPort);
      let uri = (yield uriCompleter.future);
      receivePort.close();
      return new developer.ServiceProtocolInfo(uri);
    }, developer.ServiceProtocolInfo);
  }
  static controlWebServer(opts) {
    return dart.async(function*(opts) {
      let enable = opts && 'enable' in opts ? opts.enable : false;
      if (!(typeof enable == 'boolean')) {
        dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
      }
      let receivePort = isolate.RawReceivePort.new();
      let uriCompleter = CompleterOfUri().new();
      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
      developer._webServerControl(receivePort.sendPort, enable);
      let uri = (yield uriCompleter.future);
      receivePort.close();
      return new developer.ServiceProtocolInfo(uri);
    }, developer.ServiceProtocolInfo, opts);
  }
};
dart.setSignature(developer.Service, {
  statics: () => ({
    getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
    controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
  }),
  names: ['getInfo', 'controlWebServer']
});
developer._getServerInfo = function(sp) {
  sp.send(null);
};
dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
developer._webServerControl = function(sp, enable) {
  sp.send(null);
};
dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
developer._getServiceMajorVersion = function() {
  return 0;
};
dart.fn(developer._getServiceMajorVersion, VoidToint());
developer._getServiceMinorVersion = function() {
  return 0;
};
dart.fn(developer._getServiceMinorVersion, VoidToint());
io.BytesBuilder = class BytesBuilder extends core.Object {
  static new(opts) {
    let copy = opts && 'copy' in opts ? opts.copy : true;
    if (dart.test(copy)) {
      return new io._CopyingBytesBuilder();
    } else {
      return new io._BytesBuilder();
    }
  }
};
dart.setSignature(io.BytesBuilder, {
  constructors: () => ({new: dart.definiteFunctionType(io.BytesBuilder, [], {copy: core.bool})})
});
const _length$2 = Symbol('_length');
const _buffer$ = Symbol('_buffer');
const _pow2roundup = Symbol('_pow2roundup');
io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
  new() {
    this[_length$2] = 0;
    this[_buffer$] = null;
  }
  add(bytes) {
    let bytesLength = bytes[dartx.length];
    if (bytesLength == 0) return;
    let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
    if (this[_buffer$] == null) {
      let size = this[_pow2roundup](required);
      size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
      this[_buffer$] = typed_data.Uint8List.new(size);
    } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
      let size = dart.notNull(this[_pow2roundup](required)) * 2;
      let newBuffer = typed_data.Uint8List.new(size);
      newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
      this[_buffer$] = newBuffer;
    }
    dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
    if (typed_data.Uint8List.is(bytes)) {
      this[_buffer$][dartx.setRange](this[_length$2], required, bytes);
    } else {
      for (let i = 0; i < dart.notNull(bytesLength); i++) {
        this[_buffer$][dartx._set](dart.notNull(this[_length$2]) + i, bytes[dartx._get](i));
      }
    }
    this[_length$2] = required;
  }
  addByte(byte) {
    this.add(JSArrayOfint().of([byte]));
  }
  takeBytes() {
    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
    let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
    this.clear();
    return buffer;
  }
  toBytes() {
    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
    return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
  }
  get length() {
    return this[_length$2];
  }
  get isEmpty() {
    return this[_length$2] == 0;
  }
  get isNotEmpty() {
    return this[_length$2] != 0;
  }
  clear() {
    this[_length$2] = 0;
    this[_buffer$] = null;
  }
  [_pow2roundup](x) {
    x = dart.notNull(x) - 1;
    x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](4)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](8)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](16)) >>> 0;
    return dart.notNull(x) + 1;
  }
};
io._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setSignature(io._CopyingBytesBuilder, {
  fields: () => ({
    [_length$2]: core.int,
    [_buffer$]: typed_data.Uint8List
  }),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addByte: dart.definiteFunctionType(dart.void, [core.int]),
    takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
    toBytes: dart.definiteFunctionType(core.List$(core.int), []),
    clear: dart.definiteFunctionType(dart.void, []),
    [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
  }),
  sfields: () => ({_INIT_SIZE: core.int})
});
io._CopyingBytesBuilder._INIT_SIZE = 1024;
const _chunks = Symbol('_chunks');
io._BytesBuilder = class _BytesBuilder extends core.Object {
  new() {
    this[_chunks] = JSArrayOfListOfint().of([]);
    this[_length$2] = 0;
  }
  add(bytes) {
    if (!typed_data.Uint8List.is(bytes)) {
      bytes = typed_data.Uint8List.fromList(bytes);
    }
    this[_chunks][dartx.add](bytes);
    this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
  }
  addByte(byte) {
    this.add(JSArrayOfint().of([byte]));
  }
  takeBytes() {
    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
    if (this[_chunks][dartx.length] == 1) {
      let buffer = this[_chunks][dartx.single];
      this.clear();
      return buffer;
    }
    let buffer = typed_data.Uint8List.new(this[_length$2]);
    let offset = 0;
    for (let chunk of this[_chunks]) {
      buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
      offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
    }
    this.clear();
    return buffer;
  }
  toBytes() {
    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
    let buffer = typed_data.Uint8List.new(this[_length$2]);
    let offset = 0;
    for (let chunk of this[_chunks]) {
      buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
      offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
    }
    return buffer;
  }
  get length() {
    return this[_length$2];
  }
  get isEmpty() {
    return this[_length$2] == 0;
  }
  get isNotEmpty() {
    return this[_length$2] != 0;
  }
  clear() {
    this[_length$2] = 0;
    this[_chunks][dartx.clear]();
  }
};
io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setSignature(io._BytesBuilder, {
  fields: () => ({
    [_length$2]: core.int,
    [_chunks]: ListOfListOfint()
  }),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addByte: dart.definiteFunctionType(dart.void, [core.int]),
    takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
    toBytes: dart.definiteFunctionType(core.List$(core.int), []),
    clear: dart.definiteFunctionType(dart.void, [])
  })
});
io._SUCCESS_RESPONSE = 0;
io._ILLEGAL_ARGUMENT_RESPONSE = 1;
io._OSERROR_RESPONSE = 2;
io._FILE_CLOSED_RESPONSE = 3;
io._ERROR_RESPONSE_ERROR_TYPE = 0;
io._OSERROR_RESPONSE_ERROR_CODE = 1;
io._OSERROR_RESPONSE_MESSAGE = 2;
io._isErrorResponse = function(response) {
  return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
};
dart.fn(io._isErrorResponse, dynamicTobool$());
io._exceptionFromResponse = function(response, message, path) {
  dart.assert(io._isErrorResponse(response));
  switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
    case io._ILLEGAL_ARGUMENT_RESPONSE:
    {
      return new core.ArgumentError();
    }
    case io._OSERROR_RESPONSE:
    {
      let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
      return new io.FileSystemException(message, path, err);
    }
    case io._FILE_CLOSED_RESPONSE:
    {
      return new io.FileSystemException("File closed", path);
    }
    default:
    {
      return core.Exception.new("Unknown error");
    }
  }
};
dart.fn(io._exceptionFromResponse, dynamicAndStringAndStringTodynamic());
io.IOException = class IOException extends core.Object {
  toString() {
    return "IOException";
  }
};
io.IOException[dart.implements] = () => [core.Exception];
io.OSError = class OSError extends core.Object {
  new(message, errorCode) {
    if (message === void 0) message = "";
    if (errorCode === void 0) errorCode = io.OSError.noErrorCode;
    this.message = message;
    this.errorCode = errorCode;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write("OS Error");
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(": ");
      sb.write(this.message);
      if (this.errorCode != io.OSError.noErrorCode) {
        sb.write(", errno = ");
        sb.write(dart.toString(this.errorCode));
      }
    } else if (this.errorCode != io.OSError.noErrorCode) {
      sb.write(": errno = ");
      sb.write(dart.toString(this.errorCode));
    }
    return sb.toString();
  }
};
dart.setSignature(io.OSError, {
  constructors: () => ({new: dart.definiteFunctionType(io.OSError, [], [core.String, core.int])}),
  fields: () => ({
    message: core.String,
    errorCode: core.int
  }),
  sfields: () => ({noErrorCode: core.int})
});
io.OSError.noErrorCode = -1;
io._BufferAndStart = class _BufferAndStart extends core.Object {
  new(buffer, start) {
    this.buffer = buffer;
    this.start = start;
  }
};
dart.setSignature(io._BufferAndStart, {
  constructors: () => ({new: dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int])}),
  fields: () => ({
    buffer: core.List,
    start: core.int
  })
});
io._ensureFastAndSerializableByteData = function(buffer, start, end) {
  if (typed_data.Uint8List.is(buffer) || typed_data.Int8List.is(buffer)) {
    return new io._BufferAndStart(buffer, start);
  }
  let length = dart.notNull(end) - dart.notNull(start);
  let newBuffer = typed_data.Uint8List.new(length);
  let j = start;
  for (let i = 0; i < length; i++) {
    let value = core.int._check(buffer[dartx._get](j));
    if (!(typeof value == 'number')) {
      dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
    }
    newBuffer[dartx._set](i, value);
    j = dart.notNull(j) + 1;
  }
  return new io._BufferAndStart(newBuffer, 0);
};
dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
io._IOCrypto = class _IOCrypto extends core.Object {
  static getRandomBytes(count) {
    dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
  }
};
dart.setSignature(io._IOCrypto, {
  statics: () => ({getRandomBytes: dart.definiteFunctionType(typed_data.Uint8List, [core.int])}),
  names: ['getRandomBytes']
});
io._CryptoUtils = class _CryptoUtils extends core.Object {
  static bytesToHex(bytes) {
    let result = new core.StringBuffer();
    for (let part of bytes) {
      result.write(dart.str`${dart.notNull(part) < 16 ? '0' : ''}${part[dartx.toRadixString](16)}`);
    }
    return result.toString();
  }
  static bytesToBase64(bytes, urlSafe, addLineSeparator) {
    if (urlSafe === void 0) urlSafe = false;
    if (addLineSeparator === void 0) addLineSeparator = false;
    let len = bytes[dartx.length];
    if (len == 0) {
      return "";
    }
    let lookup = dart.test(urlSafe) ? io._CryptoUtils._encodeTableUrlSafe : io._CryptoUtils._encodeTable;
    let remainderLength = dart.asInt(len[dartx.remainder](3));
    let chunkLength = dart.notNull(len) - dart.notNull(remainderLength);
    let outputLen = (dart.notNull(len) / 3)[dartx.truncate]() * 4 + (dart.notNull(remainderLength) > 0 ? 4 : 0);
    if (dart.test(addLineSeparator)) {
      outputLen = outputLen + (((outputLen - 1) / io._CryptoUtils.LINE_LENGTH)[dartx.truncate]() << 1 >>> 0);
    }
    let out = ListOfint().new(outputLen);
    let j = 0, i = 0, c = 0;
    while (i < chunkLength) {
      let x = (dart.notNull(bytes[dartx._get](i++)) << 16 & 16777215 | dart.notNull(bytes[dartx._get](i++)) << 8 & 16777215 | dart.notNull(bytes[dartx._get](i++))) >>> 0;
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](18)));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 12 & 63));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 6 & 63));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x & 63));
      if (dart.test(addLineSeparator) && ++c == 19 && j < outputLen - 2) {
        out[dartx._set](j++, io._CryptoUtils.CR);
        out[dartx._set](j++, io._CryptoUtils.LF);
        c = 0;
      }
    }
    if (remainderLength == 1) {
      let x = bytes[dartx._get](i);
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(x) << 4 & 63));
      out[dartx._set](j++, io._CryptoUtils.PAD);
      out[dartx._set](j++, io._CryptoUtils.PAD);
    } else if (remainderLength == 2) {
      let x = bytes[dartx._get](i);
      let y = bytes[dartx._get](i + 1);
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
      out[dartx._set](j++, lookup[dartx.codeUnitAt]((dart.notNull(x) << 4 | dart.notNull(y) >> 4) & 63));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(y) << 2 & 63));
      out[dartx._set](j++, io._CryptoUtils.PAD);
    }
    return core.String.fromCharCodes(out);
  }
  static base64StringToBytes(input, ignoreInvalidCharacters) {
    if (ignoreInvalidCharacters === void 0) ignoreInvalidCharacters = true;
    let len = input[dartx.length];
    if (len == 0) {
      return ListOfint().new(0);
    }
    let extrasLen = 0;
    for (let i = 0; i < dart.notNull(len); i++) {
      let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i));
      if (dart.notNull(c) < 0) {
        extrasLen++;
        if (c == -2 && !dart.test(ignoreInvalidCharacters)) {
          dart.throw(new core.FormatException(dart.str`Invalid character: ${input[dartx._get](i)}`));
        }
      }
    }
    if ((dart.notNull(len) - extrasLen)[dartx['%']](4) != 0) {
      dart.throw(new core.FormatException(dart.str`Size of Base 64 characters in Input\n          must be a multiple of 4. Input: ${input}`));
    }
    let padLength = 0;
    for (let i = dart.notNull(len) - 1; i >= 0; i--) {
      let currentCodeUnit = input[dartx.codeUnitAt](i);
      if (dart.notNull(io._CryptoUtils._decodeTable[dartx._get](currentCodeUnit)) > 0) break;
      if (currentCodeUnit == io._CryptoUtils.PAD) padLength++;
    }
    let outputLen = ((dart.notNull(len) - extrasLen) * 6)[dartx['>>']](3) - padLength;
    let out = ListOfint().new(outputLen);
    for (let i = 0, o = 0; o < outputLen;) {
      let x = 0;
      for (let j = 4; j > 0;) {
        let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i++));
        if (dart.notNull(c) >= 0) {
          x = (x << 6 & 16777215 | dart.notNull(c)) >>> 0;
          j--;
        }
      }
      out[dartx._set](o++, x[dartx['>>']](16));
      if (o < outputLen) {
        out[dartx._set](o++, x >> 8 & 255);
        if (o < outputLen) out[dartx._set](o++, x & 255);
      }
    }
    return out;
  }
};
dart.setSignature(io._CryptoUtils, {
  sfields: () => ({
    PAD: core.int,
    CR: core.int,
    LF: core.int,
    LINE_LENGTH: core.int,
    _encodeTable: core.String,
    _encodeTableUrlSafe: core.String,
    _decodeTable: ListOfint()
  }),
  statics: () => ({
    bytesToHex: dart.definiteFunctionType(core.String, [ListOfint()]),
    bytesToBase64: dart.definiteFunctionType(core.String, [ListOfint()], [core.bool, core.bool]),
    base64StringToBytes: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.bool])
  }),
  names: ['bytesToHex', 'bytesToBase64', 'base64StringToBytes']
});
io._CryptoUtils.PAD = 61;
io._CryptoUtils.CR = 13;
io._CryptoUtils.LF = 10;
io._CryptoUtils.LINE_LENGTH = 76;
io._CryptoUtils._encodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
io._CryptoUtils._encodeTableUrlSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
io._CryptoUtils._decodeTable = dart.constList([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, 0, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2], core.int);
io._MASK_8 = 255;
io._MASK_32 = 4294967295;
io._BITS_PER_BYTE = 8;
io._BYTES_PER_WORD = 4;
const _chunkSizeInWords = Symbol('_chunkSizeInWords');
const _digestSizeInWords = Symbol('_digestSizeInWords');
const _bigEndianWords = Symbol('_bigEndianWords');
const _pendingData = Symbol('_pendingData');
const _lengthInBytes = Symbol('_lengthInBytes');
const _currentChunk = Symbol('_currentChunk');
const _h = Symbol('_h');
const _digestCalled = Symbol('_digestCalled');
const _iterate = Symbol('_iterate');
const _resultAsBytes = Symbol('_resultAsBytes');
const _finalizeData = Symbol('_finalizeData');
const _add32 = Symbol('_add32');
const _roundUp = Symbol('_roundUp');
const _rotl32 = Symbol('_rotl32');
const _wordToBytes = Symbol('_wordToBytes');
const _bytesToChunk = Symbol('_bytesToChunk');
const _updateHash = Symbol('_updateHash');
io._HashBase = class _HashBase extends core.Object {
  new(chunkSizeInWords, digestSizeInWords, bigEndianWords) {
    this[_chunkSizeInWords] = chunkSizeInWords;
    this[_digestSizeInWords] = digestSizeInWords;
    this[_bigEndianWords] = bigEndianWords;
    this[_pendingData] = JSArrayOfint().of([]);
    this[_lengthInBytes] = 0;
    this[_currentChunk] = null;
    this[_h] = null;
    this[_digestCalled] = false;
    this[_currentChunk] = ListOfint().new(this[_chunkSizeInWords]);
    this[_h] = ListOfint().new(this[_digestSizeInWords]);
  }
  add(data) {
    if (dart.test(this[_digestCalled])) {
      dart.throw(new core.StateError('Hash update method called after digest was retrieved'));
    }
    this[_lengthInBytes] = dart.notNull(this[_lengthInBytes]) + dart.notNull(data[dartx.length]);
    this[_pendingData][dartx.addAll](data);
    this[_iterate]();
  }
  close() {
    if (dart.test(this[_digestCalled])) {
      return ListOfint()._check(this[_resultAsBytes]());
    }
    this[_digestCalled] = true;
    this[_finalizeData]();
    this[_iterate]();
    dart.assert(this[_pendingData][dartx.length] == 0);
    return ListOfint()._check(this[_resultAsBytes]());
  }
  get blockSize() {
    return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
  }
  [_add32](x, y) {
    return dart.dsend(dart.dsend(x, '+', y), '&', io._MASK_32);
  }
  [_roundUp](val, n) {
    return dart.dsend(dart.dsend(dart.dsend(val, '+', n), '-', 1), '&', dart.dsend(n, '_negate'));
  }
  [_rotl32](val, shift) {
    let mod_shift = dart.notNull(shift) & 31;
    return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
  }
  [_resultAsBytes]() {
    let result = [];
    for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
      result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
    }
    return result;
  }
  [_bytesToChunk](data, dataIndex) {
    dart.assert(dart.notNull(data[dartx.length]) - dart.notNull(dataIndex) >= dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD);
    for (let wordIndex = 0; wordIndex < dart.notNull(this[_chunkSizeInWords]); wordIndex++) {
      let w3 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dataIndex) : data[dartx._get](dart.notNull(dataIndex) + 3);
      let w2 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 1) : data[dartx._get](dart.notNull(dataIndex) + 2);
      let w1 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 2) : data[dartx._get](dart.notNull(dataIndex) + 1);
      let w0 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 3) : data[dartx._get](dataIndex);
      dataIndex = dart.notNull(dataIndex) + 4;
      let word = (dart.notNull(w3) & 255) << 24 >>> 0;
      word = (word | (dart.notNull(w2) & io._MASK_8) << 16) >>> 0;
      word = (word | (dart.notNull(w1) & io._MASK_8) << 8) >>> 0;
      word = (word | dart.notNull(w0) & io._MASK_8) >>> 0;
      this[_currentChunk][dartx._set](wordIndex, word);
    }
  }
  [_wordToBytes](word) {
    let bytes = ListOfint().new(io._BYTES_PER_WORD);
    bytes[dartx._set](0, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 24 : 0) & io._MASK_8);
    bytes[dartx._set](1, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 16 : 8) & io._MASK_8);
    bytes[dartx._set](2, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 8 : 16) & io._MASK_8);
    bytes[dartx._set](3, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 0 : 24) & io._MASK_8);
    return bytes;
  }
  [_iterate]() {
    let len = this[_pendingData][dartx.length];
    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
    if (dart.notNull(len) >= chunkSizeInBytes) {
      let index = 0;
      for (; dart.notNull(len) - index >= chunkSizeInBytes; index = index + chunkSizeInBytes) {
        this[_bytesToChunk](this[_pendingData], index);
        this[_updateHash](this[_currentChunk]);
      }
      this[_pendingData] = this[_pendingData][dartx.sublist](index, len);
    }
  }
  [_finalizeData]() {
    this[_pendingData][dartx.add](128);
    let contentsLength = dart.notNull(this[_lengthInBytes]) + 9;
    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
    let finalizedLength = this[_roundUp](contentsLength, chunkSizeInBytes);
    let zeroPadding = dart.dsend(finalizedLength, '-', contentsLength);
    for (let i = 0; i < dart.notNull(core.num._check(zeroPadding)); i++) {
      this[_pendingData][dartx.add](0);
    }
    let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
    dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
    if (dart.test(this[_bigEndianWords])) {
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
    } else {
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
    }
  }
};
dart.setSignature(io._HashBase, {
  constructors: () => ({new: dart.definiteFunctionType(io._HashBase, [core.int, core.int, core.bool])}),
  fields: () => ({
    [_chunkSizeInWords]: core.int,
    [_digestSizeInWords]: core.int,
    [_bigEndianWords]: core.bool,
    [_lengthInBytes]: core.int,
    [_pendingData]: ListOfint(),
    [_currentChunk]: ListOfint(),
    [_h]: ListOfint(),
    [_digestCalled]: core.bool
  }),
  getters: () => ({blockSize: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    add: dart.definiteFunctionType(dart.dynamic, [ListOfint()]),
    close: dart.definiteFunctionType(core.List$(core.int), []),
    [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
    [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
    [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
    [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
    [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
    [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
  })
});
io._MD5 = class _MD5 extends io._HashBase {
  new() {
    super.new(16, 4, false);
    this[_h][dartx._set](0, 1732584193);
    this[_h][dartx._set](1, 4023233417);
    this[_h][dartx._set](2, 2562383102);
    this[_h][dartx._set](3, 271733878);
  }
  newInstance() {
    return new io._MD5();
  }
  [_updateHash](m) {
    dart.assert(m[dartx.length] == 16);
    let a = this[_h][dartx._get](0);
    let b = this[_h][dartx._get](1);
    let c = this[_h][dartx._get](2);
    let d = this[_h][dartx._get](3);
    let t0 = null;
    let t1 = null;
    for (let i = 0; i < 64; i++) {
      if (i < 16) {
        t0 = (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & io._MASK_32 & dart.notNull(d)) >>> 0;
        t1 = i;
      } else if (i < 32) {
        t0 = (dart.notNull(d) & dart.notNull(b) | ~dart.notNull(d) & io._MASK_32 & dart.notNull(c)) >>> 0;
        t1 = (5 * i + 1)[dartx['%']](16);
      } else if (i < 48) {
        t0 = (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0;
        t1 = (3 * i + 5)[dartx['%']](16);
      } else {
        t0 = (dart.notNull(c) ^ (dart.notNull(b) | ~dart.notNull(d) & io._MASK_32)) >>> 0;
        t1 = (7 * i)[dartx['%']](16);
      }
      let temp = d;
      d = c;
      c = b;
      b = core.int._check(this[_add32](b, this[_rotl32](core.int._check(this[_add32](this[_add32](a, t0), this[_add32](io._MD5._k[dartx._get](i), m[dartx._get](core.int._check(t1))))), io._MD5._r[dartx._get](i))));
      a = temp;
    }
    this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
    this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
    this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
    this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
  }
};
dart.setSignature(io._MD5, {
  constructors: () => ({new: dart.definiteFunctionType(io._MD5, [])}),
  methods: () => ({
    newInstance: dart.definiteFunctionType(io._MD5, []),
    [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
  }),
  sfields: () => ({
    _k: ListOfint(),
    _r: ListOfint()
  })
});
io._MD5._k = dart.constList([3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745], core.int);
io._MD5._r = dart.constList([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21], core.int);
const _w = Symbol('_w');
io._SHA1 = class _SHA1 extends io._HashBase {
  new() {
    this[_w] = ListOfint().new(80);
    super.new(16, 5, true);
    this[_h][dartx._set](0, 1732584193);
    this[_h][dartx._set](1, 4023233417);
    this[_h][dartx._set](2, 2562383102);
    this[_h][dartx._set](3, 271733878);
    this[_h][dartx._set](4, 3285377520);
  }
  newInstance() {
    return new io._SHA1();
  }
  [_updateHash](m) {
    dart.assert(m[dartx.length] == 16);
    let a = this[_h][dartx._get](0);
    let b = this[_h][dartx._get](1);
    let c = this[_h][dartx._get](2);
    let d = this[_h][dartx._get](3);
    let e = this[_h][dartx._get](4);
    for (let i = 0; i < 80; i++) {
      if (i < 16) {
        this[_w][dartx._set](i, m[dartx._get](i));
      } else {
        let n = (dart.notNull(this[_w][dartx._get](i - 3)) ^ dart.notNull(this[_w][dartx._get](i - 8)) ^ dart.notNull(this[_w][dartx._get](i - 14)) ^ dart.notNull(this[_w][dartx._get](i - 16))) >>> 0;
        this[_w][dartx._set](i, this[_rotl32](n, 1));
      }
      let t = this[_add32](this[_add32](this[_rotl32](a, 5), e), this[_w][dartx._get](i));
      if (i < 20) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & dart.notNull(d)) >>> 0), 1518500249);
      } else if (i < 40) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 1859775393);
      } else if (i < 60) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | dart.notNull(b) & dart.notNull(d) | dart.notNull(c) & dart.notNull(d)) >>> 0), 2400959708);
      } else {
        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 3395469782);
      }
      e = d;
      d = c;
      c = this[_rotl32](b, 30);
      b = a;
      a = core.int._check(dart.dsend(t, '&', io._MASK_32));
    }
    this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
    this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
    this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
    this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
    this[_h][dartx._set](4, core.int._check(this[_add32](e, this[_h][dartx._get](4))));
  }
};
dart.setSignature(io._SHA1, {
  constructors: () => ({new: dart.definiteFunctionType(io._SHA1, [])}),
  fields: () => ({[_w]: ListOfint()}),
  methods: () => ({
    newInstance: dart.definiteFunctionType(io._SHA1, []),
    [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
  })
});
io.ZLibOption = class ZLibOption extends core.Object {};
dart.setSignature(io.ZLibOption, {
  sfields: () => ({
    MIN_WINDOW_BITS: core.int,
    MAX_WINDOW_BITS: core.int,
    DEFAULT_WINDOW_BITS: core.int,
    MIN_LEVEL: core.int,
    MAX_LEVEL: core.int,
    DEFAULT_LEVEL: core.int,
    MIN_MEM_LEVEL: core.int,
    MAX_MEM_LEVEL: core.int,
    DEFAULT_MEM_LEVEL: core.int,
    STRATEGY_FILTERED: core.int,
    STRATEGY_HUFFMAN_ONLY: core.int,
    STRATEGY_RLE: core.int,
    STRATEGY_FIXED: core.int,
    STRATEGY_DEFAULT: core.int
  })
});
io.ZLibOption.MIN_WINDOW_BITS = 8;
io.ZLibOption.MAX_WINDOW_BITS = 15;
io.ZLibOption.DEFAULT_WINDOW_BITS = 15;
io.ZLibOption.MIN_LEVEL = -1;
io.ZLibOption.MAX_LEVEL = 9;
io.ZLibOption.DEFAULT_LEVEL = 6;
io.ZLibOption.MIN_MEM_LEVEL = 1;
io.ZLibOption.MAX_MEM_LEVEL = 9;
io.ZLibOption.DEFAULT_MEM_LEVEL = 8;
io.ZLibOption.STRATEGY_FILTERED = 1;
io.ZLibOption.STRATEGY_HUFFMAN_ONLY = 2;
io.ZLibOption.STRATEGY_RLE = 3;
io.ZLibOption.STRATEGY_FIXED = 4;
io.ZLibOption.STRATEGY_DEFAULT = 0;
io.ZLibCodec = class ZLibCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    let gzip = opts && 'gzip' in opts ? opts.gzip : false;
    this.level = level;
    this.windowBits = windowBits;
    this.memLevel = memLevel;
    this.strategy = strategy;
    this.dictionary = dictionary;
    this.raw = raw;
    this.gzip = gzip;
    super.new();
    io._validateZLibeLevel(this.level);
    io._validateZLibMemLevel(this.memLevel);
    io._validateZLibStrategy(this.strategy);
    io._validateZLibWindowBits(this.windowBits);
  }
  _default() {
    this.level = io.ZLibOption.DEFAULT_LEVEL;
    this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
    this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
    this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
    this.raw = false;
    this.gzip = false;
    this.dictionary = null;
    super.new();
  }
  get encoder() {
    return new io.ZLibEncoder({gzip: false, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
  }
  get decoder() {
    return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
  }
};
dart.addSimpleTypeTests(io.ZLibCodec);
dart.defineNamedConstructor(io.ZLibCodec, '_default');
dart.setSignature(io.ZLibCodec, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.ZLibCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
    _default: dart.definiteFunctionType(io.ZLibCodec, [])
  }),
  fields: () => ({
    gzip: core.bool,
    level: core.int,
    memLevel: core.int,
    strategy: core.int,
    windowBits: core.int,
    raw: core.bool,
    dictionary: ListOfint()
  }),
  getters: () => ({
    encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
    decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
  })
});
io.ZLIB = dart.const(new io.ZLibCodec._default());
io.GZipCodec = class GZipCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    let gzip = opts && 'gzip' in opts ? opts.gzip : true;
    this.level = level;
    this.windowBits = windowBits;
    this.memLevel = memLevel;
    this.strategy = strategy;
    this.dictionary = dictionary;
    this.raw = raw;
    this.gzip = gzip;
    super.new();
    io._validateZLibeLevel(this.level);
    io._validateZLibMemLevel(this.memLevel);
    io._validateZLibStrategy(this.strategy);
    io._validateZLibWindowBits(this.windowBits);
  }
  _default() {
    this.level = io.ZLibOption.DEFAULT_LEVEL;
    this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
    this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
    this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
    this.raw = false;
    this.gzip = true;
    this.dictionary = null;
    super.new();
  }
  get encoder() {
    return new io.ZLibEncoder({gzip: true, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
  }
  get decoder() {
    return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
  }
};
dart.addSimpleTypeTests(io.GZipCodec);
dart.defineNamedConstructor(io.GZipCodec, '_default');
dart.setSignature(io.GZipCodec, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.GZipCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
    _default: dart.definiteFunctionType(io.GZipCodec, [])
  }),
  fields: () => ({
    gzip: core.bool,
    level: core.int,
    memLevel: core.int,
    strategy: core.int,
    windowBits: core.int,
    dictionary: ListOfint(),
    raw: core.bool
  }),
  getters: () => ({
    encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
    decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
  })
});
io.GZIP = dart.const(new io.GZipCodec._default());
io.ZLibEncoder = class ZLibEncoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let gzip = opts && 'gzip' in opts ? opts.gzip : false;
    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    this.gzip = gzip;
    this.level = level;
    this.windowBits = windowBits;
    this.memLevel = memLevel;
    this.strategy = strategy;
    this.dictionary = dictionary;
    this.raw = raw;
    super.new();
    io._validateZLibeLevel(this.level);
    io._validateZLibMemLevel(this.memLevel);
    io._validateZLibStrategy(this.strategy);
    io._validateZLibWindowBits(this.windowBits);
  }
  convert(bytes) {
    let sink = new io._BufferSink();
    let _ = this.startChunkedConversion(sink);
    _.add(bytes);
    _.close();
    return sink.builder.takeBytes();
  }
  startChunkedConversion(sink) {
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new io._ZLibEncoderSink(convert.ByteConversionSink._check(sink), this.gzip, this.level, this.windowBits, this.memLevel, this.strategy, this.dictionary, this.raw);
  }
};
dart.addSimpleTypeTests(io.ZLibEncoder);
dart.setSignature(io.ZLibEncoder, {
  constructors: () => ({new: dart.definiteFunctionType(io.ZLibEncoder, [], {gzip: core.bool, level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool})}),
  fields: () => ({
    gzip: core.bool,
    level: core.int,
    memLevel: core.int,
    strategy: core.int,
    windowBits: core.int,
    dictionary: ListOfint(),
    raw: core.bool
  }),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
  })
});
io.ZLibDecoder = class ZLibDecoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    this.windowBits = windowBits;
    this.dictionary = dictionary;
    this.raw = raw;
    super.new();
    io._validateZLibWindowBits(this.windowBits);
  }
  convert(bytes) {
    let sink = new io._BufferSink();
    let _ = this.startChunkedConversion(sink);
    _.add(bytes);
    _.close();
    return sink.builder.takeBytes();
  }
  startChunkedConversion(sink) {
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new io._ZLibDecoderSink(convert.ByteConversionSink._check(sink), this.windowBits, this.dictionary, this.raw);
  }
};
dart.addSimpleTypeTests(io.ZLibDecoder);
dart.setSignature(io.ZLibDecoder, {
  constructors: () => ({new: dart.definiteFunctionType(io.ZLibDecoder, [], {windowBits: core.int, dictionary: ListOfint(), raw: core.bool})}),
  fields: () => ({
    windowBits: core.int,
    dictionary: ListOfint(),
    raw: core.bool
  }),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
  })
});
io._BufferSink = class _BufferSink extends convert.ByteConversionSink {
  new() {
    this.builder = io.BytesBuilder.new({copy: false});
    super.new();
  }
  add(chunk) {
    this.builder.add(chunk);
  }
  addSlice(chunk, start, end, isLast) {
    if (typed_data.Uint8List.is(chunk)) {
      let list = chunk;
      this.builder.add(typed_data.Uint8List.view(list[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
    } else {
      this.builder.add(chunk[dartx.sublist](start, end));
    }
  }
  close() {}
};
dart.setSignature(io._BufferSink, {
  fields: () => ({builder: io.BytesBuilder}),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
const _sink$0 = Symbol('_sink');
const _filter$ = Symbol('_filter');
const _closed = Symbol('_closed');
const _empty = Symbol('_empty');
let const$52;
io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
  new(sink, filter) {
    this[_sink$0] = sink;
    this[_filter$] = filter;
    this[_closed] = false;
    this[_empty] = true;
    super.new();
  }
  add(data) {
    this.addSlice(data, 0, data[dartx.length], false);
  }
  addSlice(data, start, end, isLast) {
    if (dart.test(this[_closed])) return;
    if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
    core.RangeError.checkValidRange(start, end, data[dartx.length]);
    try {
      this[_empty] = false;
      let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
      this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
      let out = null;
      while ((out = this[_filter$].processed({flush: false})) != null) {
        this[_sink$0].add(ListOfint()._check(out));
      }
    } catch (e) {
      this[_closed] = true;
      throw e;
    }

    if (dart.test(isLast)) this.close();
  }
  close() {
    if (dart.test(this[_closed])) return;
    if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
    try {
      let out = null;
      while ((out = this[_filter$].processed({end: true})) != null) {
        this[_sink$0].add(ListOfint()._check(out));
      }
    } catch (e) {
      this[_closed] = true;
      dart.throw(e);
    }

    this[_closed] = true;
    this[_sink$0].close();
  }
};
dart.setSignature(io._FilterSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._FilterSink, [convert.ByteConversionSink, io._Filter])}),
  fields: () => ({
    [_filter$]: io._Filter,
    [_sink$0]: convert.ByteConversionSink,
    [_closed]: core.bool,
    [_empty]: core.bool
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
io._ZLibEncoderSink = class _ZLibEncoderSink extends io._FilterSink {
  new(sink, gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
    super.new(sink, io._Filter._newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw));
  }
};
dart.setSignature(io._ZLibEncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._ZLibEncoderSink, [convert.ByteConversionSink, core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool])})
});
io._ZLibDecoderSink = class _ZLibDecoderSink extends io._FilterSink {
  new(sink, windowBits, dictionary, raw) {
    super.new(sink, io._Filter._newZLibInflateFilter(windowBits, dictionary, raw));
  }
};
dart.setSignature(io._ZLibDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._ZLibDecoderSink, [convert.ByteConversionSink, core.int, ListOfint(), core.bool])})
});
io._Filter = class _Filter extends core.Object {
  static _newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
    dart.throw(new core.UnsupportedError("_newZLibDeflateFilter"));
  }
  static _newZLibInflateFilter(windowBits, dictionary, raw) {
    dart.throw(new core.UnsupportedError("_newZLibInflateFilter"));
  }
};
dart.setSignature(io._Filter, {
  statics: () => ({
    _newZLibDeflateFilter: dart.definiteFunctionType(io._Filter, [core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool]),
    _newZLibInflateFilter: dart.definiteFunctionType(io._Filter, [core.int, ListOfint(), core.bool])
  }),
  names: ['_newZLibDeflateFilter', '_newZLibInflateFilter']
});
io._validateZLibWindowBits = function(windowBits) {
  if (io.ZLibOption.MIN_WINDOW_BITS > dart.notNull(windowBits) || io.ZLibOption.MAX_WINDOW_BITS < dart.notNull(windowBits)) {
    dart.throw(new core.RangeError.range(windowBits, io.ZLibOption.MIN_WINDOW_BITS, io.ZLibOption.MAX_WINDOW_BITS));
  }
};
dart.fn(io._validateZLibWindowBits, intTovoid());
io._validateZLibeLevel = function(level) {
  if (io.ZLibOption.MIN_LEVEL > dart.notNull(level) || io.ZLibOption.MAX_LEVEL < dart.notNull(level)) {
    dart.throw(new core.RangeError.range(level, io.ZLibOption.MIN_LEVEL, io.ZLibOption.MAX_LEVEL));
  }
};
dart.fn(io._validateZLibeLevel, intTovoid());
io._validateZLibMemLevel = function(memLevel) {
  if (io.ZLibOption.MIN_MEM_LEVEL > dart.notNull(memLevel) || io.ZLibOption.MAX_MEM_LEVEL < dart.notNull(memLevel)) {
    dart.throw(new core.RangeError.range(memLevel, io.ZLibOption.MIN_MEM_LEVEL, io.ZLibOption.MAX_MEM_LEVEL));
  }
};
dart.fn(io._validateZLibMemLevel, intTovoid());
let const$53;
io._validateZLibStrategy = function(strategy) {
  let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
  if (strategies[dartx.indexOf](strategy) == -1) {
    dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
  }
};
dart.fn(io._validateZLibStrategy, intTovoid());
io.Directory = class Directory extends core.Object {
  static new(path) {
    return new io._Directory(path);
  }
  static fromUri(uri) {
    return io.Directory.new(uri.toFilePath());
  }
  static get current() {
    return io._Directory.current;
  }
  static set current(path) {
    io._Directory.current = path;
  }
  static get systemTemp() {
    return io._Directory.systemTemp;
  }
};
io.Directory[dart.implements] = () => [io.FileSystemEntity];
dart.setSignature(io.Directory, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.Directory, [core.String]),
    fromUri: dart.definiteFunctionType(io.Directory, [core.Uri])
  }),
  fields: () => ({path: core.String}),
  sgetters: () => ({
    current: dart.definiteFunctionType(io.Directory, []),
    systemTemp: dart.definiteFunctionType(io.Directory, [])
  }),
  ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])})
});
const _isErrorResponse = Symbol('_isErrorResponse');
const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
const _absolutePath = Symbol('_absolutePath');
const _computeExistingIndex = Symbol('_computeExistingIndex');
const _delete = Symbol('_delete');
const _deleteSync = Symbol('_deleteSync');
const _type = Symbol('_type');
io.FileSystemEntity = class FileSystemEntity extends core.Object {
  get uri() {
    return core.Uri.file(this.path);
  }
  resolveSymbolicLinks() {
    return io._IOService._dispatch(io._FILE_RESOLVE_SYMBOLIC_LINKS, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot resolve symbolic links", this.path));
      }
      return FutureOrOfString()._check(response);
    }, dynamicToFutureOrOfString()));
  }
  resolveSymbolicLinksSync() {
    let result = io.FileSystemEntity._resolveSymbolicLinks(this.path);
    io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
    return core.String._check(result);
  }
  delete(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return this[_delete]({recursive: recursive});
  }
  deleteSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return this[_deleteSync]({recursive: recursive});
  }
  watch(opts) {
    let events = opts && 'events' in opts ? opts.events : io.FileSystemEvent.ALL;
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return io._FileSystemWatcher._watch(io.FileSystemEntity._trimTrailingPathSeparators(this.path), events, recursive);
  }
  static identical(path1, path2) {
    return io._IOService._dispatch(io._FILE_IDENTICAL, JSArrayOfString().of([path1, path2])).then(core.bool)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, dart.str`Error in FileSystemEntity.identical(${path1}, ${path2})`, ""));
      }
      return FutureOrOfbool()._check(response);
    }, dynamicToFutureOrOfbool()));
  }
  get isAbsolute() {
    if (dart.test(io.Platform.isWindows)) {
      return this.path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern);
    } else {
      return this.path[dartx.startsWith]('/');
    }
  }
  get [_absolutePath]() {
    if (dart.test(this.isAbsolute)) return this.path;
    let current = io.Directory.current.path;
    if (dart.test(current[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(current[dartx.endsWith]('\\'))) {
      return dart.str`${current}${this.path}`;
    } else {
      return dart.str`${current}${io.Platform.pathSeparator}${this.path}`;
    }
  }
  static identicalSync(path1, path2) {
    let result = io.FileSystemEntity._identical(path1, path2);
    io.FileSystemEntity._throwIfError(result, 'Error in FileSystemEntity.identicalSync');
    return core.bool._check(result);
  }
  static get isWatchSupported() {
    return io._FileSystemWatcher.isSupported;
  }
  static type(path, opts) {
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return io.FileSystemEntity._getTypeAsync(path, followLinks).then(io.FileSystemEntityType)(io.FileSystemEntityType._lookup);
  }
  static typeSync(path, opts) {
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return io.FileSystemEntityType._lookup(io.FileSystemEntity._getTypeSync(path, followLinks));
  }
  static isLink(path) {
    return io.FileSystemEntity._getTypeAsync(path, false).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.LINK[_type], intTobool()));
  }
  static isFile(path) {
    return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.FILE[_type], intTobool()));
  }
  static isDirectory(path) {
    return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.DIRECTORY[_type], intTobool()));
  }
  static isLinkSync(path) {
    return io.FileSystemEntity._getTypeSync(path, false) == io.FileSystemEntityType.LINK[_type];
  }
  static isFileSync(path) {
    return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.FILE[_type];
  }
  static isDirectorySync(path) {
    return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.DIRECTORY[_type];
  }
  static _getType(path, followLinks) {
    dart.throw(new core.UnsupportedError("FileSystemEntity._getType"));
  }
  static _identical(path1, path2) {
    dart.throw(new core.UnsupportedError("FileSystemEntity._identical"));
  }
  static _resolveSymbolicLinks(path) {
    dart.throw(new core.UnsupportedError("FileSystemEntity._resolveSymbolicLinks"));
  }
  static parentOf(path) {
    let rootEnd = -1;
    if (dart.test(io.Platform.isWindows)) {
      if (dart.test(path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern))) {
        rootEnd = path[dartx.indexOf](core.RegExp.new('[/\\\\]'), 2);
        if (rootEnd == -1) return path;
      } else if (dart.test(path[dartx.startsWith]('\\')) || dart.test(path[dartx.startsWith]('/'))) {
        rootEnd = 0;
      }
    } else if (dart.test(path[dartx.startsWith]('/'))) {
      rootEnd = 0;
    }
    let pos = path[dartx.lastIndexOf](io.FileSystemEntity._parentRegExp);
    if (dart.notNull(pos) > dart.notNull(rootEnd)) {
      return path[dartx.substring](0, dart.notNull(pos) + 1);
    } else if (dart.notNull(rootEnd) > -1) {
      return path[dartx.substring](0, dart.notNull(rootEnd) + 1);
    } else {
      return '.';
    }
  }
  get parent() {
    return io.Directory.new(io.FileSystemEntity.parentOf(this.path));
  }
  static _getTypeSync(path, followLinks) {
    let result = io.FileSystemEntity._getType(path, followLinks);
    io.FileSystemEntity._throwIfError(result, 'Error getting type of FileSystemEntity');
    return core.int._check(result);
  }
  static _getTypeAsync(path, followLinks) {
    return io._IOService._dispatch(io._FILE_TYPE, JSArrayOfObject().of([path, followLinks])).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Error getting type", path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  static _throwIfError(result, msg, path) {
    if (path === void 0) path = null;
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException(msg, path, result));
    } else if (core.ArgumentError.is(result)) {
      dart.throw(result);
    }
  }
  static _trimTrailingPathSeparators(path) {
    if (!(typeof path == 'string')) return path;
    if (dart.test(io.Platform.isWindows)) {
      while (dart.notNull(path[dartx.length]) > 1 && (dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) || dart.test(path[dartx.endsWith]('/')))) {
        path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
      }
    } else {
      while (dart.notNull(path[dartx.length]) > 1 && dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
        path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
      }
    }
    return path;
  }
  static _ensureTrailingPathSeparators(path) {
    if (!(typeof path == 'string')) return path;
    if (dart.test(path[dartx.isEmpty])) path = '.';
    if (dart.test(io.Platform.isWindows)) {
      while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) && !dart.test(path[dartx.endsWith]('/'))) {
        path = dart.str`${path}${io.Platform.pathSeparator}`;
      }
    } else {
      while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
        path = dart.str`${path}${io.Platform.pathSeparator}`;
      }
    }
    return path;
  }
};
dart.setSignature(io.FileSystemEntity, {
  getters: () => ({
    uri: dart.definiteFunctionType(core.Uri, []),
    isAbsolute: dart.definiteFunctionType(core.bool, []),
    [_absolutePath]: dart.definiteFunctionType(core.String, []),
    parent: dart.definiteFunctionType(io.Directory, [])
  }),
  methods: () => ({
    resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
    resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
    delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
    deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
  }),
  sfields: () => ({
    _absoluteWindowsPathPattern: core.RegExp,
    _parentRegExp: core.RegExp
  }),
  sgetters: () => ({isWatchSupported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    identical: dart.definiteFunctionType(async.Future$(core.bool), [core.String, core.String]),
    identicalSync: dart.definiteFunctionType(core.bool, [core.String, core.String]),
    type: dart.definiteFunctionType(async.Future$(io.FileSystemEntityType), [core.String], {followLinks: core.bool}),
    typeSync: dart.definiteFunctionType(io.FileSystemEntityType, [core.String], {followLinks: core.bool}),
    isLink: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
    isFile: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
    isDirectory: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
    isLinkSync: dart.definiteFunctionType(core.bool, [core.String]),
    isFileSync: dart.definiteFunctionType(core.bool, [core.String]),
    isDirectorySync: dart.definiteFunctionType(core.bool, [core.String]),
    _getType: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
    _identical: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _resolveSymbolicLinks: dart.definiteFunctionType(dart.dynamic, [core.String]),
    parentOf: dart.definiteFunctionType(core.String, [core.String]),
    _getTypeSync: dart.definiteFunctionType(core.int, [core.String, core.bool]),
    _getTypeAsync: dart.definiteFunctionType(async.Future$(core.int), [core.String, core.bool]),
    _throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String]),
    _trimTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String]),
    _ensureTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String])
  }),
  names: ['identical', 'identicalSync', 'type', 'typeSync', 'isLink', 'isFile', 'isDirectory', 'isLinkSync', 'isFileSync', 'isDirectorySync', '_getType', '_identical', '_resolveSymbolicLinks', 'parentOf', '_getTypeSync', '_getTypeAsync', '_throwIfError', '_trimTrailingPathSeparators', '_ensureTrailingPathSeparators']
});
dart.defineLazy(io.FileSystemEntity, {
  get _absoluteWindowsPathPattern() {
    return core.RegExp.new('^(\\\\\\\\|[a-zA-Z]:[/\\\\])');
  },
  get _parentRegExp() {
    return dart.test(io.Platform.isWindows) ? core.RegExp.new('[^/\\\\][/\\\\]+[^/\\\\]') : core.RegExp.new('[^/]/+[^/]');
  }
});
io._Directory = class _Directory extends io.FileSystemEntity {
  new(path) {
    this.path = path;
    if (!(typeof this.path == 'string')) {
      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
    }
  }
  static _current() {
    dart.throw(new core.UnsupportedError("Directory._current"));
  }
  static _setCurrent(path) {
    dart.throw(new core.UnsupportedError("Directory_SetCurrent"));
  }
  static _createTemp(path) {
    dart.throw(new core.UnsupportedError("Directory._createTemp"));
  }
  static _systemTemp() {
    dart.throw(new core.UnsupportedError("Directory._systemTemp"));
  }
  static _exists(path) {
    dart.throw(new core.UnsupportedError("Directory._exists"));
  }
  static _create(path) {
    dart.throw(new core.UnsupportedError("Directory._create"));
  }
  static _deleteNative(path, recursive) {
    dart.throw(new core.UnsupportedError("Directory._deleteNative"));
  }
  static _rename(path, newPath) {
    dart.throw(new core.UnsupportedError("Directory._rename"));
  }
  static _fillWithDirectoryListing(list, path, recursive, followLinks) {
    dart.throw(new core.UnsupportedError("Directory._fillWithDirectoryListing"));
  }
  static get current() {
    let result = io._Directory._current();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Getting current working directory failed", "", result));
    }
    return new io._Directory(core.String._check(result));
  }
  static set current(path) {
    if (io.Directory.is(path)) path = dart.dload(path, 'path');
    let result = io._Directory._setCurrent(path);
    if (core.ArgumentError.is(result)) dart.throw(result);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Setting current working directory failed", core.String._check(path), result));
    }
  }
  get uri() {
    return core.Uri.directory(this.path);
  }
  exists() {
    return io._IOService._dispatch(io._DIRECTORY_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Exists failed"));
      }
      return dart.equals(response, 1);
    }, dynamicTobool$()));
  }
  existsSync() {
    let result = io._Directory._exists(this.path);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Exists failed", this.path, result));
    }
    return dart.equals(result, 1);
  }
  get absolute() {
    return io.Directory.new(this[_absolutePath]);
  }
  stat() {
    return io.FileStat.stat(this.path);
  }
  statSync() {
    return io.FileStat.statSync(this.path);
  }
  [_computeExistingIndex](dirsToCreate) {
    let future = null;
    let notFound = dirsToCreate[dartx.length];
    for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
      if (future == null) {
        future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
      } else {
        future = dart.dsend(future, 'then', dart.fn(index => {
          if (!dart.equals(index, notFound)) {
            return async.Future.value(index);
          }
          return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
        }, dynamicTodynamic$()));
      }
    }
    if (future == null) {
      return FutureOfint().value(notFound);
    } else {
      return FutureOfint()._check(future);
    }
  }
  create(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return this.exists().then(io.Directory)(dart.fn(exists => {
        if (dart.test(exists)) return this;
        if (this.path != this.parent.path) {
          return this.parent.create({recursive: true}).then(io.Directory)(dart.fn(_ => this.create(), DirectoryToFutureOfDirectory()));
        } else {
          return this.create();
        }
      }, boolToFutureOrOfDirectory()));
    } else {
      return io._IOService._dispatch(io._DIRECTORY_CREATE, JSArrayOfString().of([this.path])).then(io._Directory)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation failed"));
        }
        return this;
      }, dynamicTo_Directory()));
    }
  }
  createSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      if (dart.test(this.existsSync())) return;
      if (this.path != this.parent.path) {
        this.parent.createSync({recursive: true});
      }
    }
    let result = io._Directory._create(this.path);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Creation failed", this.path, result));
    }
  }
  static get systemTemp() {
    return io.Directory.new(io._Directory._systemTemp());
  }
  createTemp(prefix) {
    if (prefix === void 0) prefix = null;
    if (prefix == null) prefix = '';
    if (this.path == '') {
      dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
    }
    let fullPrefix = null;
    if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
      fullPrefix = dart.str`${this.path}${prefix}`;
    } else {
      fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
    }
    return io._IOService._dispatch(io._DIRECTORY_CREATE_TEMP, JSArrayOfString().of([fullPrefix])).then(io.Directory)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation of temporary directory failed"));
      }
      return io.Directory.new(core.String._check(response));
    }, dynamicToDirectory()));
  }
  createTempSync(prefix) {
    if (prefix === void 0) prefix = null;
    if (prefix == null) prefix = '';
    if (this.path == '') {
      dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
    }
    let fullPrefix = null;
    if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
      fullPrefix = dart.str`${this.path}${prefix}`;
    } else {
      fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
    }
    let result = io._Directory._createTemp(fullPrefix);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Creation of temporary directory failed", fullPrefix, result));
    }
    return io.Directory.new(core.String._check(result));
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return io._IOService._dispatch(io._DIRECTORY_DELETE, JSArrayOfObject().of([this.path, recursive])).then(io._Directory)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Deletion failed"));
      }
      return this;
    }, dynamicTo_Directory()));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let result = io._Directory._deleteNative(this.path, recursive);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Deletion failed", this.path, result));
    }
  }
  rename(newPath) {
    return io._IOService._dispatch(io._DIRECTORY_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.Directory)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Rename failed"));
      }
      return io.Directory.new(newPath);
    }, dynamicToDirectory()));
  }
  renameSync(newPath) {
    if (!(typeof newPath == 'string')) {
      dart.throw(new core.ArgumentError());
    }
    let result = io._Directory._rename(this.path, newPath);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Rename failed", this.path, result));
    }
    return io.Directory.new(newPath);
  }
  list(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
  }
  listSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    if (!(typeof recursive == 'boolean') || !(typeof followLinks == 'boolean')) {
      dart.throw(new core.ArgumentError());
    }
    let result = JSArrayOfFileSystemEntity().of([]);
    io._Directory._fillWithDirectoryListing(result, io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks);
    return result;
  }
  toString() {
    return dart.str`Directory: '${this.path}'`;
  }
  [_isErrorResponse](response) {
    return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
  }
  [_exceptionOrErrorFromResponse](response, message) {
    dart.assert(this[_isErrorResponse](response));
    switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
      case io._ILLEGAL_ARGUMENT_RESPONSE:
      {
        return new core.ArgumentError();
      }
      case io._OSERROR_RESPONSE:
      {
        let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
        return new io.FileSystemException(message, this.path, err);
      }
      default:
      {
        return core.Exception.new("Unknown error");
      }
    }
  }
};
io._Directory[dart.implements] = () => [io.Directory];
dart.setSignature(io._Directory, {
  constructors: () => ({new: dart.definiteFunctionType(io._Directory, [core.String])}),
  fields: () => ({path: core.String}),
  getters: () => ({absolute: dart.definiteFunctionType(io.Directory, [])}),
  methods: () => ({
    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
    existsSync: dart.definiteFunctionType(core.bool, []),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
    statSync: dart.definiteFunctionType(io.FileStat, []),
    [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
    create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
    createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
    createTempSync: dart.definiteFunctionType(io.Directory, [], [core.String]),
    [_delete]: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    rename: dart.definiteFunctionType(async.Future$(io.Directory), [core.String]),
    renameSync: dart.definiteFunctionType(io.Directory, [core.String]),
    list: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
    listSync: dart.definiteFunctionType(core.List$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
    [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [_exceptionOrErrorFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])
  }),
  sgetters: () => ({
    current: dart.definiteFunctionType(io.Directory, []),
    systemTemp: dart.definiteFunctionType(io.Directory, [])
  }),
  ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
  statics: () => ({
    _current: dart.definiteFunctionType(dart.dynamic, []),
    _setCurrent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _createTemp: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _systemTemp: dart.definiteFunctionType(core.String, []),
    _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
    _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _fillWithDirectoryListing: dart.definiteFunctionType(dart.void, [ListOfFileSystemEntity(), core.String, core.bool, core.bool])
  }),
  names: ['_current', '_setCurrent', '_createTemp', '_systemTemp', '_exists', '_create', '_deleteNative', '_rename', '_fillWithDirectoryListing']
});
io._AsyncDirectoryListerOps = class _AsyncDirectoryListerOps extends core.Object {
  static new(pointer) {
    dart.throw(new core.UnsupportedError("Directory._list"));
  }
};
dart.setSignature(io._AsyncDirectoryListerOps, {
  constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryListerOps, [core.int])})
});
const _ops = Symbol('_ops');
const _pointer = Symbol('_pointer');
const _cleanup = Symbol('_cleanup');
io._AsyncDirectoryLister = class _AsyncDirectoryLister extends core.Object {
  new(path, recursive, followLinks) {
    this.closeCompleter = async.Completer.new();
    this.path = path;
    this.recursive = recursive;
    this.followLinks = followLinks;
    this.controller = null;
    this.canceled = false;
    this.nextRunning = false;
    this.closed = false;
    this[_ops] = null;
    this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
  }
  [_pointer]() {
    return this[_ops] == null ? null : this[_ops].getPointer();
  }
  get stream() {
    return this.controller.stream;
  }
  onListen() {
    io._IOService._dispatch(io._DIRECTORY_LIST_START, JSArrayOfObject().of([this.path, this.recursive, this.followLinks])).then(dart.dynamic)(dart.fn(response => {
      if (typeof response == 'number') {
        this[_ops] = io._AsyncDirectoryListerOps.new(response);
        this.next();
      } else if (core.Error.is(response)) {
        this.controller.addError(response, response.stackTrace);
        this.close();
      } else {
        this.error(response);
        this.close();
      }
    }, dynamicToNull$()));
  }
  onResume() {
    if (!dart.test(this.nextRunning)) {
      this.next();
    }
  }
  onCancel() {
    this.canceled = true;
    if (!dart.test(this.nextRunning)) {
      this.close();
    }
    return this.closeCompleter.future;
  }
  next() {
    if (dart.test(this.canceled)) {
      this.close();
      return;
    }
    if (dart.test(this.controller.isPaused) || dart.test(this.nextRunning)) {
      return;
    }
    let pointer = this[_pointer]();
    if (pointer == null) {
      return;
    }
    this.nextRunning = true;
    io._IOService._dispatch(io._DIRECTORY_LIST_NEXT, JSArrayOfint().of([pointer])).then(dart.dynamic)(dart.fn(result => {
      this.nextRunning = false;
      if (core.List.is(result)) {
        this.next();
        dart.assert(result[dartx.length][dartx['%']](2) == 0);
        for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
          dart.assert(i[dartx['%']](2) == 0);
          switch (result[dartx._get](i++)) {
            case io._AsyncDirectoryLister.LIST_FILE:
            {
              this.controller.add(io.File.new(core.String._check(result[dartx._get](i))));
              break;
            }
            case io._AsyncDirectoryLister.LIST_DIRECTORY:
            {
              this.controller.add(io.Directory.new(core.String._check(result[dartx._get](i))));
              break;
            }
            case io._AsyncDirectoryLister.LIST_LINK:
            {
              this.controller.add(io.Link.new(core.String._check(result[dartx._get](i))));
              break;
            }
            case io._AsyncDirectoryLister.LIST_ERROR:
            {
              this.error(result[dartx._get](i));
              break;
            }
            case io._AsyncDirectoryLister.LIST_DONE:
            {
              this.canceled = true;
              return;
            }
          }
        }
      } else {
        this.controller.addError(new io.FileSystemException("Internal error"));
      }
    }, dynamicToNull$()));
  }
  [_cleanup]() {
    this.controller.close();
    this.closeCompleter.complete();
    this[_ops] = null;
  }
  close() {
    if (dart.test(this.closed)) {
      return;
    }
    if (dart.test(this.nextRunning)) {
      return;
    }
    this.closed = true;
    let pointer = this[_pointer]();
    if (pointer == null) {
      this[_cleanup]();
    } else {
      io._IOService._dispatch(io._DIRECTORY_LIST_STOP, JSArrayOfint().of([pointer])).whenComplete(dart.bind(this, _cleanup));
    }
  }
  error(message) {
    let errorType = dart.dindex(dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR), io._ERROR_RESPONSE_ERROR_TYPE);
    if (dart.equals(errorType, io._ILLEGAL_ARGUMENT_RESPONSE)) {
      this.controller.addError(new core.ArgumentError());
    } else if (dart.equals(errorType, io._OSERROR_RESPONSE)) {
      let responseError = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR);
      let err = new io.OSError(core.String._check(dart.dindex(responseError, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(responseError, io._OSERROR_RESPONSE_ERROR_CODE)));
      let errorPath = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_PATH);
      if (errorPath == null) errorPath = this.path;
      this.controller.addError(new io.FileSystemException("Directory listing failed", core.String._check(errorPath), err));
    } else {
      this.controller.addError(new io.FileSystemException("Internal error"));
    }
  }
};
dart.setSignature(io._AsyncDirectoryLister, {
  constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryLister, [core.String, core.bool, core.bool])}),
  fields: () => ({
    path: core.String,
    recursive: core.bool,
    followLinks: core.bool,
    controller: async.StreamController,
    canceled: core.bool,
    nextRunning: core.bool,
    closed: core.bool,
    [_ops]: io._AsyncDirectoryListerOps,
    closeCompleter: async.Completer
  }),
  getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
  methods: () => ({
    [_pointer]: dart.definiteFunctionType(core.int, []),
    onListen: dart.definiteFunctionType(dart.void, []),
    onResume: dart.definiteFunctionType(dart.void, []),
    onCancel: dart.definiteFunctionType(async.Future, []),
    next: dart.definiteFunctionType(dart.void, []),
    [_cleanup]: dart.definiteFunctionType(dart.void, []),
    close: dart.definiteFunctionType(dart.void, []),
    error: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  sfields: () => ({
    LIST_FILE: core.int,
    LIST_DIRECTORY: core.int,
    LIST_LINK: core.int,
    LIST_ERROR: core.int,
    LIST_DONE: core.int,
    RESPONSE_TYPE: core.int,
    RESPONSE_PATH: core.int,
    RESPONSE_COMPLETE: core.int,
    RESPONSE_ERROR: core.int
  })
});
io._AsyncDirectoryLister.LIST_FILE = 0;
io._AsyncDirectoryLister.LIST_DIRECTORY = 1;
io._AsyncDirectoryLister.LIST_LINK = 2;
io._AsyncDirectoryLister.LIST_ERROR = 3;
io._AsyncDirectoryLister.LIST_DONE = 4;
io._AsyncDirectoryLister.RESPONSE_TYPE = 0;
io._AsyncDirectoryLister.RESPONSE_PATH = 1;
io._AsyncDirectoryLister.RESPONSE_COMPLETE = 1;
io._AsyncDirectoryLister.RESPONSE_ERROR = 2;
io._EventHandler = class _EventHandler extends core.Object {
  static _sendData(sender, sendPort, data) {
    dart.throw(new core.UnsupportedError("EventHandler._sendData"));
  }
};
dart.setSignature(io._EventHandler, {
  statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
  names: ['_sendData']
});
const _mode = Symbol('_mode');
io.FileMode = class FileMode extends core.Object {
  _internal(mode) {
    this[_mode] = mode;
  }
};
dart.defineNamedConstructor(io.FileMode, '_internal');
dart.setSignature(io.FileMode, {
  constructors: () => ({_internal: dart.definiteFunctionType(io.FileMode, [core.int])}),
  fields: () => ({[_mode]: core.int}),
  sfields: () => ({
    READ: io.FileMode,
    WRITE: io.FileMode,
    APPEND: io.FileMode,
    WRITE_ONLY: io.FileMode,
    WRITE_ONLY_APPEND: io.FileMode
  })
});
dart.defineLazy(io.FileMode, {
  get READ() {
    return dart.const(new io.FileMode._internal(0));
  },
  get WRITE() {
    return dart.const(new io.FileMode._internal(1));
  },
  get APPEND() {
    return dart.const(new io.FileMode._internal(2));
  },
  get WRITE_ONLY() {
    return dart.const(new io.FileMode._internal(3));
  },
  get WRITE_ONLY_APPEND() {
    return dart.const(new io.FileMode._internal(4));
  }
});
io.READ = io.FileMode.READ;
io.WRITE = io.FileMode.WRITE;
io.APPEND = io.FileMode.APPEND;
io.WRITE_ONLY = io.FileMode.WRITE_ONLY;
io.WRITE_ONLY_APPEND = io.FileMode.WRITE_ONLY_APPEND;
io.FileLock = class FileLock extends core.Object {
  new(index) {
    this.index = index;
  }
  toString() {
    return {
      0: "FileLock.SHARED",
      1: "FileLock.EXCLUSIVE"
    }[this.index];
  }
};
dart.setSignature(io.FileLock, {
  fields: () => ({index: core.int})
});
dart.defineEnumValues(io.FileLock, [
  'SHARED',
  'EXCLUSIVE'
]);
io.File = class File extends core.Object {
  static new(path) {
    return new io._File(path);
  }
  static fromUri(uri) {
    return io.File.new(uri.toFilePath());
  }
};
io.File[dart.implements] = () => [io.FileSystemEntity];
dart.setSignature(io.File, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.File, [core.String]),
    fromUri: dart.definiteFunctionType(io.File, [core.Uri])
  })
});
io.RandomAccessFile = class RandomAccessFile extends core.Object {};
io.FileSystemException = class FileSystemException extends core.Object {
  new(message, path, osError) {
    if (message === void 0) message = "";
    if (path === void 0) path = "";
    if (osError === void 0) osError = null;
    this.message = message;
    this.path = path;
    this.osError = osError;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write("FileSystemException");
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(dart.str`: ${this.message}`);
      if (this.path != null) {
        sb.write(dart.str`, path = '${this.path}'`);
      }
      if (this.osError != null) {
        sb.write(dart.str` (${this.osError})`);
      }
    } else if (this.osError != null) {
      sb.write(dart.str`: ${this.osError}`);
      if (this.path != null) {
        sb.write(dart.str`, path = '${this.path}'`);
      }
    } else if (this.path != null) {
      sb.write(dart.str`: ${this.path}`);
    }
    return sb.toString();
  }
};
io.FileSystemException[dart.implements] = () => [io.IOException];
dart.setSignature(io.FileSystemException, {
  constructors: () => ({new: dart.definiteFunctionType(io.FileSystemException, [], [core.String, core.String, io.OSError])}),
  fields: () => ({
    message: core.String,
    path: core.String,
    osError: io.OSError
  })
});
io._BLOCK_SIZE = 64 * 1024;
const _closeCompleter = Symbol('_closeCompleter');
const _path$ = Symbol('_path');
const _position$0 = Symbol('_position');
const _end$0 = Symbol('_end');
const _controller$0 = Symbol('_controller');
const _openedFile = Symbol('_openedFile');
const _unsubscribed = Symbol('_unsubscribed');
const _readInProgress = Symbol('_readInProgress');
const _atEnd = Symbol('_atEnd');
const _setupController = Symbol('_setupController');
const _start$2 = Symbol('_start');
const _readBlock = Symbol('_readBlock');
const _closeFile = Symbol('_closeFile');
io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
  new(path, position, end) {
    this[_closeCompleter] = async.Completer.new();
    this[_path$] = path;
    this[_position$0] = position;
    this[_end$0] = end;
    this[_controller$0] = null;
    this[_openedFile] = null;
    this[_unsubscribed] = false;
    this[_readInProgress] = true;
    this[_closed] = false;
    this[_atEnd] = false;
    super.new();
    if (this[_position$0] == null) this[_position$0] = 0;
  }
  forStdin() {
    this[_closeCompleter] = async.Completer.new();
    this[_position$0] = 0;
    this[_controller$0] = null;
    this[_path$] = null;
    this[_openedFile] = null;
    this[_end$0] = null;
    this[_unsubscribed] = false;
    this[_readInProgress] = true;
    this[_closed] = false;
    this[_atEnd] = false;
    super.new();
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    this[_setupController]();
    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  [_setupController]() {
    this[_controller$0] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start$2), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
        this[_unsubscribed] = true;
        return this[_closeFile]();
      }, VoidToFuture())});
  }
  [_closeFile]() {
    if (dart.test(this[_readInProgress]) || dart.test(this[_closed])) {
      return this[_closeCompleter].future;
    }
    this[_closed] = true;
    const done = (function() {
      this[_closeCompleter].complete();
      this[_controller$0].close();
    }).bind(this);
    dart.fn(done, VoidTovoid$());
    this[_openedFile].close().catchError(dart.bind(this[_controller$0], 'addError')).whenComplete(done);
    return this[_closeCompleter].future;
  }
  [_readBlock]() {
    if (dart.test(this[_readInProgress])) return;
    if (dart.test(this[_atEnd])) {
      this[_closeFile]();
      return;
    }
    this[_readInProgress] = true;
    let readBytes = io._BLOCK_SIZE;
    if (this[_end$0] != null) {
      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
      if (dart.notNull(readBytes) < 0) {
        this[_readInProgress] = false;
        if (!dart.test(this[_unsubscribed])) {
          this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
          this[_closeFile]();
          this[_unsubscribed] = true;
        }
        return;
      }
    }
    this[_openedFile].read(readBytes).then(dart.dynamic)(dart.fn(block => {
      this[_readInProgress] = false;
      if (dart.test(this[_unsubscribed])) {
        this[_closeFile]();
        return;
      }
      this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
        this[_atEnd] = true;
      }
      if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
        this[_readBlock]();
      }
      this[_controller$0].add(block);
      if (dart.test(this[_atEnd])) {
        this[_closeFile]();
      }
    }, ListOfintToNull())).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_unsubscribed])) {
        this[_controller$0].addError(e, core.StackTrace._check(s));
        this[_closeFile]();
        this[_unsubscribed] = true;
      }
    }, dynamicAnddynamicToNull()));
  }
  [_start$2]() {
    if (dart.notNull(this[_position$0]) < 0) {
      this[_controller$0].addError(new core.RangeError(dart.str`Bad start position: ${this[_position$0]}`));
      this[_controller$0].close();
      this[_closeCompleter].complete();
      return;
    }
    const onReady = (function(file) {
      this[_openedFile] = file;
      this[_readInProgress] = false;
      this[_readBlock]();
    }).bind(this);
    dart.fn(onReady, RandomAccessFileTovoid());
    const onOpenFile = (function(file) {
      if (dart.notNull(this[_position$0]) > 0) {
        file.setPosition(this[_position$0]).then(dart.void)(onReady, {onError: dart.fn((e, s) => {
            this[_controller$0].addError(e, core.StackTrace._check(s));
            this[_readInProgress] = false;
            this[_closeFile]();
          }, dynamicAnddynamicToNull())});
      } else {
        onReady(file);
      }
    }).bind(this);
    dart.fn(onOpenFile, RandomAccessFileTovoid());
    const openFailed = (function(error, stackTrace) {
      this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
      this[_controller$0].close();
      this[_closeCompleter].complete();
    }).bind(this);
    dart.fn(openFailed, dynamicAnddynamicTovoid$());
    if (this[_path$] != null) {
      io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
    } else {
      try {
        onOpenFile(io._File._openStdioSync(0));
      } catch (e) {
        let s = dart.stackTrace(e);
        openFailed(e, s);
      }

    }
  }
};
dart.addSimpleTypeTests(io._FileStream);
dart.defineNamedConstructor(io._FileStream, 'forStdin');
dart.setSignature(io._FileStream, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._FileStream, [core.String, core.int, core.int]),
    forStdin: dart.definiteFunctionType(io._FileStream, [])
  }),
  fields: () => ({
    [_controller$0]: StreamControllerOfListOfint(),
    [_path$]: core.String,
    [_openedFile]: io.RandomAccessFile,
    [_position$0]: core.int,
    [_end$0]: core.int,
    [_closeCompleter]: async.Completer,
    [_unsubscribed]: core.bool,
    [_readInProgress]: core.bool,
    [_closed]: core.bool,
    [_atEnd]: core.bool
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    [_setupController]: dart.definiteFunctionType(dart.void, []),
    [_closeFile]: dart.definiteFunctionType(async.Future, []),
    [_readBlock]: dart.definiteFunctionType(dart.void, []),
    [_start$2]: dart.definiteFunctionType(dart.void, [])
  })
});
const _file = Symbol('_file');
const _openFuture = Symbol('_openFuture');
io._FileStreamConsumer = class _FileStreamConsumer extends async.StreamConsumer$(core.List$(core.int)) {
  new(file, mode) {
    this[_file] = file;
    this[_openFuture] = null;
    this[_openFuture] = this[_file].open({mode: mode});
  }
  fromStdio(fd) {
    this[_file] = null;
    this[_openFuture] = null;
    dart.assert(1 <= dart.notNull(fd) && dart.notNull(fd) <= 2);
    this[_openFuture] = FutureOfRandomAccessFile().value(io._File._openStdioSync(fd));
  }
  addStream(stream) {
    let completer = CompleterOfFile().sync();
    this[_openFuture].then(dart.dynamic)(dart.fn(openedFile => {
      let _subscription = null;
      function error(e, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        dart.dsend(_subscription, 'cancel');
        openedFile.close();
        completer.completeError(e, stackTrace);
      }
      dart.fn(error, dynamic__Tovoid());
      _subscription = stream.listen(dart.fn(d => {
        dart.dsend(_subscription, 'pause');
        try {
          openedFile.writeFrom(d, 0, d[dartx.length]).then(dart.dynamic)(dart.fn(_ => dart.dsend(_subscription, 'resume'), RandomAccessFileToFutureOr()), {onError: error});
        } catch (e) {
          let stackTrace = dart.stackTrace(e);
          error(e, stackTrace);
        }

      }, ListOfintToNull()), {onDone: dart.fn(() => {
          completer.complete(this[_file]);
        }, VoidToNull()), onError: error, cancelOnError: true});
    }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
    return completer.future;
  }
  close() {
    return this[_openFuture].then(io.File)(dart.fn(openedFile => openedFile.close(), RandomAccessFileToFutureOfRandomAccessFile()));
  }
};
dart.addSimpleTypeTests(io._FileStreamConsumer);
dart.defineNamedConstructor(io._FileStreamConsumer, 'fromStdio');
dart.setSignature(io._FileStreamConsumer, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._FileStreamConsumer, [io.File, io.FileMode]),
    fromStdio: dart.definiteFunctionType(io._FileStreamConsumer, [core.int])
  }),
  fields: () => ({
    [_file]: io.File,
    [_openFuture]: FutureOfRandomAccessFile()
  }),
  methods: () => ({
    addStream: dart.definiteFunctionType(async.Future$(io.File), [StreamOfListOfint()]),
    close: dart.definiteFunctionType(async.Future$(io.File), [])
  })
});
const _tryDecode = Symbol('_tryDecode');
let const$54;
let const$55;
io._File = class _File extends io.FileSystemEntity {
  new(path) {
    this.path = path;
    if (!(typeof this.path == 'string')) {
      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
    }
  }
  exists() {
    return io._IOService._dispatch(io._FILE_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot check existence", this.path));
      }
      return FutureOrOfbool()._check(response);
    }, dynamicToFutureOrOfbool()));
  }
  static _exists(path) {
    dart.throw(new core.UnsupportedError("File._exists"));
  }
  existsSync() {
    let result = io._File._exists(this.path);
    io._File.throwIfError(result, "Cannot check existence of file", this.path);
    return core.bool._check(result);
  }
  get absolute() {
    return io.File.new(this[_absolutePath]);
  }
  stat() {
    return io.FileStat.stat(this.path);
  }
  statSync() {
    return io.FileStat.statSync(this.path);
  }
  create(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
    return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE, JSArrayOfString().of([this.path])), dynamicToFuture())).then(io._File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot create file", this.path));
      }
      return this;
    }, dynamicTo_File()));
  }
  static _create(path) {
    dart.throw(new core.UnsupportedError("File._create"));
  }
  static _createLink(path, target) {
    dart.throw(new core.UnsupportedError("File._createLink"));
  }
  static _linkTarget(path) {
    dart.throw(new core.UnsupportedError("File._linkTarget"));
  }
  createSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      this.parent.createSync({recursive: true});
    }
    let result = io._File._create(this.path);
    io._File.throwIfError(result, "Cannot create file", this.path);
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).delete({recursive: true}).then(io._File)(dart.fn(_ => this, FileSystemEntityTo_File()));
    }
    return io._IOService._dispatch(io._FILE_DELETE, JSArrayOfString().of([this.path])).then(io._File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot delete file", this.path));
      }
      return this;
    }, dynamicTo_File()));
  }
  static _deleteNative(path) {
    dart.throw(new core.UnsupportedError("File._deleteNative"));
  }
  static _deleteLinkNative(path) {
    dart.throw(new core.UnsupportedError("File._deleteLinkNative"));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).deleteSync({recursive: true});
    }
    let result = io._File._deleteNative(this.path);
    io._File.throwIfError(result, "Cannot delete file", this.path);
  }
  rename(newPath) {
    return io._IOService._dispatch(io._FILE_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, dart.str`Cannot rename file to '${newPath}'`, this.path));
      }
      return io.File.new(newPath);
    }, dynamicToFile()));
  }
  static _rename(oldPath, newPath) {
    dart.throw(new core.UnsupportedError("File._rename"));
  }
  static _renameLink(oldPath, newPath) {
    dart.throw(new core.UnsupportedError("File._renameLink"));
  }
  renameSync(newPath) {
    let result = io._File._rename(this.path, newPath);
    io._File.throwIfError(result, dart.str`Cannot rename file to '${newPath}'`, this.path);
    return io.File.new(newPath);
  }
  copy(newPath) {
    return io._IOService._dispatch(io._FILE_COPY, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, dart.str`Cannot copy file to '${newPath}'`, this.path));
      }
      return io.File.new(newPath);
    }, dynamicToFile()));
  }
  static _copy(oldPath, newPath) {
    dart.throw(new core.UnsupportedError("File._copy"));
  }
  copySync(newPath) {
    let result = io._File._copy(this.path, newPath);
    io._File.throwIfError(result, dart.str`Cannot copy file to '${newPath}'`, this.path);
    return io.File.new(newPath);
  }
  open(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
    if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
      return FutureOfRandomAccessFile().error(new core.ArgumentError('Invalid file mode for this operation'));
    }
    return io._IOService._dispatch(io._FILE_OPEN, JSArrayOfObject().of([this.path, mode[_mode]])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot open file", this.path));
      }
      return new io._RandomAccessFile(core.int._check(response), this.path);
    }, dynamicTo_RandomAccessFile()));
  }
  length() {
    return io._IOService._dispatch(io._FILE_LENGTH_FROM_PATH, JSArrayOfString().of([this.path])).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve length of file", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  static _lengthFromPath(path) {
    dart.throw(new core.UnsupportedError("File._lengthFromPath"));
  }
  lengthSync() {
    let result = io._File._lengthFromPath(this.path);
    io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
    return core.int._check(result);
  }
  lastModified() {
    return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve modification time", this.path));
      }
      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
    }, dynamicToDateTime()));
  }
  static _lastModified(path) {
    dart.throw(new core.UnsupportedError("File._lastModified"));
  }
  lastModifiedSync() {
    let ms = io._File._lastModified(this.path);
    io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
    return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
  }
  static _open(path, mode) {
    dart.throw(new core.UnsupportedError("File._open"));
  }
  openSync(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
    if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
      dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
    }
    let id = io._File._open(this.path, mode[_mode]);
    io._File.throwIfError(id, "Cannot open file", this.path);
    return new io._RandomAccessFile(core.int._check(id), this.path);
  }
  static _openStdio(fd) {
    dart.throw(new core.UnsupportedError("File._openStdio"));
  }
  static _openStdioSync(fd) {
    let id = io._File._openStdio(fd);
    if (id == 0) {
      dart.throw(new io.FileSystemException(dart.str`Cannot open stdio file for: ${fd}`));
    }
    return new io._RandomAccessFile(id, "");
  }
  openRead(start, end) {
    if (start === void 0) start = null;
    if (end === void 0) end = null;
    return new io._FileStream(this.path, start, end);
  }
  openWrite(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    if (!dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
      dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
    }
    let consumer = new io._FileStreamConsumer(this, mode);
    return io.IOSink.new(consumer, {encoding: encoding});
  }
  readAsBytes() {
    function readDataChunked(file) {
      let builder = io.BytesBuilder.new({copy: false});
      let completer = async.Completer.new();
      function read() {
        dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
            builder.add(ListOfint()._check(data));
            read();
          } else {
            completer.complete(builder.takeBytes());
          }
        }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
      }
      dart.fn(read, VoidTovoid$());
      read();
      return FutureOfListOfint()._check(completer.future);
    }
    dart.fn(readDataChunked, dynamicToFutureOfListOfint());
    return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
      if (length == 0) {
        return readDataChunked(file);
      }
      return file.read(length);
    }, intToFutureOfListOfint())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOfListOfint()));
  }
  readAsBytesSync() {
    let opened = this.openSync();
    try {
      let data = null;
      let length = opened.lengthSync();
      if (length == 0) {
        let builder = io.BytesBuilder.new({copy: false});
        do {
          data = opened.readSync(io._BLOCK_SIZE);
          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
        } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
        data = builder.takeBytes();
      } else {
        data = opened.readSync(length);
      }
      return ListOfint()._check(data);
    } finally {
      opened.closeSync();
    }
  }
  [_tryDecode](bytes, encoding) {
    try {
      return encoding.decode(bytes);
    } catch (_) {
      dart.throw(new io.FileSystemException(dart.str`Failed to decode data using encoding '${encoding.name}'`, this.path));
    }

  }
  readAsString(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return this.readAsBytes().then(core.String)(dart.fn(bytes => this[_tryDecode](bytes, encoding), ListOfintToString()));
  }
  readAsStringSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return this[_tryDecode](this.readAsBytesSync(), encoding);
  }
  readAsLines(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
  }
  readAsLinesSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
  }
  writeAsBytes(bytes, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    return this.open({mode: mode}).then(io.File)(dart.fn(file => file.writeFrom(bytes, 0, bytes[dartx.length]).then(dart.dynamic)(dart.fn(_ => {
      if (dart.test(flush)) return file.flush().then(io._File)(dart.fn(_ => this, RandomAccessFileTo_File()));
      return this;
    }, RandomAccessFileToObject())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOrOfFile()));
  }
  writeAsBytesSync(bytes, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    let opened = this.openSync({mode: mode});
    try {
      opened.writeFromSync(bytes, 0, bytes[dartx.length]);
      if (dart.test(flush)) opened.flushSync();
    } finally {
      opened.closeSync();
    }
  }
  writeAsString(contents, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    try {
      return this.writeAsBytes(encoding.encode(contents), {mode: mode, flush: flush});
    } catch (e) {
      return FutureOfFile().error(e);
    }

  }
  writeAsStringSync(contents, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    this.writeAsBytesSync(encoding.encode(contents), {mode: mode, flush: flush});
  }
  toString() {
    return dart.str`File: '${this.path}'`;
  }
  static throwIfError(result, msg, path) {
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException(msg, path, result));
    }
  }
};
io._File[dart.implements] = () => [io.File];
dart.setSignature(io._File, {
  constructors: () => ({new: dart.definiteFunctionType(io._File, [core.String])}),
  fields: () => ({path: core.String}),
  getters: () => ({absolute: dart.definiteFunctionType(io.File, [])}),
  methods: () => ({
    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
    existsSync: dart.definiteFunctionType(core.bool, []),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
    statSync: dart.definiteFunctionType(io.FileStat, []),
    create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
    createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    rename: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
    renameSync: dart.definiteFunctionType(io.File, [core.String]),
    copy: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
    copySync: dart.definiteFunctionType(io.File, [core.String]),
    open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
    length: dart.definiteFunctionType(async.Future$(core.int), []),
    lengthSync: dart.definiteFunctionType(core.int, []),
    lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
    lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
    openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
    openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
    openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
    readAsBytes: dart.definiteFunctionType(async.Future$(core.List$(core.int)), []),
    readAsBytesSync: dart.definiteFunctionType(core.List$(core.int), []),
    [_tryDecode]: dart.definiteFunctionType(core.String, [ListOfint(), convert.Encoding]),
    readAsString: dart.definiteFunctionType(async.Future$(core.String), [], {encoding: convert.Encoding}),
    readAsStringSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding}),
    readAsLines: dart.definiteFunctionType(async.Future$(core.List$(core.String)), [], {encoding: convert.Encoding}),
    readAsLinesSync: dart.definiteFunctionType(core.List$(core.String), [], {encoding: convert.Encoding}),
    writeAsBytes: dart.definiteFunctionType(async.Future$(io.File), [ListOfint()], {mode: io.FileMode, flush: core.bool}),
    writeAsBytesSync: dart.definiteFunctionType(dart.void, [ListOfint()], {mode: io.FileMode, flush: core.bool}),
    writeAsString: dart.definiteFunctionType(async.Future$(io.File), [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool}),
    writeAsStringSync: dart.definiteFunctionType(dart.void, [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool})
  }),
  statics: () => ({
    _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _createLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _linkTarget: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _deleteLinkNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
    _openStdio: dart.definiteFunctionType(core.int, [core.int]),
    _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
    throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
  }),
  names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
});
io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
  static new(pointer) {
    dart.throw(new core.UnsupportedError("RandomAccessFile"));
  }
};
dart.setSignature(io._RandomAccessFileOps, {
  constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFileOps, [core.int])})
});
const _asyncDispatched = Symbol('_asyncDispatched');
const _fileService = Symbol('_fileService');
const _resourceInfo = Symbol('_resourceInfo');
const _maybeConnectHandler = Symbol('_maybeConnectHandler');
const _maybePerformCleanup = Symbol('_maybePerformCleanup');
const _dispatch = Symbol('_dispatch');
const _checkAvailable = Symbol('_checkAvailable');
io._RandomAccessFile = class _RandomAccessFile extends core.Object {
  new(pointer, path) {
    this.path = path;
    this[_asyncDispatched] = false;
    this[_fileService] = null;
    this[_resourceInfo] = null;
    this[_ops] = null;
    this.closed = false;
    this[_ops] = io._RandomAccessFileOps.new(pointer);
    this[_resourceInfo] = new io._FileResourceInfo(this);
    this[_maybeConnectHandler]();
  }
  [_maybePerformCleanup]() {
    if (dart.test(this.closed)) {
      io._FileResourceInfo.FileClosed(this[_resourceInfo]);
    }
  }
  [_maybeConnectHandler]() {
    if (!dart.test(io._RandomAccessFile._connectedResourceHandler)) {
      developer.registerExtension('ext.dart.io.getOpenFiles', io._FileResourceInfo.getOpenFiles);
      developer.registerExtension('ext.dart.io.getFileByID', io._FileResourceInfo.getFileInfoMapByID);
      io._RandomAccessFile._connectedResourceHandler = true;
    }
  }
  close() {
    return this[_dispatch](io._FILE_CLOSE, [null], {markClosed: true}).then(io._RandomAccessFile)(dart.fn(result => {
      if (!dart.equals(result, -1)) {
        this.closed = dart.test(this.closed) || dart.equals(result, 0);
        this[_maybePerformCleanup]();
        return this;
      } else {
        dart.throw(new io.FileSystemException("Cannot close file", this.path));
      }
    }, dynamicTo_RandomAccessFile()));
  }
  closeSync() {
    this[_checkAvailable]();
    let id = this[_ops].close();
    if (id == -1) {
      dart.throw(new io.FileSystemException("Cannot close file", this.path));
    }
    this.closed = dart.test(this.closed) || id == 0;
    this[_maybePerformCleanup]();
  }
  readByte() {
    return this[_dispatch](io._FILE_READ_BYTE, [null]).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "readByte failed", this.path));
      }
      this[_resourceInfo].addRead(1);
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  readByteSync() {
    this[_checkAvailable]();
    let result = this[_ops].readByte();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("readByte failed", this.path, result));
    }
    this[_resourceInfo].addRead(1);
    return core.int._check(result);
  }
  read(bytes) {
    if (!(typeof bytes == 'number')) {
      dart.throw(new core.ArgumentError(bytes));
    }
    return this[_dispatch](io._FILE_READ, JSArrayOfint().of([null, bytes])).then(ListOfint())(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
      }
      this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
      return FutureOrOfListOfint()._check(dart.dindex(response, 1));
    }, dynamicToFutureOrOfListOfint()));
  }
  readSync(bytes) {
    this[_checkAvailable]();
    if (!(typeof bytes == 'number')) {
      dart.throw(new core.ArgumentError(bytes));
    }
    let result = this[_ops].read(bytes);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("readSync failed", this.path, result));
    }
    this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
    return ListOfint()._check(result);
  }
  readInto(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return FutureOfint().value(0);
    }
    let length = dart.notNull(end) - dart.notNull(start);
    return this[_dispatch](io._FILE_READ_INTO, JSArrayOfint().of([null, length])).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
      }
      let read = dart.dindex(response, 1);
      let data = dart.dindex(response, 2);
      buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
      this[_resourceInfo].addRead(core.int._check(read));
      return FutureOrOfint()._check(read);
    }, dynamicToFutureOrOfint()));
  }
  readIntoSync(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    this[_checkAvailable]();
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return 0;
    }
    let result = this[_ops].readInto(buffer, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("readInto failed", this.path, result));
    }
    this[_resourceInfo].addRead(core.int._check(result));
    return core.int._check(result);
  }
  writeByte(value) {
    if (!(typeof value == 'number')) {
      dart.throw(new core.ArgumentError(value));
    }
    return this[_dispatch](io._FILE_WRITE_BYTE, JSArrayOfint().of([null, value])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "writeByte failed", this.path));
      }
      this[_resourceInfo].addWrite(1);
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  writeByteSync(value) {
    this[_checkAvailable]();
    if (!(typeof value == 'number')) {
      dart.throw(new core.ArgumentError(value));
    }
    let result = this[_ops].writeByte(value);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("writeByte failed", this.path, result));
    }
    this[_resourceInfo].addWrite(1);
    return core.int._check(result);
  }
  writeFrom(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError("Invalid arguments to writeFrom"));
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return FutureOfRandomAccessFile().value(this);
    }
    let result = null;
    try {
      result = io._ensureFastAndSerializableByteData(buffer, start, end);
    } catch (e) {
      return FutureOfRandomAccessFile().error(e);
    }

    let request = core.List.new(4);
    request[dartx._set](0, null);
    request[dartx._set](1, result.buffer);
    request[dartx._set](2, result.start);
    request[dartx._set](3, dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
    return this[_dispatch](io._FILE_WRITE_FROM, request).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "writeFrom failed", this.path));
      }
      this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  writeFromSync(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    this[_checkAvailable]();
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError("Invalid arguments to writeFromSync"));
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return;
    }
    let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
    let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
    }
    this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
  }
  writeString(string, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    if (!convert.Encoding.is(encoding)) {
      dart.throw(new core.ArgumentError(encoding));
    }
    let data = encoding.encode(string);
    return this.writeFrom(data, 0, data[dartx.length]);
  }
  writeStringSync(string, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    if (!convert.Encoding.is(encoding)) {
      dart.throw(new core.ArgumentError(encoding));
    }
    let data = encoding.encode(string);
    this.writeFromSync(data, 0, data[dartx.length]);
  }
  position() {
    return this[_dispatch](io._FILE_POSITION, [null]).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "position failed", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  positionSync() {
    this[_checkAvailable]();
    let result = this[_ops].position();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("position failed", this.path, result));
    }
    return core.int._check(result);
  }
  setPosition(position) {
    return this[_dispatch](io._FILE_SET_POSITION, JSArrayOfint().of([null, position])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "setPosition failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  setPositionSync(position) {
    this[_checkAvailable]();
    let result = this[_ops].setPosition(position);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("setPosition failed", this.path, result));
    }
  }
  truncate(length) {
    return this[_dispatch](io._FILE_TRUNCATE, JSArrayOfint().of([null, length])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "truncate failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  truncateSync(length) {
    this[_checkAvailable]();
    let result = this[_ops].truncate(length);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("truncate failed", this.path, result));
    }
  }
  length() {
    return this[_dispatch](io._FILE_LENGTH, [null]).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "length failed", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  lengthSync() {
    this[_checkAvailable]();
    let result = this[_ops].length();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("length failed", this.path, result));
    }
    return core.int._check(result);
  }
  flush() {
    return this[_dispatch](io._FILE_FLUSH, [null]).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "flush failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  flushSync() {
    this[_checkAvailable]();
    let result = this[_ops].flush();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("flush failed", this.path, result));
    }
  }
  lock(mode, start, end) {
    if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
      dart.throw(new core.ArgumentError());
    }
    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
    return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  unlock(start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    if (!(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (start == end) {
      dart.throw(new core.ArgumentError());
    }
    return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, io._RandomAccessFile.LOCK_UNLOCK, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, 'unlock failed', this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  lockSync(mode, start, end) {
    if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    this[_checkAvailable]();
    if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
      dart.throw(new core.ArgumentError());
    }
    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
    let result = this[_ops].lock(lock, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException('lock failed', this.path, result));
    }
  }
  unlockSync(start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    this[_checkAvailable]();
    if (!(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (start == end) {
      dart.throw(new core.ArgumentError());
    }
    let result = this[_ops].lock(io._RandomAccessFile.LOCK_UNLOCK, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException('unlock failed', this.path, result));
    }
  }
  [_pointer]() {
    return this[_ops].getPointer();
  }
  [_dispatch](request, data, opts) {
    let markClosed = opts && 'markClosed' in opts ? opts.markClosed : false;
    if (dart.test(this.closed)) {
      return async.Future.error(new io.FileSystemException("File closed", this.path));
    }
    if (dart.test(this[_asyncDispatched])) {
      let msg = "An async operation is currently pending";
      return async.Future.error(new io.FileSystemException(msg, this.path));
    }
    if (dart.test(markClosed)) {
      this.closed = true;
    }
    this[_asyncDispatched] = true;
    data[dartx._set](0, this[_pointer]());
    return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
      this[_asyncDispatched] = false;
    }, VoidToNull()));
  }
  [_checkAvailable]() {
    if (dart.test(this[_asyncDispatched])) {
      dart.throw(new io.FileSystemException("An async operation is currently pending", this.path));
    }
    if (dart.test(this.closed)) {
      dart.throw(new io.FileSystemException("File closed", this.path));
    }
  }
};
io._RandomAccessFile[dart.implements] = () => [io.RandomAccessFile];
dart.setSignature(io._RandomAccessFile, {
  constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFile, [core.int, core.String])}),
  fields: () => ({
    path: core.String,
    [_asyncDispatched]: core.bool,
    [_fileService]: isolate.SendPort,
    [_resourceInfo]: io._FileResourceInfo,
    [_ops]: io._RandomAccessFileOps,
    closed: core.bool
  }),
  methods: () => ({
    [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
    [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
    close: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
    closeSync: dart.definiteFunctionType(dart.void, []),
    readByte: dart.definiteFunctionType(async.Future$(core.int), []),
    readByteSync: dart.definiteFunctionType(core.int, []),
    read: dart.definiteFunctionType(async.Future$(core.List$(core.int)), [core.int]),
    readSync: dart.definiteFunctionType(core.List$(core.int), [core.int]),
    readInto: dart.definiteFunctionType(async.Future$(core.int), [ListOfint()], [core.int, core.int]),
    readIntoSync: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
    writeByte: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
    writeByteSync: dart.definiteFunctionType(core.int, [core.int]),
    writeFrom: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [ListOfint()], [core.int, core.int]),
    writeFromSync: dart.definiteFunctionType(dart.void, [ListOfint()], [core.int, core.int]),
    writeString: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.String], {encoding: convert.Encoding}),
    writeStringSync: dart.definiteFunctionType(dart.void, [core.String], {encoding: convert.Encoding}),
    position: dart.definiteFunctionType(async.Future$(core.int), []),
    positionSync: dart.definiteFunctionType(core.int, []),
    setPosition: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
    setPositionSync: dart.definiteFunctionType(dart.void, [core.int]),
    truncate: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
    truncateSync: dart.definiteFunctionType(dart.void, [core.int]),
    length: dart.definiteFunctionType(async.Future$(core.int), []),
    lengthSync: dart.definiteFunctionType(core.int, []),
    flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
    flushSync: dart.definiteFunctionType(dart.void, []),
    lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
    unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
    lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
    unlockSync: dart.definiteFunctionType(dart.void, [], [core.int, core.int]),
    [_pointer]: dart.definiteFunctionType(core.int, []),
    [_dispatch]: dart.definiteFunctionType(async.Future, [core.int, core.List], {markClosed: core.bool}),
    [_checkAvailable]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    _connectedResourceHandler: core.bool,
    LOCK_UNLOCK: core.int,
    LOCK_SHARED: core.int,
    LOCK_EXCLUSIVE: core.int
  })
});
io._RandomAccessFile._connectedResourceHandler = false;
io._RandomAccessFile.LOCK_UNLOCK = 0;
io._RandomAccessFile.LOCK_SHARED = 1;
io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
let const$56;
io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
  _internal(type) {
    this[_type] = type;
  }
  static _lookup(type) {
    return io.FileSystemEntityType._typeList[dartx._get](type);
  }
  toString() {
    return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
  }
};
dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
dart.setSignature(io.FileSystemEntityType, {
  constructors: () => ({_internal: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
  fields: () => ({[_type]: core.int}),
  sfields: () => ({
    FILE: io.FileSystemEntityType,
    DIRECTORY: io.FileSystemEntityType,
    LINK: io.FileSystemEntityType,
    NOT_FOUND: io.FileSystemEntityType,
    _typeList: ListOfFileSystemEntityType()
  }),
  statics: () => ({_lookup: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
  names: ['_lookup']
});
dart.defineLazy(io.FileSystemEntityType, {
  get FILE() {
    return dart.const(new io.FileSystemEntityType._internal(0));
  },
  get DIRECTORY() {
    return dart.const(new io.FileSystemEntityType._internal(1));
  },
  get LINK() {
    return dart.const(new io.FileSystemEntityType._internal(2));
  },
  get NOT_FOUND() {
    return dart.const(new io.FileSystemEntityType._internal(3));
  },
  get _typeList() {
    return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
  }
});
let const$57;
io.FileStat = class FileStat extends core.Object {
  _internal(changed, modified, accessed, type, mode, size) {
    this.changed = changed;
    this.modified = modified;
    this.accessed = accessed;
    this.type = type;
    this.mode = mode;
    this.size = size;
  }
  _internalNotFound() {
    this.changed = null;
    this.modified = null;
    this.accessed = null;
    this.type = io.FileSystemEntityType.NOT_FOUND;
    this.mode = 0;
    this.size = -1;
  }
  static _statSync(path) {
    dart.throw(new core.UnsupportedError("FileStat.stat"));
  }
  static statSync(path) {
    if (dart.test(io.Platform.isWindows)) {
      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
    }
    let data = io.FileStat._statSync(path);
    if (io.OSError.is(data)) return io.FileStat._notFound;
    return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(dart.dindex(data, io.FileStat._TYPE))), core.int._check(dart.dindex(data, io.FileStat._MODE)), core.int._check(dart.dindex(data, io.FileStat._SIZE)));
  }
  static stat(path) {
    if (dart.test(io.Platform.isWindows)) {
      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
    }
    return io._IOService._dispatch(io._FILE_STAT, JSArrayOfString().of([path])).then(io.FileStat)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        return io.FileStat._notFound;
      }
      let data = core.List._check(dart.dindex(response, 1));
      return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(data[dartx._get](io.FileStat._TYPE))), core.int._check(data[dartx._get](io.FileStat._MODE)), core.int._check(data[dartx._get](io.FileStat._SIZE)));
    }, dynamicToFileStat()));
  }
  toString() {
    return dart.str`FileStat: type ${this.type}\n          changed ${this.changed}\n          modified ${this.modified}\n          accessed ${this.accessed}\n          mode ${this.modeString()}\n          size ${this.size}`;
  }
  modeString() {
    let permissions = dart.notNull(this.mode) & 4095;
    let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
    let result = [];
    if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
    if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
    if ((permissions & 512) != 0) result[dartx.add]("(sticky) ");
    result[dartx.add](codes[dartx._get](permissions >> 6 & 7));
    result[dartx.add](codes[dartx._get](permissions >> 3 & 7));
    result[dartx.add](codes[dartx._get](permissions & 7));
    return result[dartx.join]();
  }
};
dart.defineNamedConstructor(io.FileStat, '_internal');
dart.defineNamedConstructor(io.FileStat, '_internalNotFound');
dart.setSignature(io.FileStat, {
  constructors: () => ({
    _internal: dart.definiteFunctionType(io.FileStat, [core.DateTime, core.DateTime, core.DateTime, io.FileSystemEntityType, core.int, core.int]),
    _internalNotFound: dart.definiteFunctionType(io.FileStat, [])
  }),
  fields: () => ({
    changed: core.DateTime,
    modified: core.DateTime,
    accessed: core.DateTime,
    type: io.FileSystemEntityType,
    mode: core.int,
    size: core.int
  }),
  methods: () => ({modeString: dart.definiteFunctionType(core.String, [])}),
  sfields: () => ({
    _TYPE: core.int,
    _CHANGED_TIME: core.int,
    _MODIFIED_TIME: core.int,
    _ACCESSED_TIME: core.int,
    _MODE: core.int,
    _SIZE: core.int,
    _notFound: io.FileStat
  }),
  statics: () => ({
    _statSync: dart.definiteFunctionType(dart.dynamic, [core.String]),
    statSync: dart.definiteFunctionType(io.FileStat, [core.String]),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), [core.String])
  }),
  names: ['_statSync', 'statSync', 'stat']
});
io.FileStat._TYPE = 0;
io.FileStat._CHANGED_TIME = 1;
io.FileStat._MODIFIED_TIME = 2;
io.FileStat._ACCESSED_TIME = 3;
io.FileStat._MODE = 4;
io.FileStat._SIZE = 5;
dart.defineLazy(io.FileStat, {
  get _notFound() {
    return dart.const(new io.FileStat._internalNotFound());
  }
});
io.FileSystemEvent = class FileSystemEvent extends core.Object {
  _(type, path, isDirectory) {
    this.type = type;
    this.path = path;
    this.isDirectory = isDirectory;
  }
};
dart.defineNamedConstructor(io.FileSystemEvent, '_');
dart.setSignature(io.FileSystemEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemEvent, [core.int, core.String, core.bool])}),
  fields: () => ({
    type: core.int,
    path: core.String,
    isDirectory: core.bool
  }),
  sfields: () => ({
    CREATE: core.int,
    MODIFY: core.int,
    DELETE: core.int,
    MOVE: core.int,
    ALL: core.int,
    _MODIFY_ATTRIBUTES: core.int,
    _DELETE_SELF: core.int,
    _IS_DIR: core.int
  })
});
io.FileSystemEvent.CREATE = 1 << 0;
io.FileSystemEvent.MODIFY = 1 << 1;
io.FileSystemEvent.DELETE = 1 << 2;
io.FileSystemEvent.MOVE = 1 << 3;
io.FileSystemEvent._MODIFY_ATTRIBUTES = 1 << 4;
io.FileSystemEvent._DELETE_SELF = 1 << 5;
io.FileSystemEvent._IS_DIR = 1 << 6;
dart.defineLazy(io.FileSystemEvent, {
  get ALL() {
    return io.FileSystemEvent.CREATE | io.FileSystemEvent.MODIFY | io.FileSystemEvent.DELETE | io.FileSystemEvent.MOVE;
  }
});
io.FileSystemCreateEvent = class FileSystemCreateEvent extends io.FileSystemEvent {
  _(path, isDirectory) {
    super._(io.FileSystemEvent.CREATE, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    return dart.str`FileSystemCreateEvent('${this.path}')`;
  }
};
dart.defineNamedConstructor(io.FileSystemCreateEvent, '_');
dart.setSignature(io.FileSystemCreateEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemCreateEvent, [dart.dynamic, dart.dynamic])})
});
io.FileSystemModifyEvent = class FileSystemModifyEvent extends io.FileSystemEvent {
  _(path, isDirectory, contentChanged) {
    this.contentChanged = contentChanged;
    super._(io.FileSystemEvent.MODIFY, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    return dart.str`FileSystemModifyEvent('${this.path}', contentChanged=${this.contentChanged})`;
  }
};
dart.defineNamedConstructor(io.FileSystemModifyEvent, '_');
dart.setSignature(io.FileSystemModifyEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemModifyEvent, [dart.dynamic, dart.dynamic, core.bool])}),
  fields: () => ({contentChanged: core.bool})
});
io.FileSystemDeleteEvent = class FileSystemDeleteEvent extends io.FileSystemEvent {
  _(path, isDirectory) {
    super._(io.FileSystemEvent.DELETE, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    return dart.str`FileSystemDeleteEvent('${this.path}')`;
  }
};
dart.defineNamedConstructor(io.FileSystemDeleteEvent, '_');
dart.setSignature(io.FileSystemDeleteEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemDeleteEvent, [dart.dynamic, dart.dynamic])})
});
io.FileSystemMoveEvent = class FileSystemMoveEvent extends io.FileSystemEvent {
  _(path, isDirectory, destination) {
    this.destination = destination;
    super._(io.FileSystemEvent.MOVE, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    let buffer = new core.StringBuffer();
    buffer.write(dart.str`FileSystemMoveEvent('${this.path}'`);
    if (this.destination != null) buffer.write(dart.str`, '${this.destination}'`);
    buffer.write(')');
    return buffer.toString();
  }
};
dart.defineNamedConstructor(io.FileSystemMoveEvent, '_');
dart.setSignature(io.FileSystemMoveEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemMoveEvent, [dart.dynamic, dart.dynamic, core.String])}),
  fields: () => ({destination: core.String})
});
io._FileSystemWatcher = class _FileSystemWatcher extends core.Object {
  static _watch(path, events, recursive) {
    dart.throw(new core.UnsupportedError("_FileSystemWatcher.watch"));
  }
  static get isSupported() {
    dart.throw(new core.UnsupportedError("_FileSystemWatcher.isSupported"));
  }
};
dart.setSignature(io._FileSystemWatcher, {
  sgetters: () => ({isSupported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({_watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [core.String, core.int, core.bool])}),
  names: ['_watch']
});
io.HttpStatus = class HttpStatus extends core.Object {};
dart.setSignature(io.HttpStatus, {
  sfields: () => ({
    CONTINUE: core.int,
    SWITCHING_PROTOCOLS: core.int,
    OK: core.int,
    CREATED: core.int,
    ACCEPTED: core.int,
    NON_AUTHORITATIVE_INFORMATION: core.int,
    NO_CONTENT: core.int,
    RESET_CONTENT: core.int,
    PARTIAL_CONTENT: core.int,
    MULTIPLE_CHOICES: core.int,
    MOVED_PERMANENTLY: core.int,
    FOUND: core.int,
    MOVED_TEMPORARILY: core.int,
    SEE_OTHER: core.int,
    NOT_MODIFIED: core.int,
    USE_PROXY: core.int,
    TEMPORARY_REDIRECT: core.int,
    BAD_REQUEST: core.int,
    UNAUTHORIZED: core.int,
    PAYMENT_REQUIRED: core.int,
    FORBIDDEN: core.int,
    NOT_FOUND: core.int,
    METHOD_NOT_ALLOWED: core.int,
    NOT_ACCEPTABLE: core.int,
    PROXY_AUTHENTICATION_REQUIRED: core.int,
    REQUEST_TIMEOUT: core.int,
    CONFLICT: core.int,
    GONE: core.int,
    LENGTH_REQUIRED: core.int,
    PRECONDITION_FAILED: core.int,
    REQUEST_ENTITY_TOO_LARGE: core.int,
    REQUEST_URI_TOO_LONG: core.int,
    UNSUPPORTED_MEDIA_TYPE: core.int,
    REQUESTED_RANGE_NOT_SATISFIABLE: core.int,
    EXPECTATION_FAILED: core.int,
    INTERNAL_SERVER_ERROR: core.int,
    NOT_IMPLEMENTED: core.int,
    BAD_GATEWAY: core.int,
    SERVICE_UNAVAILABLE: core.int,
    GATEWAY_TIMEOUT: core.int,
    HTTP_VERSION_NOT_SUPPORTED: core.int,
    NETWORK_CONNECT_TIMEOUT_ERROR: core.int
  })
});
io.HttpStatus.CONTINUE = 100;
io.HttpStatus.SWITCHING_PROTOCOLS = 101;
io.HttpStatus.OK = 200;
io.HttpStatus.CREATED = 201;
io.HttpStatus.ACCEPTED = 202;
io.HttpStatus.NON_AUTHORITATIVE_INFORMATION = 203;
io.HttpStatus.NO_CONTENT = 204;
io.HttpStatus.RESET_CONTENT = 205;
io.HttpStatus.PARTIAL_CONTENT = 206;
io.HttpStatus.MULTIPLE_CHOICES = 300;
io.HttpStatus.MOVED_PERMANENTLY = 301;
io.HttpStatus.FOUND = 302;
io.HttpStatus.MOVED_TEMPORARILY = 302;
io.HttpStatus.SEE_OTHER = 303;
io.HttpStatus.NOT_MODIFIED = 304;
io.HttpStatus.USE_PROXY = 305;
io.HttpStatus.TEMPORARY_REDIRECT = 307;
io.HttpStatus.BAD_REQUEST = 400;
io.HttpStatus.UNAUTHORIZED = 401;
io.HttpStatus.PAYMENT_REQUIRED = 402;
io.HttpStatus.FORBIDDEN = 403;
io.HttpStatus.NOT_FOUND = 404;
io.HttpStatus.METHOD_NOT_ALLOWED = 405;
io.HttpStatus.NOT_ACCEPTABLE = 406;
io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED = 407;
io.HttpStatus.REQUEST_TIMEOUT = 408;
io.HttpStatus.CONFLICT = 409;
io.HttpStatus.GONE = 410;
io.HttpStatus.LENGTH_REQUIRED = 411;
io.HttpStatus.PRECONDITION_FAILED = 412;
io.HttpStatus.REQUEST_ENTITY_TOO_LARGE = 413;
io.HttpStatus.REQUEST_URI_TOO_LONG = 414;
io.HttpStatus.UNSUPPORTED_MEDIA_TYPE = 415;
io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE = 416;
io.HttpStatus.EXPECTATION_FAILED = 417;
io.HttpStatus.INTERNAL_SERVER_ERROR = 500;
io.HttpStatus.NOT_IMPLEMENTED = 501;
io.HttpStatus.BAD_GATEWAY = 502;
io.HttpStatus.SERVICE_UNAVAILABLE = 503;
io.HttpStatus.GATEWAY_TIMEOUT = 504;
io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED = 505;
io.HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR = 599;
io.HttpServer = class HttpServer extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io._HttpServer.bind(address, port, backlog, v6Only, shared);
  }
  static bindSecure(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io._HttpServer.bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared);
  }
  static listenOn(serverSocket) {
    return new io._HttpServer.listenOn(serverSocket);
  }
};
io.HttpServer[dart.implements] = () => [StreamOfHttpRequest()];
dart.setSignature(io.HttpServer, {
  constructors: () => ({listenOn: dart.definiteFunctionType(io.HttpServer, [io.ServerSocket])}),
  fields: () => ({
    serverHeader: core.String,
    autoCompress: core.bool,
    idleTimeout: core.Duration
  }),
  statics: () => ({
    bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool}),
    bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, shared: core.bool})
  }),
  names: ['bind', 'bindSecure']
});
io.HttpConnectionsInfo = class HttpConnectionsInfo extends core.Object {
  new() {
    this.total = 0;
    this.active = 0;
    this.idle = 0;
    this.closing = 0;
  }
};
dart.setSignature(io.HttpConnectionsInfo, {
  fields: () => ({
    total: core.int,
    active: core.int,
    idle: core.int,
    closing: core.int
  })
});
io.HttpHeaders = class HttpHeaders extends core.Object {
  new() {
    this.date = null;
    this.expires = null;
    this.ifModifiedSince = null;
    this.host = null;
    this.port = null;
    this.contentType = null;
    this.contentLength = null;
    this.persistentConnection = null;
    this.chunkedTransferEncoding = null;
  }
};
dart.setSignature(io.HttpHeaders, {
  fields: () => ({
    date: core.DateTime,
    expires: core.DateTime,
    ifModifiedSince: core.DateTime,
    host: core.String,
    port: core.int,
    contentType: io.ContentType,
    contentLength: core.int,
    persistentConnection: core.bool,
    chunkedTransferEncoding: core.bool
  }),
  sfields: () => ({
    ACCEPT: core.String,
    ACCEPT_CHARSET: core.String,
    ACCEPT_ENCODING: core.String,
    ACCEPT_LANGUAGE: core.String,
    ACCEPT_RANGES: core.String,
    AGE: core.String,
    ALLOW: core.String,
    AUTHORIZATION: core.String,
    CACHE_CONTROL: core.String,
    CONNECTION: core.String,
    CONTENT_ENCODING: core.String,
    CONTENT_LANGUAGE: core.String,
    CONTENT_LENGTH: core.String,
    CONTENT_LOCATION: core.String,
    CONTENT_MD5: core.String,
    CONTENT_RANGE: core.String,
    CONTENT_TYPE: core.String,
    DATE: core.String,
    ETAG: core.String,
    EXPECT: core.String,
    EXPIRES: core.String,
    FROM: core.String,
    HOST: core.String,
    IF_MATCH: core.String,
    IF_MODIFIED_SINCE: core.String,
    IF_NONE_MATCH: core.String,
    IF_RANGE: core.String,
    IF_UNMODIFIED_SINCE: core.String,
    LAST_MODIFIED: core.String,
    LOCATION: core.String,
    MAX_FORWARDS: core.String,
    PRAGMA: core.String,
    PROXY_AUTHENTICATE: core.String,
    PROXY_AUTHORIZATION: core.String,
    RANGE: core.String,
    REFERER: core.String,
    RETRY_AFTER: core.String,
    SERVER: core.String,
    TE: core.String,
    TRAILER: core.String,
    TRANSFER_ENCODING: core.String,
    UPGRADE: core.String,
    USER_AGENT: core.String,
    VARY: core.String,
    VIA: core.String,
    WARNING: core.String,
    WWW_AUTHENTICATE: core.String,
    COOKIE: core.String,
    SET_COOKIE: core.String,
    GENERAL_HEADERS: ListOfString(),
    ENTITY_HEADERS: ListOfString(),
    RESPONSE_HEADERS: ListOfString(),
    REQUEST_HEADERS: ListOfString()
  })
});
io.HttpHeaders.ACCEPT = "accept";
io.HttpHeaders.ACCEPT_CHARSET = "accept-charset";
io.HttpHeaders.ACCEPT_ENCODING = "accept-encoding";
io.HttpHeaders.ACCEPT_LANGUAGE = "accept-language";
io.HttpHeaders.ACCEPT_RANGES = "accept-ranges";
io.HttpHeaders.AGE = "age";
io.HttpHeaders.ALLOW = "allow";
io.HttpHeaders.AUTHORIZATION = "authorization";
io.HttpHeaders.CACHE_CONTROL = "cache-control";
io.HttpHeaders.CONNECTION = "connection";
io.HttpHeaders.CONTENT_ENCODING = "content-encoding";
io.HttpHeaders.CONTENT_LANGUAGE = "content-language";
io.HttpHeaders.CONTENT_LENGTH = "content-length";
io.HttpHeaders.CONTENT_LOCATION = "content-location";
io.HttpHeaders.CONTENT_MD5 = "content-md5";
io.HttpHeaders.CONTENT_RANGE = "content-range";
io.HttpHeaders.CONTENT_TYPE = "content-type";
io.HttpHeaders.DATE = "date";
io.HttpHeaders.ETAG = "etag";
io.HttpHeaders.EXPECT = "expect";
io.HttpHeaders.EXPIRES = "expires";
io.HttpHeaders.FROM = "from";
io.HttpHeaders.HOST = "host";
io.HttpHeaders.IF_MATCH = "if-match";
io.HttpHeaders.IF_MODIFIED_SINCE = "if-modified-since";
io.HttpHeaders.IF_NONE_MATCH = "if-none-match";
io.HttpHeaders.IF_RANGE = "if-range";
io.HttpHeaders.IF_UNMODIFIED_SINCE = "if-unmodified-since";
io.HttpHeaders.LAST_MODIFIED = "last-modified";
io.HttpHeaders.LOCATION = "location";
io.HttpHeaders.MAX_FORWARDS = "max-forwards";
io.HttpHeaders.PRAGMA = "pragma";
io.HttpHeaders.PROXY_AUTHENTICATE = "proxy-authenticate";
io.HttpHeaders.PROXY_AUTHORIZATION = "proxy-authorization";
io.HttpHeaders.RANGE = "range";
io.HttpHeaders.REFERER = "referer";
io.HttpHeaders.RETRY_AFTER = "retry-after";
io.HttpHeaders.SERVER = "server";
io.HttpHeaders.TE = "te";
io.HttpHeaders.TRAILER = "trailer";
io.HttpHeaders.TRANSFER_ENCODING = "transfer-encoding";
io.HttpHeaders.UPGRADE = "upgrade";
io.HttpHeaders.USER_AGENT = "user-agent";
io.HttpHeaders.VARY = "vary";
io.HttpHeaders.VIA = "via";
io.HttpHeaders.WARNING = "warning";
io.HttpHeaders.WWW_AUTHENTICATE = "www-authenticate";
io.HttpHeaders.COOKIE = "cookie";
io.HttpHeaders.SET_COOKIE = "set-cookie";
dart.defineLazy(io.HttpHeaders, {
  get GENERAL_HEADERS() {
    return dart.constList([io.HttpHeaders.CACHE_CONTROL, io.HttpHeaders.CONNECTION, io.HttpHeaders.DATE, io.HttpHeaders.PRAGMA, io.HttpHeaders.TRAILER, io.HttpHeaders.TRANSFER_ENCODING, io.HttpHeaders.UPGRADE, io.HttpHeaders.VIA, io.HttpHeaders.WARNING], core.String);
  },
  get ENTITY_HEADERS() {
    return dart.constList([io.HttpHeaders.ALLOW, io.HttpHeaders.CONTENT_ENCODING, io.HttpHeaders.CONTENT_LANGUAGE, io.HttpHeaders.CONTENT_LENGTH, io.HttpHeaders.CONTENT_LOCATION, io.HttpHeaders.CONTENT_MD5, io.HttpHeaders.CONTENT_RANGE, io.HttpHeaders.CONTENT_TYPE, io.HttpHeaders.EXPIRES, io.HttpHeaders.LAST_MODIFIED], core.String);
  },
  get RESPONSE_HEADERS() {
    return dart.constList([io.HttpHeaders.ACCEPT_RANGES, io.HttpHeaders.AGE, io.HttpHeaders.ETAG, io.HttpHeaders.LOCATION, io.HttpHeaders.PROXY_AUTHENTICATE, io.HttpHeaders.RETRY_AFTER, io.HttpHeaders.SERVER, io.HttpHeaders.VARY, io.HttpHeaders.WWW_AUTHENTICATE], core.String);
  },
  get REQUEST_HEADERS() {
    return dart.constList([io.HttpHeaders.ACCEPT, io.HttpHeaders.ACCEPT_CHARSET, io.HttpHeaders.ACCEPT_ENCODING, io.HttpHeaders.ACCEPT_LANGUAGE, io.HttpHeaders.AUTHORIZATION, io.HttpHeaders.EXPECT, io.HttpHeaders.FROM, io.HttpHeaders.HOST, io.HttpHeaders.IF_MATCH, io.HttpHeaders.IF_MODIFIED_SINCE, io.HttpHeaders.IF_NONE_MATCH, io.HttpHeaders.IF_RANGE, io.HttpHeaders.IF_UNMODIFIED_SINCE, io.HttpHeaders.MAX_FORWARDS, io.HttpHeaders.PROXY_AUTHORIZATION, io.HttpHeaders.RANGE, io.HttpHeaders.REFERER, io.HttpHeaders.TE, io.HttpHeaders.USER_AGENT], core.String);
  }
});
io.HeaderValue = class HeaderValue extends core.Object {
  static new(value, parameters) {
    if (value === void 0) value = "";
    if (parameters === void 0) parameters = null;
    return new io._HeaderValue(value, parameters);
  }
  static parse(value, opts) {
    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
    return io._HeaderValue.parse(value, {parameterSeparator: parameterSeparator, valueSeparator: valueSeparator, preserveBackslash: preserveBackslash});
  }
};
dart.setSignature(io.HeaderValue, {
  constructors: () => ({new: dart.definiteFunctionType(io.HeaderValue, [], [core.String, MapOfString$String()])}),
  statics: () => ({parse: dart.definiteFunctionType(io.HeaderValue, [core.String], {parameterSeparator: core.String, valueSeparator: core.String, preserveBackslash: core.bool})}),
  names: ['parse']
});
io.HttpSession = class HttpSession extends core.Object {};
io.HttpSession[dart.implements] = () => [core.Map];
io.ContentType = class ContentType extends core.Object {
  static new(primaryType, subType, opts) {
    let charset = opts && 'charset' in opts ? opts.charset : null;
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    return new io._ContentType(primaryType, subType, charset, parameters);
  }
  static parse(value) {
    return io._ContentType.parse(value);
  }
};
io.ContentType[dart.implements] = () => [io.HeaderValue];
dart.setSignature(io.ContentType, {
  constructors: () => ({new: dart.definiteFunctionType(io.ContentType, [core.String, core.String], {charset: core.String, parameters: MapOfString$String()})}),
  sfields: () => ({
    TEXT: io.ContentType,
    HTML: io.ContentType,
    JSON: io.ContentType,
    BINARY: io.ContentType
  }),
  statics: () => ({parse: dart.definiteFunctionType(io.ContentType, [core.String])}),
  names: ['parse']
});
dart.defineLazy(io.ContentType, {
  get TEXT() {
    return io.ContentType.new("text", "plain", {charset: "utf-8"});
  },
  get HTML() {
    return io.ContentType.new("text", "html", {charset: "utf-8"});
  },
  get JSON() {
    return io.ContentType.new("application", "json", {charset: "utf-8"});
  },
  get BINARY() {
    return io.ContentType.new("application", "octet-stream");
  }
});
io.Cookie = class Cookie extends core.Object {
  static new(name, value) {
    if (name === void 0) name = null;
    if (value === void 0) value = null;
    return new io._Cookie(name, value);
  }
  static fromSetCookieValue(value) {
    return new io._Cookie.fromSetCookieValue(value);
  }
};
dart.setSignature(io.Cookie, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.Cookie, [], [core.String, core.String]),
    fromSetCookieValue: dart.definiteFunctionType(io.Cookie, [core.String])
  }),
  fields: () => ({
    name: core.String,
    value: core.String,
    expires: core.DateTime,
    maxAge: core.int,
    domain: core.String,
    path: core.String,
    secure: core.bool,
    httpOnly: core.bool
  })
});
io.HttpRequest = class HttpRequest extends core.Object {};
io.HttpRequest[dart.implements] = () => [StreamOfListOfint()];
io.HttpResponse = class HttpResponse extends core.Object {
  new() {
    this.contentLength = null;
    this.statusCode = null;
    this.reasonPhrase = null;
    this.persistentConnection = null;
    this.deadline = null;
    this.bufferOutput = null;
  }
};
io.HttpResponse[dart.implements] = () => [io.IOSink];
dart.setSignature(io.HttpResponse, {
  fields: () => ({
    contentLength: core.int,
    statusCode: core.int,
    reasonPhrase: core.String,
    persistentConnection: core.bool,
    deadline: core.Duration,
    bufferOutput: core.bool
  })
});
io.HttpClient = class HttpClient extends core.Object {
  static new(opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    return new io._HttpClient(context);
  }
  static findProxyFromEnvironment(url, opts) {
    let environment = opts && 'environment' in opts ? opts.environment : null;
    return io._HttpClient._findProxyFromEnvironment(url, environment);
  }
};
dart.setSignature(io.HttpClient, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpClient, [], {context: io.SecurityContext})}),
  fields: () => ({
    idleTimeout: core.Duration,
    maxConnectionsPerHost: core.int,
    autoUncompress: core.bool,
    userAgent: core.String
  }),
  sfields: () => ({
    DEFAULT_HTTP_PORT: core.int,
    DEFAULT_HTTPS_PORT: core.int
  }),
  statics: () => ({findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri], {environment: MapOfString$String()})}),
  names: ['findProxyFromEnvironment']
});
io.HttpClient.DEFAULT_HTTP_PORT = 80;
io.HttpClient.DEFAULT_HTTPS_PORT = 443;
io.HttpClientRequest = class HttpClientRequest extends core.Object {
  new() {
    this.persistentConnection = null;
    this.followRedirects = null;
    this.maxRedirects = null;
    this.contentLength = null;
    this.bufferOutput = null;
  }
};
io.HttpClientRequest[dart.implements] = () => [io.IOSink];
dart.setSignature(io.HttpClientRequest, {
  fields: () => ({
    persistentConnection: core.bool,
    followRedirects: core.bool,
    maxRedirects: core.int,
    contentLength: core.int,
    bufferOutput: core.bool
  })
});
io.HttpClientResponse = class HttpClientResponse extends core.Object {};
io.HttpClientResponse[dart.implements] = () => [StreamOfListOfint()];
io.HttpClientCredentials = class HttpClientCredentials extends core.Object {};
io.HttpClientBasicCredentials = class HttpClientBasicCredentials extends io.HttpClientCredentials {
  static new(username, password) {
    return new io._HttpClientBasicCredentials(username, password);
  }
};
dart.setSignature(io.HttpClientBasicCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpClientBasicCredentials, [core.String, core.String])})
});
io.HttpClientDigestCredentials = class HttpClientDigestCredentials extends io.HttpClientCredentials {
  static new(username, password) {
    return new io._HttpClientDigestCredentials(username, password);
  }
};
dart.setSignature(io.HttpClientDigestCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpClientDigestCredentials, [core.String, core.String])})
});
io.HttpConnectionInfo = class HttpConnectionInfo extends core.Object {};
io.RedirectInfo = class RedirectInfo extends core.Object {};
io.DetachedSocket = class DetachedSocket extends core.Object {};
io.HttpException = class HttpException extends core.Object {
  new(message, opts) {
    let uri = opts && 'uri' in opts ? opts.uri : null;
    this.message = message;
    this.uri = uri;
  }
  toString() {
    let b = new core.StringBuffer();
    b.write('HttpException: ');
    b.write(this.message);
    if (this.uri != null) {
      b.write(dart.str`, uri = ${this.uri}`);
    }
    return b.toString();
  }
};
io.HttpException[dart.implements] = () => [io.IOException];
dart.setSignature(io.HttpException, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpException, [core.String], {uri: core.Uri})}),
  fields: () => ({
    message: core.String,
    uri: core.Uri
  })
});
io.RedirectException = class RedirectException extends core.Object {
  new(message, redirects) {
    this.message = message;
    this.redirects = redirects;
  }
  toString() {
    return dart.str`RedirectException: ${this.message}`;
  }
  get uri() {
    return this.redirects[dartx.last].location;
  }
};
io.RedirectException[dart.implements] = () => [io.HttpException];
dart.setSignature(io.RedirectException, {
  constructors: () => ({new: dart.definiteFunctionType(io.RedirectException, [core.String, ListOfRedirectInfo()])}),
  fields: () => ({
    message: core.String,
    redirects: ListOfRedirectInfo()
  }),
  getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
});
let const$58;
let const$59;
let const$60;
let const$61;
let const$62;
let const$63;
let const$64;
let const$65;
let const$66;
io.HttpDate = class HttpDate extends core.Object {
  static format(date) {
    let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
    let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
    let d = date.toUtc();
    let sb = new core.StringBuffer();
    sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
    sb.write(", ");
    sb.write(dart.notNull(d.day) <= 9 ? "0" : "");
    sb.write(dart.toString(d.day));
    sb.write(" ");
    sb.write(month[dartx._get](dart.notNull(d.month) - 1));
    sb.write(" ");
    sb.write(dart.toString(d.year));
    sb.write(dart.notNull(d.hour) <= 9 ? " 0" : " ");
    sb.write(dart.toString(d.hour));
    sb.write(dart.notNull(d.minute) <= 9 ? ":0" : ":");
    sb.write(dart.toString(d.minute));
    sb.write(dart.notNull(d.second) <= 9 ? ":0" : ":");
    sb.write(dart.toString(d.second));
    sb.write(" GMT");
    return sb.toString();
  }
  static parse(date) {
    let SP = 32;
    let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
    let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
    let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
    let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
    let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
    let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
    let formatRfc1123 = 0;
    let formatRfc850 = 1;
    let formatAsctime = 2;
    let index = 0;
    let tmp = null;
    let format = null;
    function expect(s) {
      if (dart.notNull(date[dartx.length]) - dart.notNull(index) < dart.notNull(s[dartx.length])) {
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
      let tmp = date[dartx.substring](index, dart.notNull(index) + dart.notNull(s[dartx.length]));
      if (tmp != s) {
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
      index = dart.notNull(index) + dart.notNull(s[dartx.length]);
    }
    dart.fn(expect, StringTovoid$());
    function expectWeekday() {
      let weekday = null;
      let pos = date[dartx.indexOf](",", index);
      if (pos == -1) {
        let pos = date[dartx.indexOf](" ", index);
        if (pos == -1) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        tmp = date[dartx.substring](index, pos);
        index = dart.notNull(pos) + 1;
        weekday = wkdays[dartx.indexOf](tmp);
        if (weekday != -1) {
          format = formatAsctime;
          return weekday;
        }
      } else {
        tmp = date[dartx.substring](index, pos);
        index = dart.notNull(pos) + 1;
        weekday = wkdays[dartx.indexOf](tmp);
        if (weekday != -1) {
          format = formatRfc1123;
          return weekday;
        }
        weekday = weekdays[dartx.indexOf](tmp);
        if (weekday != -1) {
          format = formatRfc850;
          return weekday;
        }
      }
      dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
    }
    dart.fn(expectWeekday, VoidToint());
    function expectMonth(separator) {
      let pos = date[dartx.indexOf](separator, index);
      if (dart.notNull(pos) - dart.notNull(index) != 3) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      tmp = date[dartx.substring](index, pos);
      index = dart.notNull(pos) + 1;
      let month = months[dartx.indexOf](tmp);
      if (month != -1) return month;
      dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
    }
    dart.fn(expectMonth, StringToint$());
    function expectNum(separator) {
      let pos = null;
      if (dart.notNull(separator[dartx.length]) > 0) {
        pos = date[dartx.indexOf](separator, index);
      } else {
        pos = date[dartx.length];
      }
      let tmp = date[dartx.substring](index, pos);
      index = dart.notNull(pos) + dart.notNull(separator[dartx.length]);
      try {
        let value = core.int.parse(tmp);
        return value;
      } catch (e) {
        if (core.FormatException.is(e)) {
          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        } else
          throw e;
      }

    }
    dart.fn(expectNum, StringToint$());
    function expectEnd() {
      if (index != date[dartx.length]) {
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
    }
    dart.fn(expectEnd, VoidTovoid$());
    let weekday = expectWeekday();
    let day = null;
    let month = null;
    let year = null;
    let hours = null;
    let minutes = null;
    let seconds = null;
    if (format == formatAsctime) {
      month = expectMonth(" ");
      if (date[dartx.codeUnitAt](index) == SP) {
        index = dart.notNull(index) + 1;
      }
      day = expectNum(" ");
      hours = expectNum(":");
      minutes = expectNum(":");
      seconds = expectNum(" ");
      year = expectNum("");
    } else {
      expect(" ");
      day = expectNum(format == formatRfc1123 ? " " : "-");
      month = expectMonth(format == formatRfc1123 ? " " : "-");
      year = expectNum(" ");
      hours = expectNum(":");
      minutes = expectNum(":");
      seconds = expectNum(" ");
      expect("GMT");
    }
    expectEnd();
    return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
  }
  static _parseCookieDate(date) {
    let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
    let position = 0;
    function error() {
      dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
    }
    dart.fn(error, VoidTovoid$());
    function isEnd() {
      return position == date[dartx.length];
    }
    dart.fn(isEnd, VoidTobool());
    function isDelimiter(s) {
      let char = s[dartx.codeUnitAt](0);
      if (char == 9) return true;
      if (dart.notNull(char) >= 32 && dart.notNull(char) <= 47) return true;
      if (dart.notNull(char) >= 59 && dart.notNull(char) <= 64) return true;
      if (dart.notNull(char) >= 91 && dart.notNull(char) <= 96) return true;
      if (dart.notNull(char) >= 123 && dart.notNull(char) <= 126) return true;
      return false;
    }
    dart.fn(isDelimiter, StringTobool$());
    function isNonDelimiter(s) {
      let char = s[dartx.codeUnitAt](0);
      if (dart.notNull(char) >= 0 && dart.notNull(char) <= 8) return true;
      if (dart.notNull(char) >= 10 && dart.notNull(char) <= 31) return true;
      if (dart.notNull(char) >= 48 && dart.notNull(char) <= 57) return true;
      if (char == 58) return true;
      if (dart.notNull(char) >= 65 && dart.notNull(char) <= 90) return true;
      if (dart.notNull(char) >= 97 && dart.notNull(char) <= 122) return true;
      if (dart.notNull(char) >= 127 && dart.notNull(char) <= 255) return true;
      return false;
    }
    dart.fn(isNonDelimiter, StringTobool$());
    function isDigit(s) {
      let char = s[dartx.codeUnitAt](0);
      if (dart.notNull(char) > 47 && dart.notNull(char) < 58) return true;
      return false;
    }
    dart.fn(isDigit, StringTobool$());
    function getMonth(month) {
      if (dart.notNull(month[dartx.length]) < 3) return -1;
      return monthsLowerCase[dartx.indexOf](month[dartx.substring](0, 3));
    }
    dart.fn(getMonth, StringToint$());
    function toInt(s) {
      let index = 0;
      for (; index < dart.notNull(s[dartx.length]) && dart.test(isDigit(s[dartx._get](index))); index++)
        ;
      return core.int.parse(s[dartx.substring](0, index));
    }
    dart.fn(toInt, StringToint$());
    let tokens = [];
    while (!dart.test(isEnd())) {
      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
        position++;
      let start = position;
      while (!dart.test(isEnd()) && dart.test(isNonDelimiter(date[dartx._get](position))))
        position++;
      tokens[dartx.add](date[dartx.substring](start, position)[dartx.toLowerCase]());
      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
        position++;
    }
    let timeStr = null;
    let dayOfMonthStr = null;
    let monthStr = null;
    let yearStr = null;
    for (let token of tokens) {
      if (dart.test(dart.dsend(dart.dload(token, 'length'), '<', 1))) continue;
      if (timeStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 5)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && (dart.equals(dart.dindex(token, 1), ":") || dart.test(isDigit(core.String._check(dart.dindex(token, 1)))) && dart.equals(dart.dindex(token, 2), ":"))) {
        timeStr = core.String._check(token);
      } else if (dayOfMonthStr == null && dart.test(isDigit(core.String._check(dart.dindex(token, 0))))) {
        dayOfMonthStr = core.String._check(token);
      } else if (monthStr == null && dart.notNull(getMonth(core.String._check(token))) >= 0) {
        monthStr = core.String._check(token);
      } else if (yearStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 2)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && dart.test(isDigit(core.String._check(dart.dindex(token, 1))))) {
        yearStr = core.String._check(token);
      }
    }
    if (timeStr == null || dayOfMonthStr == null || monthStr == null || yearStr == null) {
      error();
    }
    let year = toInt(yearStr);
    if (dart.notNull(year) >= 70 && dart.notNull(year) <= 99) {
      year = dart.notNull(year) + 1900;
    } else if (dart.notNull(year) >= 0 && dart.notNull(year) <= 69) {
      year = dart.notNull(year) + 2000;
    }
    if (dart.notNull(year) < 1601) error();
    let dayOfMonth = toInt(dayOfMonthStr);
    if (dart.notNull(dayOfMonth) < 1 || dart.notNull(dayOfMonth) > 31) error();
    let month = dart.notNull(getMonth(monthStr)) + 1;
    let timeList = timeStr[dartx.split](":");
    if (timeList[dartx.length] != 3) error();
    let hour = toInt(timeList[dartx._get](0));
    let minute = toInt(timeList[dartx._get](1));
    let second = toInt(timeList[dartx._get](2));
    if (dart.notNull(hour) > 23) error();
    if (dart.notNull(minute) > 59) error();
    if (dart.notNull(second) > 59) error();
    return new core.DateTime.utc(year, month, dayOfMonth, hour, minute, second, 0);
  }
};
dart.setSignature(io.HttpDate, {
  statics: () => ({
    format: dart.definiteFunctionType(core.String, [core.DateTime]),
    parse: dart.definiteFunctionType(core.DateTime, [core.String]),
    _parseCookieDate: dart.definiteFunctionType(core.DateTime, [core.String])
  }),
  names: ['format', 'parse', '_parseCookieDate']
});
const _headers = Symbol('_headers');
const _defaultPortForScheme = Symbol('_defaultPortForScheme');
const _mutable = Symbol('_mutable');
const _noFoldingHeaders = Symbol('_noFoldingHeaders');
const _contentLength = Symbol('_contentLength');
const _persistentConnection = Symbol('_persistentConnection');
const _chunkedTransferEncoding = Symbol('_chunkedTransferEncoding');
const _host$ = Symbol('_host');
const _port$ = Symbol('_port');
const _checkMutable = Symbol('_checkMutable');
const _addAll = Symbol('_addAll');
const _add$2 = Symbol('_add');
const _set$ = Symbol('_set');
const _addValue = Symbol('_addValue');
const _updateHostHeader = Symbol('_updateHostHeader');
const _addDate = Symbol('_addDate');
const _addHost = Symbol('_addHost');
const _addExpires = Symbol('_addExpires');
const _addConnection = Symbol('_addConnection');
const _addContentType = Symbol('_addContentType');
const _addContentLength = Symbol('_addContentLength');
const _addTransferEncoding = Symbol('_addTransferEncoding');
const _addIfModifiedSince = Symbol('_addIfModifiedSince');
const _foldHeader = Symbol('_foldHeader');
const _finalize = Symbol('_finalize');
const _write = Symbol('_write');
const _parseCookies = Symbol('_parseCookies');
io._HttpHeaders = class _HttpHeaders extends core.Object {
  new(protocolVersion, opts) {
    let defaultPortForScheme = opts && 'defaultPortForScheme' in opts ? opts.defaultPortForScheme : io.HttpClient.DEFAULT_HTTP_PORT;
    let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
    this.protocolVersion = protocolVersion;
    this[_headers] = HashMapOfString$ListOfString().new();
    this[_defaultPortForScheme] = defaultPortForScheme;
    this[_mutable] = true;
    this[_noFoldingHeaders] = null;
    this[_contentLength] = -1;
    this[_persistentConnection] = true;
    this[_chunkedTransferEncoding] = false;
    this[_host$] = null;
    this[_port$] = null;
    if (initialHeaders != null) {
      initialHeaders[_headers][dartx.forEach](dart.fn((name, value) => this[_headers][dartx._set](name, value), StringAndListOfStringToListOfString()));
      this[_contentLength] = initialHeaders[_contentLength];
      this[_persistentConnection] = initialHeaders[_persistentConnection];
      this[_chunkedTransferEncoding] = initialHeaders[_chunkedTransferEncoding];
      this[_host$] = initialHeaders[_host$];
      this[_port$] = initialHeaders[_port$];
    }
    if (this.protocolVersion == "1.0") {
      this[_persistentConnection] = false;
      this[_chunkedTransferEncoding] = false;
    }
  }
  _get(name) {
    return this[_headers][dartx._get](name[dartx.toLowerCase]());
  }
  value(name) {
    name = name[dartx.toLowerCase]();
    let values = this[_headers][dartx._get](name);
    if (values == null) return null;
    if (dart.notNull(values[dartx.length]) > 1) {
      dart.throw(new io.HttpException(dart.str`More than one value for header ${name}`));
    }
    return values[dartx._get](0);
  }
  add(name, value) {
    this[_checkMutable]();
    this[_addAll](io._HttpHeaders._validateField(name), value);
  }
  [_addAll](name, value) {
    dart.assert(name == io._HttpHeaders._validateField(name));
    if (core.Iterable.is(value)) {
      for (let v of value) {
        this[_add$2](name, io._HttpHeaders._validateValue(v));
      }
    } else {
      this[_add$2](name, io._HttpHeaders._validateValue(value));
    }
  }
  set(name, value) {
    this[_checkMutable]();
    name = io._HttpHeaders._validateField(name);
    this[_headers][dartx.remove](name);
    if (name == io.HttpHeaders.TRANSFER_ENCODING) {
      this[_chunkedTransferEncoding] = false;
    }
    this[_addAll](name, value);
  }
  remove(name, value) {
    this[_checkMutable]();
    name = io._HttpHeaders._validateField(name);
    value = io._HttpHeaders._validateValue(value);
    let values = this[_headers][dartx._get](name);
    if (values != null) {
      let index = values[dartx.indexOf](core.String._check(value));
      if (index != -1) {
        values[dartx.removeRange](index, dart.notNull(index) + 1);
      }
      if (values[dartx.length] == 0) this[_headers][dartx.remove](name);
    }
    if (name == io.HttpHeaders.TRANSFER_ENCODING && dart.equals(value, "chunked")) {
      this[_chunkedTransferEncoding] = false;
    }
  }
  removeAll(name) {
    this[_checkMutable]();
    name = io._HttpHeaders._validateField(name);
    this[_headers][dartx.remove](name);
  }
  forEach(f) {
    this[_headers][dartx.forEach](f);
  }
  noFolding(name) {
    if (this[_noFoldingHeaders] == null) this[_noFoldingHeaders] = ListOfString().new();
    this[_noFoldingHeaders][dartx.add](name);
  }
  get persistentConnection() {
    return this[_persistentConnection];
  }
  set persistentConnection(persistentConnection) {
    this[_checkMutable]();
    if (persistentConnection == this[_persistentConnection]) return;
    if (dart.test(persistentConnection)) {
      if (this.protocolVersion == "1.1") {
        this.remove(io.HttpHeaders.CONNECTION, "close");
      } else {
        if (this[_contentLength] == -1) {
          dart.throw(new io.HttpException("Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with " + "no ContentLength"));
        }
        this.add(io.HttpHeaders.CONNECTION, "keep-alive");
      }
    } else {
      if (this.protocolVersion == "1.1") {
        this.add(io.HttpHeaders.CONNECTION, "close");
      } else {
        this.remove(io.HttpHeaders.CONNECTION, "keep-alive");
      }
    }
    this[_persistentConnection] = persistentConnection;
  }
  get contentLength() {
    return this[_contentLength];
  }
  set contentLength(contentLength) {
    this[_checkMutable]();
    if (this.protocolVersion == "1.0" && dart.test(this.persistentConnection) && contentLength == -1) {
      dart.throw(new io.HttpException("Trying to clear ContentLength on HTTP 1.0 headers with " + "'Connection: Keep-Alive' set"));
    }
    if (this[_contentLength] == contentLength) return;
    this[_contentLength] = contentLength;
    if (dart.notNull(this[_contentLength]) >= 0) {
      if (dart.test(this.chunkedTransferEncoding)) this.chunkedTransferEncoding = false;
      this[_set$](io.HttpHeaders.CONTENT_LENGTH, dart.toString(contentLength));
    } else {
      this.removeAll(io.HttpHeaders.CONTENT_LENGTH);
      if (this.protocolVersion == "1.1") {
        this.chunkedTransferEncoding = true;
      }
    }
  }
  get chunkedTransferEncoding() {
    return this[_chunkedTransferEncoding];
  }
  set chunkedTransferEncoding(chunkedTransferEncoding) {
    this[_checkMutable]();
    if (dart.test(chunkedTransferEncoding) && this.protocolVersion == "1.0") {
      dart.throw(new io.HttpException("Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers"));
    }
    if (chunkedTransferEncoding == this[_chunkedTransferEncoding]) return;
    if (dart.test(chunkedTransferEncoding)) {
      let values = this[_headers][dartx._get](io.HttpHeaders.TRANSFER_ENCODING);
      if (values == null || values[dartx.last] != "chunked") {
        this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, "chunked");
      }
      this.contentLength = -1;
    } else {
      this.remove(io.HttpHeaders.TRANSFER_ENCODING, "chunked");
    }
    this[_chunkedTransferEncoding] = chunkedTransferEncoding;
  }
  get host() {
    return this[_host$];
  }
  set host(host) {
    this[_checkMutable]();
    this[_host$] = host;
    this[_updateHostHeader]();
  }
  get port() {
    return this[_port$];
  }
  set port(port) {
    this[_checkMutable]();
    this[_port$] = port;
    this[_updateHostHeader]();
  }
  get ifModifiedSince() {
    let values = this[_headers][dartx._get](io.HttpHeaders.IF_MODIFIED_SINCE);
    if (values != null) {
      try {
        return io.HttpDate.parse(values[dartx._get](0));
      } catch (e) {
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e;
      }

    }
    return null;
  }
  set ifModifiedSince(ifModifiedSince) {
    this[_checkMutable]();
    let formatted = io.HttpDate.format(ifModifiedSince.toUtc());
    this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, formatted);
  }
  get date() {
    let values = this[_headers][dartx._get](io.HttpHeaders.DATE);
    if (values != null) {
      try {
        return io.HttpDate.parse(values[dartx._get](0));
      } catch (e) {
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e;
      }

    }
    return null;
  }
  set date(date) {
    this[_checkMutable]();
    let formatted = io.HttpDate.format(date.toUtc());
    this[_set$]("date", formatted);
  }
  get expires() {
    let values = this[_headers][dartx._get](io.HttpHeaders.EXPIRES);
    if (values != null) {
      try {
        return io.HttpDate.parse(values[dartx._get](0));
      } catch (e) {
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e;
      }

    }
    return null;
  }
  set expires(expires) {
    this[_checkMutable]();
    let formatted = io.HttpDate.format(expires.toUtc());
    this[_set$](io.HttpHeaders.EXPIRES, formatted);
  }
  get contentType() {
    let values = this[_headers][dartx._get]("content-type");
    if (values != null) {
      return io.ContentType.parse(values[dartx._get](0));
    } else {
      return null;
    }
  }
  set contentType(contentType) {
    this[_checkMutable]();
    this[_set$](io.HttpHeaders.CONTENT_TYPE, dart.toString(contentType));
  }
  clear() {
    this[_checkMutable]();
    this[_headers][dartx.clear]();
    this[_contentLength] = -1;
    this[_persistentConnection] = true;
    this[_chunkedTransferEncoding] = false;
    this[_host$] = null;
    this[_port$] = null;
  }
  [_add$2](name, value) {
    dart.assert(name == io._HttpHeaders._validateField(name));
    switch (name[dartx.length]) {
      case 4:
      {
        if (io.HttpHeaders.DATE == name) {
          this[_addDate](name, value);
          return;
        }
        if (io.HttpHeaders.HOST == name) {
          this[_addHost](name, value);
          return;
        }
        break;
      }
      case 7:
      {
        if (io.HttpHeaders.EXPIRES == name) {
          this[_addExpires](name, value);
          return;
        }
        break;
      }
      case 10:
      {
        if (io.HttpHeaders.CONNECTION == name) {
          this[_addConnection](name, value);
          return;
        }
        break;
      }
      case 12:
      {
        if (io.HttpHeaders.CONTENT_TYPE == name) {
          this[_addContentType](name, value);
          return;
        }
        break;
      }
      case 14:
      {
        if (io.HttpHeaders.CONTENT_LENGTH == name) {
          this[_addContentLength](name, value);
          return;
        }
        break;
      }
      case 17:
      {
        if (io.HttpHeaders.TRANSFER_ENCODING == name) {
          this[_addTransferEncoding](name, value);
          return;
        }
        if (io.HttpHeaders.IF_MODIFIED_SINCE == name) {
          this[_addIfModifiedSince](name, value);
          return;
        }
      }
    }
    this[_addValue](name, value);
  }
  [_addContentLength](name, value) {
    if (typeof value == 'number') {
      this.contentLength = value;
    } else if (typeof value == 'string') {
      this.contentLength = core.int.parse(value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addTransferEncoding](name, value) {
    if (dart.equals(value, "chunked")) {
      this.chunkedTransferEncoding = true;
    } else {
      this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, value);
    }
  }
  [_addDate](name, value) {
    if (core.DateTime.is(value)) {
      this.date = value;
    } else if (typeof value == 'string') {
      this[_set$](io.HttpHeaders.DATE, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addExpires](name, value) {
    if (core.DateTime.is(value)) {
      this.expires = value;
    } else if (typeof value == 'string') {
      this[_set$](io.HttpHeaders.EXPIRES, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addIfModifiedSince](name, value) {
    if (core.DateTime.is(value)) {
      this.ifModifiedSince = value;
    } else if (typeof value == 'string') {
      this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addHost](name, value) {
    if (typeof value == 'string') {
      let pos = value[dartx.indexOf](":");
      if (pos == -1) {
        this[_host$] = value;
        this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
      } else {
        if (dart.notNull(pos) > 0) {
          this[_host$] = value[dartx.substring](0, pos);
        } else {
          this[_host$] = null;
        }
        if (dart.notNull(pos) + 1 == value[dartx.length]) {
          this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
        } else {
          try {
            this[_port$] = core.int.parse(value[dartx.substring](dart.notNull(pos) + 1));
          } catch (e) {
            if (core.FormatException.is(e)) {
              this[_port$] = null;
            } else
              throw e;
          }

        }
      }
      this[_set$](io.HttpHeaders.HOST, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addConnection](name, value) {
    let lowerCaseValue = dart.dsend(value, 'toLowerCase');
    if (dart.equals(lowerCaseValue, 'close')) {
      this[_persistentConnection] = false;
    } else if (dart.equals(lowerCaseValue, 'keep-alive')) {
      this[_persistentConnection] = true;
    }
    this[_addValue](name, value);
  }
  [_addContentType](name, value) {
    this[_set$](io.HttpHeaders.CONTENT_TYPE, core.String._check(value));
  }
  [_addValue](name, value) {
    let values = this[_headers][dartx._get](name);
    if (values == null) {
      values = ListOfString().new();
      this[_headers][dartx._set](name, values);
    }
    if (core.DateTime.is(value)) {
      values[dartx.add](io.HttpDate.format(value));
    } else if (typeof value == 'string') {
      values[dartx.add](value);
    } else {
      values[dartx.add](core.String._check(io._HttpHeaders._validateValue(dart.toString(value))));
    }
  }
  [_set$](name, value) {
    dart.assert(name == io._HttpHeaders._validateField(name));
    let values = ListOfString().new();
    this[_headers][dartx._set](name, values);
    values[dartx.add](value);
  }
  [_checkMutable]() {
    if (!dart.test(this[_mutable])) dart.throw(new io.HttpException("HTTP headers are not mutable"));
  }
  [_updateHostHeader]() {
    let defaultPort = this[_port$] == null || this[_port$] == this[_defaultPortForScheme];
    this[_set$]("host", defaultPort ? this.host : dart.str`${this.host}:${this[_port$]}`);
  }
  [_foldHeader](name) {
    if (name == io.HttpHeaders.SET_COOKIE || this[_noFoldingHeaders] != null && this[_noFoldingHeaders][dartx.indexOf](name) != -1) {
      return false;
    }
    return true;
  }
  [_finalize]() {
    this[_mutable] = false;
  }
  [_write](buffer, offset) {
    function write(bytes) {
      let len = bytes[dartx.length];
      for (let i = 0; i < dart.notNull(len); i++) {
        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
      }
      offset = dart.notNull(offset) + dart.notNull(len);
    }
    dart.fn(write, ListOfintTovoid$());
    for (let name of this[_headers][dartx.keys]) {
      let values = this[_headers][dartx._get](name);
      let fold = core.bool._check(this[_foldHeader](name));
      let nameData = name[dartx.codeUnits];
      write(nameData);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.COLON);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.SP);
      for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
        if (i > 0) {
          if (dart.test(fold)) {
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.COMMA);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.SP);
          } else {
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.CR);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.LF);
            write(nameData);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.COLON);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.SP);
          }
        }
        write(values[dartx._get](i)[dartx.codeUnits]);
      }
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.CR);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.LF);
    }
    return offset;
  }
  toString() {
    let sb = new core.StringBuffer();
    this[_headers][dartx.forEach](dart.fn((name, values) => {
      sb.write(name);
      sb.write(": ");
      let fold = core.bool._check(this[_foldHeader](name));
      for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
        if (i > 0) {
          if (dart.test(fold)) {
            sb.write(", ");
          } else {
            sb.write("\n");
            sb.write(name);
            sb.write(": ");
          }
        }
        sb.write(values[dartx._get](i));
      }
      sb.write("\n");
    }, StringAndListOfStringToNull()));
    return sb.toString();
  }
  [_parseCookies]() {
    let cookies = ListOfCookie().new();
    function parseCookieString(s) {
      let index = 0;
      function done() {
        return index == -1 || index == s[dartx.length];
      }
      dart.fn(done, VoidTobool());
      function skipWS() {
        while (!dart.test(done())) {
          if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
          index = dart.notNull(index) + 1;
        }
      }
      dart.fn(skipWS, VoidTovoid$());
      function parseName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=") break;
          index = dart.notNull(index) + 1;
        }
        return s[dartx.substring](start, index);
      }
      dart.fn(parseName, VoidToString$());
      function parseValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == ";") break;
          index = dart.notNull(index) + 1;
        }
        return s[dartx.substring](start, index);
      }
      dart.fn(parseValue, VoidToString$());
      function expect(expected) {
        if (dart.test(done())) return false;
        if (s[dartx._get](index) != expected) return false;
        index = dart.notNull(index) + 1;
        return true;
      }
      dart.fn(expect, StringTobool$());
      while (!dart.test(done())) {
        skipWS();
        if (dart.test(done())) return;
        let name = parseName();
        skipWS();
        if (!dart.test(expect("="))) {
          index = s[dartx.indexOf](';', index);
          continue;
        }
        skipWS();
        let value = parseValue();
        try {
          cookies[dartx.add](new io._Cookie(name, value));
        } catch (_) {
        }

        skipWS();
        if (dart.test(done())) return;
        if (!dart.test(expect(";"))) {
          index = s[dartx.indexOf](';', index);
          continue;
        }
      }
    }
    dart.fn(parseCookieString, StringTovoid$());
    let values = this[_headers][dartx._get](io.HttpHeaders.COOKIE);
    if (values != null) {
      values[dartx.forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid$()));
    }
    return cookies;
  }
  static _validateField(field) {
    for (let i = 0; i < dart.notNull(field[dartx.length]); i++) {
      if (!dart.test(io._HttpParser._isTokenChar(field[dartx.codeUnitAt](i)))) {
        dart.throw(new core.FormatException(dart.str`Invalid HTTP header field name: ${convert.JSON.encode(field)}`));
      }
    }
    return field[dartx.toLowerCase]();
  }
  static _validateValue(value) {
    if (!(typeof value == 'string')) return value;
    for (let i = 0; i < dart.notNull(core.num._check(dart.dload(value, 'length'))); i++) {
      if (!dart.test(io._HttpParser._isValueChar(core.int._check(dart.dsend(value, 'codeUnitAt', i))))) {
        dart.throw(new core.FormatException(dart.str`Invalid HTTP header field value: ${convert.JSON.encode(value)}`));
      }
    }
    return value;
  }
};
io._HttpHeaders[dart.implements] = () => [io.HttpHeaders];
dart.setSignature(io._HttpHeaders, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpHeaders, [core.String], {defaultPortForScheme: core.int, initialHeaders: io._HttpHeaders})}),
  fields: () => ({
    [_headers]: MapOfString$ListOfString(),
    protocolVersion: core.String,
    [_mutable]: core.bool,
    [_noFoldingHeaders]: ListOfString(),
    [_contentLength]: core.int,
    [_persistentConnection]: core.bool,
    [_chunkedTransferEncoding]: core.bool,
    [_host$]: core.String,
    [_port$]: core.int,
    [_defaultPortForScheme]: core.int
  }),
  getters: () => ({
    persistentConnection: dart.definiteFunctionType(core.bool, []),
    contentLength: dart.definiteFunctionType(core.int, []),
    chunkedTransferEncoding: dart.definiteFunctionType(core.bool, []),
    host: dart.definiteFunctionType(core.String, []),
    port: dart.definiteFunctionType(core.int, []),
    ifModifiedSince: dart.definiteFunctionType(core.DateTime, []),
    date: dart.definiteFunctionType(core.DateTime, []),
    expires: dart.definiteFunctionType(core.DateTime, []),
    contentType: dart.definiteFunctionType(io.ContentType, [])
  }),
  setters: () => ({
    persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
    contentLength: dart.definiteFunctionType(dart.void, [core.int]),
    chunkedTransferEncoding: dart.definiteFunctionType(dart.void, [core.bool]),
    host: dart.definiteFunctionType(dart.void, [core.String]),
    port: dart.definiteFunctionType(dart.void, [core.int]),
    ifModifiedSince: dart.definiteFunctionType(dart.void, [core.DateTime]),
    date: dart.definiteFunctionType(dart.void, [core.DateTime]),
    expires: dart.definiteFunctionType(dart.void, [core.DateTime]),
    contentType: dart.definiteFunctionType(dart.void, [io.ContentType])
  }),
  methods: () => ({
    _get: dart.definiteFunctionType(core.List$(core.String), [core.String]),
    value: dart.definiteFunctionType(core.String, [core.String]),
    add: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    [_addAll]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    set: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    remove: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    removeAll: dart.definiteFunctionType(dart.void, [core.String]),
    forEach: dart.definiteFunctionType(dart.void, [StringAndListOfStringTovoid()]),
    noFolding: dart.definiteFunctionType(dart.void, [core.String]),
    clear: dart.definiteFunctionType(dart.void, []),
    [_add$2]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addContentLength]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addTransferEncoding]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addDate]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addExpires]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addIfModifiedSince]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addHost]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addConnection]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addContentType]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addValue]: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    [_set$]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [_checkMutable]: dart.definiteFunctionType(dart.dynamic, []),
    [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
    [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
    [_finalize]: dart.definiteFunctionType(dart.void, []),
    [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
    [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
  }),
  statics: () => ({
    _validateField: dart.definiteFunctionType(core.String, [core.String]),
    _validateValue: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
  }),
  names: ['_validateField', '_validateValue']
});
const _value$1 = Symbol('_value');
const _parameters = Symbol('_parameters');
const _unmodifiableParameters = Symbol('_unmodifiableParameters');
const _parse = Symbol('_parse');
const _ensureParameters = Symbol('_ensureParameters');
io._HeaderValue = class _HeaderValue extends core.Object {
  new(value, parameters) {
    if (value === void 0) value = "";
    if (parameters === void 0) parameters = null;
    this[_value$1] = value;
    this[_parameters] = null;
    this[_unmodifiableParameters] = null;
    if (parameters != null) {
      this[_parameters] = HashMapOfString$String().from(parameters);
    }
  }
  static parse(value, opts) {
    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
    let result = new io._HeaderValue();
    result[_parse](value, core.String._check(parameterSeparator), core.String._check(valueSeparator), core.bool._check(preserveBackslash));
    return result;
  }
  get value() {
    return this[_value$1];
  }
  [_ensureParameters]() {
    if (this[_parameters] == null) {
      this[_parameters] = HashMapOfString$String().new();
    }
  }
  get parameters() {
    this[_ensureParameters]();
    if (this[_unmodifiableParameters] == null) {
      this[_unmodifiableParameters] = new (UnmodifiableMapViewOfString$String())(this[_parameters]);
    }
    return this[_unmodifiableParameters];
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write(this[_value$1]);
    if (this.parameters != null && dart.notNull(this.parameters[dartx.length]) > 0) {
      this[_parameters][dartx.forEach](dart.fn((name, value) => {
        sb.write("; ");
        sb.write(name);
        sb.write("=");
        sb.write(value);
      }, StringAndStringToNull()));
    }
    return sb.toString();
  }
  [_parse](s, parameterSeparator, valueSeparator, preserveBackslash) {
    let index = 0;
    function done() {
      return index == s[dartx.length];
    }
    dart.fn(done, VoidTobool());
    function skipWS() {
      while (!dart.test(done())) {
        if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
        index++;
      }
    }
    dart.fn(skipWS, VoidTovoid$());
    function parseValue() {
      let start = index;
      while (!dart.test(done())) {
        if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == valueSeparator || s[dartx._get](index) == parameterSeparator) break;
        index++;
      }
      return s[dartx.substring](start, index);
    }
    dart.fn(parseValue, VoidToString$());
    function expect(expected) {
      if (dart.test(done()) || s[dartx._get](index) != expected) {
        dart.throw(new io.HttpException("Failed to parse header value"));
      }
      index++;
    }
    dart.fn(expect, StringTovoid$());
    function maybeExpect(expected) {
      if (s[dartx._get](index) == expected) index++;
    }
    dart.fn(maybeExpect, StringTovoid$());
    const parseParameters = (function() {
      let parameters = HashMapOfString$String().new();
      this[_parameters] = new (UnmodifiableMapViewOfString$String())(parameters);
      function parseParameterName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=" || s[dartx._get](index) == parameterSeparator || s[dartx._get](index) == valueSeparator) break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.toLowerCase]();
      }
      dart.fn(parseParameterName, VoidToString$());
      function parseParameterValue() {
        if (!dart.test(done()) && s[dartx._get](index) == "\"") {
          let sb = new core.StringBuffer();
          index++;
          while (!dart.test(done())) {
            if (s[dartx._get](index) == "\\") {
              if (index + 1 == s[dartx.length]) {
                dart.throw(new io.HttpException("Failed to parse header value"));
              }
              if (dart.test(preserveBackslash) && s[dartx._get](index + 1) != "\"") {
                sb.write(s[dartx._get](index));
              }
              index++;
            } else if (s[dartx._get](index) == "\"") {
              index++;
              break;
            }
            sb.write(s[dartx._get](index));
            index++;
          }
          return sb.toString();
        } else {
          let val = parseValue();
          return val == "" ? null : val;
        }
      }
      dart.fn(parseParameterValue, VoidToString$());
      while (!dart.test(done())) {
        skipWS();
        if (dart.test(done())) return;
        let name = parseParameterName();
        skipWS();
        if (dart.test(done())) {
          parameters._set(name, null);
          return;
        }
        maybeExpect("=");
        skipWS();
        if (dart.test(done())) {
          parameters._set(name, null);
          return;
        }
        let value = parseParameterValue();
        if (name == 'charset' && io._ContentType.is(this)) {
          value = value[dartx.toLowerCase]();
        }
        parameters._set(name, value);
        skipWS();
        if (dart.test(done())) return;
        if (s[dartx._get](index) == valueSeparator) return;
        expect(parameterSeparator);
      }
    }).bind(this);
    dart.fn(parseParameters, VoidTovoid$());
    skipWS();
    this[_value$1] = parseValue();
    skipWS();
    if (dart.test(done())) return;
    maybeExpect(parameterSeparator);
    parseParameters();
  }
};
io._HeaderValue[dart.implements] = () => [io.HeaderValue];
dart.setSignature(io._HeaderValue, {
  constructors: () => ({new: dart.definiteFunctionType(io._HeaderValue, [], [core.String, MapOfString$String()])}),
  fields: () => ({
    [_value$1]: core.String,
    [_parameters]: MapOfString$String(),
    [_unmodifiableParameters]: MapOfString$String()
  }),
  getters: () => ({
    value: dart.definiteFunctionType(core.String, []),
    parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
  }),
  methods: () => ({
    [_ensureParameters]: dart.definiteFunctionType(dart.void, []),
    [_parse]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String, core.bool])
  }),
  statics: () => ({parse: dart.definiteFunctionType(io._HeaderValue, [core.String], {parameterSeparator: dart.dynamic, valueSeparator: dart.dynamic, preserveBackslash: dart.dynamic})}),
  names: ['parse']
});
const _primaryType = Symbol('_primaryType');
const _subType = Symbol('_subType');
io._ContentType = class _ContentType extends io._HeaderValue {
  new(primaryType, subType, charset, parameters) {
    this[_primaryType] = primaryType;
    this[_subType] = subType;
    super.new("");
    if (this[_primaryType] == null) this[_primaryType] = "";
    if (this[_subType] == null) this[_subType] = "";
    this[_value$1] = dart.str`${this[_primaryType]}/${this[_subType]}`;
    if (parameters != null) {
      this[_ensureParameters]();
      parameters[dartx.forEach](dart.fn((key, value) => {
        let lowerCaseKey = key[dartx.toLowerCase]();
        if (lowerCaseKey == "charset") {
          value = value[dartx.toLowerCase]();
        }
        this[_parameters][dartx._set](lowerCaseKey, value);
      }, StringAndStringToNull()));
    }
    if (charset != null) {
      this[_ensureParameters]();
      this[_parameters][dartx._set]("charset", charset[dartx.toLowerCase]());
    }
  }
  _() {
    this[_primaryType] = "";
    this[_subType] = "";
    super.new();
  }
  static parse(value) {
    let result = new io._ContentType._();
    result[_parse](value, ";", null, false);
    let index = result[_value$1][dartx.indexOf]("/");
    if (index == -1 || index == dart.notNull(result[_value$1][dartx.length]) - 1) {
      result[_primaryType] = result[_value$1][dartx.trim]()[dartx.toLowerCase]();
      result[_subType] = "";
    } else {
      result[_primaryType] = result[_value$1][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
      result[_subType] = result[_value$1][dartx.substring](dart.notNull(index) + 1)[dartx.trim]()[dartx.toLowerCase]();
    }
    return result;
  }
  get mimeType() {
    return dart.str`${this.primaryType}/${this.subType}`;
  }
  get primaryType() {
    return this[_primaryType];
  }
  get subType() {
    return this[_subType];
  }
  get charset() {
    return this.parameters[dartx._get]("charset");
  }
};
dart.defineNamedConstructor(io._ContentType, '_');
io._ContentType[dart.implements] = () => [io.ContentType];
dart.setSignature(io._ContentType, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._ContentType, [core.String, core.String, core.String, MapOfString$String()]),
    _: dart.definiteFunctionType(io._ContentType, [])
  }),
  fields: () => ({
    [_primaryType]: core.String,
    [_subType]: core.String
  }),
  getters: () => ({
    mimeType: dart.definiteFunctionType(core.String, []),
    primaryType: dart.definiteFunctionType(core.String, []),
    subType: dart.definiteFunctionType(core.String, []),
    charset: dart.definiteFunctionType(core.String, [])
  }),
  statics: () => ({parse: dart.definiteFunctionType(io._ContentType, [core.String])}),
  names: ['parse']
});
const _validate = Symbol('_validate');
const _parseSetCookieValue = Symbol('_parseSetCookieValue');
let const$67;
io._Cookie = class _Cookie extends core.Object {
  new(name, value) {
    if (name === void 0) name = null;
    if (value === void 0) value = null;
    this.name = name;
    this.value = value;
    this.expires = null;
    this.maxAge = null;
    this.domain = null;
    this.path = null;
    this.httpOnly = false;
    this.secure = false;
    this.httpOnly = true;
    this[_validate]();
  }
  fromSetCookieValue(value) {
    this.name = null;
    this.value = null;
    this.expires = null;
    this.maxAge = null;
    this.domain = null;
    this.path = null;
    this.httpOnly = false;
    this.secure = false;
    this[_parseSetCookieValue](value);
  }
  [_parseSetCookieValue](s) {
    let index = 0;
    function done() {
      return index == s[dartx.length];
    }
    dart.fn(done, VoidTobool());
    function parseName() {
      let start = index;
      while (!dart.test(done())) {
        if (s[dartx._get](index) == "=") break;
        index++;
      }
      return s[dartx.substring](start, index)[dartx.trim]();
    }
    dart.fn(parseName, VoidToString$());
    function parseValue() {
      let start = index;
      while (!dart.test(done())) {
        if (s[dartx._get](index) == ";") break;
        index++;
      }
      return s[dartx.substring](start, index)[dartx.trim]();
    }
    dart.fn(parseValue, VoidToString$());
    function expect(expected) {
      if (dart.test(done())) dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
      if (s[dartx._get](index) != expected) {
        dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
      }
      index++;
    }
    dart.fn(expect, StringTovoid$());
    const parseAttributes = (function() {
      function parseAttributeName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == "=" || s[dartx._get](index) == ";") break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
      }
      dart.fn(parseAttributeName, VoidToString$());
      function parseAttributeValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == ";") break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
      }
      dart.fn(parseAttributeValue, VoidToString$());
      while (!dart.test(done())) {
        let name = parseAttributeName();
        let value = "";
        if (!dart.test(done()) && s[dartx._get](index) == "=") {
          index++;
          value = parseAttributeValue();
        }
        if (name == "expires") {
          this.expires = io.HttpDate._parseCookieDate(value);
        } else if (name == "max-age") {
          this.maxAge = core.int.parse(value);
        } else if (name == "domain") {
          this.domain = value;
        } else if (name == "path") {
          this.path = value;
        } else if (name == "httponly") {
          this.httpOnly = true;
        } else if (name == "secure") {
          this.secure = true;
        }
        if (!dart.test(done())) index++;
      }
    }).bind(this);
    dart.fn(parseAttributes, VoidTovoid$());
    this.name = parseName();
    if (dart.test(done()) || this.name[dartx.length] == 0) {
      dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
    }
    index++;
    this.value = parseValue();
    this[_validate]();
    if (dart.test(done())) return;
    index++;
    parseAttributes();
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write(this.name);
    sb.write("=");
    sb.write(this.value);
    if (this.expires != null) {
      sb.write("; Expires=");
      sb.write(io.HttpDate.format(this.expires));
    }
    if (this.maxAge != null) {
      sb.write("; Max-Age=");
      sb.write(this.maxAge);
    }
    if (this.domain != null) {
      sb.write("; Domain=");
      sb.write(this.domain);
    }
    if (this.path != null) {
      sb.write("; Path=");
      sb.write(this.path);
    }
    if (dart.test(this.secure)) sb.write("; Secure");
    if (dart.test(this.httpOnly)) sb.write("; HttpOnly");
    return sb.toString();
  }
  [_validate]() {
    let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
    for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
      let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
      if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
        dart.throw(new core.FormatException(dart.str`Invalid character in cookie name, code unit: '${codeUnit}'`));
      }
    }
    for (let i = 0; i < dart.notNull(this.value[dartx.length]); i++) {
      let codeUnit = this.value[dartx.codeUnits][dartx._get](i);
      if (!(codeUnit == 33 || dart.notNull(codeUnit) >= 35 && dart.notNull(codeUnit) <= 43 || dart.notNull(codeUnit) >= 45 && dart.notNull(codeUnit) <= 58 || dart.notNull(codeUnit) >= 60 && dart.notNull(codeUnit) <= 91 || dart.notNull(codeUnit) >= 93 && dart.notNull(codeUnit) <= 126)) {
        dart.throw(new core.FormatException(dart.str`Invalid character in cookie value, code unit: '${codeUnit}'`));
      }
    }
  }
};
dart.defineNamedConstructor(io._Cookie, 'fromSetCookieValue');
io._Cookie[dart.implements] = () => [io.Cookie];
dart.setSignature(io._Cookie, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._Cookie, [], [core.String, core.String]),
    fromSetCookieValue: dart.definiteFunctionType(io._Cookie, [core.String])
  }),
  fields: () => ({
    name: core.String,
    value: core.String,
    expires: core.DateTime,
    maxAge: core.int,
    domain: core.String,
    path: core.String,
    httpOnly: core.bool,
    secure: core.bool
  }),
  methods: () => ({
    [_parseSetCookieValue]: dart.definiteFunctionType(dart.void, [core.String]),
    [_validate]: dart.definiteFunctionType(dart.void, [])
  })
});
io._OUTGOING_BUFFER_SIZE = 8 * 1024;
const _transferLength = Symbol('_transferLength');
const _dataCompleter = Symbol('_dataCompleter');
const _stream$ = Symbol('_stream');
io._HttpIncoming = class _HttpIncoming extends async.Stream$(core.List$(core.int)) {
  get transferLength() {
    return this[_transferLength];
  }
  new(headers, transferLength, stream) {
    this[_dataCompleter] = async.Completer.new();
    this.headers = headers;
    this[_transferLength] = transferLength;
    this[_stream$] = stream;
    this.fullBodyRead = false;
    this.upgraded = false;
    this.statusCode = null;
    this.reasonPhrase = null;
    this.method = null;
    this.uri = null;
    this.hasSubscriber = false;
    super.new();
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    this.hasSubscriber = true;
    return this[_stream$].handleError(dart.fn(error => {
      dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
    }, dynamicToNull$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get dataDone() {
    return this[_dataCompleter].future;
  }
  close(closing) {
    this.fullBodyRead = true;
    this.hasSubscriber = true;
    this[_dataCompleter].complete(closing);
  }
};
dart.addSimpleTypeTests(io._HttpIncoming);
dart.setSignature(io._HttpIncoming, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpIncoming, [io._HttpHeaders, core.int, StreamOfListOfint()])}),
  fields: () => ({
    [_transferLength]: core.int,
    [_dataCompleter]: async.Completer,
    [_stream$]: StreamOfListOfint(),
    fullBodyRead: core.bool,
    headers: io._HttpHeaders,
    upgraded: core.bool,
    statusCode: core.int,
    reasonPhrase: core.String,
    method: core.String,
    uri: core.Uri,
    hasSubscriber: core.bool
  }),
  getters: () => ({
    transferLength: dart.definiteFunctionType(core.int, []),
    dataDone: dart.definiteFunctionType(async.Future, [])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(dart.void, [core.bool])
  })
});
const _incoming = Symbol('_incoming');
const _cookies = Symbol('_cookies');
io._HttpInboundMessage = class _HttpInboundMessage extends async.Stream$(core.List$(core.int)) {
  new(incoming) {
    this[_incoming] = incoming;
    this[_cookies] = null;
    super.new();
  }
  get cookies() {
    if (this[_cookies] != null) return this[_cookies];
    return this[_cookies] = this.headers[_parseCookies]();
  }
  get headers() {
    return this[_incoming].headers;
  }
  get protocolVersion() {
    return this.headers.protocolVersion;
  }
  get contentLength() {
    return this.headers.contentLength;
  }
  get persistentConnection() {
    return this.headers.persistentConnection;
  }
};
dart.addSimpleTypeTests(io._HttpInboundMessage);
dart.setSignature(io._HttpInboundMessage, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpInboundMessage, [io._HttpIncoming])}),
  fields: () => ({
    [_incoming]: io._HttpIncoming,
    [_cookies]: ListOfCookie()
  }),
  getters: () => ({
    cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
    headers: dart.definiteFunctionType(io._HttpHeaders, []),
    protocolVersion: dart.definiteFunctionType(core.String, []),
    contentLength: dart.definiteFunctionType(core.int, []),
    persistentConnection: dart.definiteFunctionType(core.bool, [])
  })
});
const _httpServer = Symbol('_httpServer');
const _httpConnection = Symbol('_httpConnection');
const _session = Symbol('_session');
const _requestedUri = Symbol('_requestedUri');
const _sessionManagerInstance = Symbol('_sessionManagerInstance');
const _sessionManager = Symbol('_sessionManager');
const _markSeen = Symbol('_markSeen');
const _socket = Symbol('_socket');
const _destroyed = Symbol('_destroyed');
io._HttpRequest = class _HttpRequest extends io._HttpInboundMessage {
  new(response, _incoming, httpServer, httpConnection) {
    this.response = response;
    this[_httpServer] = httpServer;
    this[_httpConnection] = httpConnection;
    this[_session] = null;
    this[_requestedUri] = null;
    super.new(_incoming);
    if (this.headers.protocolVersion == "1.1") {
      let _ = this.response.headers;
      _.chunkedTransferEncoding = true;
      _.persistentConnection = this.headers.persistentConnection;
    }
    if (this[_httpServer][_sessionManagerInstance] != null) {
      let sessionIds = this.cookies[dartx.where](dart.fn(cookie => cookie.name[dartx.toUpperCase]() == io._DART_SESSION_ID, CookieTobool()))[dartx.map](core.String)(dart.fn(cookie => cookie.value, CookieToString()));
      for (let sessionId of sessionIds) {
        this[_session] = this[_httpServer][_sessionManager].getSession(sessionId);
        if (this[_session] != null) {
          this[_session][_markSeen]();
          break;
        }
      }
    }
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get uri() {
    return this[_incoming].uri;
  }
  get requestedUri() {
    if (this[_requestedUri] == null) {
      let proto = this.headers._get('x-forwarded-proto');
      let scheme = proto != null ? proto[dartx.first] : io.SecureSocket.is(this[_httpConnection][_socket]) ? "https" : "http";
      let hostList = this.headers._get('x-forwarded-host');
      let host = null;
      if (hostList != null) {
        host = hostList[dartx.first];
      } else {
        hostList = this.headers._get('host');
        if (hostList != null) {
          host = hostList[dartx.first];
        } else {
          host = dart.str`${this[_httpServer].address.host}:${this[_httpServer].port}`;
        }
      }
      this[_requestedUri] = core.Uri.parse(dart.str`${scheme}://${host}${this.uri}`);
    }
    return this[_requestedUri];
  }
  get method() {
    return this[_incoming].method;
  }
  get session() {
    if (this[_session] != null) {
      if (dart.test(this[_session][_destroyed])) {
        this[_session] = null;
        return this.session;
      }
      return this[_session];
    }
    return this[_session] = this[_httpServer][_sessionManager].createSession();
  }
  get connectionInfo() {
    return this[_httpConnection].connectionInfo;
  }
  get certificate() {
    let socket = this[_httpConnection][_socket];
    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
    return null;
  }
};
io._HttpRequest[dart.implements] = () => [io.HttpRequest];
dart.setSignature(io._HttpRequest, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpRequest, [io.HttpResponse, io._HttpIncoming, io._HttpServer, io._HttpConnection])}),
  fields: () => ({
    response: io.HttpResponse,
    [_httpServer]: io._HttpServer,
    [_httpConnection]: io._HttpConnection,
    [_session]: io._HttpSession,
    [_requestedUri]: core.Uri
  }),
  getters: () => ({
    uri: dart.definiteFunctionType(core.Uri, []),
    requestedUri: dart.definiteFunctionType(core.Uri, []),
    method: dart.definiteFunctionType(core.String, []),
    session: dart.definiteFunctionType(io.HttpSession, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    certificate: dart.definiteFunctionType(io.X509Certificate, [])
  }),
  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
});
const _responseRedirects = Symbol('_responseRedirects');
const _httpRequest = Symbol('_httpRequest');
const _httpClient = Symbol('_httpClient');
const _httpClientConnection = Symbol('_httpClientConnection');
const _openUrlFromRequest = Symbol('_openUrlFromRequest');
const _connectionClosed = Symbol('_connectionClosed');
const _shouldAuthenticateProxy = Symbol('_shouldAuthenticateProxy');
const _shouldAuthenticate = Symbol('_shouldAuthenticate');
const _proxy = Symbol('_proxy');
const _findProxyCredentials = Symbol('_findProxyCredentials');
const _findCredentials = Symbol('_findCredentials');
const _removeProxyCredentials = Symbol('_removeProxyCredentials');
const _removeCredentials = Symbol('_removeCredentials');
const _authenticateProxy = Symbol('_authenticateProxy');
const _authenticate = Symbol('_authenticate');
io._HttpClientResponse = class _HttpClientResponse extends io._HttpInboundMessage {
  get redirects() {
    return this[_httpRequest][_responseRedirects];
  }
  new(_incoming, httpRequest, httpClient) {
    this[_httpRequest] = httpRequest;
    this[_httpClient] = httpClient;
    super.new(_incoming);
    _incoming.uri = this[_httpRequest].uri;
  }
  get statusCode() {
    return this[_incoming].statusCode;
  }
  get reasonPhrase() {
    return this[_incoming].reasonPhrase;
  }
  get certificate() {
    let socket = this[_httpRequest][_httpClientConnection][_socket];
    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
    dart.throw(new core.UnsupportedError("Socket is not a SecureSocket"));
  }
  get cookies() {
    if (this[_cookies] != null) return this[_cookies];
    this[_cookies] = ListOfCookie().new();
    let values = this.headers._get(io.HttpHeaders.SET_COOKIE);
    if (values != null) {
      values[dartx.forEach](dart.fn(value => {
        this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
      }, StringToNull()));
    }
    return this[_cookies];
  }
  get isRedirect() {
    if (this[_httpRequest].method == "GET" || this[_httpRequest].method == "HEAD") {
      return this.statusCode == io.HttpStatus.MOVED_PERMANENTLY || this.statusCode == io.HttpStatus.FOUND || this.statusCode == io.HttpStatus.SEE_OTHER || this.statusCode == io.HttpStatus.TEMPORARY_REDIRECT;
    } else if (this[_httpRequest].method == "POST") {
      return this.statusCode == io.HttpStatus.SEE_OTHER;
    }
    return false;
  }
  redirect(method, url, followLoops) {
    if (method === void 0) method = null;
    if (url === void 0) url = null;
    if (followLoops === void 0) followLoops = null;
    if (method == null) {
      if (this.statusCode == io.HttpStatus.SEE_OTHER && this[_httpRequest].method == "POST") {
        method = "GET";
      } else {
        method = this[_httpRequest].method;
      }
    }
    if (url == null) {
      let location = this.headers.value(io.HttpHeaders.LOCATION);
      if (location == null) {
        dart.throw(new core.StateError("Response has no Location header for redirect"));
      }
      url = core.Uri.parse(location);
    }
    if (followLoops != true) {
      for (let redirect of this.redirects) {
        if (dart.equals(redirect.location, url)) {
          return FutureOfHttpClientResponse().error(new io.RedirectException("Redirect loop detected", this.redirects));
        }
      }
    }
    return this[_httpClient][_openUrlFromRequest](method, url, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => {
      let _ = request[_responseRedirects];
      _[dartx.addAll](this.redirects);
      _[dartx.add](new io._RedirectInfo(this.statusCode, method, url));
      return request.close();
    }, _HttpClientRequestToFutureOfHttpClientResponse()));
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    if (dart.test(this[_incoming].upgraded)) {
      this[_httpRequest][_httpClientConnection].destroy();
      return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
    }
    let stream = this[_incoming];
    if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
      stream = io._HttpIncoming._check(stream.transform(ListOfint())(io.GZIP.decoder));
    }
    return stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  detachSocket() {
    this[_httpClient][_connectionClosed](this[_httpRequest][_httpClientConnection]);
    return this[_httpRequest][_httpClientConnection].detachSocket();
  }
  get connectionInfo() {
    return this[_httpRequest].connectionInfo;
  }
  get [_shouldAuthenticateProxy]() {
    let challenge = this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE);
    return this.statusCode == io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED && challenge != null && challenge[dartx.length] == 1;
  }
  get [_shouldAuthenticate]() {
    let challenge = this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
    return this.statusCode == io.HttpStatus.UNAUTHORIZED && challenge != null && challenge[dartx.length] == 1;
  }
  [_authenticate](proxyAuth) {
    const retry = (function() {
      return this.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => this[_httpClient][_openUrlFromRequest](this[_httpRequest].method, this[_httpRequest].uri, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => request.close(), _HttpClientRequestToFutureOfHttpClientResponse())), dynamicToFutureOfHttpClientResponse()));
    }).bind(this);
    dart.fn(retry, VoidToFutureOfHttpClientResponse());
    const authChallenge = (function() {
      return dart.test(proxyAuth) ? this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE) : this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
    }).bind(this);
    dart.fn(authChallenge, VoidToListOfString());
    const findCredentials = (function(scheme) {
      return dart.test(proxyAuth) ? this[_httpClient][_findProxyCredentials](this[_httpRequest][_proxy], scheme) : this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
    }).bind(this);
    dart.fn(findCredentials, _AuthenticationSchemeTo_Credentials());
    const removeCredentials = (function(cr) {
      if (dart.test(proxyAuth)) {
        this[_httpClient][_removeProxyCredentials](cr);
      } else {
        this[_httpClient][_removeCredentials](cr);
      }
    }).bind(this);
    dart.fn(removeCredentials, _CredentialsTovoid());
    const requestAuthentication = (function(scheme, realm) {
      if (dart.test(proxyAuth)) {
        if (this[_httpClient][_authenticateProxy] == null) {
          return async.Future.value(false);
        }
        let proxy = this[_httpRequest][_proxy];
        return async.Future._check(dart.dsend(this[_httpClient], _authenticateProxy, proxy.host, proxy.port, dart.toString(scheme), realm));
      } else {
        if (this[_httpClient][_authenticate] == null) {
          return async.Future.value(false);
        }
        return async.Future._check(dart.dsend(this[_httpClient], _authenticate, this[_httpRequest].uri, dart.toString(scheme), realm));
      }
    }).bind(this);
    dart.fn(requestAuthentication, _AuthenticationSchemeAndStringToFuture());
    let challenge = authChallenge();
    dart.assert(challenge != null || challenge[dartx.length] == 1);
    let header = io._HeaderValue.parse(challenge[dartx._get](0), {parameterSeparator: ","});
    let scheme = io._AuthenticationScheme.fromString(header.value);
    let realm = header.parameters[dartx._get]("realm");
    let cr = findCredentials(scheme);
    if (cr != null) {
      if (dart.equals(cr.scheme, io._AuthenticationScheme.BASIC) && !dart.test(cr.used)) {
        return retry();
      }
      if (dart.equals(cr.scheme, io._AuthenticationScheme.DIGEST) && (header.parameters[dartx._get]("algorithm") == null || header.parameters[dartx._get]("algorithm")[dartx.toLowerCase]() == "md5")) {
        if (cr.nonce == null || cr.nonce == header.parameters[dartx._get]("nonce")) {
          if (cr.nonce == null) {
            let _ = cr;
            _.nonce = header.parameters[dartx._get]("nonce");
            _.algorithm = "MD5";
            _.qop = header.parameters[dartx._get]("qop");
            _.nonceCount = 0;
          }
          return retry();
        } else if (header.parameters[dartx._get]("stale") != null && header.parameters[dartx._get]("stale")[dartx.toLowerCase]() == "true") {
          cr.nonce = header.parameters[dartx._get]("nonce");
          return retry();
        }
      }
    }
    if (cr != null) {
      removeCredentials(cr);
      cr = null;
    }
    return requestAuthentication(scheme, realm).then(io.HttpClientResponse)(dart.fn(credsAvailable => {
      if (dart.test(credsAvailable)) {
        cr = this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
        return retry();
      } else {
        return this;
      }
    }, dynamicToFutureOrOfHttpClientResponse()));
  }
};
io._HttpClientResponse[dart.implements] = () => [io.HttpClientResponse];
dart.setSignature(io._HttpClientResponse, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientResponse, [io._HttpIncoming, io._HttpClientRequest, io._HttpClient])}),
  fields: () => ({
    [_httpClient]: io._HttpClient,
    [_httpRequest]: io._HttpClientRequest
  }),
  getters: () => ({
    redirects: dart.definiteFunctionType(core.List$(io.RedirectInfo), []),
    statusCode: dart.definiteFunctionType(core.int, []),
    reasonPhrase: dart.definiteFunctionType(core.String, []),
    certificate: dart.definiteFunctionType(io.X509Certificate, []),
    isRedirect: dart.definiteFunctionType(core.bool, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    [_shouldAuthenticateProxy]: dart.definiteFunctionType(core.bool, []),
    [_shouldAuthenticate]: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    redirect: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [], [core.String, core.Uri, core.bool]),
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
    [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
  })
});
const _uri = Symbol('_uri');
const _outgoing = Symbol('_outgoing');
const _encodingSet = Symbol('_encodingSet');
const _bufferOutput = Symbol('_bufferOutput');
const _encodingMutable = Symbol('_encodingMutable');
const _encoding = Symbol('_encoding');
const _isConnectionClosed = Symbol('_isConnectionClosed');
const _doneCompleter = Symbol('_doneCompleter');
const _target$ = Symbol('_target');
const _controllerInstance = Symbol('_controllerInstance');
const _controllerCompleter = Symbol('_controllerCompleter');
const _isClosed$0 = Symbol('_isClosed');
const _isBound = Symbol('_isBound');
const _hasError$ = Symbol('_hasError');
const _closeTarget = Symbol('_closeTarget');
const _completeDoneValue = Symbol('_completeDoneValue');
const _completeDoneError = Symbol('_completeDoneError');
io._StreamSinkImpl$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
  class _StreamSinkImpl extends core.Object {
    new(target) {
      this[_doneCompleter] = async.Completer.new();
      this[_target$] = target;
      this[_controllerInstance] = null;
      this[_controllerCompleter] = null;
      this[_isClosed$0] = false;
      this[_isBound] = false;
      this[_hasError$] = false;
    }
    add(data) {
      T._check(data);
      if (dart.test(this[_isClosed$0])) return;
      this[_controller$0].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_controller$0].addError(error, stackTrace);
    }
    addStream(stream) {
      StreamOfT()._check(stream);
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is already bound to a stream"));
      }
      this[_isBound] = true;
      if (dart.test(this[_hasError$])) return this.done;
      const targetAddStream = (function() {
        return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
          this[_isBound] = false;
        }, VoidToNull()));
      }).bind(this);
      dart.fn(targetAddStream, VoidToFuture());
      if (this[_controllerInstance] == null) return targetAddStream();
      let future = this[_controllerCompleter].future;
      this[_controllerInstance].close();
      return future.then(dart.dynamic)(dart.fn(_ => targetAddStream(), dynamicToFuture()));
    }
    flush() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is bound to a stream"));
      }
      if (this[_controllerInstance] == null) return async.Future.value(this);
      this[_isBound] = true;
      let future = this[_controllerCompleter].future;
      this[_controllerInstance].close();
      return future.whenComplete(dart.fn(() => {
        this[_isBound] = false;
      }, VoidToNull()));
    }
    close() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is bound to a stream"));
      }
      if (!dart.test(this[_isClosed$0])) {
        this[_isClosed$0] = true;
        if (this[_controllerInstance] != null) {
          this[_controllerInstance].close();
        } else {
          this[_closeTarget]();
        }
      }
      return this.done;
    }
    [_closeTarget]() {
      this[_target$].close().then(dart.void)(dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
    }
    get done() {
      return this[_doneCompleter].future;
    }
    [_completeDoneValue](value) {
      if (!dart.test(this[_doneCompleter].isCompleted)) {
        this[_doneCompleter].complete(value);
      }
    }
    [_completeDoneError](error, stackTrace) {
      if (!dart.test(this[_doneCompleter].isCompleted)) {
        this[_hasError$] = true;
        this[_doneCompleter].completeError(error, stackTrace);
      }
    }
    get [_controller$0]() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is bound to a stream"));
      }
      if (dart.test(this[_isClosed$0])) {
        dart.throw(new core.StateError("StreamSink is closed"));
      }
      if (this[_controllerInstance] == null) {
        this[_controllerInstance] = StreamControllerOfT().new({sync: true});
        this[_controllerCompleter] = async.Completer.new();
        this[_target$].addStream(this[_controller$0].stream).then(dart.dynamic)(dart.fn(_ => {
          if (dart.test(this[_isBound])) {
            this[_controllerCompleter].complete(this);
            this[_controllerCompleter] = null;
            this[_controllerInstance] = null;
          } else {
            this[_closeTarget]();
          }
        }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
            if (dart.test(this[_isBound])) {
              this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
              this[_controllerCompleter] = null;
              this[_controllerInstance] = null;
            } else {
              this[_completeDoneError](error, core.StackTrace._check(stackTrace));
            }
          }, dynamicAnddynamicToNull())});
      }
      return this[_controllerInstance];
    }
  }
  dart.addTypeTests(_StreamSinkImpl);
  _StreamSinkImpl[dart.implements] = () => [StreamSinkOfT()];
  dart.setSignature(_StreamSinkImpl, {
    constructors: () => ({new: dart.definiteFunctionType(io._StreamSinkImpl$(T), [StreamConsumerOfT()])}),
    fields: () => ({
      [_target$]: StreamConsumerOfT(),
      [_doneCompleter]: async.Completer,
      [_controllerInstance]: StreamControllerOfT(),
      [_controllerCompleter]: async.Completer,
      [_isClosed$0]: core.bool,
      [_isBound]: core.bool,
      [_hasError$]: core.bool
    }),
    getters: () => ({
      done: dart.definiteFunctionType(async.Future, []),
      [_controller$0]: dart.definiteFunctionType(async.StreamController$(T), [])
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [T]),
      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()]),
      flush: dart.definiteFunctionType(async.Future, []),
      close: dart.definiteFunctionType(async.Future, []),
      [_closeTarget]: dart.definiteFunctionType(dart.void, []),
      [_completeDoneValue]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_completeDoneError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])
    })
  });
  return _StreamSinkImpl;
});
io._StreamSinkImpl = _StreamSinkImpl();
io._IOSinkImpl = class _IOSinkImpl extends io._StreamSinkImpl$(core.List$(core.int)) {
  new(target, encoding) {
    this[_encoding] = encoding;
    this[_encodingMutable] = true;
    super.new(target);
  }
  get encoding() {
    return this[_encoding];
  }
  set encoding(value) {
    if (!dart.test(this[_encodingMutable])) {
      dart.throw(new core.StateError("IOSink encoding is not mutable"));
    }
    this[_encoding] = value;
  }
  write(obj) {
    let string = dart.str`${obj}`;
    if (dart.test(string[dartx.isEmpty])) return;
    this.add(this[_encoding].encode(string));
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    let iterator = objects[dartx.iterator];
    if (!dart.test(iterator.moveNext())) return;
    if (dart.test(separator[dartx.isEmpty])) {
      do {
        this.write(iterator.current);
      } while (dart.test(iterator.moveNext()));
    } else {
      this.write(iterator.current);
      while (dart.test(iterator.moveNext())) {
        this.write(separator);
        this.write(iterator.current);
      }
    }
  }
  writeln(object) {
    if (object === void 0) object = "";
    this.write(object);
    this.write("\n");
  }
  writeCharCode(charCode) {
    this.write(core.String.fromCharCode(charCode));
  }
};
dart.addSimpleTypeTests(io._IOSinkImpl);
io._IOSinkImpl[dart.implements] = () => [io.IOSink];
dart.setSignature(io._IOSinkImpl, {
  constructors: () => ({new: dart.definiteFunctionType(io._IOSinkImpl, [StreamConsumerOfListOfint(), convert.Encoding])}),
  fields: () => ({
    [_encoding]: convert.Encoding,
    [_encodingMutable]: core.bool
  }),
  getters: () => ({encoding: dart.definiteFunctionType(convert.Encoding, [])}),
  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
  methods: () => ({
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
  })
});
io._HttpOutboundMessage$ = dart.generic(T => {
  class _HttpOutboundMessage extends io._IOSinkImpl {
    new(uri, protocolVersion, outgoing, opts) {
      let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
      this[_uri] = uri;
      this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
      this[_outgoing] = outgoing;
      this[_encodingSet] = false;
      this[_bufferOutput] = true;
      super.new(outgoing, null);
      this[_outgoing].outbound = this;
      this[_encodingMutable] = false;
    }
    get contentLength() {
      return this.headers.contentLength;
    }
    set contentLength(contentLength) {
      this.headers.contentLength = contentLength;
    }
    get persistentConnection() {
      return this.headers.persistentConnection;
    }
    set persistentConnection(p) {
      this.headers.persistentConnection = p;
    }
    get bufferOutput() {
      return this[_bufferOutput];
    }
    set bufferOutput(bufferOutput) {
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
      this[_bufferOutput] = bufferOutput;
    }
    get encoding() {
      if (dart.test(this[_encodingSet]) && dart.test(this[_outgoing].headersWritten)) {
        return this[_encoding];
      }
      let charset = null;
      if (this.headers.contentType != null && this.headers.contentType.charset != null) {
        charset = this.headers.contentType.charset;
      } else {
        charset = "iso-8859-1";
      }
      return convert.Encoding.getByName(core.String._check(charset));
    }
    set encoding(value) {
      super.encoding = value;
    }
    add(data) {
      if (data[dartx.length] == 0) return;
      super.add(data);
    }
    write(obj) {
      if (!dart.test(this[_encodingSet])) {
        this[_encoding] = this.encoding;
        this[_encodingSet] = true;
      }
      super.write(obj);
    }
    get [_isConnectionClosed]() {
      return false;
    }
  }
  dart.addTypeTests(_HttpOutboundMessage);
  dart.setSignature(_HttpOutboundMessage, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpOutboundMessage$(T), [core.Uri, core.String, io._HttpOutgoing], {initialHeaders: io._HttpHeaders})}),
    fields: () => ({
      [_encodingSet]: core.bool,
      [_bufferOutput]: core.bool,
      [_uri]: core.Uri,
      [_outgoing]: io._HttpOutgoing,
      headers: io._HttpHeaders
    }),
    getters: () => ({
      contentLength: dart.definiteFunctionType(core.int, []),
      persistentConnection: dart.definiteFunctionType(core.bool, []),
      bufferOutput: dart.definiteFunctionType(core.bool, []),
      [_isConnectionClosed]: dart.definiteFunctionType(core.bool, [])
    }),
    setters: () => ({
      contentLength: dart.definiteFunctionType(dart.void, [core.int]),
      persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
      bufferOutput: dart.definiteFunctionType(dart.void, [core.bool])
    })
  });
  return _HttpOutboundMessage;
});
io._HttpOutboundMessage = _HttpOutboundMessage();
const _statusCode = Symbol('_statusCode');
const _reasonPhrase = Symbol('_reasonPhrase');
const _deadline = Symbol('_deadline');
const _deadlineTimer = Symbol('_deadlineTimer');
const _isClosing = Symbol('_isClosing');
const _findReasonPhrase = Symbol('_findReasonPhrase');
const _isNew = Symbol('_isNew');
const _writeHeader = Symbol('_writeHeader');
io._HttpResponse = class _HttpResponse extends io._HttpOutboundMessage$(io.HttpResponse) {
  new(uri, protocolVersion, outgoing, defaultHeaders, serverHeader) {
    this[_statusCode] = 200;
    this[_reasonPhrase] = null;
    this[_cookies] = null;
    this[_httpRequest] = null;
    this[_deadline] = null;
    this[_deadlineTimer] = null;
    super.new(uri, protocolVersion, outgoing, {initialHeaders: io._HttpHeaders._check(defaultHeaders)});
    if (serverHeader != null) this.headers.set('server', serverHeader);
  }
  get [_isConnectionClosed]() {
    return this[_httpRequest][_httpConnection][_isClosing];
  }
  get cookies() {
    if (this[_cookies] == null) this[_cookies] = ListOfCookie().new();
    return this[_cookies];
  }
  get statusCode() {
    return this[_statusCode];
  }
  set statusCode(statusCode) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
    this[_statusCode] = statusCode;
  }
  get reasonPhrase() {
    return this[_findReasonPhrase](this.statusCode);
  }
  set reasonPhrase(reasonPhrase) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
    this[_reasonPhrase] = reasonPhrase;
  }
  redirect(location, opts) {
    let status = opts && 'status' in opts ? opts.status : io.HttpStatus.MOVED_TEMPORARILY;
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
    this.statusCode = status;
    this.headers.set("location", dart.toString(location));
    return this.close();
  }
  detachSocket(opts) {
    let writeHeaders = opts && 'writeHeaders' in opts ? opts.writeHeaders : true;
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Headers already sent"));
    this.deadline = null;
    let future = this[_httpRequest][_httpConnection].detachSocket();
    if (dart.test(writeHeaders)) {
      let headersFuture = this[_outgoing].writeHeaders({drainRequest: false, setOutgoing: false});
      dart.assert(headersFuture == null);
    } else {
      this[_outgoing].headersWritten = true;
    }
    this.close();
    this.done.catchError(dart.fn(_ => {
    }, dynamicToNull$()));
    return future;
  }
  get connectionInfo() {
    return this[_httpRequest].connectionInfo;
  }
  get deadline() {
    return this[_deadline];
  }
  set deadline(d) {
    if (this[_deadlineTimer] != null) this[_deadlineTimer].cancel();
    this[_deadline] = d;
    if (this[_deadline] == null) return;
    this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
      this[_httpRequest][_httpConnection].destroy();
    }, VoidToNull()));
  }
  [_writeHeader]() {
    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
    let offset = 0;
    function write(bytes) {
      let len = bytes[dartx.length];
      for (let i = 0; i < dart.notNull(len); i++) {
        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
      }
      offset = dart.notNull(offset) + dart.notNull(len);
    }
    dart.fn(write, ListOfintTovoid$());
    if (this.headers.protocolVersion == "1.1") {
      write(io._Const.HTTP11);
    } else {
      write(io._Const.HTTP10);
    }
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(dart.toString(this.statusCode)[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(this.reasonPhrase[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    let session = this[_httpRequest][_session];
    if (session != null && !dart.test(session[_destroyed])) {
      session[_isNew] = false;
      let found = false;
      for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
        if (this.cookies[dartx._get](i).name[dartx.toUpperCase]() == io._DART_SESSION_ID) {
          let _ = this.cookies[dartx._get](i);
          _.value = session.id;
          _.httpOnly = true;
          _.path = "/";
          found = true;
        }
      }
      if (!found) {
        let cookie = io.Cookie.new(io._DART_SESSION_ID, session.id);
        this.cookies[dartx.add](((() => {
          cookie.httpOnly = true;
          cookie.path = "/";
          return cookie;
        })()));
      }
    }
    if (this[_cookies] != null) {
      this[_cookies][dartx.forEach](dart.fn(cookie => {
        this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
      }, CookieToNull()));
    }
    this.headers[_finalize]();
    offset = this.headers[_write](buffer, offset);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    this[_outgoing].setHeader(buffer, offset);
  }
  [_findReasonPhrase](statusCode) {
    if (this[_reasonPhrase] != null) {
      return this[_reasonPhrase];
    }
    switch (statusCode) {
      case io.HttpStatus.CONTINUE:
      {
        return "Continue";
      }
      case io.HttpStatus.SWITCHING_PROTOCOLS:
      {
        return "Switching Protocols";
      }
      case io.HttpStatus.OK:
      {
        return "OK";
      }
      case io.HttpStatus.CREATED:
      {
        return "Created";
      }
      case io.HttpStatus.ACCEPTED:
      {
        return "Accepted";
      }
      case io.HttpStatus.NON_AUTHORITATIVE_INFORMATION:
      {
        return "Non-Authoritative Information";
      }
      case io.HttpStatus.NO_CONTENT:
      {
        return "No Content";
      }
      case io.HttpStatus.RESET_CONTENT:
      {
        return "Reset Content";
      }
      case io.HttpStatus.PARTIAL_CONTENT:
      {
        return "Partial Content";
      }
      case io.HttpStatus.MULTIPLE_CHOICES:
      {
        return "Multiple Choices";
      }
      case io.HttpStatus.MOVED_PERMANENTLY:
      {
        return "Moved Permanently";
      }
      case io.HttpStatus.FOUND:
      {
        return "Found";
      }
      case io.HttpStatus.SEE_OTHER:
      {
        return "See Other";
      }
      case io.HttpStatus.NOT_MODIFIED:
      {
        return "Not Modified";
      }
      case io.HttpStatus.USE_PROXY:
      {
        return "Use Proxy";
      }
      case io.HttpStatus.TEMPORARY_REDIRECT:
      {
        return "Temporary Redirect";
      }
      case io.HttpStatus.BAD_REQUEST:
      {
        return "Bad Request";
      }
      case io.HttpStatus.UNAUTHORIZED:
      {
        return "Unauthorized";
      }
      case io.HttpStatus.PAYMENT_REQUIRED:
      {
        return "Payment Required";
      }
      case io.HttpStatus.FORBIDDEN:
      {
        return "Forbidden";
      }
      case io.HttpStatus.NOT_FOUND:
      {
        return "Not Found";
      }
      case io.HttpStatus.METHOD_NOT_ALLOWED:
      {
        return "Method Not Allowed";
      }
      case io.HttpStatus.NOT_ACCEPTABLE:
      {
        return "Not Acceptable";
      }
      case io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED:
      {
        return "Proxy Authentication Required";
      }
      case io.HttpStatus.REQUEST_TIMEOUT:
      {
        return "Request Time-out";
      }
      case io.HttpStatus.CONFLICT:
      {
        return "Conflict";
      }
      case io.HttpStatus.GONE:
      {
        return "Gone";
      }
      case io.HttpStatus.LENGTH_REQUIRED:
      {
        return "Length Required";
      }
      case io.HttpStatus.PRECONDITION_FAILED:
      {
        return "Precondition Failed";
      }
      case io.HttpStatus.REQUEST_ENTITY_TOO_LARGE:
      {
        return "Request Entity Too Large";
      }
      case io.HttpStatus.REQUEST_URI_TOO_LONG:
      {
        return "Request-URI Too Large";
      }
      case io.HttpStatus.UNSUPPORTED_MEDIA_TYPE:
      {
        return "Unsupported Media Type";
      }
      case io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE:
      {
        return "Requested range not satisfiable";
      }
      case io.HttpStatus.EXPECTATION_FAILED:
      {
        return "Expectation Failed";
      }
      case io.HttpStatus.INTERNAL_SERVER_ERROR:
      {
        return "Internal Server Error";
      }
      case io.HttpStatus.NOT_IMPLEMENTED:
      {
        return "Not Implemented";
      }
      case io.HttpStatus.BAD_GATEWAY:
      {
        return "Bad Gateway";
      }
      case io.HttpStatus.SERVICE_UNAVAILABLE:
      {
        return "Service Unavailable";
      }
      case io.HttpStatus.GATEWAY_TIMEOUT:
      {
        return "Gateway Time-out";
      }
      case io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED:
      {
        return "Http Version not supported";
      }
      default:
      {
        return dart.str`Status ${statusCode}`;
      }
    }
  }
};
dart.addSimpleTypeTests(io._HttpResponse);
io._HttpResponse[dart.implements] = () => [io.HttpResponse];
dart.setSignature(io._HttpResponse, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpResponse, [core.Uri, core.String, io._HttpOutgoing, io.HttpHeaders, core.String])}),
  fields: () => ({
    [_statusCode]: core.int,
    [_reasonPhrase]: core.String,
    [_cookies]: ListOfCookie(),
    [_httpRequest]: io._HttpRequest,
    [_deadline]: core.Duration,
    [_deadlineTimer]: async.Timer
  }),
  getters: () => ({
    cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
    statusCode: dart.definiteFunctionType(core.int, []),
    reasonPhrase: dart.definiteFunctionType(core.String, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    deadline: dart.definiteFunctionType(core.Duration, [])
  }),
  setters: () => ({
    statusCode: dart.definiteFunctionType(dart.void, [core.int]),
    reasonPhrase: dart.definiteFunctionType(dart.void, [core.String]),
    deadline: dart.definiteFunctionType(dart.void, [core.Duration])
  }),
  methods: () => ({
    redirect: dart.definiteFunctionType(async.Future, [core.Uri], {status: core.int}),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), [], {writeHeaders: core.bool}),
    [_writeHeader]: dart.definiteFunctionType(dart.void, []),
    [_findReasonPhrase]: dart.definiteFunctionType(core.String, [core.int])
  })
});
const _responseCompleter = Symbol('_responseCompleter');
const _response = Symbol('_response');
const _followRedirects = Symbol('_followRedirects');
const _maxRedirects = Symbol('_maxRedirects');
const _onIncoming = Symbol('_onIncoming');
const _onError$ = Symbol('_onError');
const _proxyTunnel = Symbol('_proxyTunnel');
const _requestUri = Symbol('_requestUri');
io._HttpClientRequest = class _HttpClientRequest extends io._HttpOutboundMessage$(io.HttpClientResponse) {
  new(outgoing, uri, method, proxy, httpClient, httpClientConnection) {
    this.cookies = ListOfCookie().new();
    this[_responseCompleter] = CompleterOfHttpClientResponse().new();
    this[_responseRedirects] = JSArrayOfRedirectInfo().of([]);
    this.method = method;
    this[_proxy] = proxy;
    this[_httpClient] = httpClient;
    this[_httpClientConnection] = httpClientConnection;
    this.uri = uri;
    this[_response] = null;
    this[_followRedirects] = true;
    this[_maxRedirects] = 5;
    super.new(uri, "1.1", outgoing);
    if (this.method == "GET" || this.method == "HEAD") {
      this.contentLength = 0;
    } else {
      this.headers.chunkedTransferEncoding = true;
    }
  }
  get done() {
    if (this[_response] == null) {
      this[_response] = async.Future.wait(dart.dynamic)(JSArrayOfFuture().of([this[_responseCompleter].future, super.done]), {eagerError: true}).then(io.HttpClientResponse)(dart.fn(list => FutureOrOfHttpClientResponse()._check(list[dartx._get](0)), ListToFutureOrOfHttpClientResponse()));
    }
    return this[_response];
  }
  close() {
    super.close();
    return this.done;
  }
  get maxRedirects() {
    return this[_maxRedirects];
  }
  set maxRedirects(maxRedirects) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
    this[_maxRedirects] = maxRedirects;
  }
  get followRedirects() {
    return this[_followRedirects];
  }
  set followRedirects(followRedirects) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
    this[_followRedirects] = followRedirects;
  }
  get connectionInfo() {
    return this[_httpClientConnection].connectionInfo;
  }
  [_onIncoming](incoming) {
    let response = new io._HttpClientResponse(incoming, this, this[_httpClient]);
    let future = null;
    if (dart.test(this.followRedirects) && dart.test(response.isRedirect)) {
      if (dart.notNull(response.redirects[dartx.length]) < dart.notNull(this.maxRedirects)) {
        future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => response.redirect(), dynamicToFutureOfHttpClientResponse()));
      } else {
        future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => FutureOfHttpClientResponse().error(new io.RedirectException("Redirect limit exceeded", response.redirects)), dynamicToFutureOfHttpClientResponse()));
      }
    } else if (dart.test(response[_shouldAuthenticateProxy])) {
      future = response[_authenticate](true);
    } else if (dart.test(response[_shouldAuthenticate])) {
      future = response[_authenticate](false);
    } else {
      future = FutureOfHttpClientResponse().value(response);
    }
    future.then(dart.void)(dart.fn(v => this[_responseCompleter].complete(v), HttpClientResponseTovoid()), {onError: dart.bind(this[_responseCompleter], 'completeError')});
  }
  [_onError$](error, stackTrace) {
    this[_responseCompleter].completeError(error, stackTrace);
  }
  [_requestUri]() {
    const uriStartingFromPath = (function() {
      let result = this.uri.path;
      if (dart.test(result[dartx.isEmpty])) result = "/";
      if (dart.test(this.uri.hasQuery)) {
        result = dart.str`${result}?${this.uri.query}`;
      }
      return result;
    }).bind(this);
    dart.fn(uriStartingFromPath, VoidToString$());
    if (dart.test(this[_proxy].isDirect)) {
      return uriStartingFromPath();
    } else {
      if (this.method == "CONNECT") {
        return dart.str`${this.uri.host}:${this.uri.port}`;
      } else {
        if (dart.test(this[_httpClientConnection][_proxyTunnel])) {
          return uriStartingFromPath();
        } else {
          return dart.toString(this.uri.removeFragment());
        }
      }
    }
  }
  [_writeHeader]() {
    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
    let offset = 0;
    function write(bytes) {
      let len = bytes[dartx.length];
      for (let i = 0; i < dart.notNull(len); i++) {
        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
      }
      offset = dart.notNull(offset) + dart.notNull(len);
    }
    dart.fn(write, ListOfintTovoid$());
    write(this.method[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(this[_requestUri]()[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(io._Const.HTTP11);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    if (!dart.test(this.cookies[dartx.isEmpty])) {
      let sb = new core.StringBuffer();
      for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
        if (i > 0) sb.write("; ");
        sb.write(this.cookies[dartx._get](i).name);
        sb.write("=");
        sb.write(this.cookies[dartx._get](i).value);
      }
      this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
    }
    this.headers[_finalize]();
    offset = this.headers[_write](buffer, offset);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    this[_outgoing].setHeader(buffer, offset);
  }
};
dart.addSimpleTypeTests(io._HttpClientRequest);
io._HttpClientRequest[dart.implements] = () => [io.HttpClientRequest];
dart.setSignature(io._HttpClientRequest, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientRequest, [io._HttpOutgoing, core.Uri, core.String, io._Proxy, io._HttpClient, io._HttpClientConnection])}),
  fields: () => ({
    method: core.String,
    uri: core.Uri,
    cookies: ListOfCookie(),
    [_httpClient]: io._HttpClient,
    [_httpClientConnection]: io._HttpClientConnection,
    [_responseCompleter]: CompleterOfHttpClientResponse(),
    [_proxy]: io._Proxy,
    [_response]: FutureOfHttpClientResponse(),
    [_followRedirects]: core.bool,
    [_maxRedirects]: core.int,
    [_responseRedirects]: ListOfRedirectInfo()
  }),
  getters: () => ({
    done: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
    maxRedirects: dart.definiteFunctionType(core.int, []),
    followRedirects: dart.definiteFunctionType(core.bool, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])
  }),
  setters: () => ({
    maxRedirects: dart.definiteFunctionType(dart.void, [core.int]),
    followRedirects: dart.definiteFunctionType(dart.void, [core.bool])
  }),
  methods: () => ({
    close: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
    [_onIncoming]: dart.definiteFunctionType(dart.void, [io._HttpIncoming]),
    [_onError$]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
    [_requestUri]: dart.definiteFunctionType(core.String, []),
    [_writeHeader]: dart.definiteFunctionType(dart.void, [])
  })
});
const _consume = Symbol('_consume');
io._HttpGZipSink = class _HttpGZipSink extends convert.ByteConversionSink {
  new(consume) {
    this[_consume] = consume;
    super.new();
  }
  add(chunk) {
    dart.dcall(this[_consume], chunk);
  }
  addSlice(chunk, start, end, isLast) {
    if (typed_data.Uint8List.is(chunk)) {
      dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
    } else {
      dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
    }
  }
  close() {}
};
dart.setSignature(io._HttpGZipSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpGZipSink, [core.Function])}),
  fields: () => ({[_consume]: core.Function}),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
const _closeFuture = Symbol('_closeFuture');
const _pendingChunkedFooter = Symbol('_pendingChunkedFooter');
const _bytesWritten = Symbol('_bytesWritten');
const _gzip = Symbol('_gzip');
const _gzipSink = Symbol('_gzipSink');
const _gzipAdd = Symbol('_gzipAdd');
const _gzipBuffer = Symbol('_gzipBuffer');
const _gzipBufferLength = Symbol('_gzipBufferLength');
const _socketError = Symbol('_socketError');
const _addGZipChunk = Symbol('_addGZipChunk');
const _addChunk$ = Symbol('_addChunk');
const _chunkHeader = Symbol('_chunkHeader');
const _ignoreError = Symbol('_ignoreError');
let const$68;
io._HttpOutgoing = class _HttpOutgoing extends core.Object {
  new(socket) {
    this[_doneCompleter] = async.Completer.new();
    this.socket = socket;
    this.ignoreBody = false;
    this.headersWritten = false;
    this[_buffer$] = null;
    this[_length$2] = 0;
    this[_closeFuture] = null;
    this.chunked = false;
    this[_pendingChunkedFooter] = 0;
    this.contentLength = null;
    this[_bytesWritten] = 0;
    this[_gzip] = false;
    this[_gzipSink] = null;
    this[_gzipAdd] = null;
    this[_gzipBuffer] = null;
    this[_gzipBufferLength] = 0;
    this[_socketError] = false;
    this.outbound = null;
  }
  writeHeaders(opts) {
    let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
    let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
    const write = (function() {
      try {
        this.outbound[_writeHeader]();
      } catch (_) {
        return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
      }

      return null;
    }).bind(this);
    dart.fn(write, VoidToFuture());
    if (dart.test(this.headersWritten)) return null;
    this.headersWritten = true;
    let drainFuture = null;
    let gzip = false;
    if (io._HttpResponse.is(this.outbound)) {
      let response = io._HttpResponse._check(this.outbound);
      if (dart.test(response[_httpRequest][_httpServer].autoCompress) && dart.test(this.outbound.bufferOutput) && dart.test(this.outbound.headers.chunkedTransferEncoding)) {
        let acceptEncodings = response[_httpRequest].headers._get(io.HttpHeaders.ACCEPT_ENCODING);
        let contentEncoding = this.outbound.headers._get(io.HttpHeaders.CONTENT_ENCODING);
        if (acceptEncodings != null && dart.test(acceptEncodings[dartx.expand](dart.dynamic)(dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', ",")), dynamicToIterable()))[dartx.any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim'), 'toLowerCase'), "gzip"), dynamicTobool$()))) && contentEncoding == null) {
          this.outbound.headers.set(io.HttpHeaders.CONTENT_ENCODING, "gzip");
          gzip = true;
        }
      }
      if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
        drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
        }, dynamicToNull$()));
      }
    } else {
      drainRequest = false;
    }
    if (dart.test(this.ignoreBody)) {
      return write();
    }
    if (dart.test(setOutgoing)) {
      let contentLength = this.outbound.headers.contentLength;
      if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
        this.chunked = true;
        if (gzip) this.gzip = true;
      } else if (dart.notNull(contentLength) >= 0) {
        this.contentLength = contentLength;
      }
    }
    if (drainFuture != null) {
      return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
    }
    return write();
  }
  addStream(stream) {
    if (dart.test(this[_socketError])) {
      stream.listen(null).cancel();
      return async.Future.value(this.outbound);
    }
    if (dart.test(this.ignoreBody)) {
      stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
      }, dynamicToNull$()));
      let future = this.writeHeaders();
      if (future != null) {
        return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
      }
      return this.close();
    }
    let sub = null;
    let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
    const onData = (function(data) {
      if (dart.test(this[_socketError])) return;
      if (dart.equals(dart.dload(data, 'length'), 0)) return;
      if (dart.test(this.chunked)) {
        if (dart.test(this[_gzip])) {
          this[_gzipAdd] = dart.bind(controller, 'add');
          this[_addGZipChunk](data, dart.bind(this[_gzipSink], 'add'));
          this[_gzipAdd] = null;
          return;
        }
        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
        this[_pendingChunkedFooter] = 2;
      } else {
        if (this.contentLength != null) {
          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
          if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
            controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
            return;
          }
        }
      }
      this[_addChunk$](data, dart.bind(controller, 'add'));
    }).bind(this);
    dart.fn(onData, dynamicTovoid$());
    sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
    if (!dart.test(this.headersWritten)) {
      let future = this.writeHeaders();
      if (future != null) {
        dart.dsend(sub, 'pause', future);
      }
    }
    return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
        if (dart.test(this[_gzip])) this[_gzipSink].close();
        this[_socketError] = true;
        this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
        if (dart.test(this[_ignoreError](error))) {
          return this.outbound;
        } else {
          dart.throw(error);
        }
      }, dynamicAnddynamicTo_HttpOutboundMessage())});
  }
  close() {
    if (this[_closeFuture] != null) return this[_closeFuture];
    if (dart.test(this[_socketError])) return async.Future.value(this.outbound);
    if (dart.test(this.outbound[_isConnectionClosed])) return async.Future.value(this.outbound);
    if (!dart.test(this.headersWritten) && !dart.test(this.ignoreBody)) {
      if (this.outbound.headers.contentLength == -1) {
        this.outbound.headers.chunkedTransferEncoding = false;
        this.outbound.headers.contentLength = 0;
      } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
        let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
        this[_doneCompleter].completeError(error);
        return this[_closeFuture] = async.Future.error(error);
      }
    }
    if (this.contentLength != null) {
      if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
        let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
        this[_doneCompleter].completeError(error);
        return this[_closeFuture] = async.Future.error(error);
      }
    }
    const finalize = (function() {
      if (dart.test(this.chunked)) {
        if (dart.test(this[_gzip])) {
          this[_gzipAdd] = dart.bind(this.socket, 'add');
          if (dart.notNull(this[_gzipBufferLength]) > 0) {
            this[_gzipSink].add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
          }
          this[_gzipBuffer] = null;
          this[_gzipSink].close();
          this[_gzipAdd] = null;
        }
        this[_addChunk$](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
      }
      if (dart.notNull(this[_length$2]) > 0) {
        this.socket.add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
      }
      this[_buffer$] = null;
      return this.socket.flush().then(io._HttpOutboundMessage)(dart.fn(_ => {
        this[_doneCompleter].complete(this.socket);
        return this.outbound;
      }, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
          this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
          if (dart.test(this[_ignoreError](error))) {
            return this.outbound;
          } else {
            dart.throw(error);
          }
        }, dynamicAnddynamicTo_HttpOutboundMessage())});
    }).bind(this);
    dart.fn(finalize, VoidToFuture());
    let future = this.writeHeaders();
    if (future != null) {
      return this[_closeFuture] = future.whenComplete(finalize);
    }
    return this[_closeFuture] = finalize();
  }
  get done() {
    return this[_doneCompleter].future;
  }
  setHeader(data, length) {
    dart.assert(this[_length$2] == 0);
    dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
    this[_buffer$] = typed_data.Uint8List._check(data);
    this[_length$2] = length;
  }
  set gzip(value) {
    this[_gzip] = value;
    if (dart.test(this[_gzip])) {
      this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      dart.assert(this[_gzipSink] == null);
      this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
        if (this[_gzipAdd] == null) return;
        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
        this[_pendingChunkedFooter] = 2;
        this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
      }, dynamicToNull$())));
    }
  }
  [_ignoreError](error) {
    return (io.SocketException.is(error) || io.TlsException.is(error)) && io.HttpResponse.is(this.outbound);
  }
  [_addGZipChunk](chunk, add) {
    if (!dart.test(this.outbound.bufferOutput)) {
      add(ListOfint()._check(chunk));
      return;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
      add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
      this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      this[_gzipBufferLength] = 0;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
      add(ListOfint()._check(chunk));
    } else {
      this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
    }
  }
  [_addChunk$](chunk, add) {
    if (!dart.test(this.outbound.bufferOutput)) {
      if (this[_buffer$] != null) {
        add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
        this[_buffer$] = null;
        this[_length$2] = 0;
      }
      add(ListOfint()._check(chunk));
      return;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
      add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
      this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      this[_length$2] = 0;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
      add(ListOfint()._check(chunk));
    } else {
      this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
    }
  }
  [_chunkHeader](length) {
    let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
    if (length == 0) {
      if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
      return io._HttpOutgoing._chunk0Length;
    }
    let size = this[_pendingChunkedFooter];
    let len = length;
    while (dart.notNull(len) > 0) {
      size = dart.notNull(size) + 1;
      len = len[dartx['>>']](4);
    }
    let footerAndHeader = typed_data.Uint8List.new(dart.notNull(size) + 2);
    if (this[_pendingChunkedFooter] == 2) {
      footerAndHeader[dartx._set](0, io._CharCode.CR);
      footerAndHeader[dartx._set](1, io._CharCode.LF);
    }
    let index = size;
    while (dart.notNull(index) > dart.notNull(this[_pendingChunkedFooter])) {
      footerAndHeader[dartx._set]((index = dart.notNull(index) - 1), hexDigits[dartx._get](dart.notNull(length) & 15));
      length = length[dartx['>>']](4);
    }
    footerAndHeader[dartx._set](dart.notNull(size) + 0, io._CharCode.CR);
    footerAndHeader[dartx._set](dart.notNull(size) + 1, io._CharCode.LF);
    return footerAndHeader;
  }
};
io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
dart.setSignature(io._HttpOutgoing, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpOutgoing, [io.Socket])}),
  fields: () => ({
    [_doneCompleter]: async.Completer,
    socket: io.Socket,
    ignoreBody: core.bool,
    headersWritten: core.bool,
    [_buffer$]: typed_data.Uint8List,
    [_length$2]: core.int,
    [_closeFuture]: async.Future,
    chunked: core.bool,
    [_pendingChunkedFooter]: core.int,
    contentLength: core.int,
    [_bytesWritten]: core.int,
    [_gzip]: core.bool,
    [_gzipSink]: convert.ByteConversionSink,
    [_gzipAdd]: core.Function,
    [_gzipBuffer]: typed_data.Uint8List,
    [_gzipBufferLength]: core.int,
    [_socketError]: core.bool,
    outbound: io._HttpOutboundMessage
  }),
  getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
  setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
  methods: () => ({
    writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
    close: dart.definiteFunctionType(async.Future, []),
    setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
    [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
    [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
    [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
  }),
  sfields: () => ({
    _footerAndChunk0Length: ListOfint(),
    _chunk0Length: ListOfint()
  })
});
dart.defineLazy(io._HttpOutgoing, {
  get _footerAndChunk0Length() {
    return dart.constList([io._CharCode.CR, io._CharCode.LF, 48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
  },
  get _chunk0Length() {
    return dart.constList([48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
  }
});
const _context = Symbol('_context');
const _httpParser = Symbol('_httpParser');
const _subscription$ = Symbol('_subscription');
const _dispose = Symbol('_dispose');
const _idleTimer = Symbol('_idleTimer');
const _currentUri = Symbol('_currentUri');
const _nextResponseCompleter = Symbol('_nextResponseCompleter');
const _streamFuture = Symbol('_streamFuture');
const _proxyCredentials = Symbol('_proxyCredentials');
const _returnConnection = Symbol('_returnConnection');
io._HttpClientConnection = class _HttpClientConnection extends core.Object {
  new(key, socket, httpClient, proxyTunnel, context) {
    if (proxyTunnel === void 0) proxyTunnel = false;
    if (context === void 0) context = null;
    this.key = key;
    this[_socket] = socket;
    this[_httpClient] = httpClient;
    this[_proxyTunnel] = proxyTunnel;
    this[_context] = context;
    this[_httpParser] = io._HttpParser.responseParser();
    this[_subscription$] = null;
    this[_dispose] = false;
    this[_idleTimer] = null;
    this.closed = false;
    this[_currentUri] = null;
    this[_nextResponseCompleter] = null;
    this[_streamFuture] = null;
    this[_httpParser].listenToStream(this[_socket]);
    this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
      this[_subscription$].pause();
      if (this[_nextResponseCompleter] == null) {
        dart.throw(new io.HttpException("Unexpected response (unsolicited response without request).", {uri: this[_currentUri]}));
      }
      if (incoming.statusCode == 100) {
        incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
          this[_subscription$].resume();
        }, dynamicToNull$())).catchError(dart.fn((error, stackTrace) => {
          if (stackTrace === void 0) stackTrace = null;
          this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
          this[_nextResponseCompleter] = null;
        }, dynamic__ToNull$()));
      } else {
        this[_nextResponseCompleter].complete(incoming);
        this[_nextResponseCompleter] = null;
      }
    }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
        if (stackTrace === void 0) stackTrace = null;
        if (this[_nextResponseCompleter] != null) {
          this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
          this[_nextResponseCompleter] = null;
        }
      }, dynamic__ToNull$()), onDone: dart.fn(() => {
        if (this[_nextResponseCompleter] != null) {
          this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
          this[_nextResponseCompleter] = null;
        }
        this.close();
      }, VoidToNull())});
  }
  send(uri, port, method, proxy) {
    if (dart.test(this.closed)) {
      dart.throw(new io.HttpException("Socket closed before request was sent", {uri: uri}));
    }
    this[_currentUri] = uri;
    this[_subscription$].pause();
    let proxyCreds = null;
    let creds = null;
    let outgoing = new io._HttpOutgoing(this[_socket]);
    let request = new io._HttpClientRequest(outgoing, uri, method, proxy, this[_httpClient], this);
    let host = uri.host;
    if (dart.test(host[dartx.contains](':'))) host = dart.str`[${host}]`;
    request.headers.host = host;
    request.headers.port = port;
    request.headers[_add$2](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
    if (this[_httpClient].userAgent != null) {
      request.headers[_add$2]('user-agent', this[_httpClient].userAgent);
    }
    if (dart.test(proxy.isAuthenticated)) {
      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
    } else if (!dart.test(proxy.isDirect) && dart.notNull(this[_httpClient][_proxyCredentials][dartx.length]) > 0) {
      proxyCreds = this[_httpClient][_findProxyCredentials](proxy);
      if (proxyCreds != null) {
        proxyCreds.authorize(request);
      }
    }
    if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
      request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
    } else {
      creds = this[_httpClient][_findCredentials](uri);
      if (creds != null) {
        creds.authorize(request);
      }
    }
    this[_httpParser].isHead = method == "HEAD";
    this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
      this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
      this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
        this[_currentUri] = null;
        incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
          if (dart.test(incoming.upgraded)) {
            this[_httpClient][_connectionClosed](this);
            this.startTimer();
            return;
          }
          if (dart.test(this.closed)) return;
          if (!dart.test(closing) && !dart.test(this[_dispose]) && dart.test(incoming.headers.persistentConnection) && dart.test(request.persistentConnection)) {
            this[_httpClient][_returnConnection](this);
            this[_subscription$].resume();
          } else {
            this.destroy();
          }
        }, dynamicToNull$()));
        if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
          let authInfo = incoming.headers._get("proxy-authentication-info");
          if (authInfo != null && authInfo[dartx.length] == 1) {
            let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
            let nextnonce = header.parameters[dartx._get]("nextnonce");
            if (nextnonce != null) proxyCreds.nonce = nextnonce;
          }
        }
        if (creds != null && dart.equals(creds.scheme, io._AuthenticationScheme.DIGEST)) {
          let authInfo = incoming.headers._get("authentication-info");
          if (authInfo != null && authInfo[dartx.length] == 1) {
            let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
            let nextnonce = header.parameters[dartx._get]("nextnonce");
            if (nextnonce != null) creds.nonce = nextnonce;
          }
        }
        request[_onIncoming](incoming);
      }, _HttpIncomingToNull())).catchError(dart.fn(error => {
        dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
      }, dynamicToNull$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
        this.destroy();
        request[_onError$](error, core.StackTrace._check(stackTrace));
      }, dynamicAnddynamicToNull()));
      this[_subscription$].resume();
      return s;
    }, dynamicTodynamic$()), {onError: dart.fn(e => {
        this.destroy();
      }, dynamicToNull$())});
    return request;
  }
  detachSocket() {
    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
  }
  destroy() {
    this.closed = true;
    this[_httpClient][_connectionClosed](this);
    this[_socket].destroy();
  }
  close() {
    this.closed = true;
    this[_httpClient][_connectionClosed](this);
    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
  }
  createProxyTunnel(host, port, proxy, callback) {
    let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
    if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
    }
    return request.close().then(io.SecureSocket)(dart.fn(response => {
      if (response.statusCode != io.HttpStatus.OK) {
        dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
      }
      let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
      return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
    }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
      let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
      return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
    }, SecureSocketTo_HttpClientConnection()));
  }
  get connectionInfo() {
    return io._HttpConnectionInfo.create(this[_socket]);
  }
  static makeKey(isSecure, host, port) {
    return dart.test(isSecure) ? dart.str`ssh:${host}:${port}` : dart.str`${host}:${port}`;
  }
  stopTimer() {
    if (this[_idleTimer] != null) {
      this[_idleTimer].cancel();
      this[_idleTimer] = null;
    }
  }
  startTimer() {
    dart.assert(this[_idleTimer] == null);
    this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
      this[_idleTimer] = null;
      this.close();
    }, VoidToNull()));
  }
};
dart.setSignature(io._HttpClientConnection, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientConnection, [core.String, io.Socket, io._HttpClient], [core.bool, io.SecurityContext])}),
  fields: () => ({
    key: core.String,
    [_socket]: io.Socket,
    [_proxyTunnel]: core.bool,
    [_context]: io.SecurityContext,
    [_httpParser]: io._HttpParser,
    [_subscription$]: async.StreamSubscription,
    [_httpClient]: io._HttpClient,
    [_dispose]: core.bool,
    [_idleTimer]: async.Timer,
    closed: core.bool,
    [_currentUri]: core.Uri,
    [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
    [_streamFuture]: async.Future
  }),
  getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
  methods: () => ({
    send: dart.definiteFunctionType(io._HttpClientRequest, [core.Uri, core.int, core.String, io._Proxy]),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
    destroy: dart.definiteFunctionType(dart.void, []),
    close: dart.definiteFunctionType(dart.void, []),
    createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    stopTimer: dart.definiteFunctionType(dart.void, []),
    startTimer: dart.definiteFunctionType(dart.void, [])
  }),
  statics: () => ({makeKey: dart.definiteFunctionType(dart.dynamic, [core.bool, core.String, core.int])}),
  names: ['makeKey']
});
io._ConnectionInfo = class _ConnectionInfo extends core.Object {
  new(connection, proxy) {
    this.connection = connection;
    this.proxy = proxy;
  }
};
dart.setSignature(io._ConnectionInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection, io._Proxy])}),
  fields: () => ({
    connection: io._HttpClientConnection,
    proxy: io._Proxy
  })
});
const _idle = Symbol('_idle');
const _active = Symbol('_active');
const _pending$ = Symbol('_pending');
const _connecting = Symbol('_connecting');
const _checkPending = Symbol('_checkPending');
const _connectionsChanged = Symbol('_connectionsChanged');
const _badCertificateCallback = Symbol('_badCertificateCallback');
const _getConnectionTarget = Symbol('_getConnectionTarget');
io._ConnectionTarget = class _ConnectionTarget extends core.Object {
  new(key, host, port, isSecure, context) {
    this[_idle] = HashSetOf_HttpClientConnection().new();
    this[_active] = HashSetOf_HttpClientConnection().new();
    this[_pending$] = new collection.ListQueue();
    this.key = key;
    this.host = host;
    this.port = port;
    this.isSecure = isSecure;
    this.context = context;
    this[_connecting] = 0;
  }
  get isEmpty() {
    return dart.test(this[_idle].isEmpty) && dart.test(this[_active].isEmpty) && this[_connecting] == 0;
  }
  get hasIdle() {
    return this[_idle].isNotEmpty;
  }
  get hasActive() {
    return dart.test(this[_active].isNotEmpty) || dart.notNull(this[_connecting]) > 0;
  }
  takeIdle() {
    dart.assert(this.hasIdle);
    let connection = this[_idle].first;
    this[_idle].remove(connection);
    connection.stopTimer();
    this[_active].add(connection);
    return connection;
  }
  [_checkPending]() {
    if (dart.test(this[_pending$].isNotEmpty)) {
      dart.dcall(this[_pending$].removeFirst());
    }
  }
  addNewActive(connection) {
    this[_active].add(connection);
  }
  returnConnection(connection) {
    dart.assert(this[_active].contains(connection));
    this[_active].remove(connection);
    this[_idle].add(connection);
    connection.startTimer();
    this[_checkPending]();
  }
  connectionClosed(connection) {
    dart.assert(!dart.test(this[_active].contains(connection)) || !dart.test(this[_idle].contains(connection)));
    this[_active].remove(connection);
    this[_idle].remove(connection);
    this[_checkPending]();
  }
  close(force) {
    for (let c of this[_idle].toList()) {
      c.close();
    }
    if (dart.test(force)) {
      for (let c of this[_active].toList()) {
        c.destroy();
      }
    }
  }
  connect(uriHost, uriPort, proxy, client) {
    if (dart.test(this.hasIdle)) {
      let connection = this.takeIdle();
      client[_connectionsChanged]();
      return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
    }
    if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
      let completer = async.Completer.new();
      this[_pending$].add(dart.fn(() => {
        this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
      }, VoidToNull()));
      return FutureOf_ConnectionInfo()._check(completer.future);
    }
    let currentBadCertificateCallback = client[_badCertificateCallback];
    function callback(certificate) {
      if (currentBadCertificateCallback == null) return false;
      return currentBadCertificateCallback(certificate, uriHost, uriPort);
    }
    dart.fn(callback, X509CertificateTobool$());
    let socketFuture = dart.test(this.isSecure) && dart.test(proxy.isDirect) ? io.SecureSocket.connect(this.host, this.port, {context: this.context, onBadCertificate: callback}) : io.Socket.connect(this.host, this.port);
    this[_connecting] = dart.notNull(this[_connecting]) + 1;
    return socketFuture.then(io._ConnectionInfo)(dart.fn(socket => {
      this[_connecting] = dart.notNull(this[_connecting]) - 1;
      dart.dsend(socket, 'setOption', io.SocketOption.TCP_NODELAY, true);
      let connection = new io._HttpClientConnection(this.key, io.Socket._check(socket), client, false, this.context);
      if (dart.test(this.isSecure) && !dart.test(proxy.isDirect)) {
        connection[_dispose] = true;
        return connection.createProxyTunnel(uriHost, uriPort, proxy, callback).then(io._ConnectionInfo)(dart.fn(tunnel => {
          client[_getConnectionTarget](uriHost, uriPort, true).addNewActive(tunnel);
          return new io._ConnectionInfo(tunnel, proxy);
        }, _HttpClientConnectionTo_ConnectionInfo()));
      } else {
        this.addNewActive(connection);
        return new io._ConnectionInfo(connection, proxy);
      }
    }, dynamicToFutureOrOf_ConnectionInfo()), {onError: dart.fn(error => {
        this[_connecting] = dart.notNull(this[_connecting]) - 1;
        this[_checkPending]();
        dart.throw(error);
      }, dynamicToNull$())});
  }
};
dart.setSignature(io._ConnectionTarget, {
  constructors: () => ({new: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.String, core.int, core.bool, io.SecurityContext])}),
  fields: () => ({
    key: core.String,
    host: core.String,
    port: core.int,
    isSecure: core.bool,
    context: io.SecurityContext,
    [_idle]: SetOf_HttpClientConnection(),
    [_active]: SetOf_HttpClientConnection(),
    [_pending$]: collection.Queue,
    [_connecting]: core.int
  }),
  getters: () => ({
    isEmpty: dart.definiteFunctionType(core.bool, []),
    hasIdle: dart.definiteFunctionType(core.bool, []),
    hasActive: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    takeIdle: dart.definiteFunctionType(io._HttpClientConnection, []),
    [_checkPending]: dart.definiteFunctionType(dart.dynamic, []),
    addNewActive: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    returnConnection: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    connectionClosed: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    close: dart.definiteFunctionType(dart.void, [core.bool]),
    connect: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._Proxy, io._HttpClient])
  })
});
io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
const _idleTimeout = Symbol('_idleTimeout');
let const$69;
const _connectionTargets = Symbol('_connectionTargets');
const _credentials = Symbol('_credentials');
const _closing = Symbol('_closing');
const _closingForcefully = Symbol('_closingForcefully');
const _findProxy = Symbol('_findProxy');
const _openUrl = Symbol('_openUrl');
const _closeConnections = Symbol('_closeConnections');
let const$70;
const _getConnection = Symbol('_getConnection');
io._HttpClient = class _HttpClient extends core.Object {
  get idleTimeout() {
    return this[_idleTimeout];
  }
  new(context) {
    this[_connectionTargets] = HashMapOfString$_ConnectionTarget().new();
    this[_credentials] = JSArrayOf_Credentials().of([]);
    this[_proxyCredentials] = JSArrayOf_ProxyCredentials().of([]);
    this.userAgent = io._getHttpVersion();
    this[_context] = context;
    this[_closing] = false;
    this[_closingForcefully] = false;
    this[_authenticate] = null;
    this[_authenticateProxy] = null;
    this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
    this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
    this[_badCertificateCallback] = null;
    this.maxConnectionsPerHost = null;
    this.autoUncompress = true;
  }
  set idleTimeout(timeout) {
    this[_idleTimeout] = timeout;
    for (let c of this[_connectionTargets][dartx.values]) {
      for (let idle of c[_idle]) {
        idle.stopTimer();
        idle.startTimer();
      }
    }
  }
  set badCertificateCallback(callback) {
    this[_badCertificateCallback] = callback;
  }
  open(method, host, port, path) {
    let hashMark = 35;
    let questionMark = 63;
    let fragmentStart = path[dartx.length];
    let queryStart = path[dartx.length];
    for (let i = dart.notNull(path[dartx.length]) - 1; i >= 0; i--) {
      let char = path[dartx.codeUnitAt](i);
      if (char == hashMark) {
        fragmentStart = i;
        queryStart = i;
      } else if (char == questionMark) {
        queryStart = i;
      }
    }
    let query = null;
    if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
      query = path[dartx.substring](dart.notNull(queryStart) + 1, fragmentStart);
      path = path[dartx.substring](0, queryStart);
    }
    let uri = core.Uri.new({scheme: "http", host: host, port: port, path: path, query: query});
    return this[_openUrl](method, uri);
  }
  openUrl(method, url) {
    return this[_openUrl](method, url);
  }
  get(host, port, path) {
    return this.open("get", host, port, path);
  }
  getUrl(url) {
    return this[_openUrl]("get", url);
  }
  post(host, port, path) {
    return this.open("post", host, port, path);
  }
  postUrl(url) {
    return this[_openUrl]("post", url);
  }
  put(host, port, path) {
    return this.open("put", host, port, path);
  }
  putUrl(url) {
    return this[_openUrl]("put", url);
  }
  delete(host, port, path) {
    return this.open("delete", host, port, path);
  }
  deleteUrl(url) {
    return this[_openUrl]("delete", url);
  }
  head(host, port, path) {
    return this.open("head", host, port, path);
  }
  headUrl(url) {
    return this[_openUrl]("head", url);
  }
  patch(host, port, path) {
    return this.open("patch", host, port, path);
  }
  patchUrl(url) {
    return this[_openUrl]("patch", url);
  }
  close(opts) {
    let force = opts && 'force' in opts ? opts.force : false;
    this[_closing] = true;
    this[_closingForcefully] = force;
    this[_closeConnections](this[_closingForcefully]);
    dart.assert(!dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s.hasIdle, _ConnectionTargetTobool()))));
    dart.assert(!dart.test(force) || !dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s[_active].isNotEmpty, _ConnectionTargetTobool()))));
  }
  set authenticate(f) {
    this[_authenticate] = f;
  }
  addCredentials(url, realm, cr) {
    this[_credentials][dartx.add](new io._SiteCredentials(url, realm, io._HttpClientCredentials._check(cr)));
  }
  set authenticateProxy(f) {
    this[_authenticateProxy] = f;
  }
  addProxyCredentials(host, port, realm, cr) {
    this[_proxyCredentials][dartx.add](new io._ProxyCredentials(host, port, realm, io._HttpClientCredentials._check(cr)));
  }
  set findProxy(f) {
    return this[_findProxy] = f;
  }
  [_openUrl](method, uri) {
    uri = uri.removeFragment();
    if (method == null) {
      dart.throw(new core.ArgumentError(method));
    }
    if (method != "CONNECT") {
      if (dart.test(uri.host[dartx.isEmpty])) {
        dart.throw(new core.ArgumentError(dart.str`No host specified in URI ${uri}`));
      } else if (uri.scheme != "http" && uri.scheme != "https") {
        dart.throw(new core.ArgumentError(dart.str`Unsupported scheme '${uri.scheme}' in URI ${uri}`));
      }
    }
    let isSecure = uri.scheme == "https";
    let port = uri.port;
    if (port == 0) {
      port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
    }
    let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
    if (this[_findProxy] != null) {
      try {
        proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
      } catch (error) {
        let stackTrace = dart.stackTrace(error);
        return FutureOf_HttpClientRequest().error(error, stackTrace);
      }

    }
    return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(dart.fn(info => {
      function send(info) {
        return info.connection.send(uri, port, method[dartx.toUpperCase](), info.proxy);
      }
      dart.fn(send, _ConnectionInfoTo_HttpClientRequest());
      if (dart.test(info.connection.closed)) {
        return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(send);
      }
      return send(info);
    }, _ConnectionInfoToFutureOrOf_HttpClientRequest()));
  }
  [_openUrlFromRequest](method, uri, previous) {
    let resolved = previous.uri.resolveUri(uri);
    return this[_openUrl](method, resolved).then(io._HttpClientRequest)(dart.fn(request => {
      request.followRedirects = previous.followRedirects;
      request.maxRedirects = previous.maxRedirects;
      for (let header of previous.headers[_headers][dartx.keys]) {
        if (request.headers._get(header) == null) {
          request.headers.set(header, previous.headers._get(header));
        }
      }
      request.headers.chunkedTransferEncoding = false;
      request.contentLength = 0;
      return request;
    }, _HttpClientRequestTo_HttpClientRequest()));
  }
  [_returnConnection](connection) {
    this[_connectionTargets][dartx._get](connection.key).returnConnection(connection);
    this[_connectionsChanged]();
  }
  [_connectionClosed](connection) {
    connection.stopTimer();
    let connectionTarget = this[_connectionTargets][dartx._get](connection.key);
    if (connectionTarget != null) {
      connectionTarget.connectionClosed(connection);
      if (dart.test(connectionTarget.isEmpty)) {
        this[_connectionTargets][dartx.remove](connection.key);
      }
      this[_connectionsChanged]();
    }
  }
  [_connectionsChanged]() {
    if (dart.test(this[_closing])) {
      this[_closeConnections](this[_closingForcefully]);
    }
  }
  [_closeConnections](force) {
    for (let connectionTarget of this[_connectionTargets][dartx.values][dartx.toList]()) {
      connectionTarget.close(force);
    }
  }
  [_getConnectionTarget](host, port, isSecure) {
    let key = core.String._check(io._HttpClientConnection.makeKey(isSecure, host, port));
    return this[_connectionTargets][dartx.putIfAbsent](key, dart.fn(() => new io._ConnectionTarget(key, host, port, isSecure, this[_context]), VoidTo_ConnectionTarget()));
  }
  [_getConnection](uriHost, uriPort, proxyConf, isSecure) {
    let proxies = proxyConf.proxies[dartx.iterator];
    const connect = (function(error) {
      if (!dart.test(proxies.moveNext())) return FutureOf_ConnectionInfo().error(error);
      let proxy = proxies.current;
      let host = dart.test(proxy.isDirect) ? uriHost : proxy.host;
      let port = dart.test(proxy.isDirect) ? uriPort : proxy.port;
      return this[_getConnectionTarget](host, port, isSecure).connect(uriHost, uriPort, proxy, this).catchError(connect);
    }).bind(this);
    dart.fn(connect, dynamicToFutureOf_ConnectionInfo());
    return FutureOf_ConnectionInfo().new(dart.fn(() => connect(new io.HttpException("No proxies given")), VoidToFutureOf_ConnectionInfo()));
  }
  [_findCredentials](url, scheme) {
    if (scheme === void 0) scheme = null;
    let cr = this[_credentials][dartx.fold](io._SiteCredentials)(null, dart.fn((prev, value) => {
      let siteCredentials = io._SiteCredentials.as(value);
      if (dart.test(siteCredentials.applies(url, scheme))) {
        if (prev == null) return io._SiteCredentials._check(value);
        return dart.notNull(siteCredentials.uri.path[dartx.length]) > dart.notNull(prev.uri.path[dartx.length]) ? siteCredentials : prev;
      } else {
        return prev;
      }
    }, _SiteCredentialsAnd_CredentialsTo_SiteCredentials()));
    return cr;
  }
  [_findProxyCredentials](proxy, scheme) {
    if (scheme === void 0) scheme = null;
    let it = this[_proxyCredentials][dartx.iterator];
    while (dart.test(it.moveNext())) {
      if (dart.test(it.current.applies(proxy, scheme))) {
        return it.current;
      }
    }
    return null;
  }
  [_removeCredentials](cr) {
    let index = this[_credentials][dartx.indexOf](cr);
    if (index != -1) {
      this[_credentials][dartx.removeAt](index);
    }
  }
  [_removeProxyCredentials](cr) {
    let index = this[_proxyCredentials][dartx.indexOf](io._ProxyCredentials._check(cr));
    if (index != -1) {
      this[_proxyCredentials][dartx.removeAt](index);
    }
  }
  static _findProxyFromEnvironment(url, environment) {
    function checkNoProxy(option) {
      if (option == null) return null;
      let names = option[dartx.split](",")[dartx.map](core.String)(dart.fn(s => s[dartx.trim](), StringToString$()))[dartx.iterator];
      while (dart.test(names.moveNext())) {
        let name = names.current;
        if (dart.test(name[dartx.startsWith]("[")) && dart.test(name[dartx.endsWith]("]")) && dart.str`[${url.host}]` == name || dart.test(name[dartx.isNotEmpty]) && dart.test(url.host[dartx.endsWith](name))) {
          return "DIRECT";
        }
      }
      return null;
    }
    dart.fn(checkNoProxy, StringToString$());
    function checkProxy(option) {
      if (option == null) return null;
      option = option[dartx.trim]();
      if (dart.test(option[dartx.isEmpty])) return null;
      let pos = option[dartx.indexOf]("://");
      if (dart.notNull(pos) >= 0) {
        option = option[dartx.substring](dart.notNull(pos) + 3);
      }
      pos = option[dartx.indexOf]("/");
      if (dart.notNull(pos) >= 0) {
        option = option[dartx.substring](0, pos);
      }
      if (option[dartx.indexOf]("[") == 0) {
        let pos = option[dartx.lastIndexOf](":");
        if (dart.notNull(option[dartx.indexOf]("]")) > dart.notNull(pos)) option = dart.str`${option}:1080`;
      } else {
        if (option[dartx.indexOf](":") == -1) option = dart.str`${option}:1080`;
      }
      return dart.str`PROXY ${option}`;
    }
    dart.fn(checkProxy, StringToString$());
    if (environment == null) environment = io._HttpClient._platformEnvironmentCache;
    let proxyCfg = null;
    let noProxy = environment[dartx._get]("no_proxy");
    if (noProxy == null) noProxy = environment[dartx._get]("NO_PROXY");
    if ((proxyCfg = checkNoProxy(noProxy)) != null) {
      return proxyCfg;
    }
    if (url.scheme == "http") {
      let proxy = environment[dartx._get]("http_proxy");
      if (proxy == null) proxy = environment[dartx._get]("HTTP_PROXY");
      if ((proxyCfg = checkProxy(proxy)) != null) {
        return proxyCfg;
      }
    } else if (url.scheme == "https") {
      let proxy = environment[dartx._get]("https_proxy");
      if (proxy == null) proxy = environment[dartx._get]("HTTPS_PROXY");
      if ((proxyCfg = checkProxy(proxy)) != null) {
        return proxyCfg;
      }
    }
    return "DIRECT";
  }
};
io._HttpClient[dart.implements] = () => [io.HttpClient];
dart.setSignature(io._HttpClient, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClient, [io.SecurityContext])}),
  fields: () => ({
    [_closing]: core.bool,
    [_closingForcefully]: core.bool,
    [_connectionTargets]: MapOfString$_ConnectionTarget(),
    [_credentials]: ListOf_Credentials(),
    [_proxyCredentials]: ListOf_ProxyCredentials(),
    [_context]: io.SecurityContext,
    [_authenticate]: core.Function,
    [_authenticateProxy]: core.Function,
    [_findProxy]: core.Function,
    [_idleTimeout]: core.Duration,
    [_badCertificateCallback]: io.BadCertificateCallback,
    maxConnectionsPerHost: core.int,
    autoUncompress: core.bool,
    userAgent: core.String
  }),
  getters: () => ({idleTimeout: dart.definiteFunctionType(core.Duration, [])}),
  setters: () => ({
    idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
    badCertificateCallback: dart.definiteFunctionType(dart.void, [X509CertificateAndStringAndintTobool()]),
    authenticate: dart.definiteFunctionType(dart.void, [UriAndStringAndStringToFutureOfbool()]),
    authenticateProxy: dart.definiteFunctionType(dart.void, [StringAndintAndString__ToFutureOfbool()]),
    findProxy: dart.definiteFunctionType(dart.void, [UriToString()])
  }),
  methods: () => ({
    open: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.String, core.int, core.String]),
    openUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.Uri]),
    get: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    getUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    post: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    postUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    put: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    putUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    delete: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    deleteUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    head: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    headUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    patch: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    patchUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    close: dart.definiteFunctionType(dart.void, [], {force: core.bool}),
    addCredentials: dart.definiteFunctionType(dart.void, [core.Uri, core.String, io.HttpClientCredentials]),
    addProxyCredentials: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String, io.HttpClientCredentials]),
    [_openUrl]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri]),
    [_openUrlFromRequest]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri, io._HttpClientRequest]),
    [_returnConnection]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    [_connectionsChanged]: dart.definiteFunctionType(dart.void, []),
    [_closeConnections]: dart.definiteFunctionType(dart.void, [core.bool]),
    [_getConnectionTarget]: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.int, core.bool]),
    [_getConnection]: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._ProxyConfiguration, core.bool]),
    [_findCredentials]: dart.definiteFunctionType(io._SiteCredentials, [core.Uri], [io._AuthenticationScheme]),
    [_findProxyCredentials]: dart.definiteFunctionType(io._ProxyCredentials, [io._Proxy], [io._AuthenticationScheme]),
    [_removeCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials]),
    [_removeProxyCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials])
  }),
  sfields: () => ({_platformEnvironmentCache: MapOfString$String()}),
  statics: () => ({_findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri, MapOfString$String()])}),
  names: ['_findProxyFromEnvironment']
});
dart.defineLazy(io._HttpClient, {
  get _platformEnvironmentCache() {
    return io.Platform.environment;
  },
  set _platformEnvironmentCache(_) {}
});
const _state$1 = Symbol('_state');
const _idleMark = Symbol('_idleMark');
const _owner = Symbol('_owner');
const _serviceId = Symbol('_serviceId');
const _markActive = Symbol('_markActive');
const _markIdle = Symbol('_markIdle');
const _handleRequest = Symbol('_handleRequest');
const _isActive = Symbol('_isActive');
const _isIdle = Symbol('_isIdle');
const _isDetached = Symbol('_isDetached');
const _serviceTypePath = Symbol('_serviceTypePath');
const _serviceTypeName = Symbol('_serviceTypeName');
const _servicePath = Symbol('_servicePath');
const _serviceType = Symbol('_serviceType');
const _toJSON$ = Symbol('_toJSON');
const __serviceId = Symbol('__serviceId');
io._ServiceObject = class _ServiceObject extends core.Object {
  new() {
    this[__serviceId] = 0;
  }
  get [_serviceId]() {
    if (this[__serviceId] == 0) this[__serviceId] = (() => {
      let x = io._nextServiceId;
      io._nextServiceId = dart.notNull(x) + 1;
      return x;
    })();
    return this[__serviceId];
  }
  get [_servicePath]() {
    return dart.str`${this[_serviceTypePath]}/${this[_serviceId]}`;
  }
  [_serviceType](ref) {
    if (dart.test(ref)) return dart.str`@${this[_serviceTypeName]}`;
    return this[_serviceTypeName];
  }
};
dart.setSignature(io._ServiceObject, {
  fields: () => ({[__serviceId]: core.int}),
  getters: () => ({
    [_serviceId]: dart.definiteFunctionType(core.int, []),
    [_servicePath]: dart.definiteFunctionType(core.String, [])
  }),
  methods: () => ({[_serviceType]: dart.definiteFunctionType(core.String, [core.bool])})
});
io._HttpConnection = class _HttpConnection extends dart.mixin(collection.LinkedListEntry, io._ServiceObject) {
  new(socket, httpServer) {
    this[_socket] = socket;
    this[_httpServer] = httpServer;
    this[_httpParser] = io._HttpParser.requestParser();
    this[_state$1] = io._HttpConnection._IDLE;
    this[_subscription$] = null;
    this[_idleMark] = false;
    this[_streamFuture] = null;
    super.new();
    try {
      dart.dput(this[_socket], _owner, this);
    } catch (_) {
      core.print(_);
    }

    io._HttpConnection._connections[dartx._set](this[_serviceId], this);
    this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
    this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
      this[_httpServer][_markActive](this);
      incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
        if (dart.test(closing)) this.destroy();
      }, dynamicToNull$()));
      this[_subscription$].pause();
      this[_state$1] = io._HttpConnection._ACTIVE;
      let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
      let response = new io._HttpResponse(incoming.uri, incoming.headers.protocolVersion, outgoing, this[_httpServer].defaultResponseHeaders, this[_httpServer].serverHeader);
      let request = new io._HttpRequest(response, incoming, this[_httpServer], this);
      this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(_ => {
        response.deadline = null;
        if (this[_state$1] == io._HttpConnection._DETACHED) return;
        if (dart.test(response.persistentConnection) && dart.test(request.persistentConnection) && dart.test(incoming.fullBodyRead) && !dart.test(this[_httpParser].upgrade) && !dart.test(this[_httpServer].closed)) {
          this[_state$1] = io._HttpConnection._IDLE;
          this[_idleMark] = false;
          this[_httpServer][_markIdle](this);
          this[_subscription$].resume();
        } else {
          this.destroy();
        }
      }, dynamicToNull$()), {onError: dart.fn(_ => {
          this.destroy();
        }, dynamicToNull$())});
      outgoing.ignoreBody = request.method == "HEAD";
      response[_httpRequest] = request;
      this[_httpServer][_handleRequest](request);
    }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
        this.destroy();
      }, VoidToNull()), onError: dart.fn(error => {
        this.destroy();
      }, dynamicToNull$())});
  }
  markIdle() {
    this[_idleMark] = true;
  }
  get isMarkedIdle() {
    return this[_idleMark];
  }
  destroy() {
    if (this[_state$1] == io._HttpConnection._CLOSING || this[_state$1] == io._HttpConnection._DETACHED) return;
    this[_state$1] = io._HttpConnection._CLOSING;
    dart.dsend(this[_socket], 'destroy');
    this[_httpServer][_connectionClosed](this);
    io._HttpConnection._connections[dartx.remove](this[_serviceId]);
  }
  detachSocket() {
    this[_state$1] = io._HttpConnection._DETACHED;
    this[_httpServer][_connectionClosed](this);
    let detachedIncoming = this[_httpParser].detachIncoming();
    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
      io._HttpConnection._connections[dartx.remove](this[_serviceId]);
      return new io._DetachedSocket(this[_socket], detachedIncoming);
    }, dynamicTo_DetachedSocket()));
  }
  get connectionInfo() {
    return io._HttpConnectionInfo.create(io.Socket._check(this[_socket]));
  }
  get [_isActive]() {
    return this[_state$1] == io._HttpConnection._ACTIVE;
  }
  get [_isIdle]() {
    return this[_state$1] == io._HttpConnection._IDLE;
  }
  get [_isClosing]() {
    return this[_state$1] == io._HttpConnection._CLOSING;
  }
  get [_isDetached]() {
    return this[_state$1] == io._HttpConnection._DETACHED;
  }
  get [_serviceTypePath]() {
    return 'io/http/serverconnections';
  }
  get [_serviceTypeName]() {
    return 'HttpServerConnection';
  }
  [_toJSON$](ref) {
    let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')} <-> ` + dart.str`${dart.dload(dart.dload(this[_socket], 'remoteAddress'), 'host')}:${dart.dload(this[_socket], 'remotePort')}`;
    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
    if (dart.test(ref)) {
      return r;
    }
    r[dartx._set]('server', this[_httpServer][_toJSON$](true));
    try {
      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
    } catch (_) {
      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
    }

    switch (this[_state$1]) {
      case io._HttpConnection._ACTIVE:
      {
        r[dartx._set]('state', "Active");
        break;
      }
      case io._HttpConnection._IDLE:
      {
        r[dartx._set]('state', "Idle");
        break;
      }
      case io._HttpConnection._CLOSING:
      {
        r[dartx._set]('state', "Closing");
        break;
      }
      case io._HttpConnection._DETACHED:
      {
        r[dartx._set]('state', "Detached");
        break;
      }
      default:
      {
        r[dartx._set]('state', 'Unknown');
        break;
      }
    }
    return r;
  }
};
dart.setBaseClass(io._HttpConnection, dart.mixin(collection.LinkedListEntry$(io._HttpConnection), io._ServiceObject));
dart.addSimpleTypeTests(io._HttpConnection);
dart.setSignature(io._HttpConnection, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpConnection, [dart.dynamic, io._HttpServer])}),
  fields: () => ({
    [_socket]: dart.dynamic,
    [_httpServer]: io._HttpServer,
    [_httpParser]: io._HttpParser,
    [_state$1]: core.int,
    [_subscription$]: async.StreamSubscription,
    [_idleMark]: core.bool,
    [_streamFuture]: async.Future
  }),
  getters: () => ({
    isMarkedIdle: dart.definiteFunctionType(core.bool, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    [_isActive]: dart.definiteFunctionType(core.bool, []),
    [_isIdle]: dart.definiteFunctionType(core.bool, []),
    [_isClosing]: dart.definiteFunctionType(core.bool, []),
    [_isDetached]: dart.definiteFunctionType(core.bool, []),
    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
  }),
  methods: () => ({
    markIdle: dart.definiteFunctionType(dart.void, []),
    destroy: dart.definiteFunctionType(dart.void, []),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
    [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
  }),
  sfields: () => ({
    _ACTIVE: core.int,
    _IDLE: core.int,
    _CLOSING: core.int,
    _DETACHED: core.int,
    _connections: MapOfint$_HttpConnection()
  })
});
io._HttpConnection._ACTIVE = 0;
io._HttpConnection._IDLE = 1;
io._HttpConnection._CLOSING = 2;
io._HttpConnection._DETACHED = 3;
dart.defineLazy(io._HttpConnection, {
  get _connections() {
    return HashMapOfint$_HttpConnection().new();
  },
  set _connections(_) {}
});
const _activeConnections = Symbol('_activeConnections');
const _idleConnections = Symbol('_idleConnections');
const _serverSocket = Symbol('_serverSocket');
const _closeServer = Symbol('_closeServer');
let const$71;
let const$72;
io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
  static bind(address, port, backlog, v6Only, shared) {
    return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
  }
  static bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared) {
    return io.SecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), SecureServerSocketTo_HttpServer()));
  }
  _(serverSocket, closeServer) {
    this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
    this[_activeConnections] = new (LinkedListOf_HttpConnection())();
    this[_idleConnections] = new (LinkedListOf_HttpConnection())();
    this[_serverSocket] = serverSocket;
    this[_closeServer] = closeServer;
    this.serverHeader = null;
    this.autoCompress = false;
    this[_idleTimeout] = null;
    this[_idleTimer] = null;
    this[_sessionManagerInstance] = null;
    this.closed = false;
    this[_controller$0] = null;
    super.new();
    this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
    this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
    io._HttpServer._servers[dartx._set](this[_serviceId], this);
    dart.dput(this[_serverSocket], _owner, this);
  }
  listenOn(serverSocket) {
    this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
    this[_activeConnections] = new (LinkedListOf_HttpConnection())();
    this[_idleConnections] = new (LinkedListOf_HttpConnection())();
    this[_serverSocket] = serverSocket;
    this[_closeServer] = false;
    this.serverHeader = null;
    this.autoCompress = false;
    this[_idleTimeout] = null;
    this[_idleTimer] = null;
    this[_sessionManagerInstance] = null;
    this.closed = false;
    this[_controller$0] = null;
    super.new();
    this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
    this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
    io._HttpServer._servers[dartx._set](this[_serviceId], this);
    try {
      dart.dput(this[_serverSocket], _owner, this);
    } catch (_) {
    }

  }
  static _initDefaultResponseHeaders() {
    let defaultResponseHeaders = new io._HttpHeaders('1.1');
    defaultResponseHeaders.contentType = io.ContentType.TEXT;
    defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN');
    defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff');
    defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block');
    return defaultResponseHeaders;
  }
  get idleTimeout() {
    return this[_idleTimeout];
  }
  set idleTimeout(duration) {
    if (this[_idleTimer] != null) {
      this[_idleTimer].cancel();
      this[_idleTimer] = null;
    }
    this[_idleTimeout] = duration;
    if (this[_idleTimeout] != null) {
      this[_idleTimer] = async.Timer.periodic(this[_idleTimeout], dart.fn(_ => {
        for (let idle of this[_idleConnections].toList()) {
          if (dart.test(idle.isMarkedIdle)) {
            idle.destroy();
          } else {
            idle.markIdle();
          }
        }
      }, TimerToNull()));
    }
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    dart.dsend(this[_serverSocket], 'listen', dart.fn(socket => {
      socket.setOption(io.SocketOption.TCP_NODELAY, true);
      let connection = new io._HttpConnection(socket, this);
      this[_idleConnections].add(connection);
    }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
        if (!io.HandshakeException.is(error)) {
          this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
        }
      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$0], 'close')});
    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  close(opts) {
    let force = opts && 'force' in opts ? opts.force : false;
    this.closed = true;
    let result = null;
    if (this[_serverSocket] != null && dart.test(this[_closeServer])) {
      result = async.Future._check(dart.dsend(this[_serverSocket], 'close'));
    } else {
      result = async.Future.value();
    }
    this.idleTimeout = null;
    if (dart.test(force)) {
      for (let c of this[_activeConnections].toList()) {
        c.destroy();
      }
      dart.assert(this[_activeConnections].isEmpty);
    }
    for (let c of this[_idleConnections].toList()) {
      c.destroy();
    }
    this[_maybePerformCleanup]();
    return result;
  }
  [_maybePerformCleanup]() {
    if (dart.test(this.closed) && dart.test(this[_idleConnections].isEmpty) && dart.test(this[_activeConnections].isEmpty) && this[_sessionManagerInstance] != null) {
      this[_sessionManagerInstance].close();
      this[_sessionManagerInstance] = null;
      io._HttpServer._servers[dartx.remove](this[_serviceId]);
    }
  }
  get port() {
    if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
    return core.int._check(dart.dload(this[_serverSocket], 'port'));
  }
  get address() {
    if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
    return io.InternetAddress._check(dart.dload(this[_serverSocket], 'address'));
  }
  set sessionTimeout(timeout) {
    this[_sessionManager].sessionTimeout = timeout;
  }
  [_handleRequest](request) {
    if (!dart.test(this.closed)) {
      this[_controller$0].add(request);
    } else {
      request[_httpConnection].destroy();
    }
  }
  [_connectionClosed](connection) {
    connection.unlink();
    this[_maybePerformCleanup]();
  }
  [_markIdle](connection) {
    this[_activeConnections].remove(connection);
    this[_idleConnections].add(connection);
  }
  [_markActive](connection) {
    this[_idleConnections].remove(connection);
    this[_activeConnections].add(connection);
  }
  get [_sessionManager]() {
    if (this[_sessionManagerInstance] == null) {
      this[_sessionManagerInstance] = new io._HttpSessionManager();
    }
    return this[_sessionManagerInstance];
  }
  connectionsInfo() {
    let result = new io.HttpConnectionsInfo();
    result.total = dart.notNull(this[_activeConnections].length) + dart.notNull(this[_idleConnections].length);
    this[_activeConnections].forEach(dart.fn(conn => {
      if (dart.test(conn[_isActive])) {
        result.active = dart.notNull(result.active) + 1;
      } else {
        dart.assert(conn[_isClosing]);
        result.closing = dart.notNull(result.closing) + 1;
      }
    }, _HttpConnectionToNull()));
    this[_idleConnections].forEach(dart.fn(conn => {
      result.idle = dart.notNull(result.idle) + 1;
      dart.assert(conn[_isIdle]);
    }, _HttpConnectionToNull()));
    return result;
  }
  get [_serviceTypePath]() {
    return 'io/http/servers';
  }
  get [_serviceTypeName]() {
    return 'HttpServer';
  }
  [_toJSON$](ref) {
    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: dart.str`${this.address.host}:${this.port}`, user_name: dart.str`${this.address.host}:${this.port}`}, core.String, dart.dynamic);
    if (dart.test(ref)) {
      return r;
    }
    try {
      r[dartx._set]('socket', dart.dsend(this[_serverSocket], _toJSON$, true));
    } catch (_) {
      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
    }

    r[dartx._set]('port', this.port);
    r[dartx._set]('address', this.address.host);
    r[dartx._set]('active', this[_activeConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
    r[dartx._set]('idle', this[_idleConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
    r[dartx._set]('closed', this.closed);
    return r;
  }
};
dart.addSimpleTypeTests(io._HttpServer);
dart.defineNamedConstructor(io._HttpServer, '_');
dart.defineNamedConstructor(io._HttpServer, 'listenOn');
io._HttpServer[dart.implements] = () => [io.HttpServer];
dart.setSignature(io._HttpServer, {
  constructors: () => ({
    _: dart.definiteFunctionType(io._HttpServer, [dart.dynamic, core.bool]),
    listenOn: dart.definiteFunctionType(io._HttpServer, [dart.dynamic])
  }),
  fields: () => ({
    serverHeader: core.String,
    defaultResponseHeaders: io.HttpHeaders,
    autoCompress: core.bool,
    [_idleTimeout]: core.Duration,
    [_idleTimer]: async.Timer,
    [_sessionManagerInstance]: io._HttpSessionManager,
    closed: core.bool,
    [_serverSocket]: dart.dynamic,
    [_closeServer]: core.bool,
    [_activeConnections]: LinkedListOf_HttpConnection(),
    [_idleConnections]: LinkedListOf_HttpConnection(),
    [_controller$0]: StreamControllerOfHttpRequest()
  }),
  getters: () => ({
    idleTimeout: dart.definiteFunctionType(core.Duration, []),
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, []),
    [_sessionManager]: dart.definiteFunctionType(io._HttpSessionManager, []),
    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({
    idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
    sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.HttpRequest), [HttpRequestTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(async.Future, [], {force: core.bool}),
    [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
    [_handleRequest]: dart.definiteFunctionType(dart.void, [io._HttpRequest]),
    [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
    [_markIdle]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
    [_markActive]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
    connectionsInfo: dart.definiteFunctionType(io.HttpConnectionsInfo, []),
    [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
  }),
  sfields: () => ({_servers: MapOfint$_HttpServer()}),
  statics: () => ({
    bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, core.int, core.bool, core.bool]),
    bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext, core.int, core.bool, core.bool, core.bool]),
    _initDefaultResponseHeaders: dart.definiteFunctionType(io.HttpHeaders, [])
  }),
  names: ['bind', 'bindSecure', '_initDefaultResponseHeaders']
});
dart.defineLazy(io._HttpServer, {
  get _servers() {
    return MapOfint$_HttpServer().new();
  },
  set _servers(_) {}
});
io._Proxy = class _Proxy extends core.Object {
  new(host, port, username, password) {
    this.host = host;
    this.port = port;
    this.username = username;
    this.password = password;
    this.isDirect = false;
  }
  direct() {
    this.host = null;
    this.port = null;
    this.username = null;
    this.password = null;
    this.isDirect = true;
  }
  get isAuthenticated() {
    return this.username != null;
  }
};
dart.defineNamedConstructor(io._Proxy, 'direct');
dart.setSignature(io._Proxy, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._Proxy, [core.String, core.int, core.String, core.String]),
    direct: dart.definiteFunctionType(io._Proxy, [])
  }),
  fields: () => ({
    host: core.String,
    port: core.int,
    username: core.String,
    password: core.String,
    isDirect: core.bool
  }),
  getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
});
let const$73;
let const$74;
io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
  new(configuration) {
    this.proxies = ListOf_Proxy().new();
    if (configuration == null) {
      dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
    }
    let list = configuration[dartx.split](";");
    list[dartx.forEach](dart.fn(proxy => {
      proxy = proxy[dartx.trim]();
      if (!dart.test(proxy[dartx.isEmpty])) {
        if (dart.test(proxy[dartx.startsWith](io._ProxyConfiguration.PROXY_PREFIX))) {
          let username = null;
          let password = null;
          proxy = proxy[dartx.substring](io._ProxyConfiguration.PROXY_PREFIX[dartx.length])[dartx.trim]();
          let at = proxy[dartx.indexOf]("@");
          if (at != -1) {
            let userinfo = proxy[dartx.substring](0, at)[dartx.trim]();
            proxy = proxy[dartx.substring](dart.notNull(at) + 1)[dartx.trim]();
            let colon = userinfo[dartx.indexOf](":");
            if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
            }
            username = userinfo[dartx.substring](0, colon)[dartx.trim]();
            password = userinfo[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
          }
          let colon = proxy[dartx.lastIndexOf](":");
          if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
            dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
          }
          let host = proxy[dartx.substring](0, colon)[dartx.trim]();
          if (dart.test(host[dartx.startsWith]("[")) && dart.test(host[dartx.endsWith]("]"))) {
            host = host[dartx.substring](1, dart.notNull(host[dartx.length]) - 1);
          }
          let portString = proxy[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
          let port = null;
          try {
            port = core.int.parse(portString);
          } catch (e) {
            if (core.FormatException.is(e)) {
              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}, ` + dart.str`invalid port '${portString}'`));
            } else
              throw e;
          }

          this.proxies[dartx.add](new io._Proxy(host, port, username, password));
        } else if (proxy[dartx.trim]() == io._ProxyConfiguration.DIRECT_PREFIX) {
          this.proxies[dartx.add](new io._Proxy.direct());
        } else {
          dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
        }
      }
    }, StringToNull()));
  }
  direct() {
    this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
  }
};
dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
dart.setSignature(io._ProxyConfiguration, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._ProxyConfiguration, [core.String]),
    direct: dart.definiteFunctionType(io._ProxyConfiguration, [])
  }),
  fields: () => ({proxies: ListOf_Proxy()}),
  sfields: () => ({
    PROXY_PREFIX: core.String,
    DIRECT_PREFIX: core.String
  })
});
io._ProxyConfiguration.PROXY_PREFIX = "PROXY ";
io._ProxyConfiguration.DIRECT_PREFIX = "DIRECT";
io._HttpConnectionInfo = class _HttpConnectionInfo extends core.Object {
  new() {
    this.remoteAddress = null;
    this.remotePort = null;
    this.localPort = null;
  }
  static create(socket) {
    if (socket == null) return null;
    try {
      let info = new io._HttpConnectionInfo();
      info.remoteAddress = socket.remoteAddress;
      info.remotePort = socket.remotePort;
      info.localPort = socket.port;
      return info;
    } catch (e) {
    }

    return null;
  }
};
io._HttpConnectionInfo[dart.implements] = () => [io.HttpConnectionInfo];
dart.setSignature(io._HttpConnectionInfo, {
  fields: () => ({
    remoteAddress: io.InternetAddress,
    remotePort: core.int,
    localPort: core.int
  }),
  statics: () => ({create: dart.definiteFunctionType(io._HttpConnectionInfo, [io.Socket])}),
  names: ['create']
});
io._DetachedSocket = class _DetachedSocket extends async.Stream$(core.List$(core.int)) {
  new(socket, incoming) {
    this[_socket] = socket;
    this[_incoming] = incoming;
    super.new();
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get encoding() {
    return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
  }
  set encoding(value) {
    dart.dput(this[_socket], 'encoding', value);
  }
  write(obj) {
    dart.dsend(this[_socket], 'write', obj);
  }
  writeln(obj) {
    if (obj === void 0) obj = "";
    dart.dsend(this[_socket], 'writeln', obj);
  }
  writeCharCode(charCode) {
    dart.dsend(this[_socket], 'writeCharCode', charCode);
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    dart.dsend(this[_socket], 'writeAll', objects, separator);
  }
  add(bytes) {
    dart.dsend(this[_socket], 'add', bytes);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    return dart.dsend(this[_socket], 'addError', error, stackTrace);
  }
  addStream(stream) {
    return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
  }
  destroy() {
    dart.dsend(this[_socket], 'destroy');
  }
  flush() {
    return async.Future._check(dart.dsend(this[_socket], 'flush'));
  }
  close() {
    return async.Future._check(dart.dsend(this[_socket], 'close'));
  }
  get done() {
    return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
  }
  get port() {
    return core.int._check(dart.dload(this[_socket], 'port'));
  }
  get address() {
    return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
  }
  get remoteAddress() {
    return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
  }
  get remotePort() {
    return core.int._check(dart.dload(this[_socket], 'remotePort'));
  }
  setOption(option, enabled) {
    return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
  }
  [_toJSON$](ref) {
    return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
};
dart.addSimpleTypeTests(io._DetachedSocket);
io._DetachedSocket[dart.implements] = () => [io.Socket];
dart.setSignature(io._DetachedSocket, {
  constructors: () => ({new: dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic, StreamOfListOfint()])}),
  fields: () => ({
    [_incoming]: StreamOfListOfint(),
    [_socket]: dart.dynamic
  }),
  getters: () => ({
    encoding: dart.definiteFunctionType(convert.Encoding, []),
    done: dart.definiteFunctionType(async.Future$(io.Socket), []),
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, []),
    remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
    remotePort: dart.definiteFunctionType(core.int, [])
  }),
  setters: () => ({
    encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
    [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
    destroy: dart.definiteFunctionType(dart.void, []),
    flush: dart.definiteFunctionType(async.Future, []),
    close: dart.definiteFunctionType(async.Future, []),
    setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
    [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
  })
});
const _scheme = Symbol('_scheme');
io._AuthenticationScheme = class _AuthenticationScheme extends core.Object {
  new(scheme) {
    this[_scheme] = scheme;
  }
  static fromString(scheme) {
    if (scheme[dartx.toLowerCase]() == "basic") return io._AuthenticationScheme.BASIC;
    if (scheme[dartx.toLowerCase]() == "digest") return io._AuthenticationScheme.DIGEST;
    return io._AuthenticationScheme.UNKNOWN;
  }
  toString() {
    if (dart.equals(this, io._AuthenticationScheme.BASIC)) return "Basic";
    if (dart.equals(this, io._AuthenticationScheme.DIGEST)) return "Digest";
    return "Unknown";
  }
};
dart.setSignature(io._AuthenticationScheme, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._AuthenticationScheme, [core.int]),
    fromString: dart.definiteFunctionType(io._AuthenticationScheme, [core.String])
  }),
  fields: () => ({[_scheme]: core.int}),
  sfields: () => ({
    UNKNOWN: io._AuthenticationScheme,
    BASIC: io._AuthenticationScheme,
    DIGEST: io._AuthenticationScheme
  })
});
dart.defineLazy(io._AuthenticationScheme, {
  get UNKNOWN() {
    return dart.const(new io._AuthenticationScheme(-1));
  },
  get BASIC() {
    return dart.const(new io._AuthenticationScheme(0));
  },
  get DIGEST() {
    return dart.const(new io._AuthenticationScheme(1));
  }
});
io._Credentials = class _Credentials extends core.Object {
  new(credentials, realm) {
    this.credentials = credentials;
    this.realm = realm;
    this.used = false;
    this.ha1 = null;
    this.nonce = null;
    this.algorithm = null;
    this.qop = null;
    this.nonceCount = null;
    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST)) {
      let creds = io._HttpClientDigestCredentials._check(this.credentials);
      let hasher = new io._MD5();
      hasher.add(convert.UTF8.encode(creds.username));
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(this.realm[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(convert.UTF8.encode(creds.password));
      this.ha1 = io._CryptoUtils.bytesToHex(hasher.close());
    }
  }
  get scheme() {
    return this.credentials.scheme;
  }
};
dart.setSignature(io._Credentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._Credentials, [io._HttpClientCredentials, core.String])}),
  fields: () => ({
    credentials: io._HttpClientCredentials,
    realm: core.String,
    used: core.bool,
    ha1: core.String,
    nonce: core.String,
    algorithm: core.String,
    qop: core.String,
    nonceCount: core.int
  }),
  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])})
});
io._SiteCredentials = class _SiteCredentials extends io._Credentials {
  new(uri, realm, creds) {
    this.uri = uri;
    super.new(creds, core.String._check(realm));
  }
  applies(uri, scheme) {
    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
    if (uri.host != this.uri.host) return false;
    let thisPort = this.uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
    let otherPort = uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : uri.port;
    if (otherPort != thisPort) return false;
    return uri.path[dartx.startsWith](this.uri.path);
  }
  authorize(request) {
    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
      return;
    }
    this.credentials.authorize(this, request);
    this.used = true;
  }
};
dart.setSignature(io._SiteCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._SiteCredentials, [core.Uri, dart.dynamic, io._HttpClientCredentials])}),
  fields: () => ({uri: core.Uri}),
  methods: () => ({
    applies: dart.definiteFunctionType(core.bool, [core.Uri, io._AuthenticationScheme]),
    authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
  })
});
io._ProxyCredentials = class _ProxyCredentials extends io._Credentials {
  new(host, port, realm, creds) {
    this.host = host;
    this.port = port;
    super.new(creds, core.String._check(realm));
  }
  applies(proxy, scheme) {
    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
    return proxy.host == this.host && proxy.port == this.port;
  }
  authorize(request) {
    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
      return;
    }
    this.credentials.authorizeProxy(this, request);
  }
};
dart.setSignature(io._ProxyCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._ProxyCredentials, [core.String, core.int, dart.dynamic, io._HttpClientCredentials])}),
  fields: () => ({
    host: core.String,
    port: core.int
  }),
  methods: () => ({
    applies: dart.definiteFunctionType(core.bool, [io._Proxy, io._AuthenticationScheme]),
    authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
  })
});
io._HttpClientCredentials = class _HttpClientCredentials extends core.Object {};
io._HttpClientCredentials[dart.implements] = () => [io.HttpClientCredentials];
io._HttpClientBasicCredentials = class _HttpClientBasicCredentials extends io._HttpClientCredentials {
  new(username, password) {
    this.username = username;
    this.password = password;
  }
  get scheme() {
    return io._AuthenticationScheme.BASIC;
  }
  authorization() {
    let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${this.username}:${this.password}`));
    return dart.str`Basic ${auth}`;
  }
  authorize(_, request) {
    request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization());
  }
  authorizeProxy(_, request) {
    request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization());
  }
};
io._HttpClientBasicCredentials[dart.implements] = () => [io.HttpClientBasicCredentials];
dart.setSignature(io._HttpClientBasicCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientBasicCredentials, [core.String, core.String])}),
  fields: () => ({
    username: core.String,
    password: core.String
  }),
  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
  methods: () => ({
    authorization: dart.definiteFunctionType(core.String, []),
    authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
    authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
  })
});
io._HttpClientDigestCredentials = class _HttpClientDigestCredentials extends io._HttpClientCredentials {
  new(username, password) {
    this.username = username;
    this.password = password;
  }
  get scheme() {
    return io._AuthenticationScheme.DIGEST;
  }
  authorization(credentials, request) {
    let requestUri = request[_requestUri]();
    let hasher = new io._MD5();
    hasher.add(request.method[dartx.codeUnits]);
    hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
    hasher.add(requestUri[dartx.codeUnits]);
    let ha2 = io._CryptoUtils.bytesToHex(hasher.close());
    let qop = null;
    let cnonce = null;
    let nc = null;
    let x = null;
    hasher = new io._MD5();
    hasher.add(credentials.ha1[dartx.codeUnits]);
    hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
    if (credentials.qop == "auth") {
      qop = credentials.qop;
      cnonce = io._CryptoUtils.bytesToHex(io._IOCrypto.getRandomBytes(4));
      credentials.nonceCount = dart.notNull(credentials.nonceCount) + 1;
      nc = credentials.nonceCount[dartx.toRadixString](16);
      nc = dart.notNull("00000000"[dartx.substring](0, 8 - dart.notNull(nc[dartx.length]) + 1)) + dart.notNull(nc);
      hasher.add(credentials.nonce[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(nc[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(cnonce[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(credentials.qop[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(ha2[dartx.codeUnits]);
    } else {
      hasher.add(credentials.nonce[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(ha2[dartx.codeUnits]);
    }
    let response = io._CryptoUtils.bytesToHex(hasher.close());
    let buffer = new core.StringBuffer();
    buffer.write('Digest ');
    buffer.write(dart.str`username="${this.username}"`);
    buffer.write(dart.str`, realm="${credentials.realm}"`);
    buffer.write(dart.str`, nonce="${credentials.nonce}"`);
    buffer.write(dart.str`, uri="${requestUri}"`);
    buffer.write(dart.str`, algorithm="${credentials.algorithm}"`);
    if (qop == "auth") {
      buffer.write(dart.str`, qop="${qop}"`);
      buffer.write(dart.str`, cnonce="${cnonce}"`);
      buffer.write(dart.str`, nc="${nc}"`);
    }
    buffer.write(dart.str`, response="${response}"`);
    return buffer.toString();
  }
  authorize(credentials, request) {
    request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
  }
  authorizeProxy(credentials, request) {
    request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
  }
};
io._HttpClientDigestCredentials[dart.implements] = () => [io.HttpClientDigestCredentials];
dart.setSignature(io._HttpClientDigestCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientDigestCredentials, [core.String, core.String])}),
  fields: () => ({
    username: core.String,
    password: core.String
  }),
  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
  methods: () => ({
    authorization: dart.definiteFunctionType(core.String, [io._Credentials, io._HttpClientRequest]),
    authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
    authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
  })
});
io._RedirectInfo = class _RedirectInfo extends core.Object {
  new(statusCode, method, location) {
    this.statusCode = statusCode;
    this.method = method;
    this.location = location;
  }
};
io._RedirectInfo[dart.implements] = () => [io.RedirectInfo];
dart.setSignature(io._RedirectInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._RedirectInfo, [core.int, core.String, core.Uri])}),
  fields: () => ({
    statusCode: core.int,
    method: core.String,
    location: core.Uri
  })
});
io._getHttpVersion = function() {
  let version = io.Platform.version;
  let index = version[dartx.indexOf]('.', dart.notNull(version[dartx.indexOf]('.')) + 1);
  version = version[dartx.substring](0, index);
  return dart.str`Dart/${version} (dart:io)`;
};
dart.fn(io._getHttpVersion, VoidToString$());
io._Const = class _Const extends core.Object {};
dart.setSignature(io._Const, {
  sfields: () => ({
    HTTP: ListOfint(),
    HTTP1DOT: ListOfint(),
    HTTP10: ListOfint(),
    HTTP11: ListOfint(),
    T: core.bool,
    F: core.bool,
    SEPARATOR_MAP: ListOfbool()
  })
});
io._Const.HTTP = dart.constList([72, 84, 84, 80], core.int);
io._Const.HTTP1DOT = dart.constList([72, 84, 84, 80, 47, 49, 46], core.int);
io._Const.HTTP10 = dart.constList([72, 84, 84, 80, 47, 49, 46, 48], core.int);
io._Const.HTTP11 = dart.constList([72, 84, 84, 80, 47, 49, 46, 49], core.int);
io._Const.T = true;
io._Const.F = false;
dart.defineLazy(io._Const, {
  get SEPARATOR_MAP() {
    return dart.constList([io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F], core.bool);
  }
});
io._CharCode = class _CharCode extends core.Object {};
dart.setSignature(io._CharCode, {
  sfields: () => ({
    HT: core.int,
    LF: core.int,
    CR: core.int,
    SP: core.int,
    AMPERSAND: core.int,
    COMMA: core.int,
    DASH: core.int,
    SLASH: core.int,
    ZERO: core.int,
    ONE: core.int,
    COLON: core.int,
    SEMI_COLON: core.int,
    EQUAL: core.int
  })
});
io._CharCode.HT = 9;
io._CharCode.LF = 10;
io._CharCode.CR = 13;
io._CharCode.SP = 32;
io._CharCode.AMPERSAND = 38;
io._CharCode.COMMA = 44;
io._CharCode.DASH = 45;
io._CharCode.SLASH = 47;
io._CharCode.ZERO = 48;
io._CharCode.ONE = 49;
io._CharCode.COLON = 58;
io._CharCode.SEMI_COLON = 59;
io._CharCode.EQUAL = 61;
io._State = class _State extends core.Object {};
dart.setSignature(io._State, {
  sfields: () => ({
    START: core.int,
    METHOD_OR_RESPONSE_HTTP_VERSION: core.int,
    RESPONSE_HTTP_VERSION: core.int,
    REQUEST_LINE_METHOD: core.int,
    REQUEST_LINE_URI: core.int,
    REQUEST_LINE_HTTP_VERSION: core.int,
    REQUEST_LINE_ENDING: core.int,
    RESPONSE_LINE_STATUS_CODE: core.int,
    RESPONSE_LINE_REASON_PHRASE: core.int,
    RESPONSE_LINE_ENDING: core.int,
    HEADER_START: core.int,
    HEADER_FIELD: core.int,
    HEADER_VALUE_START: core.int,
    HEADER_VALUE: core.int,
    HEADER_VALUE_FOLDING_OR_ENDING: core.int,
    HEADER_VALUE_FOLD_OR_END: core.int,
    HEADER_ENDING: core.int,
    CHUNK_SIZE_STARTING_CR: core.int,
    CHUNK_SIZE_STARTING_LF: core.int,
    CHUNK_SIZE: core.int,
    CHUNK_SIZE_EXTENSION: core.int,
    CHUNK_SIZE_ENDING: core.int,
    CHUNKED_BODY_DONE_CR: core.int,
    CHUNKED_BODY_DONE_LF: core.int,
    BODY: core.int,
    CLOSED: core.int,
    UPGRADED: core.int,
    FAILURE: core.int,
    FIRST_BODY_STATE: core.int
  })
});
io._State.START = 0;
io._State.METHOD_OR_RESPONSE_HTTP_VERSION = 1;
io._State.RESPONSE_HTTP_VERSION = 2;
io._State.REQUEST_LINE_METHOD = 3;
io._State.REQUEST_LINE_URI = 4;
io._State.REQUEST_LINE_HTTP_VERSION = 5;
io._State.REQUEST_LINE_ENDING = 6;
io._State.RESPONSE_LINE_STATUS_CODE = 7;
io._State.RESPONSE_LINE_REASON_PHRASE = 8;
io._State.RESPONSE_LINE_ENDING = 9;
io._State.HEADER_START = 10;
io._State.HEADER_FIELD = 11;
io._State.HEADER_VALUE_START = 12;
io._State.HEADER_VALUE = 13;
io._State.HEADER_VALUE_FOLDING_OR_ENDING = 14;
io._State.HEADER_VALUE_FOLD_OR_END = 15;
io._State.HEADER_ENDING = 16;
io._State.CHUNK_SIZE_STARTING_CR = 17;
io._State.CHUNK_SIZE_STARTING_LF = 18;
io._State.CHUNK_SIZE = 19;
io._State.CHUNK_SIZE_EXTENSION = 20;
io._State.CHUNK_SIZE_ENDING = 21;
io._State.CHUNKED_BODY_DONE_CR = 22;
io._State.CHUNKED_BODY_DONE_LF = 23;
io._State.BODY = 24;
io._State.CLOSED = 25;
io._State.UPGRADED = 26;
io._State.FAILURE = 27;
dart.defineLazy(io._State, {
  get FIRST_BODY_STATE() {
    return io._State.CHUNK_SIZE_STARTING_CR;
  }
});
io._HttpVersion = class _HttpVersion extends core.Object {};
dart.setSignature(io._HttpVersion, {
  sfields: () => ({
    UNDETERMINED: core.int,
    HTTP10: core.int,
    HTTP11: core.int
  })
});
io._HttpVersion.UNDETERMINED = 0;
io._HttpVersion.HTTP10 = 1;
io._HttpVersion.HTTP11 = 2;
io._MessageType = class _MessageType extends core.Object {};
dart.setSignature(io._MessageType, {
  sfields: () => ({
    UNDETERMINED: core.int,
    REQUEST: core.int,
    RESPONSE: core.int
  })
});
io._MessageType.UNDETERMINED = 0;
io._MessageType.REQUEST = 1;
io._MessageType.RESPONSE = 0;
const _injectData = Symbol('_injectData');
const _userOnData = Symbol('_userOnData');
const _isCanceled$ = Symbol('_isCanceled');
const _pauseCount$ = Symbol('_pauseCount');
const _scheduled = Symbol('_scheduled');
const _maybeScheduleData = Symbol('_maybeScheduleData');
io._HttpDetachedStreamSubscription = class _HttpDetachedStreamSubscription extends core.Object {
  new(subscription, injectData, userOnData) {
    this[_subscription$] = subscription;
    this[_injectData] = injectData;
    this[_userOnData] = userOnData;
    this[_isCanceled$] = false;
    this[_pauseCount$] = 1;
    this[_scheduled] = false;
  }
  get isPaused() {
    return this[_subscription$].isPaused;
  }
  asFuture(T) {
    return futureValue => {
      if (futureValue === void 0) futureValue = null;
      return this[_subscription$].asFuture(T)(futureValue);
    };
  }
  cancel() {
    this[_isCanceled$] = true;
    this[_injectData] = null;
    return this[_subscription$].cancel();
  }
  onData(handleData) {
    this[_userOnData] = handleData;
    this[_subscription$].onData(handleData);
  }
  onDone(handleDone) {
    this[_subscription$].onDone(handleDone);
  }
  onError(handleError) {
    this[_subscription$].onError(handleError);
  }
  pause(resumeSignal) {
    if (resumeSignal === void 0) resumeSignal = null;
    if (this[_injectData] == null) {
      this[_subscription$].pause(resumeSignal);
    } else {
      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
      if (resumeSignal != null) {
        resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
    }
  }
  resume() {
    if (this[_injectData] == null) {
      this[_subscription$].resume();
    } else {
      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
      this[_maybeScheduleData]();
    }
  }
  [_maybeScheduleData]() {
    if (dart.test(this[_scheduled])) return;
    if (this[_pauseCount$] != 0) return;
    this[_scheduled] = true;
    async.scheduleMicrotask(dart.fn(() => {
      this[_scheduled] = false;
      if (dart.notNull(this[_pauseCount$]) > 0 || dart.test(this[_isCanceled$])) return;
      let data = this[_injectData];
      this[_injectData] = null;
      this[_subscription$].resume();
      if (this[_userOnData] != null) {
        dart.dcall(this[_userOnData], data);
      }
    }, VoidToNull()));
  }
};
io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
dart.setSignature(io._HttpDetachedStreamSubscription, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedStreamSubscription, [StreamSubscriptionOfListOfint(), ListOfint(), core.Function])}),
  fields: () => ({
    [_subscription$]: StreamSubscriptionOfListOfint(),
    [_injectData]: ListOfint(),
    [_isCanceled$]: core.bool,
    [_pauseCount$]: core.int,
    [_userOnData]: core.Function,
    [_scheduled]: core.bool
  }),
  getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
  methods: () => ({
    asFuture: dart.definiteFunctionType(T => [async.Future$(T), [], [T]]),
    cancel: dart.definiteFunctionType(async.Future, []),
    onData: dart.definiteFunctionType(dart.void, [ListOfintTovoid()]),
    onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    onError: dart.definiteFunctionType(dart.void, [core.Function]),
    pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
    resume: dart.definiteFunctionType(dart.void, []),
    [_maybeScheduleData]: dart.definiteFunctionType(dart.void, [])
  })
});
io._HttpDetachedIncoming = class _HttpDetachedIncoming extends async.Stream$(core.List$(core.int)) {
  new(subscription, bufferedData) {
    this.subscription = subscription;
    this.bufferedData = bufferedData;
    super.new();
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    if (this.subscription != null) {
      this.subscription.onData(onData);
      this.subscription.onError(onError);
      this.subscription.onDone(onDone);
      if (this.bufferedData == null) {
        return StreamSubscriptionOfListOfint()._check(((() => {
          this.subscription.resume();
          return this.subscription;
        })()));
      }
      let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
      _.resume();
      return _;
    } else {
      return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
  }
};
dart.addSimpleTypeTests(io._HttpDetachedIncoming);
dart.setSignature(io._HttpDetachedIncoming, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedIncoming, [async.StreamSubscription, ListOfint()])}),
  fields: () => ({
    subscription: async.StreamSubscription,
    bufferedData: ListOfint()
  }),
  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
});
const _method$ = Symbol('_method');
const _uri_or_reason_phrase = Symbol('_uri_or_reason_phrase');
const _headerField = Symbol('_headerField');
const _headerValue = Symbol('_headerValue');
const _requestParser = Symbol('_requestParser');
const _parserCalled = Symbol('_parserCalled');
const _index$2 = Symbol('_index');
const _httpVersionIndex = Symbol('_httpVersionIndex');
const _messageType = Symbol('_messageType');
const _statusCodeLength = Symbol('_statusCodeLength');
const _httpVersion = Symbol('_httpVersion');
const _connectionUpgrade = Symbol('_connectionUpgrade');
const _chunked = Symbol('_chunked');
const _noMessageBody = Symbol('_noMessageBody');
const _remainingContent = Symbol('_remainingContent');
const _socketSubscription = Symbol('_socketSubscription');
const _paused = Symbol('_paused');
const _bodyPaused = Symbol('_bodyPaused');
const _bodyController = Symbol('_bodyController');
const _pauseStateChanged = Symbol('_pauseStateChanged');
const _reset = Symbol('_reset');
const _onData$ = Symbol('_onData');
const _onDone$ = Symbol('_onDone');
const _doParse = Symbol('_doParse');
const _reportError = Symbol('_reportError');
const _createIncoming = Symbol('_createIncoming');
const _closeIncoming = Symbol('_closeIncoming');
const _headersEnd = Symbol('_headersEnd');
const _expect = Symbol('_expect');
const _caseInsensitiveCompare = Symbol('_caseInsensitiveCompare');
const _expectHexDigit = Symbol('_expectHexDigit');
const _releaseBuffer = Symbol('_releaseBuffer');
io._HttpParser = class _HttpParser extends async.Stream$(io._HttpIncoming) {
  static requestParser() {
    return new io._HttpParser._(true);
  }
  static responseParser() {
    return new io._HttpParser._(false);
  }
  _(requestParser) {
    this[_method$] = JSArrayOfint().of([]);
    this[_uri_or_reason_phrase] = JSArrayOfint().of([]);
    this[_headerField] = JSArrayOfint().of([]);
    this[_headerValue] = JSArrayOfint().of([]);
    this[_requestParser] = requestParser;
    this[_parserCalled] = false;
    this[_buffer$] = null;
    this[_index$2] = null;
    this[_state$1] = null;
    this[_httpVersionIndex] = null;
    this[_messageType] = null;
    this[_statusCode] = 0;
    this[_statusCodeLength] = 0;
    this[_httpVersion] = null;
    this[_transferLength] = -1;
    this[_persistentConnection] = null;
    this[_connectionUpgrade] = null;
    this[_chunked] = null;
    this[_noMessageBody] = false;
    this[_remainingContent] = -1;
    this[_headers] = null;
    this[_incoming] = null;
    this[_socketSubscription] = null;
    this[_paused] = true;
    this[_bodyPaused] = false;
    this[_controller$0] = null;
    this[_bodyController] = null;
    super.new();
    this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
        this[_paused] = false;
      }, VoidToNull()), onPause: dart.fn(() => {
        this[_paused] = true;
        this[_pauseStateChanged]();
      }, VoidToNull()), onResume: dart.fn(() => {
        this[_paused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onCancel: dart.fn(() => {
        if (this[_socketSubscription] != null) {
          this[_socketSubscription].cancel();
        }
      }, VoidToNull())});
    this[_reset]();
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  listenToStream(stream) {
    this[_socketSubscription] = stream.listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this, _onDone$)});
  }
  [_parse]() {
    try {
      this[_doParse]();
    } catch (e) {
      let s = dart.stackTrace(e);
      this[_state$1] = io._State.FAILURE;
      this[_reportError](e, s);
    }

  }
  [_headersEnd]() {
    this[_headers][_mutable] = false;
    this[_transferLength] = this[_headers].contentLength;
    if (dart.test(this[_chunked])) this[_transferLength] = -1;
    if (this[_messageType] == io._MessageType.REQUEST && dart.notNull(this[_transferLength]) < 0 && this[_chunked] == false) {
      this[_transferLength] = 0;
    }
    if (dart.test(this[_connectionUpgrade])) {
      this[_state$1] = io._State.UPGRADED;
      this[_transferLength] = 0;
    }
    this[_createIncoming](this[_transferLength]);
    if (dart.test(this[_requestParser])) {
      this[_incoming].method = core.String.fromCharCodes(this[_method$]);
      this[_incoming].uri = core.Uri.parse(core.String.fromCharCodes(this[_uri_or_reason_phrase]));
    } else {
      this[_incoming].statusCode = this[_statusCode];
      this[_incoming].reasonPhrase = core.String.fromCharCodes(this[_uri_or_reason_phrase]);
    }
    this[_method$][dartx.clear]();
    this[_uri_or_reason_phrase][dartx.clear]();
    if (dart.test(this[_connectionUpgrade])) {
      this[_incoming].upgraded = true;
      this[_parserCalled] = false;
      let tmp = this[_incoming];
      this[_closeIncoming]();
      this[_controller$0].add(tmp);
      return true;
    }
    if (this[_transferLength] == 0 || this[_messageType] == io._MessageType.RESPONSE && dart.test(this[_noMessageBody])) {
      this[_reset]();
      let tmp = this[_incoming];
      this[_closeIncoming]();
      this[_controller$0].add(tmp);
      return false;
    } else if (dart.test(this[_chunked])) {
      this[_state$1] = io._State.CHUNK_SIZE;
      this[_remainingContent] = 0;
    } else if (dart.notNull(this[_transferLength]) > 0) {
      this[_remainingContent] = this[_transferLength];
      this[_state$1] = io._State.BODY;
    } else {
      this[_state$1] = io._State.BODY;
    }
    this[_parserCalled] = false;
    this[_controller$0].add(this[_incoming]);
    return true;
  }
  [_doParse]() {
    dart.assert(!dart.test(this[_parserCalled]));
    this[_parserCalled] = true;
    if (this[_state$1] == io._State.CLOSED) {
      dart.throw(new io.HttpException("Data on closed connection"));
    }
    if (this[_state$1] == io._State.FAILURE) {
      dart.throw(new io.HttpException("Data on failed connection"));
    }
    while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
      if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
        this[_parserCalled] = false;
        return;
      }
      let byte = this[_buffer$][dartx._get]((() => {
        let x = this[_index$2];
        this[_index$2] = dart.notNull(x) + 1;
        return x;
      })());
      switch (this[_state$1]) {
        case io._State.START:
        {
          if (byte == io._Const.HTTP[dartx._get](0)) {
            this[_httpVersionIndex] = 1;
            this[_state$1] = io._State.METHOD_OR_RESPONSE_HTTP_VERSION;
          } else {
            if (!dart.test(io._HttpParser._isTokenChar(byte))) {
              dart.throw(new io.HttpException("Invalid request method"));
            }
            this[_method$][dartx.add](byte);
            if (!dart.test(this[_requestParser])) {
              dart.throw(new io.HttpException("Invalid response line"));
            }
            this[_state$1] = io._State.REQUEST_LINE_METHOD;
          }
          break;
        }
        case io._State.METHOD_OR_RESPONSE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP[dartx.length]) && byte == io._Const.HTTP[dartx._get](this[_httpVersionIndex])) {
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP[dartx.length] && byte == io._CharCode.SLASH) {
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            if (dart.test(this[_requestParser])) {
              dart.throw(new io.HttpException("Invalid request line"));
            }
            this[_state$1] = io._State.RESPONSE_HTTP_VERSION;
          } else {
            for (let i = 0; i < dart.notNull(this[_httpVersionIndex]); i++) {
              this[_method$][dartx.add](io._Const.HTTP[dartx._get](i));
            }
            if (byte == io._CharCode.SP) {
              this[_state$1] = io._State.REQUEST_LINE_URI;
            } else {
              this[_method$][dartx.add](byte);
              this[_httpVersion] = io._HttpVersion.UNDETERMINED;
              if (!dart.test(this[_requestParser])) {
                dart.throw(new io.HttpException("Invalid response line"));
              }
              this[_state$1] = io._State.REQUEST_LINE_METHOD;
            }
          }
          break;
        }
        case io._State.RESPONSE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
            this[_expect](byte, io._Const.HTTP1DOT[dartx._get](this[_httpVersionIndex]));
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ONE) {
            this[_httpVersion] = io._HttpVersion.HTTP11;
            this[_persistentConnection] = true;
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ZERO) {
            this[_httpVersion] = io._HttpVersion.HTTP10;
            this[_persistentConnection] = false;
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == dart.notNull(io._Const.HTTP1DOT[dartx.length]) + 1) {
            this[_expect](byte, io._CharCode.SP);
            this[_state$1] = io._State.RESPONSE_LINE_STATUS_CODE;
          } else {
            dart.throw(new io.HttpException("Invalid response line"));
          }
          break;
        }
        case io._State.REQUEST_LINE_METHOD:
        {
          if (byte == io._CharCode.SP) {
            this[_state$1] = io._State.REQUEST_LINE_URI;
          } else {
            if (dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte)) || byte == io._CharCode.CR || byte == io._CharCode.LF) {
              dart.throw(new io.HttpException("Invalid request method"));
            }
            this[_method$][dartx.add](byte);
          }
          break;
        }
        case io._State.REQUEST_LINE_URI:
        {
          if (byte == io._CharCode.SP) {
            if (this[_uri_or_reason_phrase][dartx.length] == 0) {
              dart.throw(new io.HttpException("Invalid request URI"));
            }
            this[_state$1] = io._State.REQUEST_LINE_HTTP_VERSION;
            this[_httpVersionIndex] = 0;
          } else {
            if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
              dart.throw(new io.HttpException("Invalid request URI"));
            }
            this[_uri_or_reason_phrase][dartx.add](byte);
          }
          break;
        }
        case io._State.REQUEST_LINE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
            this[_expect](byte, io._Const.HTTP11[dartx._get](this[_httpVersionIndex]));
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length]) {
            if (byte == io._CharCode.ONE) {
              this[_httpVersion] = io._HttpVersion.HTTP11;
              this[_persistentConnection] = true;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (byte == io._CharCode.ZERO) {
              this[_httpVersion] = io._HttpVersion.HTTP10;
              this[_persistentConnection] = false;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else {
              dart.throw(new io.HttpException("Invalid response line"));
            }
          } else {
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.REQUEST_LINE_ENDING;
            } else {
              this[_expect](byte, io._CharCode.LF);
              this[_messageType] = io._MessageType.REQUEST;
              this[_state$1] = io._State.HEADER_START;
            }
          }
          break;
        }
        case io._State.REQUEST_LINE_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_messageType] = io._MessageType.REQUEST;
          this[_state$1] = io._State.HEADER_START;
          break;
        }
        case io._State.RESPONSE_LINE_STATUS_CODE:
        {
          if (byte == io._CharCode.SP) {
            this[_state$1] = io._State.RESPONSE_LINE_REASON_PHRASE;
          } else if (byte == io._CharCode.CR) {
            this[_state$1] = io._State.RESPONSE_LINE_ENDING;
          } else {
            this[_statusCodeLength] = dart.notNull(this[_statusCodeLength]) + 1;
            if (dart.notNull(byte) < 48 && 57 < dart.notNull(byte) || dart.notNull(this[_statusCodeLength]) > 3) {
              dart.throw(new io.HttpException("Invalid response status code"));
            } else {
              this[_statusCode] = dart.notNull(this[_statusCode]) * 10 + dart.notNull(byte) - 48;
            }
          }
          break;
        }
        case io._State.RESPONSE_LINE_REASON_PHRASE:
        {
          if (byte == io._CharCode.CR) {
            this[_state$1] = io._State.RESPONSE_LINE_ENDING;
          } else {
            if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
              dart.throw(new io.HttpException("Invalid response reason phrase"));
            }
            this[_uri_or_reason_phrase][dartx.add](byte);
          }
          break;
        }
        case io._State.RESPONSE_LINE_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_messageType] == io._MessageType.RESPONSE;
          if (dart.notNull(this[_statusCode]) < 100 || dart.notNull(this[_statusCode]) > 599) {
            dart.throw(new io.HttpException("Invalid response status code"));
          } else {
            if (dart.notNull(this[_statusCode]) <= 199 || this[_statusCode] == 204 || this[_statusCode] == 304) {
              this[_noMessageBody] = true;
            }
          }
          this[_state$1] = io._State.HEADER_START;
          break;
        }
        case io._State.HEADER_START:
        {
          this[_headers] = new io._HttpHeaders(this.version);
          if (byte == io._CharCode.CR) {
            this[_state$1] = io._State.HEADER_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state$1] = io._State.HEADER_ENDING;
            this[_index$2] = dart.notNull(this[_index$2]) - 1;
          } else {
            this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
            this[_state$1] = io._State.HEADER_FIELD;
          }
          break;
        }
        case io._State.HEADER_FIELD:
        {
          if (byte == io._CharCode.COLON) {
            this[_state$1] = io._State.HEADER_VALUE_START;
          } else {
            if (!dart.test(io._HttpParser._isTokenChar(byte))) {
              dart.throw(new io.HttpException("Invalid header field name"));
            }
            this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
          }
          break;
        }
        case io._State.HEADER_VALUE_START:
        {
          if (byte == io._CharCode.CR) {
            this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
          } else if (byte != io._CharCode.SP && byte != io._CharCode.HT) {
            this[_headerValue][dartx.add](byte);
            this[_state$1] = io._State.HEADER_VALUE;
          }
          break;
        }
        case io._State.HEADER_VALUE:
        {
          if (byte == io._CharCode.CR) {
            this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
          } else {
            this[_headerValue][dartx.add](byte);
          }
          break;
        }
        case io._State.HEADER_VALUE_FOLDING_OR_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
          break;
        }
        case io._State.HEADER_VALUE_FOLD_OR_END:
        {
          if (byte == io._CharCode.SP || byte == io._CharCode.HT) {
            this[_state$1] = io._State.HEADER_VALUE_START;
          } else {
            let headerField = core.String.fromCharCodes(this[_headerField]);
            let headerValue = core.String.fromCharCodes(this[_headerValue]);
            if (headerField == "transfer-encoding" && dart.test(this[_caseInsensitiveCompare]("chunked"[dartx.codeUnits], this[_headerValue]))) {
              this[_chunked] = true;
            }
            if (headerField == "connection") {
              let tokens = io._HttpParser._tokenizeFieldValue(headerValue);
              for (let i = 0; i < dart.notNull(tokens[dartx.length]); i++) {
                if (dart.test(this[_caseInsensitiveCompare]("upgrade"[dartx.codeUnits], tokens[dartx._get](i)[dartx.codeUnits]))) {
                  this[_connectionUpgrade] = true;
                }
                this[_headers][_add$2](headerField, tokens[dartx._get](i));
              }
            } else {
              this[_headers][_add$2](headerField, headerValue);
            }
            this[_headerField][dartx.clear]();
            this[_headerValue][dartx.clear]();
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.HEADER_ENDING;
            } else if (byte == io._CharCode.LF) {
              this[_state$1] = io._State.HEADER_ENDING;
              this[_index$2] = dart.notNull(this[_index$2]) - 1;
            } else {
              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
              this[_state$1] = io._State.HEADER_FIELD;
            }
          }
          break;
        }
        case io._State.HEADER_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          if (dart.test(this[_headersEnd]())) {
            return;
          } else {
            break;
          }
          return;
        }
        case io._State.CHUNK_SIZE_STARTING_CR:
        {
          this[_expect](byte, io._CharCode.CR);
          this[_state$1] = io._State.CHUNK_SIZE_STARTING_LF;
          break;
        }
        case io._State.CHUNK_SIZE_STARTING_LF:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_state$1] = io._State.CHUNK_SIZE;
          break;
        }
        case io._State.CHUNK_SIZE:
        {
          if (byte == io._CharCode.CR) {
            this[_state$1] = io._State.CHUNK_SIZE_ENDING;
          } else if (byte == io._CharCode.SEMI_COLON) {
            this[_state$1] = io._State.CHUNK_SIZE_EXTENSION;
          } else {
            let value = this[_expectHexDigit](byte);
            this[_remainingContent] = dart.notNull(this[_remainingContent]) * 16 + dart.notNull(value);
          }
          break;
        }
        case io._State.CHUNK_SIZE_EXTENSION:
        {
          if (byte == io._CharCode.CR) {
            this[_state$1] = io._State.CHUNK_SIZE_ENDING;
          }
          break;
        }
        case io._State.CHUNK_SIZE_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          if (dart.notNull(this[_remainingContent]) > 0) {
            this[_state$1] = io._State.BODY;
          } else {
            this[_state$1] = io._State.CHUNKED_BODY_DONE_CR;
          }
          break;
        }
        case io._State.CHUNKED_BODY_DONE_CR:
        {
          this[_expect](byte, io._CharCode.CR);
          this[_state$1] = io._State.CHUNKED_BODY_DONE_LF;
          break;
        }
        case io._State.CHUNKED_BODY_DONE_LF:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_reset]();
          this[_closeIncoming]();
          break;
        }
        case io._State.BODY:
        {
          this[_index$2] = dart.notNull(this[_index$2]) - 1;
          let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
          if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
            dataAvailable = this[_remainingContent];
          }
          let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
          this[_bodyController].add(data);
          if (this[_remainingContent] != -1) {
            this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
          }
          this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
          if (this[_remainingContent] == 0) {
            if (!dart.test(this[_chunked])) {
              this[_reset]();
              this[_closeIncoming]();
            } else {
              this[_state$1] = io._State.CHUNK_SIZE_STARTING_CR;
            }
          }
          break;
        }
        case io._State.FAILURE:
        {
          dart.assert(false);
          break;
        }
        default:
        {
          dart.assert(false);
          break;
        }
      }
    }
    this[_parserCalled] = false;
    if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
      this[_releaseBuffer]();
      if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
        this[_socketSubscription].resume();
      }
    }
  }
  [_onData$](buffer) {
    this[_socketSubscription].pause();
    dart.assert(this[_buffer$] == null);
    this[_buffer$] = typed_data.Uint8List._check(buffer);
    this[_index$2] = 0;
    this[_parse]();
  }
  [_onDone$]() {
    this[_socketSubscription] = null;
    if (this[_state$1] == io._State.CLOSED || this[_state$1] == io._State.FAILURE) return;
    if (this[_incoming] != null) {
      if (this[_state$1] != io._State.UPGRADED && !(this[_state$1] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state$1] == io._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] == -1)) {
        this[_bodyController].addError(new io.HttpException("Connection closed while receiving data"));
      }
      this[_closeIncoming](true);
      this[_controller$0].close();
      return;
    }
    if (this[_state$1] == io._State.START) {
      if (!dart.test(this[_requestParser])) {
        this[_reportError](new io.HttpException("Connection closed before full header was received"));
      }
      this[_controller$0].close();
      return;
    }
    if (this[_state$1] == io._State.UPGRADED) {
      this[_controller$0].close();
      return;
    }
    if (dart.notNull(this[_state$1]) < io._State.FIRST_BODY_STATE) {
      this[_state$1] = io._State.FAILURE;
      this[_reportError](new io.HttpException("Connection closed before full header was received"));
      this[_controller$0].close();
      return;
    }
    if (!dart.test(this[_chunked]) && this[_transferLength] == -1) {
      this[_state$1] = io._State.CLOSED;
    } else {
      this[_state$1] = io._State.FAILURE;
      this[_reportError](new io.HttpException("Connection closed before full body was received"));
    }
    this[_controller$0].close();
  }
  get version() {
    switch (this[_httpVersion]) {
      case io._HttpVersion.HTTP10:
      {
        return "1.0";
      }
      case io._HttpVersion.HTTP11:
      {
        return "1.1";
      }
    }
    return null;
  }
  get messageType() {
    return this[_messageType];
  }
  get transferLength() {
    return this[_transferLength];
  }
  get upgrade() {
    return dart.test(this[_connectionUpgrade]) && this[_state$1] == io._State.UPGRADED;
  }
  get persistentConnection() {
    return this[_persistentConnection];
  }
  set isHead(value) {
    if (dart.test(value)) this[_noMessageBody] = true;
  }
  detachIncoming() {
    this[_state$1] = io._State.UPGRADED;
    return new io._HttpDetachedIncoming(this[_socketSubscription], this.readUnparsedData());
  }
  readUnparsedData() {
    if (this[_buffer$] == null) return null;
    if (this[_index$2] == this[_buffer$][dartx.length]) return null;
    let result = this[_buffer$][dartx.sublist](this[_index$2]);
    this[_releaseBuffer]();
    return result;
  }
  [_reset]() {
    if (this[_state$1] == io._State.UPGRADED) return;
    this[_state$1] = io._State.START;
    this[_messageType] = io._MessageType.UNDETERMINED;
    this[_headerField][dartx.clear]();
    this[_headerValue][dartx.clear]();
    this[_method$][dartx.clear]();
    this[_uri_or_reason_phrase][dartx.clear]();
    this[_statusCode] = 0;
    this[_statusCodeLength] = 0;
    this[_httpVersion] = io._HttpVersion.UNDETERMINED;
    this[_transferLength] = -1;
    this[_persistentConnection] = false;
    this[_connectionUpgrade] = false;
    this[_chunked] = false;
    this[_noMessageBody] = false;
    this[_remainingContent] = -1;
    this[_headers] = null;
  }
  [_releaseBuffer]() {
    this[_buffer$] = null;
    this[_index$2] = null;
  }
  static _isTokenChar(byte) {
    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
  }
  static _isValueChar(byte) {
    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 || byte == io._CharCode.SP || byte == io._CharCode.HT;
  }
  static _tokenizeFieldValue(headerValue) {
    let tokens = ListOfString().new();
    let start = 0;
    let index = 0;
    while (index < dart.notNull(headerValue[dartx.length])) {
      if (headerValue[dartx._get](index) == ",") {
        tokens[dartx.add](headerValue[dartx.substring](start, index));
        start = index + 1;
      } else if (headerValue[dartx._get](index) == " " || headerValue[dartx._get](index) == "\t") {
        start++;
      }
      index++;
    }
    tokens[dartx.add](headerValue[dartx.substring](start, index));
    return tokens;
  }
  static _toLowerCaseByte(x) {
    return (dart.notNull(x) - 65 & 127) < 26 ? (dart.notNull(x) | 32) >>> 0 : x;
  }
  [_caseInsensitiveCompare](expected, value) {
    if (expected[dartx.length] != value[dartx.length]) return false;
    for (let i = 0; i < dart.notNull(expected[dartx.length]); i++) {
      if (expected[dartx._get](i) != io._HttpParser._toLowerCaseByte(value[dartx._get](i))) return false;
    }
    return true;
  }
  [_expect](val1, val2) {
    if (val1 != val2) {
      dart.throw(new io.HttpException("Failed to parse HTTP"));
    }
  }
  [_expectHexDigit](byte) {
    if (48 <= dart.notNull(byte) && dart.notNull(byte) <= 57) {
      return dart.notNull(byte) - 48;
    } else if (65 <= dart.notNull(byte) && dart.notNull(byte) <= 70) {
      return dart.notNull(byte) - 65 + 10;
    } else if (97 <= dart.notNull(byte) && dart.notNull(byte) <= 102) {
      return dart.notNull(byte) - 97 + 10;
    } else {
      dart.throw(new io.HttpException("Failed to parse HTTP"));
    }
  }
  [_createIncoming](transferLength) {
    dart.assert(this[_incoming] == null);
    dart.assert(this[_bodyController] == null);
    dart.assert(!dart.test(this[_bodyPaused]));
    let incoming = null;
    this[_bodyController] = StreamControllerOfListOfint().new({sync: true, onListen: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        dart.assert(this[_bodyPaused]);
        this[_bodyPaused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onPause: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        dart.assert(!dart.test(this[_bodyPaused]));
        this[_bodyPaused] = true;
        this[_pauseStateChanged]();
      }, VoidToNull()), onResume: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        dart.assert(this[_bodyPaused]);
        this[_bodyPaused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onCancel: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        if (this[_socketSubscription] != null) {
          this[_socketSubscription].cancel();
        }
        this[_closeIncoming](true);
        this[_controller$0].close();
      }, VoidToNull())});
    incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
    this[_bodyPaused] = true;
    this[_pauseStateChanged]();
  }
  [_closeIncoming](closing) {
    if (closing === void 0) closing = false;
    if (this[_incoming] == null) return;
    let tmp = this[_incoming];
    tmp.close(closing);
    this[_incoming] = null;
    if (this[_bodyController] != null) {
      this[_bodyController].close();
      this[_bodyController] = null;
    }
    this[_bodyPaused] = false;
    this[_pauseStateChanged]();
  }
  [_pauseStateChanged]() {
    if (this[_incoming] != null) {
      if (!dart.test(this[_bodyPaused]) && !dart.test(this[_parserCalled])) {
        this[_parse]();
      }
    } else {
      if (!dart.test(this[_paused]) && !dart.test(this[_parserCalled])) {
        this[_parse]();
      }
    }
  }
  [_reportError](error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    if (this[_socketSubscription] != null) this[_socketSubscription].cancel();
    this[_state$1] = io._State.FAILURE;
    this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
    this[_controller$0].close();
  }
};
dart.addSimpleTypeTests(io._HttpParser);
dart.defineNamedConstructor(io._HttpParser, '_');
dart.setSignature(io._HttpParser, {
  constructors: () => ({
    requestParser: dart.definiteFunctionType(io._HttpParser, []),
    responseParser: dart.definiteFunctionType(io._HttpParser, []),
    _: dart.definiteFunctionType(io._HttpParser, [core.bool])
  }),
  fields: () => ({
    [_parserCalled]: core.bool,
    [_buffer$]: typed_data.Uint8List,
    [_index$2]: core.int,
    [_requestParser]: core.bool,
    [_state$1]: core.int,
    [_httpVersionIndex]: core.int,
    [_messageType]: core.int,
    [_statusCode]: core.int,
    [_statusCodeLength]: core.int,
    [_method$]: ListOfint(),
    [_uri_or_reason_phrase]: ListOfint(),
    [_headerField]: ListOfint(),
    [_headerValue]: ListOfint(),
    [_httpVersion]: core.int,
    [_transferLength]: core.int,
    [_persistentConnection]: core.bool,
    [_connectionUpgrade]: core.bool,
    [_chunked]: core.bool,
    [_noMessageBody]: core.bool,
    [_remainingContent]: core.int,
    [_headers]: io._HttpHeaders,
    [_incoming]: io._HttpIncoming,
    [_socketSubscription]: async.StreamSubscription,
    [_paused]: core.bool,
    [_bodyPaused]: core.bool,
    [_controller$0]: StreamControllerOf_HttpIncoming(),
    [_bodyController]: StreamControllerOfListOfint()
  }),
  getters: () => ({
    version: dart.definiteFunctionType(core.String, []),
    messageType: dart.definiteFunctionType(core.int, []),
    transferLength: dart.definiteFunctionType(core.int, []),
    upgrade: dart.definiteFunctionType(core.bool, []),
    persistentConnection: dart.definiteFunctionType(core.bool, [])
  }),
  setters: () => ({isHead: dart.definiteFunctionType(dart.void, [core.bool])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io._HttpIncoming), [_HttpIncomingTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    listenToStream: dart.definiteFunctionType(dart.void, [StreamOfListOfint()]),
    [_parse]: dart.definiteFunctionType(dart.void, []),
    [_headersEnd]: dart.definiteFunctionType(core.bool, []),
    [_doParse]: dart.definiteFunctionType(dart.void, []),
    [_onData$]: dart.definiteFunctionType(dart.void, [ListOfint()]),
    [_onDone$]: dart.definiteFunctionType(dart.void, []),
    detachIncoming: dart.definiteFunctionType(io._HttpDetachedIncoming, []),
    readUnparsedData: dart.definiteFunctionType(core.List$(core.int), []),
    [_reset]: dart.definiteFunctionType(dart.void, []),
    [_releaseBuffer]: dart.definiteFunctionType(dart.void, []),
    [_caseInsensitiveCompare]: dart.definiteFunctionType(core.bool, [ListOfint(), ListOfint()]),
    [_expect]: dart.definiteFunctionType(core.int, [core.int, core.int]),
    [_expectHexDigit]: dart.definiteFunctionType(core.int, [core.int]),
    [_createIncoming]: dart.definiteFunctionType(dart.void, [core.int]),
    [_closeIncoming]: dart.definiteFunctionType(dart.void, [], [core.bool]),
    [_pauseStateChanged]: dart.definiteFunctionType(dart.void, []),
    [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic])
  }),
  statics: () => ({
    _isTokenChar: dart.definiteFunctionType(core.bool, [core.int]),
    _isValueChar: dart.definiteFunctionType(core.bool, [core.int]),
    _tokenizeFieldValue: dart.definiteFunctionType(core.List$(core.String), [core.String]),
    _toLowerCaseByte: dart.definiteFunctionType(core.int, [core.int])
  }),
  names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
});
io._DART_SESSION_ID = "DARTSESSID";
const _data$ = Symbol('_data');
const _lastSeen = Symbol('_lastSeen');
const _timeoutCallback = Symbol('_timeoutCallback');
const _prev = Symbol('_prev');
const _next$1 = Symbol('_next');
const _removeFromTimeoutQueue = Symbol('_removeFromTimeoutQueue');
const _sessions = Symbol('_sessions');
const _bumpToEnd = Symbol('_bumpToEnd');
io._HttpSession = class _HttpSession extends core.Object {
  new(sessionManager, id) {
    this[_data$] = collection.HashMap.new();
    this[_sessionManager] = sessionManager;
    this.id = id;
    this[_lastSeen] = new core.DateTime.now();
    this[_destroyed] = false;
    this[_isNew] = true;
    this[_timeoutCallback] = null;
    this[_prev] = null;
    this[_next$1] = null;
  }
  destroy() {
    this[_destroyed] = true;
    this[_sessionManager][_removeFromTimeoutQueue](this);
    this[_sessionManager][_sessions][dartx.remove](this.id);
  }
  [_markSeen]() {
    this[_lastSeen] = new core.DateTime.now();
    this[_sessionManager][_bumpToEnd](this);
  }
  get lastSeen() {
    return this[_lastSeen];
  }
  get isNew() {
    return this[_isNew];
  }
  set onTimeout(callback) {
    this[_timeoutCallback] = callback;
  }
  containsValue(value) {
    return this[_data$][dartx.containsValue](value);
  }
  containsKey(key) {
    return this[_data$][dartx.containsKey](key);
  }
  _get(key) {
    return this[_data$][dartx._get](key);
  }
  _set(key, value) {
    this[_data$][dartx._set](key, value);
    return value;
  }
  putIfAbsent(key, ifAbsent) {
    return this[_data$][dartx.putIfAbsent](key, ifAbsent);
  }
  addAll(other) {
    return this[_data$][dartx.addAll](other);
  }
  remove(key) {
    return this[_data$][dartx.remove](key);
  }
  clear() {
    this[_data$][dartx.clear]();
  }
  forEach(f) {
    this[_data$][dartx.forEach](f);
  }
  get keys() {
    return this[_data$][dartx.keys];
  }
  get values() {
    return this[_data$][dartx.values];
  }
  get length() {
    return this[_data$][dartx.length];
  }
  get isEmpty() {
    return this[_data$][dartx.isEmpty];
  }
  get isNotEmpty() {
    return this[_data$][dartx.isNotEmpty];
  }
  toString() {
    return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
  }
};
io._HttpSession[dart.implements] = () => [io.HttpSession];
dart.setSignature(io._HttpSession, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpSession, [io._HttpSessionManager, core.String])}),
  fields: () => ({
    [_destroyed]: core.bool,
    [_isNew]: core.bool,
    [_lastSeen]: core.DateTime,
    [_timeoutCallback]: core.Function,
    [_sessionManager]: io._HttpSessionManager,
    [_prev]: io._HttpSession,
    [_next$1]: io._HttpSession,
    id: core.String,
    [_data$]: core.Map
  }),
  getters: () => ({
    lastSeen: dart.definiteFunctionType(core.DateTime, []),
    isNew: dart.definiteFunctionType(core.bool, []),
    keys: dart.definiteFunctionType(core.Iterable, []),
    values: dart.definiteFunctionType(core.Iterable, []),
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  setters: () => ({onTimeout: dart.definiteFunctionType(dart.void, [VoidTovoid()])}),
  methods: () => ({
    destroy: dart.definiteFunctionType(dart.void, []),
    [_markSeen]: dart.definiteFunctionType(dart.void, []),
    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
    addAll: dart.definiteFunctionType(dart.void, [core.Map]),
    remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    clear: dart.definiteFunctionType(dart.void, []),
    forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()])
  })
});
dart.defineExtensionMembers(io._HttpSession, [
  'containsValue',
  'containsKey',
  '_get',
  '_set',
  'putIfAbsent',
  'addAll',
  'remove',
  'clear',
  'forEach',
  'keys',
  'values',
  'length',
  'isEmpty',
  'isNotEmpty'
]);
const _sessionTimeout = Symbol('_sessionTimeout');
const _head$ = Symbol('_head');
const _tail$ = Symbol('_tail');
const _timer = Symbol('_timer');
const _addToTimeoutQueue = Symbol('_addToTimeoutQueue');
const _stopTimer = Symbol('_stopTimer');
const _startTimer = Symbol('_startTimer');
const _timerTimeout = Symbol('_timerTimeout');
io._HttpSessionManager = class _HttpSessionManager extends core.Object {
  new() {
    this[_sessions] = dart.map({}, core.String, io._HttpSession);
    this[_sessionTimeout] = 20 * 60;
    this[_head$] = null;
    this[_tail$] = null;
    this[_timer] = null;
  }
  createSessionId() {
    let _KEY_LENGTH = 16;
    let data = io._IOCrypto.getRandomBytes(_KEY_LENGTH);
    return io._CryptoUtils.bytesToHex(data);
  }
  getSession(id) {
    return this[_sessions][dartx._get](id);
  }
  createSession() {
    let id = this.createSessionId();
    while (dart.test(this[_sessions][dartx.containsKey](id))) {
      id = this.createSessionId();
    }
    let session = this[_sessions][dartx._set](id, new io._HttpSession(this, id));
    this[_addToTimeoutQueue](session);
    return session;
  }
  set sessionTimeout(timeout) {
    this[_sessionTimeout] = timeout;
    this[_stopTimer]();
    this[_startTimer]();
  }
  close() {
    this[_stopTimer]();
  }
  [_bumpToEnd](session) {
    this[_removeFromTimeoutQueue](session);
    this[_addToTimeoutQueue](session);
  }
  [_addToTimeoutQueue](session) {
    if (this[_head$] == null) {
      dart.assert(this[_tail$] == null);
      this[_tail$] = this[_head$] = session;
      this[_startTimer]();
    } else {
      dart.assert(this[_timer] != null);
      dart.assert(this[_tail$] != null);
      this[_tail$][_next$1] = session;
      session[_prev] = this[_tail$];
      this[_tail$] = session;
    }
  }
  [_removeFromTimeoutQueue](session) {
    if (session[_next$1] != null) {
      session[_next$1][_prev] = session[_prev];
    }
    if (session[_prev] != null) {
      session[_prev][_next$1] = session[_next$1];
    }
    if (dart.equals(this[_head$], session)) {
      this[_head$] = session[_next$1];
      this[_stopTimer]();
      this[_startTimer]();
    }
    if (dart.equals(this[_tail$], session)) {
      this[_tail$] = session[_prev];
    }
    session[_next$1] = session[_prev] = null;
  }
  [_timerTimeout]() {
    this[_stopTimer]();
    dart.assert(this[_head$] != null);
    let session = this[_head$];
    session.destroy();
    if (session[_timeoutCallback] != null) {
      dart.dsend(session, _timeoutCallback);
    }
  }
  [_startTimer]() {
    dart.assert(this[_timer] == null);
    if (this[_head$] != null) {
      let seconds = new core.DateTime.now().difference(this[_head$].lastSeen).inSeconds;
      this[_timer] = async.Timer.new(new core.Duration({seconds: dart.notNull(this[_sessionTimeout]) - dart.notNull(seconds)}), dart.bind(this, _timerTimeout));
    }
  }
  [_stopTimer]() {
    if (this[_timer] != null) {
      this[_timer].cancel();
      this[_timer] = null;
    }
  }
};
dart.setSignature(io._HttpSessionManager, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpSessionManager, [])}),
  fields: () => ({
    [_sessions]: MapOfString$_HttpSession(),
    [_sessionTimeout]: core.int,
    [_head$]: io._HttpSession,
    [_tail$]: io._HttpSession,
    [_timer]: async.Timer
  }),
  setters: () => ({sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    createSessionId: dart.definiteFunctionType(core.String, []),
    getSession: dart.definiteFunctionType(io._HttpSession, [core.String]),
    createSession: dart.definiteFunctionType(io._HttpSession, []),
    close: dart.definiteFunctionType(dart.void, []),
    [_bumpToEnd]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
    [_addToTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
    [_removeFromTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
    [_timerTimeout]: dart.definiteFunctionType(dart.void, []),
    [_startTimer]: dart.definiteFunctionType(dart.void, []),
    [_stopTimer]: dart.definiteFunctionType(dart.void, [])
  })
});
io._IOResourceInfo = class _IOResourceInfo extends core.Object {
  static get timestamp() {
    return dart.notNull(io._IOResourceInfo._startTime) + dart.notNull(io._IOResourceInfo._sw.elapsedMicroseconds) / 1000;
  }
  new(type) {
    this.type = type;
    this.id = io._IOResourceInfo.getNextID();
  }
  get referenceValueMap() {
    return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
  }
  static getNextID() {
    return (() => {
      let x = io._IOResourceInfo._count;
      io._IOResourceInfo._count = dart.notNull(x) + 1;
      return x;
    })();
  }
};
dart.setSignature(io._IOResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._IOResourceInfo, [core.String])}),
  fields: () => ({
    type: core.String,
    id: core.int
  }),
  getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  sfields: () => ({
    _count: core.int,
    _sw: core.Stopwatch,
    _startTime: core.int
  }),
  sgetters: () => ({timestamp: dart.definiteFunctionType(core.double, [])}),
  statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
  names: ['getNextID']
});
io._IOResourceInfo._count = 0;
dart.defineLazy(io._IOResourceInfo, {
  get _sw() {
    return (() => {
      let _ = new core.Stopwatch();
      _.start();
      return _;
    })();
  },
  get _startTime() {
    return new core.DateTime.now().millisecondsSinceEpoch;
  }
});
io._ReadWriteResourceInfo = class _ReadWriteResourceInfo extends io._IOResourceInfo {
  addRead(bytes) {
    this.totalRead = dart.notNull(this.totalRead) + dart.notNull(bytes);
    this.readCount = dart.notNull(this.readCount) + 1;
    this.lastRead = io._IOResourceInfo.timestamp;
  }
  didRead() {
    this.addRead(0);
  }
  addWrite(bytes) {
    this.totalWritten = dart.notNull(this.totalWritten) + dart.notNull(bytes);
    this.writeCount = dart.notNull(this.writeCount) + 1;
    this.lastWrite = io._IOResourceInfo.timestamp;
  }
  new(type) {
    this.totalRead = 0;
    this.totalWritten = 0;
    this.readCount = 0;
    this.writeCount = 0;
    this.lastRead = 0.0;
    this.lastWrite = 0.0;
    super.new(type);
  }
  get fullValueMap() {
    return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
  }
};
dart.setSignature(io._ReadWriteResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._ReadWriteResourceInfo, [core.String])}),
  fields: () => ({
    totalRead: core.int,
    totalWritten: core.int,
    readCount: core.int,
    writeCount: core.int,
    lastRead: core.double,
    lastWrite: core.double
  }),
  getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  methods: () => ({
    addRead: dart.definiteFunctionType(dart.void, [core.int]),
    didRead: dart.definiteFunctionType(dart.void, []),
    addWrite: dart.definiteFunctionType(dart.void, [core.int])
  })
});
io._FileResourceInfo = class _FileResourceInfo extends io._ReadWriteResourceInfo {
  new(file) {
    this.file = file;
    super.new(io._FileResourceInfo.TYPE);
    io._FileResourceInfo.FileOpened(this);
  }
  static FileOpened(info) {
    dart.assert(!dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](info.id)));
    io._FileResourceInfo.openFiles[dartx._set](info.id, info);
  }
  static FileClosed(info) {
    dart.assert(io._FileResourceInfo.openFiles[dartx.containsKey](info.id));
    io._FileResourceInfo.openFiles[dartx.remove](info.id);
  }
  static getOpenFilesList() {
    return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
  }
  static getOpenFiles(func, params) {
    dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
    let data = dart.map({type: '_openfiles', data: io._FileResourceInfo.getOpenFilesList()}, core.String, core.Object);
    let json = convert.JSON.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  getFileInfoMap() {
    let result = this.fullValueMap;
    return result;
  }
  static getFileInfoMapByID(func, params) {
    dart.assert(dart.dsend(params, 'containsKey', 'id'));
    let id = core.int.parse(core.String._check(dart.dindex(params, 'id')));
    let result = dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](id)) ? io._FileResourceInfo.openFiles[dartx._get](id).getFileInfoMap() : dart.map();
    let json = convert.JSON.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  get name() {
    return dart.str`${dart.dload(this.file, 'path')}`;
  }
};
dart.setSignature(io._FileResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._FileResourceInfo, [dart.dynamic])}),
  fields: () => ({file: dart.dynamic}),
  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
  methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  sfields: () => ({
    TYPE: core.String,
    openFiles: MapOfint$_FileResourceInfo()
  }),
  statics: () => ({
    FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
    FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
    getOpenFilesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
    getOpenFiles: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
    getFileInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic])
  }),
  names: ['FileOpened', 'FileClosed', 'getOpenFilesList', 'getOpenFiles', 'getFileInfoMapByID']
});
io._FileResourceInfo.TYPE = '_file';
dart.defineLazy(io._FileResourceInfo, {
  get openFiles() {
    return MapOfint$_FileResourceInfo().new();
  },
  set openFiles(_) {}
});
const _arguments$0 = Symbol('_arguments');
const _workingDirectory = Symbol('_workingDirectory');
io._ProcessResourceInfo = class _ProcessResourceInfo extends io._IOResourceInfo {
  new(process) {
    this.process = process;
    this.startedAt = io._IOResourceInfo.timestamp;
    super.new(io._ProcessResourceInfo.TYPE);
    io._ProcessResourceInfo.ProcessStarted(this);
  }
  get name() {
    return core.String._check(dart.dload(this.process, _path$));
  }
  stopped() {
    io._ProcessResourceInfo.ProcessStopped(this);
  }
  get fullValueMap() {
    return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
  }
  static ProcessStarted(info) {
    dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
    io._ProcessResourceInfo.startedProcesses[dartx._set](info.id, info);
  }
  static ProcessStopped(info) {
    dart.assert(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id));
    io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
  }
  static getStartedProcessesList() {
    return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
  }
  static getStartedProcesses(func, params) {
    dart.assert(func == 'ext.dart.io.getProcesses');
    let data = dart.map({type: '_startedprocesses', data: io._ProcessResourceInfo.getStartedProcessesList()}, core.String, core.Object);
    let json = convert.JSON.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  static getProcessInfoMapById(func, params) {
    let id = core.int.parse(params[dartx._get]('id'));
    let result = dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](id)) ? io._ProcessResourceInfo.startedProcesses[dartx._get](id).fullValueMap : dart.map();
    let json = convert.JSON.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
};
dart.setSignature(io._ProcessResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._ProcessResourceInfo, [dart.dynamic])}),
  fields: () => ({
    process: dart.dynamic,
    startedAt: core.double
  }),
  getters: () => ({
    name: dart.definiteFunctionType(core.String, []),
    fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
  }),
  methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
  sfields: () => ({
    TYPE: core.String,
    startedProcesses: MapOfint$_ProcessResourceInfo()
  }),
  statics: () => ({
    ProcessStarted: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
    ProcessStopped: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
    getStartedProcessesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
    getStartedProcesses: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
    getProcessInfoMapById: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()])
  }),
  names: ['ProcessStarted', 'ProcessStopped', 'getStartedProcessesList', 'getStartedProcesses', 'getProcessInfoMapById']
});
io._ProcessResourceInfo.TYPE = '_process';
dart.defineLazy(io._ProcessResourceInfo, {
  get startedProcesses() {
    return MapOfint$_ProcessResourceInfo().new();
  },
  set startedProcesses(_) {}
});
io._SocketResourceInfo = class _SocketResourceInfo extends io._ReadWriteResourceInfo {
  new(socket) {
    this.socket = socket;
    super.new(io._SocketResourceInfo.TYPE);
    io._SocketResourceInfo.SocketOpened(this);
  }
  get name() {
    if (dart.test(dart.dload(this.socket, 'isListening'))) {
      return dart.str`listening:${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}`;
    }
    let remote = '';
    try {
      let remoteHost = dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host');
      let remotePort = dart.dload(this.socket, 'remotePort');
      remote = dart.str` -> ${remoteHost}:${remotePort}`;
    } catch (e) {
    }

    return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
  }
  static getOpenSocketsList() {
    return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
  }
  getSocketInfoMap() {
    let result = this.fullValueMap;
    result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
    result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
    result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
    result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
    if (!dart.test(dart.dload(this.socket, 'isListening'))) {
      try {
        result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
        result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
      } catch (e) {
        result[dartx._set]('remotePort', 'NA');
        result[dartx._set]('remoteHost', 'NA');
      }

    } else {
      result[dartx._set]('remotePort', 'NA');
      result[dartx._set]('remoteHost', 'NA');
    }
    result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
    return result;
  }
  static getSocketInfoMapByID(func, params) {
    dart.assert(params[dartx.containsKey]('id'));
    let id = core.int.parse(params[dartx._get]('id'));
    let result = dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](id)) ? io._SocketResourceInfo.openSockets[dartx._get](id).getSocketInfoMap() : dart.map();
    let json = convert.JSON.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  static getOpenSockets(func, params) {
    dart.assert(dart.equals(func, 'ext.dart.io.getOpenSockets'));
    let data = dart.map({type: '_opensockets', data: io._SocketResourceInfo.getOpenSocketsList()}, core.String, core.Object);
    let json = convert.JSON.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  static SocketOpened(info) {
    dart.assert(!dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id)));
    io._SocketResourceInfo.openSockets[dartx._set](info.id, info);
  }
  static SocketClosed(info) {
    dart.assert(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id));
    io._SocketResourceInfo.openSockets[dartx.remove](info.id);
  }
};
dart.setSignature(io._SocketResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._SocketResourceInfo, [dart.dynamic])}),
  fields: () => ({socket: dart.dynamic}),
  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
  methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  sfields: () => ({
    TCP_STRING: core.String,
    UDP_STRING: core.String,
    TYPE: core.String,
    openSockets: MapOfint$_SocketResourceInfo()
  }),
  statics: () => ({
    getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
    getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
    getOpenSockets: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
    SocketOpened: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo]),
    SocketClosed: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo])
  }),
  names: ['getOpenSocketsList', 'getSocketInfoMapByID', 'getOpenSockets', 'SocketOpened', 'SocketClosed']
});
io._SocketResourceInfo.TCP_STRING = 'TCP';
io._SocketResourceInfo.UDP_STRING = 'UDP';
io._SocketResourceInfo.TYPE = '_socket';
dart.defineLazy(io._SocketResourceInfo, {
  get openSockets() {
    return MapOfint$_SocketResourceInfo().new();
  },
  set openSockets(_) {}
});
io.IOSink = class IOSink extends core.Object {
  static new(target, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return new io._IOSinkImpl(target, encoding);
  }
};
io.IOSink[dart.implements] = () => [StreamSinkOfListOfint(), core.StringSink];
dart.setSignature(io.IOSink, {
  constructors: () => ({new: dart.definiteFunctionType(io.IOSink, [StreamConsumerOfListOfint()], {encoding: convert.Encoding})}),
  fields: () => ({encoding: convert.Encoding})
});
io._FILE_EXISTS = 0;
io._FILE_CREATE = 1;
io._FILE_DELETE = 2;
io._FILE_RENAME = 3;
io._FILE_COPY = 4;
io._FILE_OPEN = 5;
io._FILE_RESOLVE_SYMBOLIC_LINKS = 6;
io._FILE_CLOSE = 7;
io._FILE_POSITION = 8;
io._FILE_SET_POSITION = 9;
io._FILE_TRUNCATE = 10;
io._FILE_LENGTH = 11;
io._FILE_LENGTH_FROM_PATH = 12;
io._FILE_LAST_MODIFIED = 13;
io._FILE_FLUSH = 14;
io._FILE_READ_BYTE = 15;
io._FILE_WRITE_BYTE = 16;
io._FILE_READ = 17;
io._FILE_READ_INTO = 18;
io._FILE_WRITE_FROM = 19;
io._FILE_CREATE_LINK = 20;
io._FILE_DELETE_LINK = 21;
io._FILE_RENAME_LINK = 22;
io._FILE_LINK_TARGET = 23;
io._FILE_TYPE = 24;
io._FILE_IDENTICAL = 25;
io._FILE_STAT = 26;
io._FILE_LOCK = 27;
io._SOCKET_LOOKUP = 28;
io._SOCKET_LIST_INTERFACES = 29;
io._SOCKET_REVERSE_LOOKUP = 30;
io._DIRECTORY_CREATE = 31;
io._DIRECTORY_DELETE = 32;
io._DIRECTORY_EXISTS = 33;
io._DIRECTORY_CREATE_TEMP = 34;
io._DIRECTORY_LIST_START = 35;
io._DIRECTORY_LIST_NEXT = 36;
io._DIRECTORY_LIST_STOP = 37;
io._DIRECTORY_RENAME = 38;
io._SSL_PROCESS_FILTER = 39;
io._IOService = class _IOService extends core.Object {
  static _dispatch(request, data) {
    dart.throw(new core.UnsupportedError("_IOService._dispatch"));
  }
};
dart.setSignature(io._IOService, {
  statics: () => ({_dispatch: dart.definiteFunctionType(async.Future, [core.int, core.List])}),
  names: ['_dispatch']
});
io.Link = class Link extends core.Object {
  static new(path) {
    return new io._Link(path);
  }
  static fromUri(uri) {
    return io.Link.new(uri.toFilePath());
  }
};
io.Link[dart.implements] = () => [io.FileSystemEntity];
dart.setSignature(io.Link, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.Link, [core.String]),
    fromUri: dart.definiteFunctionType(io.Link, [core.Uri])
  })
});
const _makeWindowsLinkTarget = Symbol('_makeWindowsLinkTarget');
const _exceptionFromResponse = Symbol('_exceptionFromResponse');
io._Link = class _Link extends io.FileSystemEntity {
  new(path) {
    this.path = path;
    if (!(typeof this.path == 'string')) {
      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
    }
  }
  toString() {
    return dart.str`Link: '${this.path}'`;
  }
  exists() {
    return io.FileSystemEntity.isLink(this.path);
  }
  existsSync() {
    return io.FileSystemEntity.isLinkSync(this.path);
  }
  get absolute() {
    return io.Link.new(this[_absolutePath]);
  }
  stat() {
    return io.FileStat.stat(this.path);
  }
  statSync() {
    return io.FileStat.statSync(this.path);
  }
  create(target, opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(io.Platform.isWindows)) {
      target = this[_makeWindowsLinkTarget](target);
    }
    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
    return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE_LINK, JSArrayOfString().of([this.path, target])), dynamicToFuture())).then(io._Link)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot create link to target '${target}'`, this.path));
      }
      return this;
    }, dynamicTo_Link()));
  }
  createSync(target, opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      this.parent.createSync({recursive: true});
    }
    if (dart.test(io.Platform.isWindows)) {
      target = this[_makeWindowsLinkTarget](target);
    }
    let result = io._File._createLink(this.path, target);
    io._Link.throwIfError(result, "Cannot create link", this.path);
  }
  [_makeWindowsLinkTarget](target) {
    let base = core.Uri.file(dart.str`${io.Directory.current.path}\\`);
    let link = core.Uri.file(this.path);
    let destination = core.Uri.file(target);
    let result = base.resolveUri(link).resolveUri(destination).toFilePath();
    if (dart.notNull(result[dartx.length]) > 3 && result[dartx._get](1) == ':' && result[dartx._get](2) == '\\') {
      return dart.str`\\??\\${result}`;
    } else {
      dart.throw(new io.FileSystemException(dart.str`Target ${result} of Link.create on Windows cannot be converted` + ' to start with a drive letter.  Unexpected error.'));
    }
  }
  updateSync(target) {
    this.deleteSync();
    this.createSync(target);
  }
  update(target) {
    return this.delete().then(io.Link)(dart.fn(_ => this.create(target), FileSystemEntityToFutureOfLink()));
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).delete({recursive: true}).then(io._Link)(dart.fn(_ => this, FileSystemEntityTo_Link()));
    }
    return io._IOService._dispatch(io._FILE_DELETE_LINK, JSArrayOfString().of([this.path])).then(io._Link)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot delete link", this.path));
      }
      return this;
    }, dynamicTo_Link()));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).deleteSync({recursive: true});
    }
    let result = io._File._deleteLinkNative(this.path);
    io._Link.throwIfError(result, "Cannot delete link", this.path);
  }
  rename(newPath) {
    return io._IOService._dispatch(io._FILE_RENAME_LINK, JSArrayOfString().of([this.path, newPath])).then(io.Link)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot rename link to '${newPath}'`, this.path));
      }
      return io.Link.new(newPath);
    }, dynamicToLink()));
  }
  renameSync(newPath) {
    let result = io._File._renameLink(this.path, newPath);
    io._Link.throwIfError(result, dart.str`Cannot rename link '${this.path}' to '${newPath}'`);
    return io.Link.new(newPath);
  }
  target() {
    return io._IOService._dispatch(io._FILE_LINK_TARGET, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot get target of link", this.path));
      }
      return FutureOrOfString()._check(response);
    }, dynamicToFutureOrOfString()));
  }
  targetSync() {
    let result = io._File._linkTarget(this.path);
    io._Link.throwIfError(result, "Cannot read link", this.path);
    return core.String._check(result);
  }
  static throwIfError(result, msg, path) {
    if (path === void 0) path = "";
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException(msg, path, result));
    }
  }
  [_isErrorResponse](response) {
    return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
  }
  [_exceptionFromResponse](response, message, path) {
    dart.assert(this[_isErrorResponse](response));
    switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
      case io._ILLEGAL_ARGUMENT_RESPONSE:
      {
        return new core.ArgumentError();
      }
      case io._OSERROR_RESPONSE:
      {
        let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
        return new io.FileSystemException(message, path, err);
      }
      default:
      {
        return core.Exception.new("Unknown error");
      }
    }
  }
};
io._Link[dart.implements] = () => [io.Link];
dart.setSignature(io._Link, {
  constructors: () => ({new: dart.definiteFunctionType(io._Link, [core.String])}),
  fields: () => ({path: core.String}),
  getters: () => ({absolute: dart.definiteFunctionType(io.Link, [])}),
  methods: () => ({
    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
    existsSync: dart.definiteFunctionType(core.bool, []),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
    statSync: dart.definiteFunctionType(io.FileStat, []),
    create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
    createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
    [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
    updateSync: dart.definiteFunctionType(dart.void, [core.String]),
    update: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
    [_delete]: dart.definiteFunctionType(async.Future$(io.Link), [], {recursive: core.bool}),
    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    rename: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
    renameSync: dart.definiteFunctionType(io.Link, [core.String]),
    target: dart.definiteFunctionType(async.Future$(core.String), []),
    targetSync: dart.definiteFunctionType(core.String, []),
    [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [_exceptionFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])
  }),
  statics: () => ({throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String])}),
  names: ['throwIfError']
});
io.Platform = class Platform extends core.Object {
  static get numberOfProcessors() {
    return io.Platform._numberOfProcessors;
  }
  static get pathSeparator() {
    return io.Platform._pathSeparator;
  }
  static get operatingSystem() {
    return io.Platform._operatingSystem;
  }
  static get localHostname() {
    return io.Platform._localHostname;
  }
  static get environment() {
    return io._Platform.environment;
  }
  static get executable() {
    return io._Platform.executable;
  }
  static get resolvedExecutable() {
    return io._Platform.resolvedExecutable;
  }
  static get script() {
    return io._Platform.script;
  }
  static get executableArguments() {
    return io._Platform.executableArguments;
  }
  static get packageRoot() {
    return io._Platform.packageRoot;
  }
  static get packageConfig() {
    return io._Platform.packageConfig;
  }
  static get version() {
    return io.Platform._version;
  }
};
dart.setSignature(io.Platform, {
  sfields: () => ({
    _numberOfProcessors: core.int,
    _pathSeparator: core.String,
    _operatingSystem: core.String,
    _localHostname: core.String,
    _version: core.String,
    isLinux: core.bool,
    isMacOS: core.bool,
    isWindows: core.bool,
    isAndroid: core.bool,
    isIOS: core.bool
  }),
  sgetters: () => ({
    numberOfProcessors: dart.definiteFunctionType(core.int, []),
    pathSeparator: dart.definiteFunctionType(core.String, []),
    operatingSystem: dart.definiteFunctionType(core.String, []),
    localHostname: dart.definiteFunctionType(core.String, []),
    environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    executable: dart.definiteFunctionType(core.String, []),
    resolvedExecutable: dart.definiteFunctionType(core.String, []),
    script: dart.definiteFunctionType(core.Uri, []),
    executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
    packageRoot: dart.definiteFunctionType(core.String, []),
    packageConfig: dart.definiteFunctionType(core.String, []),
    version: dart.definiteFunctionType(core.String, [])
  })
});
dart.defineLazy(io.Platform, {
  get _numberOfProcessors() {
    return io._Platform.numberOfProcessors;
  },
  get _pathSeparator() {
    return io._Platform.pathSeparator;
  },
  get _operatingSystem() {
    return io._Platform.operatingSystem;
  },
  get _localHostname() {
    return io._Platform.localHostname;
  },
  get _version() {
    return io._Platform.version;
  },
  get isLinux() {
    return io.Platform._operatingSystem == "linux";
  },
  get isMacOS() {
    return io.Platform._operatingSystem == "macos";
  },
  get isWindows() {
    return io.Platform._operatingSystem == "windows";
  },
  get isAndroid() {
    return io.Platform._operatingSystem == "android";
  },
  get isIOS() {
    return io.Platform._operatingSystem == "ios";
  }
});
io._Platform = class _Platform extends core.Object {
  static _numberOfProcessors() {
    dart.throw(new core.UnsupportedError("Platform._numberOfProcessors"));
  }
  static _pathSeparator() {
    dart.throw(new core.UnsupportedError("Platform._pathSeparator"));
  }
  static _operatingSystem() {
    dart.throw(new core.UnsupportedError("Platform._operatingSystem"));
  }
  static _localHostname() {
    dart.throw(new core.UnsupportedError("Platform._localHostname"));
  }
  static _executable() {
    dart.throw(new core.UnsupportedError("Platform._executable"));
  }
  static _resolvedExecutable() {
    dart.throw(new core.UnsupportedError("Platform._resolvedExecutable"));
  }
  static _environment() {
    dart.throw(new core.UnsupportedError("Platform._environment"));
  }
  static _executableArguments() {
    dart.throw(new core.UnsupportedError("Platform._executableArguments"));
  }
  static _packageRoot() {
    dart.throw(new core.UnsupportedError("Platform._packageRoot"));
  }
  static _packageConfig() {
    dart.throw(new core.UnsupportedError("Platform._packageConfig"));
  }
  static _version() {
    dart.throw(new core.UnsupportedError("Platform._version"));
  }
  static get numberOfProcessors() {
    return io._Platform._numberOfProcessors();
  }
  static get pathSeparator() {
    return io._Platform._pathSeparator();
  }
  static get operatingSystem() {
    return io._Platform._operatingSystem();
  }
  static get localHostname() {
    let result = io._Platform._localHostname();
    if (io.OSError.is(result)) {
      dart.throw(result);
    } else {
      return core.String._check(result);
    }
  }
  static get executableArguments() {
    return io._Platform._executableArguments();
  }
  static get environment() {
    if (io._Platform._environmentCache == null) {
      let env = io._Platform._environment();
      if (!io.OSError.is(env)) {
        let isWindows = io._Platform.operatingSystem == 'windows';
        let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
        for (let str of core.Iterable._check(env)) {
          let equalsIndex = dart.dsend(str, 'indexOf', '=');
          if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
            result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
          }
        }
        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
      } else {
        io._Platform._environmentCache = env;
      }
    }
    if (io.OSError.is(io._Platform._environmentCache)) {
      dart.throw(io._Platform._environmentCache);
    } else {
      return MapOfString$String()._check(io._Platform._environmentCache);
    }
  }
  static get version() {
    return io._Platform._version();
  }
};
dart.setSignature(io._Platform, {
  sfields: () => ({
    executable: core.String,
    resolvedExecutable: core.String,
    packageRoot: core.String,
    packageConfig: core.String,
    _environmentCache: dart.dynamic,
    script: core.Uri
  }),
  sgetters: () => ({
    numberOfProcessors: dart.definiteFunctionType(core.int, []),
    pathSeparator: dart.definiteFunctionType(core.String, []),
    operatingSystem: dart.definiteFunctionType(core.String, []),
    localHostname: dart.definiteFunctionType(core.String, []),
    executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
    environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    version: dart.definiteFunctionType(core.String, [])
  }),
  statics: () => ({
    _numberOfProcessors: dart.definiteFunctionType(core.int, []),
    _pathSeparator: dart.definiteFunctionType(core.String, []),
    _operatingSystem: dart.definiteFunctionType(core.String, []),
    _localHostname: dart.definiteFunctionType(dart.dynamic, []),
    _executable: dart.definiteFunctionType(dart.dynamic, []),
    _resolvedExecutable: dart.definiteFunctionType(dart.dynamic, []),
    _environment: dart.definiteFunctionType(dart.dynamic, []),
    _executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
    _packageRoot: dart.definiteFunctionType(core.String, []),
    _packageConfig: dart.definiteFunctionType(core.String, []),
    _version: dart.definiteFunctionType(core.String, [])
  }),
  names: ['_numberOfProcessors', '_pathSeparator', '_operatingSystem', '_localHostname', '_executable', '_resolvedExecutable', '_environment', '_executableArguments', '_packageRoot', '_packageConfig', '_version']
});
io._Platform._environmentCache = null;
io._Platform.script = null;
dart.defineLazy(io._Platform, {
  get executable() {
    return core.String._check(io._Platform._executable());
  },
  set executable(_) {},
  get resolvedExecutable() {
    return core.String._check(io._Platform._resolvedExecutable());
  },
  set resolvedExecutable(_) {},
  get packageRoot() {
    return io._Platform._packageRoot();
  },
  set packageRoot(_) {},
  get packageConfig() {
    return io._Platform._packageConfig();
  },
  set packageConfig(_) {}
});
const _map$1 = Symbol('_map');
io._CaseInsensitiveStringMap$ = dart.generic(V => {
  let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
  class _CaseInsensitiveStringMap extends core.Object {
    new() {
      this[_map$1] = MapOfString$V().new();
    }
    containsKey(key) {
      return typeof key == 'string' && dart.test(this[_map$1][dartx.containsKey](key[dartx.toUpperCase]()));
    }
    containsValue(value) {
      return this[_map$1][dartx.containsValue](value);
    }
    _get(key) {
      return typeof key == 'string' ? this[_map$1][dartx._get](key[dartx.toUpperCase]()) : null;
    }
    _set(key, value) {
      V._check(value);
      this[_map$1][dartx._set](key[dartx.toUpperCase](), value);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      VoidToV()._check(ifAbsent);
      return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
    }
    remove(key) {
      return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
    }
    clear() {
      this[_map$1][dartx.clear]();
    }
    forEach(f) {
      this[_map$1][dartx.forEach](f);
    }
    get keys() {
      return this[_map$1][dartx.keys];
    }
    get values() {
      return this[_map$1][dartx.values];
    }
    get length() {
      return this[_map$1][dartx.length];
    }
    get isEmpty() {
      return this[_map$1][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map$1][dartx.isNotEmpty];
    }
    toString() {
      return dart.toString(this[_map$1]);
    }
  }
  dart.addTypeTests(_CaseInsensitiveStringMap);
  _CaseInsensitiveStringMap[dart.implements] = () => [MapOfString$V()];
  dart.setSignature(_CaseInsensitiveStringMap, {
    fields: () => ({[_map$1]: MapOfString$V()}),
    getters: () => ({
      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
      values: dart.definiteFunctionType(core.Iterable$(V), []),
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(V, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, V]),
      putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
      remove: dart.definiteFunctionType(V, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
    })
  });
  dart.defineExtensionMembers(_CaseInsensitiveStringMap, [
    'containsKey',
    'containsValue',
    '_get',
    '_set',
    'putIfAbsent',
    'addAll',
    'remove',
    'clear',
    'forEach',
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  return _CaseInsensitiveStringMap;
});
io._CaseInsensitiveStringMap = _CaseInsensitiveStringMap();
io._ProcessUtils = class _ProcessUtils extends core.Object {
  static _exit(status) {
    dart.throw(new core.UnsupportedError("ProcessUtils._exit"));
  }
  static _setExitCode(status) {
    dart.throw(new core.UnsupportedError("ProcessUtils._setExitCode"));
  }
  static _getExitCode() {
    dart.throw(new core.UnsupportedError("ProcessUtils._getExitCode"));
  }
  static _sleep(millis) {
    dart.throw(new core.UnsupportedError("ProcessUtils._sleep"));
  }
  static _pid(process) {
    dart.throw(new core.UnsupportedError("ProcessUtils._pid"));
  }
  static _watchSignal(signal) {
    dart.throw(new core.UnsupportedError("ProcessUtils._watchSignal"));
  }
};
dart.setSignature(io._ProcessUtils, {
  statics: () => ({
    _exit: dart.definiteFunctionType(dart.void, [core.int]),
    _setExitCode: dart.definiteFunctionType(dart.void, [core.int]),
    _getExitCode: dart.definiteFunctionType(core.int, []),
    _sleep: dart.definiteFunctionType(dart.void, [core.int]),
    _pid: dart.definiteFunctionType(core.int, [io.Process]),
    _watchSignal: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [io.ProcessSignal])
  }),
  names: ['_exit', '_setExitCode', '_getExitCode', '_sleep', '_pid', '_watchSignal']
});
io.exit = function(code) {
  if (!(typeof code == 'number')) {
    dart.throw(new core.ArgumentError("Integer value for exit code expected"));
  }
  io._ProcessUtils._exit(code);
};
dart.fn(io.exit, intTovoid());
dart.copyProperties(io, {
  set exitCode(code) {
    if (!(typeof code == 'number')) {
      dart.throw(new core.ArgumentError("Integer value for exit code expected"));
    }
    io._ProcessUtils._setExitCode(code);
  },
  get exitCode() {
    return io._ProcessUtils._getExitCode();
  }
});
io.sleep = function(duration) {
  let milliseconds = duration.inMilliseconds;
  if (dart.notNull(milliseconds) < 0) {
    dart.throw(new core.ArgumentError("sleep: duration cannot be negative"));
  }
  io._ProcessUtils._sleep(milliseconds);
};
dart.fn(io.sleep, DurationTovoid());
dart.copyProperties(io, {
  get pid() {
    return io._ProcessUtils._pid(null);
  }
});
io.ProcessStartMode = class ProcessStartMode extends core.Object {
  new(index) {
    this.index = index;
  }
  toString() {
    return {
      0: "ProcessStartMode.NORMAL",
      1: "ProcessStartMode.DETACHED",
      2: "ProcessStartMode.DETACHED_WITH_STDIO"
    }[this.index];
  }
};
dart.setSignature(io.ProcessStartMode, {
  fields: () => ({index: core.int})
});
dart.defineEnumValues(io.ProcessStartMode, [
  'NORMAL',
  'DETACHED',
  'DETACHED_WITH_STDIO'
]);
io.Process = class Process extends core.Object {
  new() {
    this.exitCode = null;
  }
  static start(executable, arguments$, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let mode = opts && 'mode' in opts ? opts.mode : io.ProcessStartMode.NORMAL;
    dart.throw(new core.UnsupportedError("Process.start"));
  }
  static run(executable, arguments$, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
    dart.throw(new core.UnsupportedError("Process.run"));
  }
  static runSync(executable, arguments$, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
    dart.throw(new core.UnsupportedError("Process.runSync"));
  }
  static killPid(pid, signal) {
    if (signal === void 0) signal = io.ProcessSignal.SIGTERM;
    dart.throw(new core.UnsupportedError("Process.killPid"));
  }
};
dart.setSignature(io.Process, {
  fields: () => ({exitCode: FutureOfint()}),
  statics: () => ({
    start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
    run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
    runSync: dart.definiteFunctionType(io.ProcessResult, [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
    killPid: dart.definiteFunctionType(core.bool, [core.int], [io.ProcessSignal])
  }),
  names: ['start', 'run', 'runSync', 'killPid']
});
io.ProcessResult = class ProcessResult extends core.Object {
  new(pid, exitCode, stdout, stderr) {
    this.pid = pid;
    this.exitCode = exitCode;
    this.stdout = stdout;
    this.stderr = stderr;
  }
};
dart.setSignature(io.ProcessResult, {
  constructors: () => ({new: dart.definiteFunctionType(io.ProcessResult, [core.int, core.int, dart.dynamic, dart.dynamic])}),
  fields: () => ({
    exitCode: core.int,
    stdout: dart.dynamic,
    stderr: dart.dynamic,
    pid: core.int
  })
});
const _signalNumber = Symbol('_signalNumber');
const _name$2 = Symbol('_name');
io.ProcessSignal = class ProcessSignal extends core.Object {
  _(signalNumber, name) {
    this[_signalNumber] = signalNumber;
    this[_name$2] = name;
  }
  toString() {
    return this[_name$2];
  }
  watch() {
    return io._ProcessUtils._watchSignal(this);
  }
};
dart.defineNamedConstructor(io.ProcessSignal, '_');
dart.setSignature(io.ProcessSignal, {
  constructors: () => ({_: dart.definiteFunctionType(io.ProcessSignal, [core.int, core.String])}),
  fields: () => ({
    [_signalNumber]: core.int,
    [_name$2]: core.String
  }),
  methods: () => ({watch: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [])}),
  sfields: () => ({
    SIGHUP: io.ProcessSignal,
    SIGINT: io.ProcessSignal,
    SIGQUIT: io.ProcessSignal,
    SIGILL: io.ProcessSignal,
    SIGTRAP: io.ProcessSignal,
    SIGABRT: io.ProcessSignal,
    SIGBUS: io.ProcessSignal,
    SIGFPE: io.ProcessSignal,
    SIGKILL: io.ProcessSignal,
    SIGUSR1: io.ProcessSignal,
    SIGSEGV: io.ProcessSignal,
    SIGUSR2: io.ProcessSignal,
    SIGPIPE: io.ProcessSignal,
    SIGALRM: io.ProcessSignal,
    SIGTERM: io.ProcessSignal,
    SIGCHLD: io.ProcessSignal,
    SIGCONT: io.ProcessSignal,
    SIGSTOP: io.ProcessSignal,
    SIGTSTP: io.ProcessSignal,
    SIGTTIN: io.ProcessSignal,
    SIGTTOU: io.ProcessSignal,
    SIGURG: io.ProcessSignal,
    SIGXCPU: io.ProcessSignal,
    SIGXFSZ: io.ProcessSignal,
    SIGVTALRM: io.ProcessSignal,
    SIGPROF: io.ProcessSignal,
    SIGWINCH: io.ProcessSignal,
    SIGPOLL: io.ProcessSignal,
    SIGSYS: io.ProcessSignal
  })
});
dart.defineLazy(io.ProcessSignal, {
  get SIGHUP() {
    return dart.const(new io.ProcessSignal._(1, "SIGHUP"));
  },
  get SIGINT() {
    return dart.const(new io.ProcessSignal._(2, "SIGINT"));
  },
  get SIGQUIT() {
    return dart.const(new io.ProcessSignal._(3, "SIGQUIT"));
  },
  get SIGILL() {
    return dart.const(new io.ProcessSignal._(4, "SIGILL"));
  },
  get SIGTRAP() {
    return dart.const(new io.ProcessSignal._(5, "SIGTRAP"));
  },
  get SIGABRT() {
    return dart.const(new io.ProcessSignal._(6, "SIGABRT"));
  },
  get SIGBUS() {
    return dart.const(new io.ProcessSignal._(7, "SIGBUS"));
  },
  get SIGFPE() {
    return dart.const(new io.ProcessSignal._(8, "SIGFPE"));
  },
  get SIGKILL() {
    return dart.const(new io.ProcessSignal._(9, "SIGKILL"));
  },
  get SIGUSR1() {
    return dart.const(new io.ProcessSignal._(10, "SIGUSR1"));
  },
  get SIGSEGV() {
    return dart.const(new io.ProcessSignal._(11, "SIGSEGV"));
  },
  get SIGUSR2() {
    return dart.const(new io.ProcessSignal._(12, "SIGUSR2"));
  },
  get SIGPIPE() {
    return dart.const(new io.ProcessSignal._(13, "SIGPIPE"));
  },
  get SIGALRM() {
    return dart.const(new io.ProcessSignal._(14, "SIGALRM"));
  },
  get SIGTERM() {
    return dart.const(new io.ProcessSignal._(15, "SIGTERM"));
  },
  get SIGCHLD() {
    return dart.const(new io.ProcessSignal._(17, "SIGCHLD"));
  },
  get SIGCONT() {
    return dart.const(new io.ProcessSignal._(18, "SIGCONT"));
  },
  get SIGSTOP() {
    return dart.const(new io.ProcessSignal._(19, "SIGSTOP"));
  },
  get SIGTSTP() {
    return dart.const(new io.ProcessSignal._(20, "SIGTSTP"));
  },
  get SIGTTIN() {
    return dart.const(new io.ProcessSignal._(21, "SIGTTIN"));
  },
  get SIGTTOU() {
    return dart.const(new io.ProcessSignal._(22, "SIGTTOU"));
  },
  get SIGURG() {
    return dart.const(new io.ProcessSignal._(23, "SIGURG"));
  },
  get SIGXCPU() {
    return dart.const(new io.ProcessSignal._(24, "SIGXCPU"));
  },
  get SIGXFSZ() {
    return dart.const(new io.ProcessSignal._(25, "SIGXFSZ"));
  },
  get SIGVTALRM() {
    return dart.const(new io.ProcessSignal._(26, "SIGVTALRM"));
  },
  get SIGPROF() {
    return dart.const(new io.ProcessSignal._(27, "SIGPROF"));
  },
  get SIGWINCH() {
    return dart.const(new io.ProcessSignal._(28, "SIGWINCH"));
  },
  get SIGPOLL() {
    return dart.const(new io.ProcessSignal._(29, "SIGPOLL"));
  },
  get SIGSYS() {
    return dart.const(new io.ProcessSignal._(31, "SIGSYS"));
  }
});
io.SignalException = class SignalException extends core.Object {
  new(message, osError) {
    if (osError === void 0) osError = null;
    this.message = message;
    this.osError = osError;
  }
  toString() {
    let msg = "";
    if (this.osError != null) {
      msg = dart.str`, osError: ${this.osError}`;
    }
    return dart.str`SignalException: ${this.message}${msg}`;
  }
};
io.SignalException[dart.implements] = () => [io.IOException];
dart.setSignature(io.SignalException, {
  constructors: () => ({new: dart.definiteFunctionType(io.SignalException, [core.String], [dart.dynamic])}),
  fields: () => ({
    message: core.String,
    osError: dart.dynamic
  })
});
io.ProcessException = class ProcessException extends core.Object {
  new(executable, arguments$, message, errorCode) {
    if (message === void 0) message = "";
    if (errorCode === void 0) errorCode = 0;
    this.executable = executable;
    this.arguments = arguments$;
    this.message = message;
    this.errorCode = errorCode;
  }
  toString() {
    let msg = this.message == null ? dart.str`OS error code: ${this.errorCode}` : this.message;
    let args = this.arguments[dartx.join](' ');
    return dart.str`ProcessException: ${msg}\n  Command: ${this.executable} ${args}`;
  }
};
io.ProcessException[dart.implements] = () => [io.IOException];
dart.setSignature(io.ProcessException, {
  constructors: () => ({new: dart.definiteFunctionType(io.ProcessException, [core.String, ListOfString()], [core.String, core.int])}),
  fields: () => ({
    executable: core.String,
    arguments: ListOfString(),
    message: core.String,
    errorCode: core.int
  })
});
const _detachRaw = Symbol('_detachRaw');
io.SecureSocket = class SecureSocket extends core.Object {
  static _(rawSocket) {
    dart.throw(new core.UnsupportedError("SecureSocket constructor"));
  }
  static connect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    return io.RawSecureSocket.connect(host, port, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}).then(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket()));
  }
  static secure(socket, opts) {
    let host = opts && 'host' in opts ? opts.host : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let completer = async.Completer.new();
    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
    }, dynamicToNull$()));
    return FutureOfSecureSocket()._check(completer.future);
  }
  static secureServer(socket, context, opts) {
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let completer = async.Completer.new();
    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
    }, dynamicToNull$()));
    return FutureOfSecureSocket()._check(completer.future);
  }
};
io.SecureSocket[dart.implements] = () => [io.Socket];
dart.setSignature(io.SecureSocket, {
  constructors: () => ({_: dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])}),
  statics: () => ({
    connect: dart.definiteFunctionType(async.Future$(io.SecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    secure: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket], {host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool()}),
    secureServer: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket, io.SecurityContext], {bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
  }),
  names: ['connect', 'secure', 'secureServer']
});
io.SecureServerSocket = class SecureServerSocket extends async.Stream$(io.SecureSocket) {
  _(socket) {
    this[_socket] = socket;
    super.new();
  }
  static bind(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io.RawSecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols, shared: shared}).then(io.SecureServerSocket)(dart.fn(serverSocket => new io.SecureServerSocket._(serverSocket), RawSecureServerSocketToSecureServerSocket()));
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_socket].map(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get port() {
    return this[_socket].port;
  }
  get address() {
    return this[_socket].address;
  }
  close() {
    return this[_socket].close().then(io.SecureServerSocket)(dart.fn(_ => this, RawSecureServerSocketToSecureServerSocket()));
  }
  set [_owner](owner) {
    this[_socket][_owner] = owner;
  }
};
dart.addSimpleTypeTests(io.SecureServerSocket);
dart.defineNamedConstructor(io.SecureServerSocket, '_');
dart.setSignature(io.SecureServerSocket, {
  constructors: () => ({_: dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])}),
  fields: () => ({[_socket]: io.RawSecureServerSocket}),
  getters: () => ({
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, [])
  }),
  setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.SecureSocket), [SecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [])
  }),
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
  names: ['bind']
});
const _onSubscriptionStateChange = Symbol('_onSubscriptionStateChange');
const _onPauseStateChange = Symbol('_onPauseStateChange');
io.RawSecureSocket = class RawSecureSocket extends core.Object {
  static connect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    io._RawSecureSocket._verifyFields(host, port, false, false, false, onBadCertificate);
    return io.RawSocket.connect(host, port).then(io.RawSecureSocket)(dart.fn(socket => io.RawSecureSocket.secure(socket, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}), RawSocketToFutureOfRawSecureSocket()));
  }
  static secure(socket, opts) {
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let host = opts && 'host' in opts ? opts.host : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    socket.readEventsEnabled = false;
    socket.writeEventsEnabled = false;
    return io._RawSecureSocket.connect(host != null ? host : socket.address.host, socket.port, {is_server: false, socket: socket, subscription: subscription, context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols});
  }
  static secureServer(socket, context, opts) {
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    socket.readEventsEnabled = false;
    socket.writeEventsEnabled = false;
    return io._RawSecureSocket.connect(socket.address, socket.remotePort, {context: context, is_server: true, socket: socket, subscription: subscription, bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols});
  }
};
io.RawSecureSocket[dart.implements] = () => [io.RawSocket];
dart.setSignature(io.RawSecureSocket, {
  statics: () => ({
    connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
  }),
  names: ['connect', 'secure', 'secureServer']
});
io.RawSecureServerSocket = class RawSecureServerSocket extends async.Stream$(io.RawSecureSocket) {
  _(socket, context, requestClientCertificate, requireClientCertificate, supportedProtocols) {
    this[_socket] = socket;
    this[_context] = context;
    this.requestClientCertificate = requestClientCertificate;
    this.requireClientCertificate = requireClientCertificate;
    this.supportedProtocols = supportedProtocols;
    this[_controller$0] = null;
    this[_subscription$] = null;
    this[_closed] = false;
    super.new();
    this[_controller$0] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
  }
  static bind(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io.RawServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io.RawSecureServerSocket)(dart.fn(serverSocket => new io.RawSecureServerSocket._(serverSocket, context, requestClientCertificate, requireClientCertificate, supportedProtocols), RawServerSocketToRawSecureServerSocket()));
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get port() {
    return this[_socket].port;
  }
  get address() {
    return this[_socket].address;
  }
  close() {
    this[_closed] = true;
    return this[_socket].close().then(io.RawSecureServerSocket)(dart.fn(_ => this, RawServerSocketToRawSecureServerSocket()));
  }
  [_onData$](connection) {
    let remotePort = null;
    try {
      remotePort = connection.remotePort;
    } catch (e) {
      return;
    }

    io._RawSecureSocket.connect(connection.address, core.int._check(remotePort), {context: this[_context], is_server: true, socket: connection, requestClientCertificate: this.requestClientCertificate, requireClientCertificate: this.requireClientCertificate, supportedProtocols: this.supportedProtocols}).then(dart.dynamic)(dart.fn(secureConnection => {
      if (dart.test(this[_closed])) {
        secureConnection.close();
      } else {
        this[_controller$0].add(secureConnection);
      }
    }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_closed])) {
        this[_controller$0].addError(e, core.StackTrace._check(s));
      }
    }, dynamicAnddynamicToNull()));
  }
  [_onPauseStateChange]() {
    if (dart.test(this[_controller$0].isPaused)) {
      this[_subscription$].pause();
    } else {
      this[_subscription$].resume();
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller$0].hasListener)) {
      this[_subscription$] = this[_socket].listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this[_controller$0], 'close')});
    } else {
      this.close();
    }
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
};
dart.addSimpleTypeTests(io.RawSecureServerSocket);
dart.defineNamedConstructor(io.RawSecureServerSocket, '_');
dart.setSignature(io.RawSecureServerSocket, {
  constructors: () => ({_: dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket, io.SecurityContext, core.bool, core.bool, ListOfString()])}),
  fields: () => ({
    [_socket]: io.RawServerSocket,
    [_controller$0]: StreamControllerOfRawSecureSocket(),
    [_subscription$]: StreamSubscriptionOfRawSocket(),
    [_context]: io.SecurityContext,
    requestClientCertificate: core.bool,
    requireClientCertificate: core.bool,
    supportedProtocols: ListOfString(),
    [_closed]: core.bool
  }),
  getters: () => ({
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, [])
  }),
  setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSecureSocket), [RawSecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), []),
    [_onData$]: dart.definiteFunctionType(dart.void, [io.RawSocket]),
    [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
    [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, [])
  }),
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
  names: ['bind']
});
io.X509Certificate = class X509Certificate extends core.Object {
  static _() {
    dart.throw(new core.UnsupportedError("X509Certificate constructor"));
  }
};
dart.setSignature(io.X509Certificate, {
  constructors: () => ({_: dart.definiteFunctionType(io.X509Certificate, [])})
});
io._FilterStatus = class _FilterStatus extends core.Object {
  new() {
    this.progress = false;
    this.readEmpty = true;
    this.writeEmpty = true;
    this.readPlaintextNoLongerEmpty = false;
    this.writePlaintextNoLongerFull = false;
    this.readEncryptedNoLongerFull = false;
    this.writeEncryptedNoLongerEmpty = false;
  }
};
dart.setSignature(io._FilterStatus, {
  constructors: () => ({new: dart.definiteFunctionType(io._FilterStatus, [])}),
  fields: () => ({
    progress: core.bool,
    readEmpty: core.bool,
    writeEmpty: core.bool,
    readPlaintextNoLongerEmpty: core.bool,
    writePlaintextNoLongerFull: core.bool,
    readEncryptedNoLongerFull: core.bool,
    writeEncryptedNoLongerEmpty: core.bool
  })
});
const _handshakeComplete = Symbol('_handshakeComplete');
const _status = Symbol('_status');
const _filterStatus = Symbol('_filterStatus');
const _secureFilter = Symbol('_secureFilter');
const _bufferedData = Symbol('_bufferedData');
const _bufferedDataIndex = Symbol('_bufferedDataIndex');
const _writeEventsEnabled = Symbol('_writeEventsEnabled');
const _readEventsEnabled = Symbol('_readEventsEnabled');
const _pendingReadEvent = Symbol('_pendingReadEvent');
const _socketClosedRead = Symbol('_socketClosedRead');
const _socketClosedWrite = Symbol('_socketClosedWrite');
const _closedRead = Symbol('_closedRead');
const _closedWrite = Symbol('_closedWrite');
const _connectPending = Symbol('_connectPending');
const _filterPending = Symbol('_filterPending');
const _filterActive = Symbol('_filterActive');
const _selectedProtocol = Symbol('_selectedProtocol');
const _secureHandshakeCompleteHandler = Symbol('_secureHandshakeCompleteHandler');
const _onBadCertificateWrapper = Symbol('_onBadCertificateWrapper');
const _eventDispatcher = Symbol('_eventDispatcher');
const _doneHandler = Symbol('_doneHandler');
const _secureHandshake = Symbol('_secureHandshake');
const _sendWriteEvent = Symbol('_sendWriteEvent');
const _completeCloseCompleter = Symbol('_completeCloseCompleter');
const _close$0 = Symbol('_close');
const _scheduleReadEvent = Symbol('_scheduleReadEvent');
const _scheduleFilter = Symbol('_scheduleFilter');
const _readHandler = Symbol('_readHandler');
const _writeHandler = Symbol('_writeHandler');
const _closeHandler = Symbol('_closeHandler');
const _readSocket = Symbol('_readSocket');
const _writeSocket = Symbol('_writeSocket');
const _tryFilter = Symbol('_tryFilter');
const _pushAllFilterStages = Symbol('_pushAllFilterStages');
const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
const _sendReadEvent = Symbol('_sendReadEvent');
let const$75;
io.RawSocketEvent = class RawSocketEvent extends core.Object {
  _(value) {
    this[_value$1] = value;
  }
  toString() {
    return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
  }
};
dart.defineNamedConstructor(io.RawSocketEvent, '_');
dart.setSignature(io.RawSocketEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.RawSocketEvent, [core.int])}),
  fields: () => ({[_value$1]: core.int}),
  sfields: () => ({
    READ: io.RawSocketEvent,
    WRITE: io.RawSocketEvent,
    READ_CLOSED: io.RawSocketEvent,
    CLOSED: io.RawSocketEvent
  })
});
dart.defineLazy(io.RawSocketEvent, {
  get READ() {
    return dart.const(new io.RawSocketEvent._(0));
  },
  get WRITE() {
    return dart.const(new io.RawSocketEvent._(1));
  },
  get READ_CLOSED() {
    return dart.const(new io.RawSocketEvent._(2));
  },
  get CLOSED() {
    return dart.const(new io.RawSocketEvent._(3));
  }
});
io._RawSecureSocket = class _RawSecureSocket extends async.Stream$(io.RawSocketEvent) {
  static _isBufferEncrypted(identifier) {
    return dart.notNull(identifier) >= dart.notNull(io._RawSecureSocket.READ_ENCRYPTED);
  }
  static connect(host, requestedPort, opts) {
    let is_server = opts && 'is_server' in opts ? opts.is_server : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let socket = opts && 'socket' in opts ? opts.socket : null;
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    io._RawSecureSocket._verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate);
    if (io.InternetAddress.is(host)) host = dart.dload(host, 'host');
    let address = socket.address;
    if (host != null) {
      address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
    }
    return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
  }
  new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
    this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
    this[_status] = io._RawSecureSocket.HANDSHAKE;
    this[_closeCompleter] = async.Completer.new();
    this[_filterStatus] = new io._FilterStatus();
    this[_secureFilter] = io._SecureFilter.new();
    this.address = address;
    this.is_server = is_server;
    this.context = context;
    this[_socket] = socket;
    this[_socketSubscription] = socketSubscription;
    this[_bufferedData] = bufferedData;
    this.requestClientCertificate = requestClientCertificate;
    this.requireClientCertificate = requireClientCertificate;
    this.onBadCertificate = onBadCertificate;
    this[_controller$0] = null;
    this[_stream$] = null;
    this[_bufferedDataIndex] = 0;
    this[_writeEventsEnabled] = true;
    this[_readEventsEnabled] = true;
    this[_pauseCount$] = 0;
    this[_pendingReadEvent] = false;
    this[_socketClosedRead] = false;
    this[_socketClosedWrite] = false;
    this[_closedRead] = false;
    this[_closedWrite] = false;
    this[_connectPending] = true;
    this[_filterPending] = false;
    this[_filterActive] = false;
    this[_selectedProtocol] = null;
    super.new();
    if (this.context == null) {
      this.context = io.SecurityContext.defaultContext;
    }
    this[_controller$0] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
    this[_stream$] = this[_controller$0].stream;
    this[_secureFilter].init();
    this[_secureFilter].registerHandshakeCompleteCallback(dart.bind(this, _secureHandshakeCompleteHandler));
    if (this.onBadCertificate != null) {
      this[_secureFilter].registerBadCertificateCallback(dart.bind(this, _onBadCertificateWrapper));
    }
    this[_socket].readEventsEnabled = true;
    this[_socket].writeEventsEnabled = false;
    if (this[_socketSubscription] == null) {
      this[_socketSubscription] = this[_socket].listen(dart.bind(this, _eventDispatcher), {onError: dart.bind(this, _reportError), onDone: dart.bind(this, _doneHandler)});
    } else {
      if (dart.test(this[_socketSubscription].isPaused)) {
        this[_socket].close();
        dart.throw(new core.ArgumentError("Subscription passed to TLS upgrade is paused"));
      }
      let s = this[_socket];
      if (dart.test(dart.dload(dart.dload(s, _socket), 'closedReadEventSent'))) {
        this[_eventDispatcher](io.RawSocketEvent.READ_CLOSED);
      }
      let _ = this[_socketSubscription];
      _.onData(dart.bind(this, _eventDispatcher));
      _.onError(dart.bind(this, _reportError));
      _.onDone(dart.bind(this, _doneHandler));
    }
    try {
      let encodedProtocols = io.SecurityContext._protocolsToLengthEncoding(supportedProtocols);
      this[_secureFilter].connect(this.address.host, this.context, this.is_server, dart.test(this.requestClientCertificate) || dart.test(this.requireClientCertificate), this.requireClientCertificate, encodedProtocols);
      this[_secureHandshake]();
    } catch (e) {
      let s = dart.stackTrace(e);
      this[_reportError](e, s);
    }

  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    this[_sendWriteEvent]();
    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  static _verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate) {
    if (!(typeof host == 'string') && !io.InternetAddress.is(host)) {
      dart.throw(new core.ArgumentError("host is not a String or an InternetAddress"));
    }
    if (!(typeof requestedPort == 'number')) {
      dart.throw(new core.ArgumentError("requestedPort is not an int"));
    }
    if (dart.notNull(requestedPort) < 0 || dart.notNull(requestedPort) > 65535) {
      dart.throw(new core.ArgumentError("requestedPort is not in the range 0..65535"));
    }
    if (!(typeof requestClientCertificate == 'boolean')) {
      dart.throw(new core.ArgumentError("requestClientCertificate is not a bool"));
    }
    if (!(typeof requireClientCertificate == 'boolean')) {
      dart.throw(new core.ArgumentError("requireClientCertificate is not a bool"));
    }
    if (onBadCertificate != null && !core.Function.is(onBadCertificate)) {
      dart.throw(new core.ArgumentError("onBadCertificate is not null or a Function"));
    }
  }
  get port() {
    return this[_socket].port;
  }
  get remoteAddress() {
    return this[_socket].remoteAddress;
  }
  get remotePort() {
    return this[_socket].remotePort;
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
  available() {
    return this[_status] != io._RawSecureSocket.CONNECTED ? 0 : this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).length;
  }
  close() {
    this.shutdown(io.SocketDirection.BOTH);
    return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
  }
  [_completeCloseCompleter](dummy) {
    if (dummy === void 0) dummy = null;
    if (!dart.test(this[_closeCompleter].isCompleted)) this[_closeCompleter].complete(this);
  }
  [_close$0]() {
    this[_closedWrite] = true;
    this[_closedRead] = true;
    if (this[_socket] != null) {
      this[_socket].close().then(dart.void)(dart.bind(this, _completeCloseCompleter));
    } else {
      this[_completeCloseCompleter]();
    }
    this[_socketClosedWrite] = true;
    this[_socketClosedRead] = true;
    if (!dart.test(this[_filterActive]) && this[_secureFilter] != null) {
      this[_secureFilter].destroy();
      this[_secureFilter] = null;
    }
    if (this[_socketSubscription] != null) {
      this[_socketSubscription].cancel();
    }
    this[_controller$0].close();
    this[_status] = io._RawSecureSocket.CLOSED;
  }
  shutdown(direction) {
    if (dart.equals(direction, io.SocketDirection.SEND) || dart.equals(direction, io.SocketDirection.BOTH)) {
      this[_closedWrite] = true;
      if (dart.test(this[_filterStatus].writeEmpty)) {
        this[_socket].shutdown(io.SocketDirection.SEND);
        this[_socketClosedWrite] = true;
        if (dart.test(this[_closedRead])) {
          this[_close$0]();
        }
      }
    }
    if (dart.equals(direction, io.SocketDirection.RECEIVE) || dart.equals(direction, io.SocketDirection.BOTH)) {
      this[_closedRead] = true;
      this[_socketClosedRead] = true;
      this[_socket].shutdown(io.SocketDirection.RECEIVE);
      if (dart.test(this[_socketClosedWrite])) {
        this[_close$0]();
      }
    }
  }
  get writeEventsEnabled() {
    return this[_writeEventsEnabled];
  }
  set writeEventsEnabled(value) {
    this[_writeEventsEnabled] = value;
    if (dart.test(value)) {
      async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTovoid$()));
    }
  }
  get readEventsEnabled() {
    return this[_readEventsEnabled];
  }
  set readEventsEnabled(value) {
    this[_readEventsEnabled] = value;
    this[_scheduleReadEvent]();
  }
  read(length) {
    if (length === void 0) length = null;
    if (length != null && (!(typeof length == 'number') || dart.notNull(length) < 0)) {
      dart.throw(new core.ArgumentError(dart.str`Invalid length parameter in SecureSocket.read (length: ${length})`));
    }
    if (dart.test(this[_closedRead])) {
      dart.throw(new io.SocketException("Reading from a closed socket"));
    }
    if (this[_status] != io._RawSecureSocket.CONNECTED) {
      return null;
    }
    let result = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).read(length);
    this[_scheduleFilter]();
    return result;
  }
  write(data, offset, bytes) {
    if (offset === void 0) offset = null;
    if (bytes === void 0) bytes = null;
    if (bytes != null && (!(typeof bytes == 'number') || dart.notNull(bytes) < 0)) {
      dart.throw(new core.ArgumentError(dart.str`Invalid bytes parameter in SecureSocket.read (bytes: ${bytes})`));
    }
    if (offset != null && (!(typeof offset == 'number') || dart.notNull(offset) < 0)) {
      dart.throw(new core.ArgumentError(dart.str`Invalid offset parameter in SecureSocket.read (offset: ${offset})`));
    }
    if (dart.test(this[_closedWrite])) {
      this[_controller$0].addError(new io.SocketException("Writing to a closed socket"));
      return 0;
    }
    if (this[_status] != io._RawSecureSocket.CONNECTED) return 0;
    if (offset == null) offset = 0;
    if (bytes == null) bytes = dart.notNull(data[dartx.length]) - dart.notNull(offset);
    let written = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).write(data, offset, bytes);
    if (dart.notNull(written) > 0) {
      this[_filterStatus].writeEmpty = false;
    }
    this[_scheduleFilter]();
    return written;
  }
  get peerCertificate() {
    return this[_secureFilter].peerCertificate;
  }
  get selectedProtocol() {
    return this[_selectedProtocol];
  }
  [_onBadCertificateWrapper](certificate) {
    if (this.onBadCertificate == null) return false;
    let result = dart.dcall(this.onBadCertificate, certificate);
    if (typeof result == 'boolean') return result;
    dart.throw(new io.HandshakeException(dart.str`onBadCertificate callback returned non-boolean ${result}`));
  }
  setOption(option, enabled) {
    if (this[_socket] == null) return false;
    return this[_socket].setOption(option, enabled);
  }
  [_eventDispatcher](event) {
    try {
      if (dart.equals(event, io.RawSocketEvent.READ)) {
        this[_readHandler]();
      } else if (dart.equals(event, io.RawSocketEvent.WRITE)) {
        this[_writeHandler]();
      } else if (dart.equals(event, io.RawSocketEvent.READ_CLOSED)) {
        this[_closeHandler]();
      }
    } catch (e) {
      let stackTrace = dart.stackTrace(e);
      this[_reportError](e, stackTrace);
    }

  }
  [_readHandler]() {
    this[_readSocket]();
    this[_scheduleFilter]();
  }
  [_writeHandler]() {
    this[_writeSocket]();
    this[_scheduleFilter]();
  }
  [_doneHandler]() {
    if (dart.test(this[_filterStatus].readEmpty)) {
      this[_close$0]();
    }
  }
  [_reportError](e, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    if (this[_status] == io._RawSecureSocket.CLOSED) {
      return;
    } else if (dart.test(this[_connectPending])) {
      this[_handshakeComplete].completeError(e, stackTrace);
    } else {
      this[_controller$0].addError(e, stackTrace);
    }
    this[_close$0]();
  }
  [_closeHandler]() {
    if (this[_status] == io._RawSecureSocket.CONNECTED) {
      if (dart.test(this[_closedRead])) return;
      this[_socketClosedRead] = true;
      if (dart.test(this[_filterStatus].readEmpty)) {
        this[_closedRead] = true;
        this[_controller$0].add(io.RawSocketEvent.READ_CLOSED);
        if (dart.test(this[_socketClosedWrite])) {
          this[_close$0]();
        }
      } else {
        this[_scheduleFilter]();
      }
    } else if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
      this[_socketClosedRead] = true;
      if (dart.test(this[_filterStatus].readEmpty)) {
        this[_reportError](new io.HandshakeException('Connection terminated during handshake'), null);
      } else {
        this[_secureHandshake]();
      }
    }
  }
  [_secureHandshake]() {
    try {
      this[_secureFilter].handshake();
      this[_filterStatus].writeEmpty = false;
      this[_readSocket]();
      this[_writeSocket]();
      this[_scheduleFilter]();
    } catch (e) {
      let stackTrace = dart.stackTrace(e);
      this[_reportError](e, stackTrace);
    }

  }
  renegotiate(opts) {
    let useSessionCache = opts && 'useSessionCache' in opts ? opts.useSessionCache : true;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    if (this[_status] != io._RawSecureSocket.CONNECTED) {
      dart.throw(new io.HandshakeException("Called renegotiate on a non-connected socket"));
    }
    this[_secureFilter].renegotiate(useSessionCache, requestClientCertificate, requireClientCertificate);
    this[_status] = io._RawSecureSocket.HANDSHAKE;
    this[_filterStatus].writeEmpty = false;
    this[_scheduleFilter]();
  }
  [_secureHandshakeCompleteHandler]() {
    this[_status] = io._RawSecureSocket.CONNECTED;
    if (dart.test(this[_connectPending])) {
      this[_connectPending] = false;
      try {
        this[_selectedProtocol] = this[_secureFilter].selectedProtocol();
        async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid$()));
      } catch (error) {
        let stack = dart.stackTrace(error);
        this[_handshakeComplete].completeError(error, stack);
      }

    }
  }
  [_onPauseStateChange]() {
    if (dart.test(this[_controller$0].isPaused)) {
      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
    } else {
      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
      if (this[_pauseCount$] == 0) {
        this[_scheduleReadEvent]();
        this[_sendWriteEvent]();
      }
    }
    if (!dart.test(this[_socketClosedRead]) || !dart.test(this[_socketClosedWrite])) {
      if (dart.test(this[_controller$0].isPaused)) {
        this[_socketSubscription].pause();
      } else {
        this[_socketSubscription].resume();
      }
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller$0].hasListener)) {
    }
  }
  [_scheduleFilter]() {
    this[_filterPending] = true;
    this[_tryFilter]();
  }
  [_tryFilter]() {
    if (this[_status] == io._RawSecureSocket.CLOSED) {
      return;
    }
    if (dart.test(this[_filterPending]) && !dart.test(this[_filterActive])) {
      this[_filterActive] = true;
      this[_filterPending] = false;
      this[_pushAllFilterStages]().then(dart.dynamic)(dart.fn(status => {
        this[_filterStatus] = status;
        this[_filterActive] = false;
        if (this[_status] == io._RawSecureSocket.CLOSED) {
          this[_secureFilter].destroy();
          this[_secureFilter] = null;
          return;
        }
        this[_socket].readEventsEnabled = true;
        if (dart.test(this[_filterStatus].writeEmpty) && dart.test(this[_closedWrite]) && !dart.test(this[_socketClosedWrite])) {
          this.shutdown(io.SocketDirection.SEND);
          if (this[_status] == io._RawSecureSocket.CLOSED) {
            return;
          }
        }
        if (dart.test(this[_filterStatus].readEmpty) && dart.test(this[_socketClosedRead]) && !dart.test(this[_closedRead])) {
          if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
            this[_secureFilter].handshake();
            if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
              dart.throw(new io.HandshakeException('Connection terminated during handshake'));
            }
          }
          this[_closeHandler]();
        }
        if (this[_status] == io._RawSecureSocket.CLOSED) {
          return;
        }
        if (dart.test(this[_filterStatus].progress)) {
          this[_filterPending] = true;
          if (dart.test(this[_filterStatus].writeEncryptedNoLongerEmpty)) {
            this[_writeSocket]();
          }
          if (dart.test(this[_filterStatus].writePlaintextNoLongerFull)) {
            this[_sendWriteEvent]();
          }
          if (dart.test(this[_filterStatus].readEncryptedNoLongerFull)) {
            this[_readSocket]();
          }
          if (dart.test(this[_filterStatus].readPlaintextNoLongerEmpty)) {
            this[_scheduleReadEvent]();
          }
          if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
            this[_secureHandshake]();
          }
        }
        this[_tryFilter]();
      }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
    }
  }
  [_readSocketOrBufferedData](bytes) {
    if (this[_bufferedData] != null) {
      if (dart.notNull(bytes) > dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex])) {
        bytes = dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex]);
      }
      let result = this[_bufferedData][dartx.sublist](this[_bufferedDataIndex], dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes));
      this[_bufferedDataIndex] = dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes);
      if (this[_bufferedData][dartx.length] == this[_bufferedDataIndex]) {
        this[_bufferedData] = null;
      }
      return result;
    } else if (!dart.test(this[_socketClosedRead])) {
      return this[_socket].read(bytes);
    } else {
      return null;
    }
  }
  [_readSocket]() {
    if (this[_status] == io._RawSecureSocket.CLOSED) return;
    let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
    if (dart.notNull(buffer.writeFromSource(dart.bind(this, _readSocketOrBufferedData))) > 0) {
      this[_filterStatus].readEmpty = false;
    } else {
      this[_socket].readEventsEnabled = false;
    }
  }
  [_writeSocket]() {
    if (dart.test(this[_socketClosedWrite])) return;
    let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
    if (dart.test(buffer.readToSocket(this[_socket]))) {
      this[_socket].writeEventsEnabled = true;
    }
  }
  [_scheduleReadEvent]() {
    if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
      this[_pendingReadEvent] = true;
      async.Timer.run(dart.bind(this, _sendReadEvent));
    }
  }
  [_sendReadEvent]() {
    this[_pendingReadEvent] = false;
    if (this[_status] != io._RawSecureSocket.CLOSED && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
      this[_controller$0].add(io.RawSocketEvent.READ);
      this[_scheduleReadEvent]();
    }
  }
  [_sendWriteEvent]() {
    if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).free) > 0) {
      this[_writeEventsEnabled] = false;
      this[_controller$0].add(io.RawSocketEvent.WRITE);
    }
  }
  [_pushAllFilterStages]() {
    let wasInHandshake = this[_status] != io._RawSecureSocket.CONNECTED;
    let args = core.List.new(2 + dart.notNull(io._RawSecureSocket.NUM_BUFFERS) * 2);
    args[dartx._set](0, this[_secureFilter][_pointer]());
    args[dartx._set](1, wasInHandshake);
    let bufs = this[_secureFilter].buffers;
    for (let i = 0; i < dart.notNull(io._RawSecureSocket.NUM_BUFFERS); ++i) {
      args[dartx._set](2 * i + 2, bufs[dartx._get](i).start);
      args[dartx._set](2 * i + 3, bufs[dartx._get](i).end);
    }
    return io._IOService._dispatch(io._SSL_PROCESS_FILTER, args).then(io._FilterStatus)(dart.fn(response => {
      if (dart.equals(dart.dload(response, 'length'), 2)) {
        if (wasInHandshake) {
          this[_reportError](new io.HandshakeException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
        } else {
          this[_reportError](new io.TlsException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
        }
      }
      function start(index) {
        return core.int._check(dart.dindex(response, 2 * dart.notNull(index)));
      }
      dart.fn(start, intToint());
      function end(index) {
        return core.int._check(dart.dindex(response, 2 * dart.notNull(index) + 1));
      }
      dart.fn(end, intToint());
      let status = new io._FilterStatus();
      status.writeEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).isEmpty) && start(io._RawSecureSocket.WRITE_ENCRYPTED) == end(io._RawSecureSocket.WRITE_ENCRYPTED);
      if (wasInHandshake) status.writeEmpty = false;
      status.readEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED).isEmpty) && start(io._RawSecureSocket.READ_PLAINTEXT) == end(io._RawSecureSocket.READ_PLAINTEXT);
      let buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT);
      let new_start = start(io._RawSecureSocket.WRITE_PLAINTEXT);
      if (new_start != buffer.start) {
        status.progress = true;
        if (buffer.free == 0) {
          status.writePlaintextNoLongerFull = true;
        }
        buffer.start = new_start;
      }
      buffer = bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
      new_start = start(io._RawSecureSocket.READ_ENCRYPTED);
      if (new_start != buffer.start) {
        status.progress = true;
        if (buffer.free == 0) {
          status.readEncryptedNoLongerFull = true;
        }
        buffer.start = new_start;
      }
      buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
      let new_end = end(io._RawSecureSocket.WRITE_ENCRYPTED);
      if (new_end != buffer.end) {
        status.progress = true;
        if (buffer.length == 0) {
          status.writeEncryptedNoLongerEmpty = true;
        }
        buffer.end = new_end;
      }
      buffer = bufs[dartx._get](io._RawSecureSocket.READ_PLAINTEXT);
      new_end = end(io._RawSecureSocket.READ_PLAINTEXT);
      if (new_end != buffer.end) {
        status.progress = true;
        if (buffer.length == 0) {
          status.readPlaintextNoLongerEmpty = true;
        }
        buffer.end = new_end;
      }
      return status;
    }, dynamicTo_FilterStatus()));
  }
};
dart.addSimpleTypeTests(io._RawSecureSocket);
io._RawSecureSocket[dart.implements] = () => [io.RawSecureSocket];
dart.setSignature(io._RawSecureSocket, {
  constructors: () => ({new: dart.definiteFunctionType(io._RawSecureSocket, [io.InternetAddress, core.int, core.bool, io.SecurityContext, io.RawSocket, StreamSubscriptionOfRawSocketEvent(), ListOfint(), core.bool, core.bool, X509CertificateTodynamic(), ListOfString()])}),
  fields: () => ({
    [_socket]: io.RawSocket,
    [_handshakeComplete]: CompleterOf_RawSecureSocket(),
    [_controller$0]: StreamControllerOfRawSocketEvent(),
    [_stream$]: StreamOfRawSocketEvent(),
    [_socketSubscription]: StreamSubscriptionOfRawSocketEvent(),
    [_bufferedData]: ListOfint(),
    [_bufferedDataIndex]: core.int,
    address: io.InternetAddress,
    is_server: core.bool,
    context: io.SecurityContext,
    requestClientCertificate: core.bool,
    requireClientCertificate: core.bool,
    onBadCertificate: core.Function,
    [_status]: core.int,
    [_writeEventsEnabled]: core.bool,
    [_readEventsEnabled]: core.bool,
    [_pauseCount$]: core.int,
    [_pendingReadEvent]: core.bool,
    [_socketClosedRead]: core.bool,
    [_socketClosedWrite]: core.bool,
    [_closedRead]: core.bool,
    [_closedWrite]: core.bool,
    [_closeCompleter]: async.Completer,
    [_filterStatus]: io._FilterStatus,
    [_connectPending]: core.bool,
    [_filterPending]: core.bool,
    [_filterActive]: core.bool,
    [_secureFilter]: io._SecureFilter,
    [_selectedProtocol]: core.String
  }),
  getters: () => ({
    port: dart.definiteFunctionType(core.int, []),
    remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
    remotePort: dart.definiteFunctionType(core.int, []),
    writeEventsEnabled: dart.definiteFunctionType(core.bool, []),
    readEventsEnabled: dart.definiteFunctionType(core.bool, []),
    peerCertificate: dart.definiteFunctionType(io.X509Certificate, []),
    selectedProtocol: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({
    [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    writeEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool]),
    readEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    available: dart.definiteFunctionType(core.int, []),
    close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
    [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
    [_close$0]: dart.definiteFunctionType(dart.void, []),
    shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
    read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
    write: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
    [_onBadCertificateWrapper]: dart.definiteFunctionType(core.bool, [io.X509Certificate]),
    setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
    [_eventDispatcher]: dart.definiteFunctionType(dart.void, [io.RawSocketEvent]),
    [_readHandler]: dart.definiteFunctionType(dart.void, []),
    [_writeHandler]: dart.definiteFunctionType(dart.void, []),
    [_doneHandler]: dart.definiteFunctionType(dart.void, []),
    [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    [_closeHandler]: dart.definiteFunctionType(dart.void, []),
    [_secureHandshake]: dart.definiteFunctionType(dart.void, []),
    renegotiate: dart.definiteFunctionType(dart.void, [], {useSessionCache: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool}),
    [_secureHandshakeCompleteHandler]: dart.definiteFunctionType(dart.void, []),
    [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
    [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, []),
    [_scheduleFilter]: dart.definiteFunctionType(dart.void, []),
    [_tryFilter]: dart.definiteFunctionType(dart.void, []),
    [_readSocketOrBufferedData]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
    [_readSocket]: dart.definiteFunctionType(dart.void, []),
    [_writeSocket]: dart.definiteFunctionType(dart.void, []),
    [_scheduleReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
    [_sendReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
    [_sendWriteEvent]: dart.definiteFunctionType(dart.dynamic, []),
    [_pushAllFilterStages]: dart.definiteFunctionType(async.Future$(io._FilterStatus), [])
  }),
  sfields: () => ({
    HANDSHAKE: core.int,
    CONNECTED: core.int,
    CLOSED: core.int,
    READ_PLAINTEXT: core.int,
    WRITE_PLAINTEXT: core.int,
    READ_ENCRYPTED: core.int,
    WRITE_ENCRYPTED: core.int,
    NUM_BUFFERS: core.int
  }),
  statics: () => ({
    _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
    connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
  }),
  names: ['_isBufferEncrypted', 'connect', '_verifyFields']
});
io._RawSecureSocket.HANDSHAKE = 201;
io._RawSecureSocket.CONNECTED = 202;
io._RawSecureSocket.CLOSED = 203;
io._RawSecureSocket.READ_PLAINTEXT = 0;
io._RawSecureSocket.WRITE_PLAINTEXT = 1;
io._RawSecureSocket.READ_ENCRYPTED = 2;
io._RawSecureSocket.WRITE_ENCRYPTED = 3;
io._RawSecureSocket.NUM_BUFFERS = 4;
io._ExternalBuffer = class _ExternalBuffer extends core.Object {
  new(size) {
    this.size = size;
    this.data = null;
    this.start = null;
    this.end = null;
    this.start = core.int._check(this.end = core.int._check(dart.dsend(this.size, '~/', 2)));
  }
  advanceStart(bytes) {
    dart.assert(dart.notNull(this.start) > dart.notNull(this.end) || dart.notNull(this.start) + dart.notNull(bytes) <= dart.notNull(this.end));
    this.start = dart.notNull(this.start) + dart.notNull(bytes);
    if (dart.notNull(this.start) >= dart.notNull(core.num._check(this.size))) {
      this.start = dart.notNull(this.start) - dart.notNull(core.num._check(this.size));
      dart.assert(dart.notNull(this.start) <= dart.notNull(this.end));
      dart.assert(dart.notNull(this.start) < dart.notNull(core.num._check(this.size)));
    }
  }
  advanceEnd(bytes) {
    dart.assert(dart.notNull(this.start) <= dart.notNull(this.end) || dart.notNull(this.start) > dart.notNull(this.end) + dart.notNull(bytes));
    this.end = dart.notNull(this.end) + dart.notNull(bytes);
    if (dart.notNull(this.end) >= dart.notNull(core.num._check(this.size))) {
      this.end = dart.notNull(this.end) - dart.notNull(core.num._check(this.size));
      dart.assert(dart.notNull(this.end) < dart.notNull(this.start));
      dart.assert(dart.notNull(this.end) < dart.notNull(core.num._check(this.size)));
    }
  }
  get isEmpty() {
    return this.end == this.start;
  }
  get length() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(dart.dsend(this.size, '+', this.end), '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
  }
  get linearLength() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(this.size, '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
  }
  get free() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.notNull(this.start) - dart.notNull(this.end) - 1 : dart.dsend(dart.dsend(dart.dsend(this.size, '+', this.start), '-', this.end), '-', 1));
  }
  get linearFree() {
    if (dart.notNull(this.start) > dart.notNull(this.end)) return dart.notNull(this.start) - dart.notNull(this.end) - 1;
    if (this.start == 0) return core.int._check(dart.dsend(dart.dsend(this.size, '-', this.end), '-', 1));
    return core.int._check(dart.dsend(this.size, '-', this.end));
  }
  read(bytes) {
    if (bytes == null) {
      bytes = this.length;
    } else {
      bytes = math.min(core.int)(bytes, this.length);
    }
    if (bytes == 0) return null;
    let result = typed_data.Uint8List.new(bytes);
    let bytesRead = 0;
    while (dart.notNull(bytesRead) < dart.notNull(bytes)) {
      let toRead = math.min(core.int)(dart.notNull(bytes) - dart.notNull(bytesRead), this.linearLength);
      result[dartx.setRange](bytesRead, dart.notNull(bytesRead) + dart.notNull(toRead), this.data, this.start);
      this.advanceStart(toRead);
      bytesRead = dart.notNull(bytesRead) + dart.notNull(toRead);
    }
    return result;
  }
  write(inputData, offset, bytes) {
    if (dart.notNull(bytes) > dart.notNull(this.free)) {
      bytes = this.free;
    }
    let written = 0;
    let toWrite = math.min(core.int)(bytes, this.linearFree);
    while (dart.notNull(toWrite) > 0) {
      this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(toWrite), inputData, offset);
      this.advanceEnd(toWrite);
      offset = dart.notNull(offset) + dart.notNull(toWrite);
      written = dart.notNull(written) + dart.notNull(toWrite);
      toWrite = math.min(core.int)(dart.notNull(bytes) - dart.notNull(written), this.linearFree);
    }
    return written;
  }
  writeFromSource(getData) {
    let written = 0;
    let toWrite = this.linearFree;
    while (dart.notNull(toWrite) > 0) {
      let inputData = getData(toWrite);
      if (inputData == null || inputData[dartx.length] == 0) break;
      let len = inputData[dartx.length];
      this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(len), inputData);
      this.advanceEnd(len);
      written = dart.notNull(written) + dart.notNull(len);
      toWrite = this.linearFree;
    }
    return written;
  }
  readToSocket(socket) {
    while (true) {
      let toWrite = this.linearLength;
      if (toWrite == 0) return false;
      let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
      this.advanceStart(bytes);
      if (dart.notNull(bytes) < dart.notNull(toWrite)) {
        return true;
      }
    }
  }
};
dart.setSignature(io._ExternalBuffer, {
  constructors: () => ({new: dart.definiteFunctionType(io._ExternalBuffer, [dart.dynamic])}),
  fields: () => ({
    data: core.List,
    start: core.int,
    end: core.int,
    size: dart.dynamic
  }),
  getters: () => ({
    isEmpty: dart.definiteFunctionType(core.bool, []),
    length: dart.definiteFunctionType(core.int, []),
    linearLength: dart.definiteFunctionType(core.int, []),
    free: dart.definiteFunctionType(core.int, []),
    linearFree: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    advanceStart: dart.definiteFunctionType(dart.void, [core.int]),
    advanceEnd: dart.definiteFunctionType(dart.void, [core.int]),
    read: dart.definiteFunctionType(core.List$(core.int), [core.int]),
    write: dart.definiteFunctionType(core.int, [ListOfint(), core.int, core.int]),
    writeFromSource: dart.definiteFunctionType(core.int, [intToListOfint()]),
    readToSocket: dart.definiteFunctionType(core.bool, [io.RawSocket])
  })
});
io._SecureFilter = class _SecureFilter extends core.Object {
  static new() {
    dart.throw(new core.UnsupportedError("_SecureFilter._SecureFilter"));
  }
};
dart.setSignature(io._SecureFilter, {
  constructors: () => ({new: dart.definiteFunctionType(io._SecureFilter, [])})
});
io.TlsException = class TlsException extends core.Object {
  new(message, osError) {
    if (message === void 0) message = "";
    if (osError === void 0) osError = null;
    TlsException.prototype._.call(this, "TlsException", message, osError);
  }
  _(type, message, osError) {
    this.type = type;
    this.message = message;
    this.osError = osError;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write(this.type);
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(dart.str`: ${this.message}`);
      if (this.osError != null) {
        sb.write(dart.str` (${this.osError})`);
      }
    } else if (this.osError != null) {
      sb.write(dart.str`: ${this.osError}`);
    }
    return sb.toString();
  }
};
dart.defineNamedConstructor(io.TlsException, '_');
io.TlsException[dart.implements] = () => [io.IOException];
dart.setSignature(io.TlsException, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.TlsException, [], [core.String, io.OSError]),
    _: dart.definiteFunctionType(io.TlsException, [core.String, core.String, io.OSError])
  }),
  fields: () => ({
    type: core.String,
    message: core.String,
    osError: io.OSError
  })
});
io.HandshakeException = class HandshakeException extends io.TlsException {
  new(message, osError) {
    if (message === void 0) message = "";
    if (osError === void 0) osError = null;
    super._("HandshakeException", message, osError);
  }
};
dart.setSignature(io.HandshakeException, {
  constructors: () => ({new: dart.definiteFunctionType(io.HandshakeException, [], [core.String, io.OSError])})
});
io.CertificateException = class CertificateException extends io.TlsException {
  new(message, osError) {
    if (message === void 0) message = "";
    if (osError === void 0) osError = null;
    super._("CertificateException", message, osError);
  }
};
dart.setSignature(io.CertificateException, {
  constructors: () => ({new: dart.definiteFunctionType(io.CertificateException, [], [core.String, io.OSError])})
});
io.SecurityContext = class SecurityContext extends core.Object {
  static new() {
    dart.throw(new core.UnsupportedError("SecurityContext constructor"));
  }
  static get defaultContext() {
    dart.throw(new core.UnsupportedError("default SecurityContext getter"));
  }
  static get alpnSupported() {
    dart.throw(new core.UnsupportedError("SecurityContext alpnSupported getter"));
  }
  static _protocolsToLengthEncoding(protocols) {
    if (protocols == null || protocols[dartx.length] == 0) {
      return typed_data.Uint8List.new(0);
    }
    let protocolsLength = protocols[dartx.length];
    let expectedLength = protocolsLength;
    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
      let length = protocols[dartx._get](i)[dartx.length];
      if (dart.notNull(length) > 0 && dart.notNull(length) <= 255) {
        expectedLength = dart.notNull(expectedLength) + dart.notNull(length);
      } else {
        dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${length}).`));
      }
    }
    if (dart.notNull(expectedLength) >= 1 << 13) {
      dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
    }
    let bytes = typed_data.Uint8List.new(expectedLength);
    let bytesOffset = 0;
    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
      let proto = protocols[dartx._get](i);
      bytes[dartx._set](bytesOffset++, proto[dartx.length]);
      let bits = 0;
      for (let j = 0; j < dart.notNull(proto[dartx.length]); j++) {
        let char = proto[dartx.codeUnitAt](j);
        bits = (dart.notNull(bits) | dart.notNull(char)) >>> 0;
        bytes[dartx._set](bytesOffset++, dart.notNull(char) & 255);
      }
      if (dart.notNull(bits) > 127) {
        return io.SecurityContext._protocolsToLengthEncodingNonAsciiBailout(protocols);
      }
    }
    return bytes;
  }
  static _protocolsToLengthEncodingNonAsciiBailout(protocols) {
    function addProtocol(outBytes, protocol) {
      let protocolBytes = convert.UTF8.encode(protocol);
      let len = protocolBytes[dartx.length];
      if (dart.notNull(len) > 255) {
        dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${len})`));
      }
      outBytes[dartx.add](len);
      outBytes[dartx.addAll](protocolBytes);
    }
    dart.fn(addProtocol, ListOfintAndStringTovoid());
    let bytes = JSArrayOfint().of([]);
    for (let i = 0; i < dart.notNull(protocols[dartx.length]); i++) {
      addProtocol(bytes, protocols[dartx._get](i));
    }
    if (dart.notNull(bytes[dartx.length]) >= 1 << 13) {
      dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
    }
    return typed_data.Uint8List.fromList(bytes);
  }
};
dart.setSignature(io.SecurityContext, {
  constructors: () => ({new: dart.definiteFunctionType(io.SecurityContext, [])}),
  sgetters: () => ({
    defaultContext: dart.definiteFunctionType(io.SecurityContext, []),
    alpnSupported: dart.definiteFunctionType(core.bool, [])
  }),
  statics: () => ({
    _protocolsToLengthEncoding: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()]),
    _protocolsToLengthEncodingNonAsciiBailout: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()])
  }),
  names: ['_protocolsToLengthEncoding', '_protocolsToLengthEncodingNonAsciiBailout']
});
io._nextServiceId = 1;
io.InternetAddressType = class InternetAddressType extends core.Object {
  _(value) {
    this[_value$1] = value;
  }
  static _from(value) {
    if (value == 0) return io.InternetAddressType.IP_V4;
    if (value == 1) return io.InternetAddressType.IP_V6;
    dart.throw(new core.ArgumentError(dart.str`Invalid type: ${value}`));
  }
  get name() {
    switch (this[_value$1]) {
      case -1:
      {
        return "ANY";
      }
      case 0:
      {
        return "IP_V4";
      }
      case 1:
      {
        return "IP_V6";
      }
      default:
      {
        dart.throw(new core.ArgumentError("Invalid InternetAddress"));
      }
    }
  }
  toString() {
    return dart.str`InternetAddressType: ${this.name}`;
  }
};
dart.defineNamedConstructor(io.InternetAddressType, '_');
dart.setSignature(io.InternetAddressType, {
  constructors: () => ({
    _: dart.definiteFunctionType(io.InternetAddressType, [core.int]),
    _from: dart.definiteFunctionType(io.InternetAddressType, [core.int])
  }),
  fields: () => ({[_value$1]: core.int}),
  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
  sfields: () => ({
    IP_V4: io.InternetAddressType,
    IP_V6: io.InternetAddressType,
    ANY: io.InternetAddressType
  })
});
dart.defineLazy(io.InternetAddressType, {
  get IP_V4() {
    return dart.const(new io.InternetAddressType._(0));
  },
  get IP_V6() {
    return dart.const(new io.InternetAddressType._(1));
  },
  get ANY() {
    return dart.const(new io.InternetAddressType._(-1));
  }
});
io.InternetAddress = class InternetAddress extends core.Object {
  static get LOOPBACK_IP_V4() {
    dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V4"));
  }
  static get LOOPBACK_IP_V6() {
    dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V6"));
  }
  static get ANY_IP_V4() {
    dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V4"));
  }
  static get ANY_IP_V6() {
    dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V6"));
  }
  static new(address) {
    dart.throw(new core.UnsupportedError("InternetAddress"));
  }
  static lookup(host, opts) {
    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
    dart.throw(new core.UnsupportedError("InternetAddress.lookup"));
  }
  static _cloneWithNewHost(address, host) {
    dart.throw(new core.UnsupportedError("InternetAddress._cloneWithNewHost"));
  }
};
dart.setSignature(io.InternetAddress, {
  constructors: () => ({new: dart.definiteFunctionType(io.InternetAddress, [core.String])}),
  fields: () => ({type: io.InternetAddressType}),
  sgetters: () => ({
    LOOPBACK_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
    LOOPBACK_IP_V6: dart.definiteFunctionType(io.InternetAddress, []),
    ANY_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
    ANY_IP_V6: dart.definiteFunctionType(io.InternetAddress, [])
  }),
  statics: () => ({
    lookup: dart.definiteFunctionType(async.Future$(core.List$(io.InternetAddress)), [core.String], {type: io.InternetAddressType}),
    _cloneWithNewHost: dart.definiteFunctionType(io.InternetAddress, [io.InternetAddress, core.String])
  }),
  names: ['lookup', '_cloneWithNewHost']
});
io.NetworkInterface = class NetworkInterface extends core.Object {
  static get listSupported() {
    dart.throw(new core.UnsupportedError("NetworkInterface.listSupported"));
  }
  static list(opts) {
    let includeLoopback = opts && 'includeLoopback' in opts ? opts.includeLoopback : false;
    let includeLinkLocal = opts && 'includeLinkLocal' in opts ? opts.includeLinkLocal : false;
    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
    dart.throw(new core.UnsupportedError("NetworkInterface.list"));
  }
};
dart.setSignature(io.NetworkInterface, {
  sgetters: () => ({listSupported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({list: dart.definiteFunctionType(async.Future$(core.List$(io.NetworkInterface)), [], {includeLoopback: core.bool, includeLinkLocal: core.bool, type: io.InternetAddressType})}),
  names: ['list']
});
io.RawServerSocket = class RawServerSocket extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    dart.throw(new core.UnsupportedError("RawServerSocket.bind"));
  }
};
io.RawServerSocket[dart.implements] = () => [StreamOfRawSocket()];
dart.setSignature(io.RawServerSocket, {
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
  names: ['bind']
});
io.ServerSocket = class ServerSocket extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    dart.throw(new core.UnsupportedError("ServerSocket.bind"));
  }
};
io.ServerSocket[dart.implements] = () => [StreamOfSocket()];
dart.setSignature(io.ServerSocket, {
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.ServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
  names: ['bind']
});
io.SocketDirection = class SocketDirection extends core.Object {
  _(value) {
    this[_value$1] = value;
  }
};
dart.defineNamedConstructor(io.SocketDirection, '_');
dart.setSignature(io.SocketDirection, {
  constructors: () => ({_: dart.definiteFunctionType(io.SocketDirection, [dart.dynamic])}),
  fields: () => ({[_value$1]: dart.dynamic}),
  sfields: () => ({
    RECEIVE: io.SocketDirection,
    SEND: io.SocketDirection,
    BOTH: io.SocketDirection
  })
});
dart.defineLazy(io.SocketDirection, {
  get RECEIVE() {
    return dart.const(new io.SocketDirection._(0));
  },
  get SEND() {
    return dart.const(new io.SocketDirection._(1));
  },
  get BOTH() {
    return dart.const(new io.SocketDirection._(2));
  }
});
io.SocketOption = class SocketOption extends core.Object {
  _(value) {
    this[_value$1] = value;
  }
};
dart.defineNamedConstructor(io.SocketOption, '_');
dart.setSignature(io.SocketOption, {
  constructors: () => ({_: dart.definiteFunctionType(io.SocketOption, [dart.dynamic])}),
  fields: () => ({[_value$1]: dart.dynamic}),
  sfields: () => ({
    TCP_NODELAY: io.SocketOption,
    _IP_MULTICAST_LOOP: io.SocketOption,
    _IP_MULTICAST_HOPS: io.SocketOption,
    _IP_MULTICAST_IF: io.SocketOption,
    _IP_BROADCAST: io.SocketOption
  })
});
dart.defineLazy(io.SocketOption, {
  get TCP_NODELAY() {
    return dart.const(new io.SocketOption._(0));
  },
  get _IP_MULTICAST_LOOP() {
    return dart.const(new io.SocketOption._(1));
  },
  get _IP_MULTICAST_HOPS() {
    return dart.const(new io.SocketOption._(2));
  },
  get _IP_MULTICAST_IF() {
    return dart.const(new io.SocketOption._(3));
  },
  get _IP_BROADCAST() {
    return dart.const(new io.SocketOption._(4));
  }
});
io.RawSocket = class RawSocket extends core.Object {
  new() {
    this.readEventsEnabled = null;
    this.writeEventsEnabled = null;
  }
  static connect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    dart.throw(new core.UnsupportedError("RawSocket constructor"));
  }
};
io.RawSocket[dart.implements] = () => [StreamOfRawSocketEvent()];
dart.setSignature(io.RawSocket, {
  fields: () => ({
    readEventsEnabled: core.bool,
    writeEventsEnabled: core.bool
  }),
  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.RawSocket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
  names: ['connect']
});
io.Socket = class Socket extends core.Object {
  static connect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    dart.throw(new core.UnsupportedError("Socket constructor"));
  }
};
io.Socket[dart.implements] = () => [StreamOfListOfint(), io.IOSink];
dart.setSignature(io.Socket, {
  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.Socket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
  names: ['connect']
});
io.Datagram = class Datagram extends core.Object {
  new(data, address, port) {
    this.data = data;
    this.address = address;
    this.port = port;
  }
};
dart.setSignature(io.Datagram, {
  constructors: () => ({new: dart.definiteFunctionType(io.Datagram, [ListOfint(), io.InternetAddress, core.int])}),
  fields: () => ({
    data: ListOfint(),
    address: io.InternetAddress,
    port: core.int
  })
});
io.RawDatagramSocket = class RawDatagramSocket extends async.Stream$(io.RawSocketEvent) {
  new() {
    this.readEventsEnabled = null;
    this.writeEventsEnabled = null;
    this.multicastLoopback = null;
    this.multicastHops = null;
    this.multicastInterface = null;
    this.broadcastEnabled = null;
    super.new();
  }
  static bind(host, port, opts) {
    let reuseAddress = opts && 'reuseAddress' in opts ? opts.reuseAddress : true;
    dart.throw(new core.UnsupportedError("RawDatagramSocket.bind"));
  }
};
dart.addSimpleTypeTests(io.RawDatagramSocket);
dart.setSignature(io.RawDatagramSocket, {
  fields: () => ({
    readEventsEnabled: core.bool,
    writeEventsEnabled: core.bool,
    multicastLoopback: core.bool,
    multicastHops: core.int,
    multicastInterface: io.NetworkInterface,
    broadcastEnabled: core.bool
  }),
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawDatagramSocket), [dart.dynamic, core.int], {reuseAddress: core.bool})}),
  names: ['bind']
});
io.SocketException = class SocketException extends core.Object {
  new(message, opts) {
    let osError = opts && 'osError' in opts ? opts.osError : null;
    let address = opts && 'address' in opts ? opts.address : null;
    let port = opts && 'port' in opts ? opts.port : null;
    this.message = message;
    this.osError = osError;
    this.address = address;
    this.port = port;
  }
  closed() {
    this.message = 'Socket has been closed';
    this.osError = null;
    this.address = null;
    this.port = null;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write("SocketException");
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(dart.str`: ${this.message}`);
      if (this.osError != null) {
        sb.write(dart.str` (${this.osError})`);
      }
    } else if (this.osError != null) {
      sb.write(dart.str`: ${this.osError}`);
    }
    if (this.address != null) {
      sb.write(dart.str`, address = ${this.address.host}`);
    }
    if (this.port != null) {
      sb.write(dart.str`, port = ${this.port}`);
    }
    return sb.toString();
  }
};
dart.defineNamedConstructor(io.SocketException, 'closed');
io.SocketException[dart.implements] = () => [io.IOException];
dart.setSignature(io.SocketException, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.SocketException, [core.String], {osError: io.OSError, address: io.InternetAddress, port: core.int}),
    closed: dart.definiteFunctionType(io.SocketException, [])
  }),
  fields: () => ({
    message: core.String,
    osError: io.OSError,
    address: io.InternetAddress,
    port: core.int
  })
});
io._STDIO_HANDLE_TYPE_TERMINAL = 0;
io._STDIO_HANDLE_TYPE_PIPE = 1;
io._STDIO_HANDLE_TYPE_FILE = 2;
io._STDIO_HANDLE_TYPE_SOCKET = 3;
io._STDIO_HANDLE_TYPE_OTHER = 4;
io._StdStream = class _StdStream extends async.Stream$(core.List$(core.int)) {
  new(stream) {
    this[_stream$] = stream;
    super.new();
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
};
dart.addSimpleTypeTests(io._StdStream);
dart.setSignature(io._StdStream, {
  constructors: () => ({new: dart.definiteFunctionType(io._StdStream, [StreamOfListOfint()])}),
  fields: () => ({[_stream$]: StreamOfListOfint()}),
  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
});
io.Stdin = class Stdin extends io._StdStream {
  _(stream) {
    super.new(stream);
  }
  readLineSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : io.SYSTEM_ENCODING;
    let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
    let CR = 13;
    let LF = 10;
    let line = [];
    let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
    if (dart.test(retainNewlines)) {
      let byte = null;
      do {
        byte = this.readByteSync();
        if (dart.notNull(byte) < 0) {
          break;
        }
        line[dartx.add](byte);
      } while (byte != LF && !(byte == CR && crIsNewline));
      if (dart.test(line[dartx.isEmpty])) {
        return null;
      }
    } else if (crIsNewline) {
      while (true) {
        let byte = this.readByteSync();
        if (dart.notNull(byte) < 0) {
          if (dart.test(line[dartx.isEmpty])) return null;
          break;
        }
        if (byte == LF || byte == CR) break;
        line[dartx.add](byte);
      }
    } else {
      outer:
        while (true) {
          let byte = this.readByteSync();
          if (byte == LF) break;
          if (byte == CR) {
            do {
              byte = this.readByteSync();
              if (byte == LF) break outer;
              line[dartx.add](CR);
            } while (byte == CR);
          }
          if (dart.notNull(byte) < 0) {
            if (dart.test(line[dartx.isEmpty])) return null;
            break;
          }
          line[dartx.add](byte);
        }
    }
    return encoding.decode(ListOfint()._check(line));
  }
  set echoMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.echoMode"));
  }
  set echoMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.echoMode"));
  }
  set lineMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.lineMode"));
  }
  set lineMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.lineMode"));
  }
  readByteSync() {
    dart.throw(new core.UnsupportedError("Stdin.readByteSync"));
  }
};
dart.defineNamedConstructor(io.Stdin, '_');
io.Stdin[dart.implements] = () => [StreamOfListOfint()];
dart.setSignature(io.Stdin, {
  constructors: () => ({_: dart.definiteFunctionType(io.Stdin, [StreamOfListOfint()])}),
  setters: () => ({
    echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
    echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
    lineMode: dart.definiteFunctionType(dart.void, [core.bool]),
    lineMode: dart.definiteFunctionType(dart.void, [core.bool])
  }),
  methods: () => ({
    readLineSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding, retainNewlines: core.bool}),
    readByteSync: dart.definiteFunctionType(core.int, [])
  })
});
const _fd = Symbol('_fd');
const _nonBlocking = Symbol('_nonBlocking');
const _hasTerminal = Symbol('_hasTerminal');
const _terminalColumns = Symbol('_terminalColumns');
const _terminalLines = Symbol('_terminalLines');
io._StdSink = class _StdSink extends core.Object {
  new(sink) {
    this[_sink$0] = sink;
  }
  get encoding() {
    return this[_sink$0].encoding;
  }
  set encoding(encoding) {
    this[_sink$0].encoding = encoding;
  }
  write(object) {
    this[_sink$0].write(object);
  }
  writeln(object) {
    if (object === void 0) object = "";
    this[_sink$0].writeln(object);
  }
  writeAll(objects, sep) {
    if (sep === void 0) sep = "";
    this[_sink$0].writeAll(objects, sep);
  }
  add(data) {
    this[_sink$0].add(data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink$0].addError(error, stackTrace);
  }
  writeCharCode(charCode) {
    this[_sink$0].writeCharCode(charCode);
  }
  addStream(stream) {
    return this[_sink$0].addStream(stream);
  }
  flush() {
    return this[_sink$0].flush();
  }
  close() {
    return this[_sink$0].close();
  }
  get done() {
    return this[_sink$0].done;
  }
};
io._StdSink[dart.implements] = () => [io.IOSink];
dart.setSignature(io._StdSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._StdSink, [io.IOSink])}),
  fields: () => ({[_sink$0]: io.IOSink}),
  getters: () => ({
    encoding: dart.definiteFunctionType(convert.Encoding, []),
    done: dart.definiteFunctionType(async.Future, [])
  }),
  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
  methods: () => ({
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
    flush: dart.definiteFunctionType(async.Future, []),
    close: dart.definiteFunctionType(async.Future, [])
  })
});
io.Stdout = class Stdout extends io._StdSink {
  _(sink, fd) {
    this[_fd] = fd;
    this[_nonBlocking] = null;
    super.new(sink);
  }
  get hasTerminal() {
    return this[_hasTerminal](this[_fd]);
  }
  get terminalColumns() {
    return this[_terminalColumns](this[_fd]);
  }
  get terminalLines() {
    return this[_terminalLines](this[_fd]);
  }
  [_hasTerminal](fd) {
    dart.throw(new core.UnsupportedError("Stdout.hasTerminal"));
  }
  [_terminalColumns](fd) {
    dart.throw(new core.UnsupportedError("Stdout.terminalColumns"));
  }
  [_terminalLines](fd) {
    dart.throw(new core.UnsupportedError("Stdout.terminalLines"));
  }
  get nonBlocking() {
    if (this[_nonBlocking] == null) {
      this[_nonBlocking] = io.IOSink.new(new io._FileStreamConsumer.fromStdio(this[_fd]));
    }
    return this[_nonBlocking];
  }
};
dart.defineNamedConstructor(io.Stdout, '_');
io.Stdout[dart.implements] = () => [io.IOSink];
dart.setSignature(io.Stdout, {
  constructors: () => ({_: dart.definiteFunctionType(io.Stdout, [io.IOSink, core.int])}),
  fields: () => ({
    [_fd]: core.int,
    [_nonBlocking]: io.IOSink
  }),
  getters: () => ({
    hasTerminal: dart.definiteFunctionType(core.bool, []),
    terminalColumns: dart.definiteFunctionType(core.int, []),
    terminalLines: dart.definiteFunctionType(core.int, []),
    nonBlocking: dart.definiteFunctionType(io.IOSink, [])
  }),
  methods: () => ({
    [_hasTerminal]: dart.definiteFunctionType(core.bool, [core.int]),
    [_terminalColumns]: dart.definiteFunctionType(core.int, [core.int]),
    [_terminalLines]: dart.definiteFunctionType(core.int, [core.int])
  })
});
io.StdoutException = class StdoutException extends core.Object {
  new(message, osError) {
    if (osError === void 0) osError = null;
    this.message = message;
    this.osError = osError;
  }
  toString() {
    return dart.str`StdoutException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
  }
};
io.StdoutException[dart.implements] = () => [io.IOException];
dart.setSignature(io.StdoutException, {
  constructors: () => ({new: dart.definiteFunctionType(io.StdoutException, [core.String], [io.OSError])}),
  fields: () => ({
    message: core.String,
    osError: io.OSError
  })
});
io._StdConsumer = class _StdConsumer extends core.Object {
  new(fd) {
    this[_file] = io._File._openStdioSync(fd);
  }
  addStream(stream) {
    let completer = async.Completer.new();
    let sub = null;
    sub = stream.listen(dart.fn(data => {
      try {
        dart.dsend(this[_file], 'writeFromSync', data);
      } catch (e) {
        let s = dart.stackTrace(e);
        dart.dsend(sub, 'cancel');
        completer.completeError(e, s);
      }

    }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
    return completer.future;
  }
  close() {
    dart.dsend(this[_file], 'closeSync');
    return async.Future.value();
  }
};
io._StdConsumer[dart.implements] = () => [StreamConsumerOfListOfint()];
dart.setSignature(io._StdConsumer, {
  constructors: () => ({new: dart.definiteFunctionType(io._StdConsumer, [core.int])}),
  fields: () => ({[_file]: dart.dynamic}),
  methods: () => ({
    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
    close: dart.definiteFunctionType(async.Future, [])
  })
});
io.StdioType = class StdioType extends core.Object {
  _(name) {
    this.name = name;
  }
  toString() {
    return dart.str`StdioType: ${this.name}`;
  }
};
dart.defineNamedConstructor(io.StdioType, '_');
dart.setSignature(io.StdioType, {
  constructors: () => ({_: dart.definiteFunctionType(io.StdioType, [core.String])}),
  fields: () => ({name: core.String}),
  sfields: () => ({
    TERMINAL: io.StdioType,
    PIPE: io.StdioType,
    FILE: io.StdioType,
    OTHER: io.StdioType
  })
});
dart.defineLazy(io.StdioType, {
  get TERMINAL() {
    return dart.const(new io.StdioType._("terminal"));
  },
  get PIPE() {
    return dart.const(new io.StdioType._("pipe"));
  },
  get FILE() {
    return dart.const(new io.StdioType._("file"));
  },
  get OTHER() {
    return dart.const(new io.StdioType._("other"));
  }
});
io._stdin = null;
io._stdout = null;
io._stderr = null;
dart.copyProperties(io, {
  get stdin() {
    if (io._stdin == null) {
      io._stdin = io._StdIOUtils._getStdioInputStream();
    }
    return io._stdin;
  }
});
dart.copyProperties(io, {
  get stdout() {
    if (io._stdout == null) {
      io._stdout = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(1));
    }
    return io._stdout;
  }
});
dart.copyProperties(io, {
  get stderr() {
    if (io._stderr == null) {
      io._stderr = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(2));
    }
    return io._stderr;
  }
});
io.stdioType = function(object) {
  if (io._StdStream.is(object)) {
    object = dart.dload(object, _stream$);
  } else if (dart.equals(object, io.stdout) || dart.equals(object, io.stderr)) {
    switch (io._StdIOUtils._getStdioHandleType(dart.equals(object, io.stdout) ? 1 : 2)) {
      case io._STDIO_HANDLE_TYPE_TERMINAL:
      {
        return io.StdioType.TERMINAL;
      }
      case io._STDIO_HANDLE_TYPE_PIPE:
      {
        return io.StdioType.PIPE;
      }
      case io._STDIO_HANDLE_TYPE_FILE:
      {
        return io.StdioType.FILE;
      }
    }
  }
  if (io._FileStream.is(object)) {
    return io.StdioType.FILE;
  }
  if (io.Socket.is(object)) {
    let socketType = io._StdIOUtils._socketType(object);
    if (socketType == null) return io.StdioType.OTHER;
    switch (socketType) {
      case io._STDIO_HANDLE_TYPE_TERMINAL:
      {
        return io.StdioType.TERMINAL;
      }
      case io._STDIO_HANDLE_TYPE_PIPE:
      {
        return io.StdioType.PIPE;
      }
      case io._STDIO_HANDLE_TYPE_FILE:
      {
        return io.StdioType.FILE;
      }
    }
  }
  if (io._IOSinkImpl.is(object)) {
    try {
      if (io._FileStreamConsumer.is(object[_target$])) {
        return io.StdioType.FILE;
      }
    } catch (e) {
    }

  }
  return io.StdioType.OTHER;
};
dart.fn(io.stdioType, dynamicToStdioType());
io._StdIOUtils = class _StdIOUtils extends core.Object {
  static _getStdioOutputStream(fd) {
    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioOutputStream"));
  }
  static _getStdioInputStream() {
    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioInputStream"));
  }
  static _socketType(socket) {
    dart.throw(new core.UnsupportedError("StdIOUtils._socketType"));
  }
  static _getStdioHandleType(fd) {
    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioHandleType"));
  }
};
dart.setSignature(io._StdIOUtils, {
  statics: () => ({
    _getStdioOutputStream: dart.definiteFunctionType(dart.dynamic, [core.int]),
    _getStdioInputStream: dart.definiteFunctionType(io.Stdin, []),
    _socketType: dart.definiteFunctionType(core.int, [io.Socket]),
    _getStdioHandleType: dart.definiteFunctionType(dart.dynamic, [core.int])
  }),
  names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
});
let const$76;
let const$77;
let const$78;
let const$79;
io.SystemEncoding = class SystemEncoding extends convert.Encoding {
  new() {
    super.new();
  }
  get name() {
    return 'system';
  }
  encode(input) {
    return this.encoder.convert(input);
  }
  decode(encoded) {
    return this.decoder.convert(encoded);
  }
  get encoder() {
    if (io.Platform.operatingSystem == "windows") {
      return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
    } else {
      return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
    }
  }
  get decoder() {
    if (io.Platform.operatingSystem == "windows") {
      return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
    } else {
      return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
    }
  }
};
dart.setSignature(io.SystemEncoding, {
  constructors: () => ({new: dart.definiteFunctionType(io.SystemEncoding, [])}),
  getters: () => ({
    name: dart.definiteFunctionType(core.String, []),
    encoder: dart.definiteFunctionType(convert.Converter$(core.String, core.List$(core.int)), []),
    decoder: dart.definiteFunctionType(convert.Converter$(core.List$(core.int), core.String), [])
  })
});
io.SYSTEM_ENCODING = dart.const(new io.SystemEncoding());
io._WindowsCodePageEncoder = class _WindowsCodePageEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
  new() {
    super.new();
  }
  convert(input) {
    let encoded = io._WindowsCodePageEncoder._encodeString(input);
    if (encoded == null) {
      dart.throw(new core.FormatException("Invalid character for encoding"));
    }
    return encoded;
  }
  startChunkedConversion(sink) {
    return new io._WindowsCodePageEncoderSink(sink);
  }
  static _encodeString(string) {
    dart.throw(new core.UnsupportedError("_WindowsCodePageEncoder._encodeString"));
  }
};
dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
dart.setSignature(io._WindowsCodePageEncoder, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoder, [])}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
  }),
  statics: () => ({_encodeString: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
  names: ['_encodeString']
});
io._WindowsCodePageEncoderSink = class _WindowsCodePageEncoderSink extends convert.StringConversionSinkBase {
  new(sink) {
    this[_sink$0] = sink;
  }
  close() {
    this[_sink$0].close();
  }
  add(string) {
    let encoded = io._WindowsCodePageEncoder._encodeString(string);
    if (encoded == null) {
      dart.throw(new core.FormatException("Invalid character for encoding"));
    }
    this[_sink$0].add(encoded);
  }
  addSlice(source, start, end, isLast) {
    if (start != 0 || end != source[dartx.length]) {
      source = source[dartx.substring](start, end);
    }
    this.add(source);
    if (dart.test(isLast)) this.close();
  }
};
dart.setSignature(io._WindowsCodePageEncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoderSink, [SinkOfListOfint()])}),
  fields: () => ({[_sink$0]: SinkOfListOfint()}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
  })
});
io._WindowsCodePageDecoder = class _WindowsCodePageDecoder extends convert.Converter$(core.List$(core.int), core.String) {
  new() {
    super.new();
  }
  convert(input) {
    return io._WindowsCodePageDecoder._decodeBytes(input);
  }
  startChunkedConversion(sink) {
    return new io._WindowsCodePageDecoderSink(sink);
  }
  static _decodeBytes(bytes) {
    dart.throw(new core.UnsupportedError("_WindowsCodePageDecoder._decodeBytes"));
  }
};
dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
dart.setSignature(io._WindowsCodePageDecoder, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoder, [])}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.String, [ListOfint()]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
  }),
  statics: () => ({_decodeBytes: dart.definiteFunctionType(core.String, [ListOfint()])}),
  names: ['_decodeBytes']
});
io._WindowsCodePageDecoderSink = class _WindowsCodePageDecoderSink extends convert.ByteConversionSinkBase {
  new(sink) {
    this[_sink$0] = sink;
    super.new();
  }
  close() {
    this[_sink$0].close();
  }
  add(bytes) {
    this[_sink$0].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
  }
};
dart.setSignature(io._WindowsCodePageDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoderSink, [SinkOfString()])}),
  fields: () => ({[_sink$0]: SinkOfString()}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()])
  })
});
io.WebSocketStatus = class WebSocketStatus extends core.Object {};
dart.setSignature(io.WebSocketStatus, {
  sfields: () => ({
    NORMAL_CLOSURE: core.int,
    GOING_AWAY: core.int,
    PROTOCOL_ERROR: core.int,
    UNSUPPORTED_DATA: core.int,
    RESERVED_1004: core.int,
    NO_STATUS_RECEIVED: core.int,
    ABNORMAL_CLOSURE: core.int,
    INVALID_FRAME_PAYLOAD_DATA: core.int,
    POLICY_VIOLATION: core.int,
    MESSAGE_TOO_BIG: core.int,
    MISSING_MANDATORY_EXTENSION: core.int,
    INTERNAL_SERVER_ERROR: core.int,
    RESERVED_1015: core.int
  })
});
io.WebSocketStatus.NORMAL_CLOSURE = 1000;
io.WebSocketStatus.GOING_AWAY = 1001;
io.WebSocketStatus.PROTOCOL_ERROR = 1002;
io.WebSocketStatus.UNSUPPORTED_DATA = 1003;
io.WebSocketStatus.RESERVED_1004 = 1004;
io.WebSocketStatus.NO_STATUS_RECEIVED = 1005;
io.WebSocketStatus.ABNORMAL_CLOSURE = 1006;
io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA = 1007;
io.WebSocketStatus.POLICY_VIOLATION = 1008;
io.WebSocketStatus.MESSAGE_TOO_BIG = 1009;
io.WebSocketStatus.MISSING_MANDATORY_EXTENSION = 1010;
io.WebSocketStatus.INTERNAL_SERVER_ERROR = 1011;
io.WebSocketStatus.RESERVED_1015 = 1015;
const _createServerResponseHeader = Symbol('_createServerResponseHeader');
const _createClientRequestHeader = Symbol('_createClientRequestHeader');
const _createHeader = Symbol('_createHeader');
io.CompressionOptions = class CompressionOptions extends core.Object {
  new(opts) {
    let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
    let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
    let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : null;
    let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : null;
    let enabled = opts && 'enabled' in opts ? opts.enabled : true;
    this.clientNoContextTakeover = clientNoContextTakeover;
    this.serverNoContextTakeover = serverNoContextTakeover;
    this.clientMaxWindowBits = clientMaxWindowBits;
    this.serverMaxWindowBits = serverMaxWindowBits;
    this.enabled = enabled;
  }
  [_createServerResponseHeader](requested) {
    let info = new io._CompressionMaxWindowBits();
    let mwb = null;
    let part = null;
    if (dart.nullSafe(requested, _ => _.parameters) != null) {
      part = requested.parameters[dartx._get](io._serverMaxWindowBits);
    }
    if (part != null) {
      if (dart.notNull(part[dartx.length]) >= 2 && dart.test(part[dartx.startsWith]('0'))) {
        dart.throw(new core.ArgumentError("Illegal 0 padding on value."));
      } else {
        mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())}) : this.serverMaxWindowBits;
        info.headerValue = dart.str`; server_max_window_bits=${mwb}`;
        info.maxWindowBits = mwb;
      }
    } else {
      info.headerValue = "";
      info.maxWindowBits = io._WebSocketImpl.DEFAULT_WINDOW_BITS;
    }
    return info;
  }
  [_createClientRequestHeader](requested, size) {
    let info = "";
    if (requested != null) {
      info = dart.str`; client_max_window_bits=${size}`;
    } else {
      if (this.clientMaxWindowBits == null) {
        info = "; client_max_window_bits";
      } else {
        info = dart.str`; client_max_window_bits=${this.clientMaxWindowBits}`;
      }
      if (this.serverMaxWindowBits != null) {
        info = info + dart.str`; server_max_window_bits=${this.serverMaxWindowBits}`;
      }
    }
    return info;
  }
  [_createHeader](requested) {
    if (requested === void 0) requested = null;
    let info = new io._CompressionMaxWindowBits("", 0);
    if (!dart.test(this.enabled)) {
      return info;
    }
    info.headerValue = io._WebSocketImpl.PER_MESSAGE_DEFLATE;
    if (dart.test(this.clientNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._clientNoContextTakeover)))) {
      info.headerValue = dart.notNull(info.headerValue) + "; client_no_context_takeover";
    }
    if (dart.test(this.serverNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._serverNoContextTakeover)))) {
      info.headerValue = dart.notNull(info.headerValue) + "; server_no_context_takeover";
    }
    let headerList = this[_createServerResponseHeader](requested);
    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(headerList.headerValue);
    info.maxWindowBits = headerList.maxWindowBits;
    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(this[_createClientRequestHeader](requested, info.maxWindowBits));
    return info;
  }
};
dart.setSignature(io.CompressionOptions, {
  constructors: () => ({new: dart.definiteFunctionType(io.CompressionOptions, [], {clientNoContextTakeover: core.bool, serverNoContextTakeover: core.bool, clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, enabled: core.bool})}),
  fields: () => ({
    clientNoContextTakeover: core.bool,
    serverNoContextTakeover: core.bool,
    clientMaxWindowBits: core.int,
    serverMaxWindowBits: core.int,
    enabled: core.bool
  }),
  methods: () => ({
    [_createServerResponseHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [io.HeaderValue]),
    [_createClientRequestHeader]: dart.definiteFunctionType(core.String, [io.HeaderValue, core.int]),
    [_createHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [io.HeaderValue])
  }),
  sfields: () => ({
    DEFAULT: io.CompressionOptions,
    OFF: io.CompressionOptions
  })
});
dart.defineLazy(io.CompressionOptions, {
  get DEFAULT() {
    return dart.const(new io.CompressionOptions());
  },
  get OFF() {
    return dart.const(new io.CompressionOptions({enabled: false}));
  }
});
io.WebSocketTransformer = class WebSocketTransformer extends core.Object {
  static new(opts) {
    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    return new io._WebSocketTransformerImpl(protocolSelector, compression);
  }
  static upgrade(request, opts) {
    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    return io._WebSocketTransformerImpl._upgrade(request, protocolSelector, compression);
  }
  static isUpgradeRequest(request) {
    return io._WebSocketTransformerImpl._isUpgradeRequest(request);
  }
};
io.WebSocketTransformer[dart.implements] = () => [StreamTransformerOfHttpRequest$WebSocket()];
dart.setSignature(io.WebSocketTransformer, {
  constructors: () => ({new: dart.definiteFunctionType(io.WebSocketTransformer, [], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions})}),
  statics: () => ({
    upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions}),
    isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
  }),
  names: ['upgrade', 'isUpgradeRequest']
});
io.WebSocket = class WebSocket extends core.Object {
  static connect(url, opts) {
    let protocols = opts && 'protocols' in opts ? opts.protocols : null;
    let headers = opts && 'headers' in opts ? opts.headers : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    return io._WebSocketImpl.connect(url, protocols, headers, {compression: compression});
  }
  new() {
    this.pingInterval = null;
  }
  static fromUpgradedSocket(socket, opts) {
    let protocol = opts && 'protocol' in opts ? opts.protocol : null;
    let serverSide = opts && 'serverSide' in opts ? opts.serverSide : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    if (serverSide == null) {
      dart.throw(new core.ArgumentError("The serverSide argument must be passed " + "explicitly to WebSocket.fromUpgradedSocket."));
    }
    return new io._WebSocketImpl._fromSocket(socket, protocol, compression, serverSide);
  }
};
io.WebSocket[dart.implements] = () => [async.Stream, async.StreamSink];
dart.setSignature(io.WebSocket, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.WebSocket, []),
    fromUpgradedSocket: dart.definiteFunctionType(io.WebSocket, [io.Socket], {protocol: core.String, serverSide: core.bool, compression: io.CompressionOptions})
  }),
  fields: () => ({pingInterval: core.Duration}),
  sfields: () => ({
    CONNECTING: core.int,
    OPEN: core.int,
    CLOSING: core.int,
    CLOSED: core.int
  }),
  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String], {protocols: IterableOfString(), headers: MapOfString$dynamic(), compression: io.CompressionOptions})}),
  names: ['connect']
});
io.WebSocket.CONNECTING = 0;
io.WebSocket.OPEN = 1;
io.WebSocket.CLOSING = 2;
io.WebSocket.CLOSED = 3;
io.WebSocketException = class WebSocketException extends core.Object {
  new(message) {
    if (message === void 0) message = "";
    this.message = message;
  }
  toString() {
    return dart.str`WebSocketException: ${this.message}`;
  }
};
io.WebSocketException[dart.implements] = () => [io.IOException];
dart.setSignature(io.WebSocketException, {
  constructors: () => ({new: dart.definiteFunctionType(io.WebSocketException, [], [core.String])}),
  fields: () => ({message: core.String})
});
io._webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
io._clientNoContextTakeover = "client_no_context_takeover";
io._serverNoContextTakeover = "server_no_context_takeover";
io._clientMaxWindowBits = "client_max_window_bits";
io._serverMaxWindowBits = "server_max_window_bits";
io._WebSocketMessageType = class _WebSocketMessageType extends core.Object {};
dart.setSignature(io._WebSocketMessageType, {
  sfields: () => ({
    NONE: core.int,
    TEXT: core.int,
    BINARY: core.int
  })
});
io._WebSocketMessageType.NONE = 0;
io._WebSocketMessageType.TEXT = 1;
io._WebSocketMessageType.BINARY = 2;
io._WebSocketOpcode = class _WebSocketOpcode extends core.Object {};
dart.setSignature(io._WebSocketOpcode, {
  sfields: () => ({
    CONTINUATION: core.int,
    TEXT: core.int,
    BINARY: core.int,
    RESERVED_3: core.int,
    RESERVED_4: core.int,
    RESERVED_5: core.int,
    RESERVED_6: core.int,
    RESERVED_7: core.int,
    CLOSE: core.int,
    PING: core.int,
    PONG: core.int,
    RESERVED_B: core.int,
    RESERVED_C: core.int,
    RESERVED_D: core.int,
    RESERVED_E: core.int,
    RESERVED_F: core.int
  })
});
io._WebSocketOpcode.CONTINUATION = 0;
io._WebSocketOpcode.TEXT = 1;
io._WebSocketOpcode.BINARY = 2;
io._WebSocketOpcode.RESERVED_3 = 3;
io._WebSocketOpcode.RESERVED_4 = 4;
io._WebSocketOpcode.RESERVED_5 = 5;
io._WebSocketOpcode.RESERVED_6 = 6;
io._WebSocketOpcode.RESERVED_7 = 7;
io._WebSocketOpcode.CLOSE = 8;
io._WebSocketOpcode.PING = 9;
io._WebSocketOpcode.PONG = 10;
io._WebSocketOpcode.RESERVED_B = 11;
io._WebSocketOpcode.RESERVED_C = 12;
io._WebSocketOpcode.RESERVED_D = 13;
io._WebSocketOpcode.RESERVED_E = 14;
io._WebSocketOpcode.RESERVED_F = 15;
io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
  new(headerValue, maxWindowBits) {
    if (headerValue === void 0) headerValue = null;
    if (maxWindowBits === void 0) maxWindowBits = null;
    this.headerValue = headerValue;
    this.maxWindowBits = maxWindowBits;
  }
  toString() {
    return this.headerValue;
  }
};
dart.setSignature(io._CompressionMaxWindowBits, {
  constructors: () => ({new: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [core.String, core.int])}),
  fields: () => ({
    headerValue: core.String,
    maxWindowBits: core.int
  })
});
const _maskingBytes = Symbol('_maskingBytes');
const _payload = Symbol('_payload');
const _serverSide = Symbol('_serverSide');
const _deflate = Symbol('_deflate');
const _fin = Symbol('_fin');
const _compressed = Symbol('_compressed');
const _opcode = Symbol('_opcode');
const _len = Symbol('_len');
const _masked = Symbol('_masked');
const _remainingLenBytes = Symbol('_remainingLenBytes');
const _remainingMaskingKeyBytes = Symbol('_remainingMaskingKeyBytes');
const _remainingPayloadBytes = Symbol('_remainingPayloadBytes');
const _unmaskingIndex = Symbol('_unmaskingIndex');
const _currentMessageType = Symbol('_currentMessageType');
const _eventSink$ = Symbol('_eventSink');
const _isControlFrame = Symbol('_isControlFrame');
const _lengthDone = Symbol('_lengthDone');
const _maskDone = Symbol('_maskDone');
const _unmask = Symbol('_unmask');
const _controlFrameEnd = Symbol('_controlFrameEnd');
const _messageFrameEnd = Symbol('_messageFrameEnd');
const _startPayload = Symbol('_startPayload');
const _prepareForNextFrame = Symbol('_prepareForNextFrame');
io._WebSocketProtocolTransformer = class _WebSocketProtocolTransformer extends core.Object {
  new(serverSide, deflate) {
    if (serverSide === void 0) serverSide = false;
    if (deflate === void 0) deflate = null;
    this[_maskingBytes] = core.List.new(4);
    this[_payload] = io.BytesBuilder.new({copy: false});
    this[_serverSide] = serverSide;
    this[_deflate] = deflate;
    this[_state$1] = io._WebSocketProtocolTransformer.START;
    this[_fin] = false;
    this[_compressed] = false;
    this[_opcode] = -1;
    this[_len] = -1;
    this[_masked] = false;
    this[_remainingLenBytes] = -1;
    this[_remainingMaskingKeyBytes] = 4;
    this[_remainingPayloadBytes] = -1;
    this[_unmaskingIndex] = 0;
    this[_currentMessageType] = io._WebSocketMessageType.NONE;
    this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
    this.closeReason = "";
    this[_eventSink$] = null;
  }
  bind(stream) {
    return async.Stream.eventTransformed(stream, dart.fn(eventSink => {
      if (this[_eventSink$] != null) {
        dart.throw(new core.StateError("WebSocket transformer already used."));
      }
      this[_eventSink$] = eventSink;
      return this;
    }, EventSinkTo_WebSocketProtocolTransformer()));
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink$].addError(error, stackTrace);
  }
  close() {
    this[_eventSink$].close();
  }
  add(bytes) {
    let buffer = typed_data.Uint8List.is(bytes) ? bytes : typed_data.Uint8List.fromList(bytes);
    let index = 0;
    let lastIndex = buffer[dartx.length];
    if (this[_state$1] == io._WebSocketProtocolTransformer.CLOSED) {
      dart.throw(new io.WebSocketException("Data on closed connection"));
    }
    if (this[_state$1] == io._WebSocketProtocolTransformer.FAILURE) {
      dart.throw(new io.WebSocketException("Data on failed connection"));
    }
    while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) {
      let byte = buffer[dartx._get](index);
      if (dart.notNull(this[_state$1]) <= io._WebSocketProtocolTransformer.LEN_REST) {
        if (this[_state$1] == io._WebSocketProtocolTransformer.START) {
          this[_fin] = (dart.notNull(byte) & io._WebSocketProtocolTransformer.FIN) != 0;
          if ((dart.notNull(byte) & (io._WebSocketProtocolTransformer.RSV2 | io._WebSocketProtocolTransformer.RSV3)) != 0) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          this[_opcode] = dart.notNull(byte) & io._WebSocketProtocolTransformer.OPCODE;
          if (this[_opcode] != io._WebSocketOpcode.CONTINUATION) {
            if ((dart.notNull(byte) & io._WebSocketProtocolTransformer.RSV1) != 0) {
              this[_compressed] = true;
            } else {
              this[_compressed] = false;
            }
          }
          if (dart.notNull(this[_opcode]) <= io._WebSocketOpcode.BINARY) {
            if (this[_opcode] == io._WebSocketOpcode.CONTINUATION) {
              if (this[_currentMessageType] == io._WebSocketMessageType.NONE) {
                dart.throw(new io.WebSocketException("Protocol error"));
              }
            } else {
              dart.assert(this[_opcode] == io._WebSocketOpcode.TEXT || this[_opcode] == io._WebSocketOpcode.BINARY);
              if (this[_currentMessageType] != io._WebSocketMessageType.NONE) {
                dart.throw(new io.WebSocketException("Protocol error"));
              }
              this[_currentMessageType] = this[_opcode];
            }
          } else if (dart.notNull(this[_opcode]) >= io._WebSocketOpcode.CLOSE && dart.notNull(this[_opcode]) <= io._WebSocketOpcode.PONG) {
            if (!dart.test(this[_fin])) dart.throw(new io.WebSocketException("Protocol error"));
          } else {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          this[_state$1] = io._WebSocketProtocolTransformer.LEN_FIRST;
        } else if (this[_state$1] == io._WebSocketProtocolTransformer.LEN_FIRST) {
          this[_masked] = (dart.notNull(byte) & 128) != 0;
          this[_len] = dart.notNull(byte) & 127;
          if (dart.test(this[_isControlFrame]()) && dart.notNull(this[_len]) > 125) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          if (this[_len] == 126) {
            this[_len] = 0;
            this[_remainingLenBytes] = 2;
            this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
          } else if (this[_len] == 127) {
            this[_len] = 0;
            this[_remainingLenBytes] = 8;
            this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
          } else {
            dart.assert(dart.notNull(this[_len]) < 126);
            this[_lengthDone]();
          }
        } else {
          dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.LEN_REST);
          this[_len] = (dart.notNull(this[_len]) << 8 | dart.notNull(byte)) >>> 0;
          this[_remainingLenBytes] = dart.notNull(this[_remainingLenBytes]) - 1;
          if (this[_remainingLenBytes] == 0) {
            this[_lengthDone]();
          }
        }
      } else {
        if (this[_state$1] == io._WebSocketProtocolTransformer.MASK) {
          this[_maskingBytes][dartx._set](4 - (() => {
            let x = this[_remainingMaskingKeyBytes];
            this[_remainingMaskingKeyBytes] = dart.notNull(x) - 1;
            return x;
          })(), byte);
          if (this[_remainingMaskingKeyBytes] == 0) {
            this[_maskDone]();
          }
        } else {
          dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.PAYLOAD);
          let payloadLength = math.min(core.int)(dart.notNull(lastIndex) - dart.notNull(index), this[_remainingPayloadBytes]);
          this[_remainingPayloadBytes] = dart.notNull(this[_remainingPayloadBytes]) - dart.notNull(payloadLength);
          if (dart.test(this[_masked])) {
            this[_unmask](index, payloadLength, buffer);
          }
          this[_payload].add(typed_data.Uint8List.view(buffer[dartx.buffer], index, payloadLength));
          index = dart.notNull(index) + dart.notNull(payloadLength);
          if (dart.test(this[_isControlFrame]())) {
            if (this[_remainingPayloadBytes] == 0) this[_controlFrameEnd]();
          } else {
            if (this[_currentMessageType] != io._WebSocketMessageType.TEXT && this[_currentMessageType] != io._WebSocketMessageType.BINARY) {
              dart.throw(new io.WebSocketException("Protocol error"));
            }
            if (this[_remainingPayloadBytes] == 0) this[_messageFrameEnd]();
          }
          index = dart.notNull(index) - 1;
        }
      }
      index = dart.notNull(index) + 1;
    }
  }
  [_unmask](index, length, buffer) {
    let BLOCK_SIZE = 16;
    if (dart.notNull(length) >= BLOCK_SIZE) {
      let startOffset = BLOCK_SIZE - (dart.notNull(index) & 15);
      let end = dart.notNull(index) + startOffset;
      for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
        buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
          let x = this[_unmaskingIndex];
          this[_unmaskingIndex] = dart.notNull(x) + 1;
          return x;
        })() & 3)))) >>> 0);
      }
      index = dart.notNull(index) + startOffset;
      length = dart.notNull(length) - startOffset;
      let blockCount = (dart.notNull(length) / BLOCK_SIZE)[dartx.truncate]();
      if (blockCount > 0) {
        let mask = 0;
        for (let i = 3; i >= 0; i--) {
          mask = (mask << 8 | dart.notNull(core.int._check(this[_maskingBytes][dartx._get](dart.notNull(this[_unmaskingIndex]) + i & 3)))) >>> 0;
        }
        let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
        let blockBuffer = typed_data.Int32x4List.view(buffer[dartx.buffer], index, blockCount);
        for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
          blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
        }
        let bytes = blockCount * BLOCK_SIZE;
        index = dart.notNull(index) + bytes;
        length = dart.notNull(length) - bytes;
      }
    }
    let end = dart.notNull(index) + dart.notNull(length);
    for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
      buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
        let x = this[_unmaskingIndex];
        this[_unmaskingIndex] = dart.notNull(x) + 1;
        return x;
      })() & 3)))) >>> 0);
    }
  }
  [_lengthDone]() {
    if (dart.test(this[_masked])) {
      if (!dart.test(this[_serverSide])) {
        dart.throw(new io.WebSocketException("Received masked frame from server"));
      }
      this[_state$1] = io._WebSocketProtocolTransformer.MASK;
    } else {
      if (dart.test(this[_serverSide])) {
        dart.throw(new io.WebSocketException("Received unmasked frame from client"));
      }
      this[_remainingPayloadBytes] = this[_len];
      this[_startPayload]();
    }
  }
  [_maskDone]() {
    this[_remainingPayloadBytes] = this[_len];
    this[_startPayload]();
  }
  [_startPayload]() {
    if (this[_remainingPayloadBytes] == 0) {
      if (dart.test(this[_isControlFrame]())) {
        switch (this[_opcode]) {
          case io._WebSocketOpcode.CLOSE:
          {
            this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
            this[_eventSink$].close();
            break;
          }
          case io._WebSocketOpcode.PING:
          {
            this[_eventSink$].add(new io._WebSocketPing());
            break;
          }
          case io._WebSocketOpcode.PONG:
          {
            this[_eventSink$].add(new io._WebSocketPong());
            break;
          }
        }
        this[_prepareForNextFrame]();
      } else {
        this[_messageFrameEnd]();
      }
    } else {
      this[_state$1] = io._WebSocketProtocolTransformer.PAYLOAD;
    }
  }
  [_messageFrameEnd]() {
    if (dart.test(this[_fin])) {
      let bytes = this[_payload].takeBytes();
      if (this[_deflate] != null && dart.test(this[_compressed])) {
        bytes = this[_deflate].processIncomingMessage(bytes);
      }
      switch (this[_currentMessageType]) {
        case io._WebSocketMessageType.TEXT:
        {
          this[_eventSink$].add(convert.UTF8.decode(bytes));
          break;
        }
        case io._WebSocketMessageType.BINARY:
        {
          this[_eventSink$].add(bytes);
          break;
        }
      }
      this[_currentMessageType] = io._WebSocketMessageType.NONE;
    }
    this[_prepareForNextFrame]();
  }
  [_controlFrameEnd]() {
    switch (this[_opcode]) {
      case io._WebSocketOpcode.CLOSE:
      {
        this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
        let payload = this[_payload].takeBytes();
        if (dart.notNull(payload[dartx.length]) > 0) {
          if (payload[dartx.length] == 1) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          this.closeCode = (dart.notNull(payload[dartx._get](0)) << 8 | dart.notNull(payload[dartx._get](1))) >>> 0;
          if (this.closeCode == io.WebSocketStatus.NO_STATUS_RECEIVED) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          if (dart.notNull(payload[dartx.length]) > 2) {
            this.closeReason = convert.UTF8.decode(payload[dartx.sublist](2));
          }
        }
        this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
        this[_eventSink$].close();
        break;
      }
      case io._WebSocketOpcode.PING:
      {
        this[_eventSink$].add(new io._WebSocketPing(this[_payload].takeBytes()));
        break;
      }
      case io._WebSocketOpcode.PONG:
      {
        this[_eventSink$].add(new io._WebSocketPong(this[_payload].takeBytes()));
        break;
      }
    }
    this[_prepareForNextFrame]();
  }
  [_isControlFrame]() {
    return this[_opcode] == io._WebSocketOpcode.CLOSE || this[_opcode] == io._WebSocketOpcode.PING || this[_opcode] == io._WebSocketOpcode.PONG;
  }
  [_prepareForNextFrame]() {
    if (this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) this[_state$1] = io._WebSocketProtocolTransformer.START;
    this[_fin] = false;
    this[_opcode] = -1;
    this[_len] = -1;
    this[_remainingLenBytes] = -1;
    this[_remainingMaskingKeyBytes] = 4;
    this[_remainingPayloadBytes] = -1;
    this[_unmaskingIndex] = 0;
  }
};
io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
dart.setSignature(io._WebSocketProtocolTransformer, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketProtocolTransformer, [], [core.bool, io._WebSocketPerMessageDeflate])}),
  fields: () => ({
    [_state$1]: core.int,
    [_fin]: core.bool,
    [_compressed]: core.bool,
    [_opcode]: core.int,
    [_len]: core.int,
    [_masked]: core.bool,
    [_remainingLenBytes]: core.int,
    [_remainingMaskingKeyBytes]: core.int,
    [_remainingPayloadBytes]: core.int,
    [_unmaskingIndex]: core.int,
    [_currentMessageType]: core.int,
    closeCode: core.int,
    closeReason: core.String,
    [_eventSink$]: async.EventSink,
    [_serverSide]: core.bool,
    [_maskingBytes]: core.List,
    [_payload]: io.BytesBuilder,
    [_deflate]: io._WebSocketPerMessageDeflate
  }),
  methods: () => ({
    bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
    addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    [_unmask]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.Uint8List]),
    [_lengthDone]: dart.definiteFunctionType(dart.void, []),
    [_maskDone]: dart.definiteFunctionType(dart.void, []),
    [_startPayload]: dart.definiteFunctionType(dart.void, []),
    [_messageFrameEnd]: dart.definiteFunctionType(dart.void, []),
    [_controlFrameEnd]: dart.definiteFunctionType(dart.void, []),
    [_isControlFrame]: dart.definiteFunctionType(core.bool, []),
    [_prepareForNextFrame]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    START: core.int,
    LEN_FIRST: core.int,
    LEN_REST: core.int,
    MASK: core.int,
    PAYLOAD: core.int,
    CLOSED: core.int,
    FAILURE: core.int,
    FIN: core.int,
    RSV1: core.int,
    RSV2: core.int,
    RSV3: core.int,
    OPCODE: core.int
  })
});
io._WebSocketProtocolTransformer.START = 0;
io._WebSocketProtocolTransformer.LEN_FIRST = 1;
io._WebSocketProtocolTransformer.LEN_REST = 2;
io._WebSocketProtocolTransformer.MASK = 3;
io._WebSocketProtocolTransformer.PAYLOAD = 4;
io._WebSocketProtocolTransformer.CLOSED = 5;
io._WebSocketProtocolTransformer.FAILURE = 6;
io._WebSocketProtocolTransformer.FIN = 128;
io._WebSocketProtocolTransformer.RSV1 = 64;
io._WebSocketProtocolTransformer.RSV2 = 32;
io._WebSocketProtocolTransformer.RSV3 = 16;
io._WebSocketProtocolTransformer.OPCODE = 15;
io._WebSocketPing = class _WebSocketPing extends core.Object {
  new(payload) {
    if (payload === void 0) payload = null;
    this.payload = payload;
  }
};
dart.setSignature(io._WebSocketPing, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPing, [], [ListOfint()])}),
  fields: () => ({payload: ListOfint()})
});
io._WebSocketPong = class _WebSocketPong extends core.Object {
  new(payload) {
    if (payload === void 0) payload = null;
    this.payload = payload;
  }
};
dart.setSignature(io._WebSocketPong, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPong, [], [ListOfint()])}),
  fields: () => ({payload: ListOfint()})
});
const _protocolSelector = Symbol('_protocolSelector');
const _compression = Symbol('_compression');
io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
  new(protocolSelector, compression) {
    this[_controller$0] = StreamControllerOfWebSocket().new({sync: true});
    this[_protocolSelector] = protocolSelector;
    this[_compression] = compression;
  }
  bind(stream) {
    stream.listen(dart.fn(request => {
      io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
    }, HttpRequestToNull()), {onDone: dart.fn(() => {
        this[_controller$0].close();
      }, VoidToNull())});
    return this[_controller$0].stream;
  }
  static _upgrade(request, _protocolSelector, compression) {
    let response = request.response;
    if (!dart.test(io._WebSocketTransformerImpl._isUpgradeRequest(request))) {
      response.statusCode = io.HttpStatus.BAD_REQUEST;
      response.close();
      return FutureOfWebSocket().error(new io.WebSocketException("Invalid WebSocket upgrade request"));
    }
    function upgrade(protocol) {
      response.statusCode = io.HttpStatus.SWITCHING_PROTOCOLS;
      response.headers.add(io.HttpHeaders.CONNECTION, "Upgrade");
      response.headers.add(io.HttpHeaders.UPGRADE, "websocket");
      let key = request.headers.value("Sec-WebSocket-Key");
      let sha1 = new io._SHA1();
      sha1.add(dart.str`${key}${io._webSocketGUID}`[dartx.codeUnits]);
      let accept = io._CryptoUtils.bytesToBase64(sha1.close());
      response.headers.add("Sec-WebSocket-Accept", accept);
      if (protocol != null) {
        response.headers.add("Sec-WebSocket-Protocol", protocol);
      }
      let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
      response.headers.contentLength = 0;
      return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
    }
    dart.fn(upgrade, StringToFuture());
    let protocols = request.headers._get('Sec-WebSocket-Protocol');
    if (protocols != null && _protocolSelector != null) {
      protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
      return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
        if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
          dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
        }
        return protocol;
      }, dynamicTodynamic$())).catchError(dart.fn(error => {
        response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
        response.close();
        dart.throw(error);
      }, dynamicToNull$())).then(io.WebSocket)(upgrade);
    } else {
      return FutureOfWebSocket()._check(upgrade(null));
    }
  }
  static _negotiateCompression(request, response, compression) {
    let extensionHeader = request.headers.value("Sec-WebSocket-Extensions");
    let t = extensionHeader;
    t == null ? extensionHeader = "" : t;
    let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
    if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
      let info = compression[_createHeader](hv);
      response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
      let serverNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._serverNoContextTakeover)) && dart.test(compression.serverNoContextTakeover);
      let clientNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._clientNoContextTakeover)) && dart.test(compression.clientNoContextTakeover);
      let deflate = new io._WebSocketPerMessageDeflate({serverNoContextTakeover: serverNoContextTakeover, clientNoContextTakeover: clientNoContextTakeover, serverMaxWindowBits: info.maxWindowBits, clientMaxWindowBits: info.maxWindowBits, serverSide: true});
      return deflate;
    }
    return null;
  }
  static _isUpgradeRequest(request) {
    if (request.method != "GET") {
      return false;
    }
    if (request.headers._get(io.HttpHeaders.CONNECTION) == null) {
      return false;
    }
    let isUpgrade = false;
    request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
      if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
    }, StringToNull()));
    if (!isUpgrade) return false;
    let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
    if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
      return false;
    }
    let version = request.headers.value("Sec-WebSocket-Version");
    if (version == null || version != "13") {
      return false;
    }
    let key = request.headers.value("Sec-WebSocket-Key");
    if (key == null) {
      return false;
    }
    return true;
  }
};
io._WebSocketTransformerImpl[dart.implements] = () => [io.WebSocketTransformer];
dart.setSignature(io._WebSocketTransformerImpl, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketTransformerImpl, [core.Function, io.CompressionOptions])}),
  fields: () => ({
    [_controller$0]: StreamControllerOfWebSocket(),
    [_protocolSelector]: core.Function,
    [_compression]: io.CompressionOptions
  }),
  methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
  statics: () => ({
    _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
    _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
    _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
  }),
  names: ['_upgrade', '_negotiateCompression', '_isUpgradeRequest']
});
const _ensureDecoder = Symbol('_ensureDecoder');
const _ensureEncoder = Symbol('_ensureEncoder');
let const$80;
io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
  new(opts) {
    let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
    let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
    let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
    let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
    let serverSide = opts && 'serverSide' in opts ? opts.serverSide : false;
    this.clientMaxWindowBits = clientMaxWindowBits;
    this.serverMaxWindowBits = serverMaxWindowBits;
    this.serverNoContextTakeover = serverNoContextTakeover;
    this.clientNoContextTakeover = clientNoContextTakeover;
    this.serverSide = serverSide;
    this.decoder = null;
    this.encoder = null;
  }
  [_ensureDecoder]() {
    if (this.decoder == null) {
      this.decoder = io._Filter._newZLibInflateFilter(dart.test(this.serverSide) ? this.clientMaxWindowBits : this.serverMaxWindowBits, null, true);
    }
  }
  [_ensureEncoder]() {
    if (this.encoder == null) {
      this.encoder = io._Filter._newZLibDeflateFilter(false, io.ZLibOption.DEFAULT_LEVEL, dart.test(this.serverSide) ? this.serverMaxWindowBits : this.clientMaxWindowBits, io.ZLibOption.DEFAULT_MEM_LEVEL, io.ZLibOption.STRATEGY_DEFAULT, null, true);
    }
  }
  processIncomingMessage(msg) {
    this[_ensureDecoder]();
    let data = [];
    data[dartx.addAll](msg);
    data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
    this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
    let result = [];
    let out = null;
    while ((out = this.decoder.processed()) != null) {
      result[dartx.addAll](core.Iterable._check(out));
    }
    if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
      this.decoder = null;
    }
    return typed_data.Uint8List.fromList(ListOfint()._check(result));
  }
  processOutgoingMessage(msg) {
    this[_ensureEncoder]();
    let result = [];
    let buffer = null;
    let out = null;
    if (!typed_data.Uint8List.is(msg)) {
      for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
        if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
          dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${msg[dartx._get](i)} at index ${i})`));
        }
      }
      buffer = typed_data.Uint8List.fromList(msg);
    } else {
      buffer = typed_data.Uint8List._check(msg);
    }
    this.encoder.process(buffer, 0, buffer[dartx.length]);
    while ((out = this.encoder.processed()) != null) {
      result[dartx.addAll](core.Iterable._check(out));
    }
    if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
      this.encoder = null;
    }
    if (dart.notNull(result[dartx.length]) > 4) {
      result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
    }
    return ListOfint()._check(result);
  }
};
dart.setSignature(io._WebSocketPerMessageDeflate, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [], {clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, serverNoContextTakeover: core.bool, clientNoContextTakeover: core.bool, serverSide: core.bool})}),
  fields: () => ({
    serverNoContextTakeover: core.bool,
    clientNoContextTakeover: core.bool,
    clientMaxWindowBits: core.int,
    serverMaxWindowBits: core.int,
    serverSide: core.bool,
    decoder: io._Filter,
    encoder: io._Filter
  }),
  methods: () => ({
    [_ensureDecoder]: dart.definiteFunctionType(dart.void, []),
    [_ensureEncoder]: dart.definiteFunctionType(dart.void, []),
    processIncomingMessage: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
    processOutgoingMessage: dart.definiteFunctionType(core.List$(core.int), [ListOfint()])
  })
});
const _deflateHelper = Symbol('_deflateHelper');
const _outCloseCode = Symbol('_outCloseCode');
const _outCloseReason = Symbol('_outCloseReason');
io._WebSocketOutgoingTransformer = class _WebSocketOutgoingTransformer extends core.Object {
  new(webSocket) {
    this.webSocket = webSocket;
    this[_eventSink$] = null;
    this[_deflateHelper] = null;
    this[_deflateHelper] = this.webSocket[_deflate];
  }
  bind(stream) {
    return StreamOfListOfint().eventTransformed(stream, dart.fn(eventSink => {
      if (this[_eventSink$] != null) {
        dart.throw(new core.StateError("WebSocket transformer already used"));
      }
      this[_eventSink$] = eventSink;
      return this;
    }, EventSinkOfListOfintTo_WebSocketOutgoingTransformer()));
  }
  add(message) {
    if (io._WebSocketPong.is(message)) {
      this.addFrame(io._WebSocketOpcode.PONG, message.payload);
      return;
    }
    if (io._WebSocketPing.is(message)) {
      this.addFrame(io._WebSocketOpcode.PING, message.payload);
      return;
    }
    let data = null;
    let opcode = null;
    if (message != null) {
      if (typeof message == 'string') {
        opcode = io._WebSocketOpcode.TEXT;
        data = convert.UTF8.encode(message);
      } else {
        if (ListOfint().is(message)) {
          data = message;
          opcode = io._WebSocketOpcode.BINARY;
        } else {
          dart.throw(new core.ArgumentError(message));
        }
      }
      if (this[_deflateHelper] != null) {
        data = this[_deflateHelper].processOutgoingMessage(data);
      }
    } else {
      opcode = io._WebSocketOpcode.TEXT;
    }
    this.addFrame(opcode, data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink$].addError(error, stackTrace);
  }
  close() {
    let code = this.webSocket[_outCloseCode];
    let reason = this.webSocket[_outCloseReason];
    let data = null;
    if (code != null) {
      data = ListOfint().new();
      data[dartx.add](dart.notNull(code) >> 8 & 255);
      data[dartx.add](dart.notNull(code) & 255);
      if (reason != null) {
        data[dartx.addAll](convert.UTF8.encode(reason));
      }
    }
    this.addFrame(io._WebSocketOpcode.CLOSE, data);
    this[_eventSink$].close();
  }
  addFrame(opcode, data) {
    return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
      this[_eventSink$].add(e);
    }, ListOfintToNull()));
  }
  static createFrame(opcode, data, serverSide, compressed) {
    let mask = !dart.test(serverSide);
    let dataLength = data == null ? 0 : data[dartx.length];
    let headerSize = mask ? 6 : 2;
    if (dart.notNull(dataLength) > 65535) {
      headerSize = headerSize + 8;
    } else if (dart.notNull(dataLength) > 125) {
      headerSize = headerSize + 2;
    }
    let header = typed_data.Uint8List.new(headerSize);
    let index = 0;
    let hoc = (io._WebSocketProtocolTransformer.FIN | (dart.test(compressed) ? io._WebSocketProtocolTransformer.RSV1 : 0) | dart.notNull(opcode) & io._WebSocketProtocolTransformer.OPCODE) >>> 0;
    header[dartx._set](index++, hoc);
    let lengthBytes = 1;
    if (dart.notNull(dataLength) > 65535) {
      header[dartx._set](index++, 127);
      lengthBytes = 8;
    } else if (dart.notNull(dataLength) > 125) {
      header[dartx._set](index++, 126);
      lengthBytes = 2;
    }
    for (let i = 0; i < lengthBytes; i++) {
      header[dartx._set](index++, dataLength[dartx['>>']]((lengthBytes - 1 - i) * 8) & 255);
    }
    if (mask) {
      let i$ = 1;
      header[dartx._set](i$, (dart.notNull(header[dartx._get](i$)) | 1 << 7) >>> 0);
      let maskBytes = io._IOCrypto.getRandomBytes(4);
      header[dartx.setRange](index, index + 4, maskBytes);
      index = index + 4;
      if (data != null) {
        let list = null;
        if (opcode == io._WebSocketOpcode.TEXT && typed_data.Uint8List.is(data)) {
          list = data;
        } else {
          if (typed_data.Uint8List.is(data)) {
            list = typed_data.Uint8List.fromList(data);
          } else {
            list = typed_data.Uint8List.new(data[dartx.length]);
            for (let i = 0; i < dart.notNull(data[dartx.length]); i++) {
              if (dart.notNull(data[dartx._get](i)) < 0 || 255 < dart.notNull(data[dartx._get](i))) {
                dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${data[dartx._get](i)} at index ${i})`));
              }
              list[dartx._set](i, data[dartx._get](i));
            }
          }
        }
        let BLOCK_SIZE = 16;
        let blockCount = (dart.notNull(list[dartx.length]) / BLOCK_SIZE)[dartx.truncate]();
        if (blockCount > 0) {
          let mask = 0;
          for (let i = 3; i >= 0; i--) {
            mask = (mask << 8 | dart.notNull(maskBytes[dartx._get](i))) >>> 0;
          }
          let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
          let blockBuffer = typed_data.Int32x4List.view(list[dartx.buffer], 0, blockCount);
          for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
            blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
          }
        }
        for (let i = blockCount * BLOCK_SIZE; i < dart.notNull(list[dartx.length]); i++) {
          list[dartx._set](i, (dart.notNull(list[dartx._get](i)) ^ dart.notNull(maskBytes[dartx._get](i & 3))) >>> 0);
        }
        data = list;
      }
    }
    dart.assert(index == headerSize);
    if (data == null) {
      return JSArrayOfUint8List().of([header]);
    } else {
      return JSArrayOfListOfint().of([header, data]);
    }
  }
};
io._WebSocketOutgoingTransformer[dart.implements] = () => [StreamTransformerOfdynamic$ListOfint(), async.EventSink];
dart.setSignature(io._WebSocketOutgoingTransformer, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [io._WebSocketImpl])}),
  fields: () => ({
    webSocket: io._WebSocketImpl,
    [_eventSink$]: EventSinkOfListOfint(),
    [_deflateHelper]: io._WebSocketPerMessageDeflate
  }),
  methods: () => ({
    bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [async.Stream]),
    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.definiteFunctionType(dart.void, []),
    addFrame: dart.definiteFunctionType(dart.void, [core.int, ListOfint()])
  }),
  statics: () => ({createFrame: dart.definiteFunctionType(core.Iterable$(core.List$(core.int)), [core.int, ListOfint(), core.bool, core.bool])}),
  names: ['createFrame']
});
const _issuedPause = Symbol('_issuedPause');
const _completer = Symbol('_completer');
const _onListen$ = Symbol('_onListen');
const _onPause$ = Symbol('_onPause');
const _onResume$ = Symbol('_onResume');
const _cancel$ = Symbol('_cancel');
const _done$ = Symbol('_done');
const _ensureController = Symbol('_ensureController');
io._WebSocketConsumer = class _WebSocketConsumer extends core.Object {
  new(webSocket, socket) {
    this[_closeCompleter] = async.Completer.new();
    this.webSocket = webSocket;
    this.socket = socket;
    this[_controller$0] = null;
    this[_subscription$] = null;
    this[_issuedPause] = false;
    this[_closed] = false;
    this[_completer] = null;
  }
  [_onListen$]() {
    if (this[_subscription$] != null) {
      this[_subscription$].cancel();
    }
  }
  [_onPause$]() {
    if (this[_subscription$] != null) {
      this[_subscription$].pause();
    } else {
      this[_issuedPause] = true;
    }
  }
  [_onResume$]() {
    if (this[_subscription$] != null) {
      this[_subscription$].resume();
    } else {
      this[_issuedPause] = false;
    }
  }
  [_cancel$]() {
    if (this[_subscription$] != null) {
      let subscription = this[_subscription$];
      this[_subscription$] = null;
      subscription.cancel();
    }
  }
  [_ensureController]() {
    if (this[_controller$0] != null) return;
    this[_controller$0] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause$), onResume: dart.bind(this, _onResume$), onCancel: dart.bind(this, _onListen$)});
    let stream = this[_controller$0].stream.transform(ListOfint())(new io._WebSocketOutgoingTransformer(this.webSocket));
    this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
      this[_done$]();
      this[_closeCompleter].complete(this.webSocket);
    }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
        this[_closed] = true;
        this[_cancel$]();
        if (core.ArgumentError.is(error)) {
          if (!dart.test(this[_done$](error, stackTrace))) {
            this[_closeCompleter].completeError(error, stackTrace);
          }
        } else {
          this[_done$]();
          this[_closeCompleter].complete(this.webSocket);
        }
      }, dynamicAndStackTraceToNull())});
  }
  [_done$](error, stackTrace) {
    if (error === void 0) error = null;
    if (stackTrace === void 0) stackTrace = null;
    if (this[_completer] == null) return false;
    if (error != null) {
      this[_completer].completeError(error, stackTrace);
    } else {
      this[_completer].complete(this.webSocket);
    }
    this[_completer] = null;
    return true;
  }
  addStream(stream) {
    if (dart.test(this[_closed])) {
      stream.listen(null).cancel();
      return async.Future.value(this.webSocket);
    }
    this[_ensureController]();
    this[_completer] = async.Completer.new();
    this[_subscription$] = stream.listen(dart.fn(data => {
      this[_controller$0].add(data);
    }, dynamicToNull$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
    if (dart.test(this[_issuedPause])) {
      this[_subscription$].pause();
      this[_issuedPause] = false;
    }
    return this[_completer].future;
  }
  close() {
    this[_ensureController]();
    const closeSocket = (function() {
      return this.socket.close().catchError(dart.fn(_ => {
      }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
    }).bind(this);
    dart.fn(closeSocket, VoidToFuture());
    this[_controller$0].close();
    return this[_closeCompleter].future.then(dart.dynamic)(dart.fn(_ => closeSocket(), dynamicToFuture()));
  }
  add(data) {
    if (dart.test(this[_closed])) return;
    this[_ensureController]();
    this[_controller$0].add(data);
  }
  closeSocket() {
    this[_closed] = true;
    this[_cancel$]();
    this.close();
  }
};
io._WebSocketConsumer[dart.implements] = () => [async.StreamConsumer];
dart.setSignature(io._WebSocketConsumer, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketConsumer, [io._WebSocketImpl, io.Socket])}),
  fields: () => ({
    webSocket: io._WebSocketImpl,
    socket: io.Socket,
    [_controller$0]: async.StreamController,
    [_subscription$]: async.StreamSubscription,
    [_issuedPause]: core.bool,
    [_closed]: core.bool,
    [_closeCompleter]: async.Completer,
    [_completer]: async.Completer
  }),
  methods: () => ({
    [_onListen$]: dart.definiteFunctionType(dart.void, []),
    [_onPause$]: dart.definiteFunctionType(dart.void, []),
    [_onResume$]: dart.definiteFunctionType(dart.void, []),
    [_cancel$]: dart.definiteFunctionType(dart.void, []),
    [_ensureController]: dart.definiteFunctionType(dart.dynamic, []),
    [_done$]: dart.definiteFunctionType(core.bool, [], [dart.dynamic, core.StackTrace]),
    addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
    close: dart.definiteFunctionType(async.Future, []),
    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    closeSocket: dart.definiteFunctionType(dart.void, [])
  })
});
const _readyState = Symbol('_readyState');
const _writeClosed = Symbol('_writeClosed');
const _closeCode = Symbol('_closeCode');
const _closeReason = Symbol('_closeReason');
const _pingInterval = Symbol('_pingInterval');
const _pingTimer = Symbol('_pingTimer');
const _consumer = Symbol('_consumer');
const _closeTimer = Symbol('_closeTimer');
let const$81;
io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
  static connect(url, protocols, headers, opts) {
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    let uri = core.Uri.parse(url);
    if (uri.scheme != "ws" && uri.scheme != "wss") {
      dart.throw(new io.WebSocketException(dart.str`Unsupported URL scheme '${uri.scheme}'`));
    }
    let random = math.Random.new();
    let nonceData = typed_data.Uint8List.new(16);
    for (let i = 0; i < 16; i++) {
      nonceData[dartx._set](i, random.nextInt(256));
    }
    let nonce = io._CryptoUtils.bytesToBase64(nonceData);
    uri = core.Uri.new({scheme: uri.scheme == "wss" ? "https" : "http", userInfo: uri.userInfo, host: uri.host, port: uri.port, path: uri.path, query: uri.query, fragment: uri.fragment});
    return io._WebSocketImpl._httpClient.openUrl("GET", uri).then(io.HttpClientResponse)(dart.fn(request => {
      if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
        request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
      }
      if (headers != null) {
        headers[dartx.forEach](dart.fn((field, value) => request.headers.add(field, value), StringAnddynamicTovoid()));
      }
      let _ = request.headers;
      _.set(io.HttpHeaders.CONNECTION, "Upgrade");
      _.set(io.HttpHeaders.UPGRADE, "websocket");
      _.set("Sec-WebSocket-Key", nonce);
      _.set("Cache-Control", "no-cache");
      _.set("Sec-WebSocket-Version", "13");
      if (protocols != null) {
        request.headers.add("Sec-WebSocket-Protocol", protocols[dartx.toList]());
      }
      if (dart.test(compression.enabled)) {
        request.headers.add("Sec-WebSocket-Extensions", compression[_createHeader]());
      }
      return request.close();
    }, HttpClientRequestToFutureOfHttpClientResponse())).then(io.WebSocket)(dart.fn(response => {
      function error(message) {
        response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
          socket.destroy();
        }, SocketToNull()));
        dart.throw(new io.WebSocketException(message));
      }
      dart.fn(error, StringTovoid$());
      if (response.statusCode != io.HttpStatus.SWITCHING_PROTOCOLS || response.headers._get(io.HttpHeaders.CONNECTION) == null || !dart.test(response.headers._get(io.HttpHeaders.CONNECTION)[dartx.any](dart.fn(value => value[dartx.toLowerCase]() == "upgrade", StringTobool$()))) || response.headers.value(io.HttpHeaders.UPGRADE)[dartx.toLowerCase]() != "websocket") {
        error(dart.str`Connection to '${uri}' was not upgraded to websocket`);
      }
      let accept = response.headers.value("Sec-WebSocket-Accept");
      if (accept == null) {
        error("Response did not contain a 'Sec-WebSocket-Accept' header");
      }
      let sha1 = new io._SHA1();
      sha1.add(dart.str`${nonce}${io._webSocketGUID}`[dartx.codeUnits]);
      let expectedAccept = sha1.close();
      let receivedAccept = io._CryptoUtils.base64StringToBytes(accept);
      if (expectedAccept[dartx.length] != receivedAccept[dartx.length]) {
        error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
      }
      for (let i = 0; i < dart.notNull(expectedAccept[dartx.length]); i++) {
        if (expectedAccept[dartx._get](i) != receivedAccept[dartx._get](i)) {
          error("Bad response 'Sec-WebSocket-Accept' header");
        }
      }
      let protocol = response.headers.value('Sec-WebSocket-Protocol');
      let deflate = io._WebSocketImpl.negotiateClientCompression(response, compression);
      return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, false, deflate), SocketTo_WebSocketImpl()));
    }, HttpClientResponseToFutureOfWebSocket()));
  }
  static negotiateClientCompression(response, compression) {
    let extensionHeader = response.headers.value('Sec-WebSocket-Extensions');
    if (extensionHeader == null) {
      extensionHeader = "";
    }
    let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
    if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
      let serverNoContextTakeover = hv.parameters[dartx.containsKey](io._serverNoContextTakeover);
      let clientNoContextTakeover = hv.parameters[dartx.containsKey](io._clientNoContextTakeover);
      function getWindowBits(type) {
        let o = hv.parameters[dartx._get](type);
        if (o == null) {
          return io._WebSocketImpl.DEFAULT_WINDOW_BITS;
        }
        return core.int.parse(o, {onError: dart.fn(s => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())});
      }
      dart.fn(getWindowBits, StringToint$());
      return new io._WebSocketPerMessageDeflate({clientMaxWindowBits: getWindowBits(io._clientMaxWindowBits), serverMaxWindowBits: getWindowBits(io._serverMaxWindowBits), clientNoContextTakeover: clientNoContextTakeover, serverNoContextTakeover: serverNoContextTakeover});
    }
    return null;
  }
  _fromSocket(socket, protocol, compression, serverSide, deflate) {
    if (serverSide === void 0) serverSide = false;
    if (deflate === void 0) deflate = null;
    this[_socket] = socket;
    this.protocol = protocol;
    this[_serverSide] = serverSide;
    this[_controller$0] = null;
    this[_subscription$] = null;
    this[_sink$0] = null;
    this[_readyState] = io.WebSocket.CONNECTING;
    this[_writeClosed] = false;
    this[_closeCode] = null;
    this[_closeReason] = null;
    this[_pingInterval] = null;
    this[_pingTimer] = null;
    this[_consumer] = null;
    this[_outCloseCode] = null;
    this[_outCloseReason] = null;
    this[_closeTimer] = null;
    this[_deflate] = null;
    super.new();
    this[_consumer] = new io._WebSocketConsumer(this, io.Socket._check(this[_socket]));
    this[_sink$0] = new io._StreamSinkImpl(this[_consumer]);
    this[_readyState] = io.WebSocket.OPEN;
    this[_deflate] = deflate;
    let transformer = new io._WebSocketProtocolTransformer(this[_serverSide], this[_deflate]);
    this[_subscription$] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket], 'transform', transformer), 'listen', dart.fn(data => {
      if (io._WebSocketPing.is(data)) {
        if (!dart.test(this[_writeClosed])) this[_consumer].add(new io._WebSocketPong(data.payload));
      } else if (io._WebSocketPong.is(data)) {
        this.pingInterval = this[_pingInterval];
      } else {
        this[_controller$0].add(data);
      }
    }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
        if (this[_closeTimer] != null) this[_closeTimer].cancel();
        if (core.FormatException.is(error)) {
          this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
        } else {
          this[_close$0](io.WebSocketStatus.PROTOCOL_ERROR);
        }
        this[_closeCode] = this[_outCloseCode];
        this[_closeReason] = this[_outCloseReason];
        this[_controller$0].close();
      }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
        if (this[_closeTimer] != null) this[_closeTimer].cancel();
        if (this[_readyState] == io.WebSocket.OPEN) {
          this[_readyState] = io.WebSocket.CLOSING;
          if (!dart.test(io._WebSocketImpl._isReservedStatusCode(transformer.closeCode))) {
            this[_close$0](transformer.closeCode, transformer.closeReason);
          } else {
            this[_close$0]();
          }
          this[_readyState] = io.WebSocket.CLOSED;
        }
        this[_closeCode] = transformer.closeCode;
        this[_closeReason] = transformer.closeReason;
        this[_controller$0].close();
      }, VoidToNull()), cancelOnError: true}));
    this[_subscription$].pause();
    this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
        this[_subscription$].cancel();
        this[_subscription$] = null;
      }, VoidToNull()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
    io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
    try {
      dart.dput(this[_socket], _owner, this);
    } catch (_) {
    }

  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get pingInterval() {
    return this[_pingInterval];
  }
  set pingInterval(interval) {
    if (dart.test(this[_writeClosed])) return;
    if (this[_pingTimer] != null) this[_pingTimer].cancel();
    this[_pingInterval] = interval;
    if (this[_pingInterval] == null) return;
    this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
      if (dart.test(this[_writeClosed])) return;
      this[_consumer].add(new io._WebSocketPing());
      this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
        this[_close$0](io.WebSocketStatus.GOING_AWAY);
      }, VoidToNull()));
    }, VoidToNull()));
  }
  get readyState() {
    return this[_readyState];
  }
  get extensions() {
    return null;
  }
  get closeCode() {
    return this[_closeCode];
  }
  get closeReason() {
    return this[_closeReason];
  }
  add(data) {
    this[_sink$0].add(data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink$0].addError(error, stackTrace);
  }
  addStream(stream) {
    return this[_sink$0].addStream(stream);
  }
  get done() {
    return this[_sink$0].done;
  }
  close(code, reason) {
    if (code === void 0) code = null;
    if (reason === void 0) reason = null;
    if (dart.test(io._WebSocketImpl._isReservedStatusCode(code))) {
      dart.throw(new io.WebSocketException(dart.str`Reserved status code ${code}`));
    }
    if (this[_outCloseCode] == null) {
      this[_outCloseCode] = code;
      this[_outCloseReason] = reason;
    }
    if (!dart.test(this[_controller$0].isClosed)) {
      if (!dart.test(this[_controller$0].hasListener) && this[_subscription$] != null) {
        this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
      }
      if (this[_closeTimer] == null) {
        this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
          this[_closeCode] = this[_outCloseCode];
          this[_closeReason] = this[_outCloseReason];
          if (this[_subscription$] != null) this[_subscription$].cancel();
          this[_controller$0].close();
          io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
        }, VoidToNull()));
      }
    }
    return this[_sink$0].close();
  }
  [_close$0](code, reason) {
    if (code === void 0) code = null;
    if (reason === void 0) reason = null;
    if (dart.test(this[_writeClosed])) return;
    if (this[_outCloseCode] == null) {
      this[_outCloseCode] = code;
      this[_outCloseReason] = reason;
    }
    this[_writeClosed] = true;
    this[_consumer].closeSocket();
    io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
  }
  get [_serviceTypePath]() {
    return 'io/websockets';
  }
  get [_serviceTypeName]() {
    return 'WebSocket';
  }
  [_toJSON$](ref) {
    let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')}`;
    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
    if (dart.test(ref)) {
      return r;
    }
    try {
      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
    } catch (_) {
      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
    }

    return r;
  }
  static _isReservedStatusCode(code) {
    return code != null && (dart.notNull(code) < io.WebSocketStatus.NORMAL_CLOSURE || code == io.WebSocketStatus.RESERVED_1004 || code == io.WebSocketStatus.NO_STATUS_RECEIVED || code == io.WebSocketStatus.ABNORMAL_CLOSURE || dart.notNull(code) > io.WebSocketStatus.INTERNAL_SERVER_ERROR && dart.notNull(code) < io.WebSocketStatus.RESERVED_1015 || dart.notNull(code) >= io.WebSocketStatus.RESERVED_1015 && dart.notNull(code) < 3000);
  }
};
dart.addSimpleTypeTests(io._WebSocketImpl);
dart.defineNamedConstructor(io._WebSocketImpl, '_fromSocket');
io._WebSocketImpl[dart.implements] = () => [io.WebSocket];
dart.setSignature(io._WebSocketImpl, {
  constructors: () => ({_fromSocket: dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic, core.String, io.CompressionOptions], [core.bool, io._WebSocketPerMessageDeflate])}),
  fields: () => ({
    protocol: core.String,
    [_controller$0]: async.StreamController,
    [_subscription$]: async.StreamSubscription,
    [_sink$0]: async.StreamSink,
    [_socket]: dart.dynamic,
    [_serverSide]: core.bool,
    [_readyState]: core.int,
    [_writeClosed]: core.bool,
    [_closeCode]: core.int,
    [_closeReason]: core.String,
    [_pingInterval]: core.Duration,
    [_pingTimer]: async.Timer,
    [_consumer]: io._WebSocketConsumer,
    [_outCloseCode]: core.int,
    [_outCloseReason]: core.String,
    [_closeTimer]: async.Timer,
    [_deflate]: io._WebSocketPerMessageDeflate
  }),
  getters: () => ({
    pingInterval: dart.definiteFunctionType(core.Duration, []),
    readyState: dart.definiteFunctionType(core.int, []),
    extensions: dart.definiteFunctionType(core.String, []),
    closeCode: dart.definiteFunctionType(core.int, []),
    closeReason: dart.definiteFunctionType(core.String, []),
    done: dart.definiteFunctionType(async.Future, []),
    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({pingInterval: dart.definiteFunctionType(dart.void, [core.Duration])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
    close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
    [_close$0]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
    [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
  }),
  sfields: () => ({
    _webSockets: MapOfint$_WebSocketImpl(),
    DEFAULT_WINDOW_BITS: core.int,
    PER_MESSAGE_DEFLATE: core.String,
    _httpClient: io.HttpClient
  }),
  statics: () => ({
    connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String, IterableOfString(), MapOfString$dynamic()], {compression: io.CompressionOptions}),
    negotiateClientCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpClientResponse, io.CompressionOptions]),
    _isReservedStatusCode: dart.definiteFunctionType(core.bool, [core.int])
  }),
  names: ['connect', 'negotiateClientCompression', '_isReservedStatusCode']
});
io._WebSocketImpl.DEFAULT_WINDOW_BITS = 15;
io._WebSocketImpl.PER_MESSAGE_DEFLATE = "permessage-deflate";
dart.defineLazy(io._WebSocketImpl, {
  get _webSockets() {
    return MapOfint$_WebSocketImpl().new();
  },
  set _webSockets(_) {},
  get _httpClient() {
    return io.HttpClient.new();
  }
});
isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
  new(message) {
    this.message = message;
  }
  toString() {
    return dart.str`IsolateSpawnException: ${this.message}`;
  }
};
isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
dart.setSignature(isolate.IsolateSpawnException, {
  constructors: () => ({new: dart.definiteFunctionType(isolate.IsolateSpawnException, [core.String])}),
  fields: () => ({message: core.String})
});
const _pause = Symbol('_pause');
isolate.Isolate = class Isolate extends core.Object {
  new(controlPort, opts) {
    let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
    let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
    this.controlPort = controlPort;
    this.pauseCapability = pauseCapability;
    this.terminateCapability = terminateCapability;
  }
  static get current() {
    return isolate.Isolate._currentIsolateCache;
  }
  static spawn(entryPoint, message, opts) {
    let paused = opts && 'paused' in opts ? opts.paused : false;
    try {
      return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
    } catch (e) {
      let st = dart.stackTrace(e);
      return FutureOfIsolate().error(e, st);
    }

  }
  static spawnUri(uri, args, message, opts) {
    let paused = opts && 'paused' in opts ? opts.paused : false;
    let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
    if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
    try {
      if (core.List.is(args)) {
        for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
          if (!(typeof args[dartx._get](i) == 'string')) {
            dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
          }
        }
      } else if (args != null) {
        dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
      }
      return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
    } catch (e) {
      let st = dart.stackTrace(e);
      return FutureOfIsolate().error(e, st);
    }

  }
  pause(resumeCapability) {
    if (resumeCapability === void 0) resumeCapability = null;
    if (resumeCapability == null) resumeCapability = isolate.Capability.new();
    this[_pause](resumeCapability);
    return resumeCapability;
  }
  [_pause](resumeCapability) {
    let message = core.List.new(3);
    message[dartx._set](0, "pause");
    message[dartx._set](1, this.pauseCapability);
    message[dartx._set](2, resumeCapability);
    this.controlPort.send(message);
  }
  resume(resumeCapability) {
    let message = core.List.new(2);
    message[dartx._set](0, "resume");
    message[dartx._set](1, resumeCapability);
    this.controlPort.send(message);
  }
  addOnExitListener(responsePort) {
    let message = core.List.new(2);
    message[dartx._set](0, "add-ondone");
    message[dartx._set](1, responsePort);
    this.controlPort.send(message);
  }
  removeOnExitListener(responsePort) {
    let message = core.List.new(2);
    message[dartx._set](0, "remove-ondone");
    message[dartx._set](1, responsePort);
    this.controlPort.send(message);
  }
  setErrorsFatal(errorsAreFatal) {
    let message = core.List.new(3);
    message[dartx._set](0, "set-errors-fatal");
    message[dartx._set](1, this.terminateCapability);
    message[dartx._set](2, errorsAreFatal);
    this.controlPort.send(message);
  }
  kill(priority) {
    if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
    this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
  }
  ping(responsePort, pingType) {
    if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
    let message = core.List.new(3);
    message[dartx._set](0, "ping");
    message[dartx._set](1, responsePort);
    message[dartx._set](2, pingType);
    this.controlPort.send(message);
  }
  addErrorListener(port) {
    let message = core.List.new(2);
    message[dartx._set](0, "getErrors");
    message[dartx._set](1, port);
    this.controlPort.send(message);
  }
  removeErrorListener(port) {
    let message = core.List.new(2);
    message[dartx._set](0, "stopErrors");
    message[dartx._set](1, port);
    this.controlPort.send(message);
  }
  get errors() {
    let controller = null;
    let port = null;
    function handleError(message) {
      let errorDescription = core.String._check(dart.dindex(message, 0));
      let stackDescription = core.String._check(dart.dindex(message, 1));
      let error = new isolate.RemoteError(errorDescription, stackDescription);
      controller.addError(error, error.stackTrace);
    }
    dart.fn(handleError, dynamicTovoid$());
    controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
        port = isolate.RawReceivePort.new(handleError);
        this.addErrorListener(port.sendPort);
      }, VoidToNull()), onCancel: dart.fn(() => {
        this.removeErrorListener(port.sendPort);
        port.close();
        port = null;
      }, VoidToNull())});
    return controller.stream;
  }
};
dart.setSignature(isolate.Isolate, {
  constructors: () => ({new: dart.definiteFunctionType(isolate.Isolate, [isolate.SendPort], {pauseCapability: isolate.Capability, terminateCapability: isolate.Capability})}),
  fields: () => ({
    controlPort: isolate.SendPort,
    pauseCapability: isolate.Capability,
    terminateCapability: isolate.Capability
  }),
  getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
  methods: () => ({
    pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
    [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
    resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
    addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
    removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
    setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
    kill: dart.definiteFunctionType(dart.void, [], [core.int]),
    ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
  }),
  sfields: () => ({
    IMMEDIATE: core.int,
    BEFORE_NEXT_EVENT: core.int,
    AS_EVENT: core.int,
    _currentIsolateCache: isolate.Isolate
  }),
  sgetters: () => ({current: dart.definiteFunctionType(isolate.Isolate, [])}),
  statics: () => ({
    spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
    spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
  }),
  names: ['spawn', 'spawnUri']
});
isolate.Isolate.IMMEDIATE = 0;
isolate.Isolate.BEFORE_NEXT_EVENT = 1;
isolate.Isolate.AS_EVENT = 2;
dart.defineLazy(isolate.Isolate, {
  get _currentIsolateCache() {
    return _isolate_helper.IsolateNatives.currentIsolate;
  }
});
isolate.SendPort = class SendPort extends core.Object {};
isolate.SendPort[dart.implements] = () => [isolate.Capability];
isolate.ReceivePort = class ReceivePort extends core.Object {
  static new() {
    return new _isolate_helper.ReceivePortImpl();
  }
  static fromRawReceivePort(rawPort) {
    return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
  }
};
isolate.ReceivePort[dart.implements] = () => [async.Stream];
dart.setSignature(isolate.ReceivePort, {
  constructors: () => ({
    new: dart.definiteFunctionType(isolate.ReceivePort, []),
    fromRawReceivePort: dart.definiteFunctionType(isolate.ReceivePort, [isolate.RawReceivePort])
  })
});
isolate.RawReceivePort = class RawReceivePort extends core.Object {
  static new(handler) {
    if (handler === void 0) handler = null;
    return new _isolate_helper.RawReceivePortImpl(handler);
  }
};
dart.setSignature(isolate.RawReceivePort, {
  constructors: () => ({new: dart.definiteFunctionType(isolate.RawReceivePort, [], [dynamicTovoid()])})
});
isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
  new(message, source, stackTrace) {
    this.message = message;
    this.source = source;
    this.stackTrace = stackTrace;
  }
  toString() {
    return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
  }
};
isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
dart.setSignature(isolate._IsolateUnhandledException, {
  constructors: () => ({new: dart.definiteFunctionType(isolate._IsolateUnhandledException, [dart.dynamic, dart.dynamic, core.StackTrace])}),
  fields: () => ({
    message: dart.dynamic,
    source: dart.dynamic,
    stackTrace: core.StackTrace
  })
});
const _description = Symbol('_description');
isolate.RemoteError = class RemoteError extends core.Object {
  new(description, stackDescription) {
    this[_description] = description;
    this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
  }
  toString() {
    return this[_description];
  }
};
isolate.RemoteError[dart.implements] = () => [core.Error];
dart.setSignature(isolate.RemoteError, {
  constructors: () => ({new: dart.definiteFunctionType(isolate.RemoteError, [core.String, core.String])}),
  fields: () => ({
    [_description]: core.String,
    stackTrace: core.StackTrace
  })
});
const _trace$ = Symbol('_trace');
isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
  new(trace) {
    this[_trace$] = trace;
  }
  toString() {
    return this[_trace$];
  }
};
isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
dart.setSignature(isolate._RemoteStackTrace, {
  constructors: () => ({new: dart.definiteFunctionType(isolate._RemoteStackTrace, [core.String])}),
  fields: () => ({[_trace$]: core.String})
});
isolate.Capability = class Capability extends core.Object {
  static new() {
    return new _isolate_helper.CapabilityImpl();
  }
};
dart.setSignature(isolate.Capability, {
  constructors: () => ({new: dart.definiteFunctionType(isolate.Capability, [])})
});
dart.defineLazy(js, {
  get _global() {
    return dart.global;
  }
});
dart.defineLazy(js, {
  get context() {
    return js.JsObject._check(js._wrapToDart(js._global));
  }
});
const _jsObject = Symbol('_jsObject');
js.JsObject = class JsObject extends core.Object {
  _fromJs(jsObject) {
    this[_jsObject] = jsObject;
    dart.assert(this[_jsObject] != null);
  }
  static new(constructor, arguments$) {
    if (arguments$ === void 0) arguments$ = null;
    let ctor = constructor[_jsObject];
    if (arguments$ == null) {
      return js.JsObject._check(js._wrapToDart(new ctor()));
    }
    let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
    return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
  }
  static fromBrowserObject(object) {
    if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
      dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
    }
    return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
  }
  static jsify(object) {
    if (!core.Map.is(object) && !core.Iterable.is(object)) {
      dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
    }
    return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
  }
  static _convertDataTree(data) {
    let _convertedObjects = collection.HashMap.identity();
    function _convert(o) {
      if (dart.test(_convertedObjects.containsKey(o))) {
        return _convertedObjects._get(o);
      }
      if (core.Map.is(o)) {
        let convertedMap = {};
        _convertedObjects._set(o, convertedMap);
        for (let key of o[dartx.keys]) {
          convertedMap[key] = _convert(o[dartx._get](key));
        }
        return convertedMap;
      } else if (core.Iterable.is(o)) {
        let convertedList = [];
        _convertedObjects._set(o, convertedList);
        convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
        return convertedList;
      } else {
        return js._convertToJS(o);
      }
    }
    dart.fn(_convert, dynamicTodynamic$());
    return _convert(data);
  }
  _get(property) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError("property is not a String or num"));
    }
    return js._convertToDart(this[_jsObject][property]);
  }
  _set(property, value) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError("property is not a String or num"));
    }
    this[_jsObject][property] = js._convertToJS(value);
    return value;
  }
  get hashCode() {
    return 0;
  }
  ['=='](other) {
    return js.JsObject.is(other) && this[_jsObject] === other[_jsObject];
  }
  hasProperty(property) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError("property is not a String or num"));
    }
    return property in this[_jsObject];
  }
  deleteProperty(property) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError("property is not a String or num"));
    }
    delete this[_jsObject][property];
  }
  instanceof(type) {
    return this[_jsObject] instanceof js._convertToJS(type);
  }
  toString() {
    try {
      return String(this[_jsObject]);
    } catch (e) {
      return super.toString();
    }

  }
  callMethod(method, args) {
    if (args === void 0) args = null;
    if (!(typeof method == 'string') && !(typeof method == 'number')) {
      dart.throw(new core.ArgumentError("method is not a String or num"));
    }
    if (args != null) args = core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS));
    let fn = this[_jsObject][method];
    if (typeof fn !== "function") {
      dart.throw(new core.NoSuchMethodError(this[_jsObject], core.Symbol.new(core.String._check(method)), args, dart.map({}, core.Symbol, dart.dynamic)));
    }
    return js._convertToDart(fn.apply(this[_jsObject], args));
  }
};
dart.defineNamedConstructor(js.JsObject, '_fromJs');
dart.setSignature(js.JsObject, {
  constructors: () => ({
    _fromJs: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
    new: dart.definiteFunctionType(js.JsObject, [js.JsFunction], [core.List]),
    fromBrowserObject: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
    jsify: dart.definiteFunctionType(js.JsObject, [dart.dynamic])
  }),
  fields: () => ({[_jsObject]: dart.dynamic}),
  methods: () => ({
    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    _set: dart.definiteFunctionType(dart.dynamic, [core.Object, dart.dynamic]),
    hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    deleteProperty: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    instanceof: dart.definiteFunctionType(core.bool, [js.JsFunction]),
    callMethod: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.List])
  }),
  statics: () => ({_convertDataTree: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
  names: ['_convertDataTree']
});
js.JsFunction = class JsFunction extends js.JsObject {
  static withThis(f) {
    return new js.JsFunction._fromJs(function() {
      let args = [js._convertToDart(this)];
      for (let arg of arguments) {
        args.push(js._convertToDart(arg));
      }
      return js._convertToJS(f(...args));
    });
  }
  _fromJs(jsObject) {
    super._fromJs(jsObject);
  }
  apply(args, opts) {
    let thisArg = opts && 'thisArg' in opts ? opts.thisArg : null;
    return js._convertToDart(this[_jsObject].apply(js._convertToJS(thisArg), args == null ? null : core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS))));
  }
};
dart.defineNamedConstructor(js.JsFunction, '_fromJs');
dart.setSignature(js.JsFunction, {
  constructors: () => ({
    withThis: dart.definiteFunctionType(js.JsFunction, [core.Function]),
    _fromJs: dart.definiteFunctionType(js.JsFunction, [dart.dynamic])
  }),
  methods: () => ({apply: dart.definiteFunctionType(dart.dynamic, [core.List], {thisArg: dart.dynamic})})
});
const _checkIndex = Symbol('_checkIndex');
const _checkInsertIndex = Symbol('_checkInsertIndex');
js.JsArray$ = dart.generic(E => {
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
  let JSArrayOfEAndEToint = () => (JSArrayOfEAndEToint = dart.constFn(_interceptors.JSArray$(EAndEToint())))();
  class JsArray extends dart.mixin(js.JsObject, collection.ListMixin$(E)) {
    new() {
      super._fromJs([]);
    }
    from(other) {
      super._fromJs((() => {
        let _ = [];
        _[dartx.addAll](other[dartx.map](dart.dynamic)(js._convertToJS));
        return _;
      })());
    }
    _fromJs(jsObject) {
      super._fromJs(jsObject);
    }
    [_checkIndex](index) {
      if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length))) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
    }
    [_checkInsertIndex](index) {
      if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length) + 1)) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
    }
    static _checkRange(start, end, length) {
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(length)) {
        dart.throw(new core.RangeError.range(start, 0, length));
      }
      if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(length)) {
        dart.throw(new core.RangeError.range(end, start, length));
      }
    }
    _get(index) {
      if (typeof index == 'number' && index == index[dartx.toInt]()) {
        this[_checkIndex](dart.asInt(index));
      }
      return E.as(super._get(index));
    }
    _set(index, value) {
      E._check(value);
      if (typeof index == 'number' && index == index[dartx.toInt]()) {
        this[_checkIndex](dart.asInt(index));
      }
      super._set(index, value);
      return value;
    }
    get length() {
      let len = this[_jsObject].length;
      if (typeof len === "number" && len >>> 0 === len) {
        return len;
      }
      dart.throw(new core.StateError('Bad JsArray length'));
    }
    set length(length) {
      super._set('length', length);
    }
    add(value) {
      E._check(value);
      this.callMethod('push', JSArrayOfE().of([value]));
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      let list = iterable instanceof Array ? iterable : core.List.from(iterable);
      this.callMethod('push', core.List._check(list));
    }
    insert(index, element) {
      E._check(element);
      this[_checkInsertIndex](index);
      this.callMethod('splice', JSArrayOfObject().of([index, 0, element]));
    }
    removeAt(index) {
      this[_checkIndex](index);
      return E.as(dart.dindex(this.callMethod('splice', JSArrayOfint().of([index, 1])), 0));
    }
    removeLast() {
      if (this.length == 0) dart.throw(new core.RangeError(-1));
      return E.as(this.callMethod('pop'));
    }
    removeRange(start, end) {
      js.JsArray._checkRange(start, end, this.length);
      this.callMethod('splice', JSArrayOfint().of([start, dart.notNull(end) - dart.notNull(start)]));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      js.JsArray._checkRange(start, end, this.length);
      let length = dart.notNull(end) - dart.notNull(start);
      if (length == 0) return;
      if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
      let args = JSArrayOfObject().of([start, length]);
      args[dartx.addAll](iterable[dartx.skip](skipCount)[dartx.take](length));
      this.callMethod('splice', args);
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      this.callMethod('sort', compare == null ? [] : JSArrayOfEAndEToint().of([compare]));
    }
  }
  dart.addTypeTests(JsArray);
  dart.defineNamedConstructor(JsArray, 'from');
  dart.defineNamedConstructor(JsArray, '_fromJs');
  dart.setSignature(JsArray, {
    constructors: () => ({
      new: dart.definiteFunctionType(js.JsArray$(E), []),
      from: dart.definiteFunctionType(js.JsArray$(E), [IterableOfE()]),
      _fromJs: dart.definiteFunctionType(js.JsArray$(E), [dart.dynamic])
    }),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [_checkIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
      [_checkInsertIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
      _get: dart.definiteFunctionType(E, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.Object, E])
    }),
    statics: () => ({_checkRange: dart.definiteFunctionType(dart.dynamic, [core.int, core.int, core.int])}),
    names: ['_checkRange']
  });
  dart.defineExtensionMembers(JsArray, [
    '_get',
    '_set',
    'add',
    'addAll',
    'insert',
    'removeAt',
    'removeLast',
    'removeRange',
    'setRange',
    'sort',
    'length',
    'length'
  ]);
  return JsArray;
});
js.JsArray = JsArray();
js._isBrowserType = function(o) {
  return o instanceof Object && (o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || window.IDBKeyRange && o instanceof IDBKeyRange || o instanceof ImageData || o instanceof Node || window.Int8Array && o instanceof Int8Array.__proto__ || o instanceof Window);
};
dart.fn(js._isBrowserType, dynamicTobool$());
const _dartObj = Symbol('_dartObj');
js._DartObject = class _DartObject extends core.Object {
  new(dartObj) {
    this[_dartObj] = dartObj;
  }
};
dart.setSignature(js._DartObject, {
  constructors: () => ({new: dart.definiteFunctionType(js._DartObject, [dart.dynamic])}),
  fields: () => ({[_dartObj]: dart.dynamic})
});
js._convertToJS = function(o) {
  if (o == null || typeof o == 'string' || typeof o == 'number' || typeof o == 'boolean' || dart.test(js._isBrowserType(o))) {
    return o;
  } else if (core.DateTime.is(o)) {
    return _js_helper.Primitives.lazyAsJsDate(o);
  } else if (js.JsObject.is(o)) {
    return o[_jsObject];
  } else if (core.Function.is(o)) {
    return js._putIfAbsent(js._jsProxies, o, js._wrapDartFunction);
  } else {
    return js._putIfAbsent(js._jsProxies, o, dart.fn(o => new js._DartObject(o), dynamicTo_DartObject()));
  }
};
dart.fn(js._convertToJS, dynamicTodynamic$());
js._wrapDartFunction = function(f) {
  let wrapper = function() {
    let args = Array.prototype.map.call(arguments, js._convertToDart);
    return js._convertToJS(f(...args));
  };
  js._dartProxies.set(wrapper, f);
  return wrapper;
};
dart.fn(js._wrapDartFunction, dynamicTodynamic$());
js._convertToDart = function(o) {
  if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean" || dart.test(js._isBrowserType(o))) {
    return o;
  } else if (o instanceof Date) {
    let ms = o.getTime();
    return new core.DateTime.fromMillisecondsSinceEpoch(dart.asInt(ms));
  } else if (js._DartObject.is(o) && dart.jsobject != dart.getReifiedType(o)) {
    return o[_dartObj];
  } else {
    return js._wrapToDart(o);
  }
};
dart.fn(js._convertToDart, dynamicToObject());
js._wrapToDart = function(o) {
  return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
};
dart.fn(js._wrapToDart, dynamicToObject());
js._wrapToDartHelper = function(o) {
  if (typeof o == "function") {
    return new js.JsFunction._fromJs(o);
  }
  if (o instanceof Array) {
    return new js.JsArray._fromJs(o);
  }
  return new js.JsObject._fromJs(o);
};
dart.fn(js._wrapToDartHelper, dynamicToObject());
dart.defineLazy(js, {
  get _dartProxies() {
    return new WeakMap();
  }
});
dart.defineLazy(js, {
  get _jsProxies() {
    return new WeakMap();
  }
});
js._putIfAbsent = function(weakMap, o, getValue) {
  let value = weakMap.get(o);
  if (value == null) {
    value = dart.dcall(getValue, o);
    weakMap.set(o, value);
  }
  return value;
};
dart.fn(js._putIfAbsent, dynamicAnddynamicAndFnToObject());
js.allowInterop = function(F) {
  return f => {
    return f;
  };
};
dart.fn(js.allowInterop, FToF());
dart.defineLazy(js, {
  get _interopCaptureThisExpando() {
    return new (ExpandoOfFunction())();
  },
  set _interopCaptureThisExpando(_) {}
});
js.allowInteropCaptureThis = function(f) {
  let ret = js._interopCaptureThisExpando._get(f);
  if (ret == null) {
    ret = function() {
      let args = [this];
      for (let arg of arguments) {
        args.push(arg);
      }
      return f(...args);
    };
    js._interopCaptureThisExpando._set(f, ret);
  }
  return ret;
};
dart.fn(js.allowInteropCaptureThis, FunctionToFunction());
js_util.jsify = function(object) {
  if (!core.Map.is(object) && !core.Iterable.is(object)) {
    dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
  }
  return js_util._convertDataTree(object);
};
dart.fn(js_util.jsify, dynamicTodynamic$());
js_util._convertDataTree = function(data) {
  let _convertedObjects = collection.HashMap.identity();
  function _convert(o) {
    if (dart.test(_convertedObjects.containsKey(o))) {
      return _convertedObjects._get(o);
    }
    if (core.Map.is(o)) {
      let convertedMap = {};
      _convertedObjects._set(o, convertedMap);
      for (let key of o[dartx.keys]) {
        convertedMap[key] = _convert(o[dartx._get](key));
      }
      return convertedMap;
    } else if (core.Iterable.is(o)) {
      let convertedList = [];
      _convertedObjects._set(o, convertedList);
      convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
      return convertedList;
    } else {
      return o;
    }
  }
  dart.fn(_convert, dynamicTodynamic$());
  return _convert(data);
};
dart.fn(js_util._convertDataTree, dynamicTodynamic$());
js_util.newObject = function() {
  return {};
};
dart.fn(js_util.newObject, VoidTodynamic$());
js_util.hasProperty = function(o, name) {
  return name in o;
};
dart.fn(js_util.hasProperty, dynamicAnddynamicTodynamic$());
js_util.getProperty = function(o, name) {
  return o[name];
};
dart.fn(js_util.getProperty, dynamicAnddynamicTodynamic$());
js_util.setProperty = function(o, name, value) {
  return o[name] = value;
};
dart.fn(js_util.setProperty, dynamicAnddynamicAnddynamicTodynamic());
js_util.callMethod = function(o, method, args) {
  return o[method].apply(o, args);
};
dart.fn(js_util.callMethod, dynamicAndStringAndListTodynamic());
js_util.instanceof = function(o, type) {
  return o instanceof type;
};
dart.fn(js_util.instanceof, dynamicAndFunctionTodynamic());
js_util.callConstructor = function(constr, arguments$) {
  if (arguments$ == null) {
    return new constr();
  }
  if (arguments$ instanceof Array) {
    let argumentCount = arguments$.length;
    switch (argumentCount) {
      case 0:
      {
        return new constr();
      }
      case 1:
      {
        let arg0 = arguments$[0];
        return new constr(arg0);
      }
      case 2:
      {
        let arg0 = arguments$[0];
        let arg1 = arguments$[1];
        return new constr(arg0, arg1);
      }
      case 3:
      {
        let arg0 = arguments$[0];
        let arg1 = arguments$[1];
        let arg2 = arguments$[2];
        return new constr(arg0, arg1, arg2);
      }
      case 4:
      {
        let arg0 = arguments$[0];
        let arg1 = arguments$[1];
        let arg2 = arguments$[2];
        let arg3 = arguments$[3];
        return new constr(arg0, arg1, arg2, arg3);
      }
    }
  }
  let args = [null];
  args[dartx.addAll](arguments$);
  let factoryFunction = constr.bind.apply(constr, args);
  String(factoryFunction);
  return new factoryFunction();
};
dart.fn(js_util.callConstructor, FunctionAndListTodynamic());
math.E = 2.718281828459045;
math.LN10 = 2.302585092994046;
math.LN2 = 0.6931471805599453;
math.LOG2E = 1.4426950408889634;
math.LOG10E = 0.4342944819032518;
math.PI = 3.141592653589793;
math.SQRT1_2 = 0.7071067811865476;
math.SQRT2 = 1.4142135623730951;
math.min = function(T) {
  return (a, b) => {
    return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
  };
};
dart.fn(math.min, TAndTToT());
math.max = function(T) {
  return (a, b) => {
    return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
  };
};
dart.fn(math.max, TAndTToT$());
math.atan2 = function(a, b) {
  return Math.atan2(_js_helper.checkNum(a), _js_helper.checkNum(b));
};
dart.fn(math.atan2, numAndnumTodouble());
math.pow = function(x, exponent) {
  _js_helper.checkNum(x);
  _js_helper.checkNum(exponent);
  return Math.pow(x, exponent);
};
dart.fn(math.pow, numAndnumTonum());
math.sin = function(x) {
  return Math.sin(_js_helper.checkNum(x));
};
dart.fn(math.sin, numTodouble());
math.cos = function(x) {
  return Math.cos(_js_helper.checkNum(x));
};
dart.fn(math.cos, numTodouble());
math.tan = function(x) {
  return Math.tan(_js_helper.checkNum(x));
};
dart.fn(math.tan, numTodouble());
math.acos = function(x) {
  return Math.acos(_js_helper.checkNum(x));
};
dart.fn(math.acos, numTodouble());
math.asin = function(x) {
  return Math.asin(_js_helper.checkNum(x));
};
dart.fn(math.asin, numTodouble());
math.atan = function(x) {
  return Math.atan(_js_helper.checkNum(x));
};
dart.fn(math.atan, numTodouble());
math.sqrt = function(x) {
  return Math.sqrt(_js_helper.checkNum(x));
};
dart.fn(math.sqrt, numTodouble());
math.exp = function(x) {
  return Math.exp(_js_helper.checkNum(x));
};
dart.fn(math.exp, numTodouble());
math.log = function(x) {
  return Math.log(_js_helper.checkNum(x));
};
dart.fn(math.log, numTodouble());
math._POW2_32 = 4294967296;
math._JSRandom = class _JSRandom extends core.Object {
  new() {
  }
  nextInt(max) {
    if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
      dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
    }
    return Math.random() * max >>> 0;
  }
  nextDouble() {
    return Math.random();
  }
  nextBool() {
    return Math.random() < 0.5;
  }
};
math._JSRandom[dart.implements] = () => [math.Random];
dart.setSignature(math._JSRandom, {
  constructors: () => ({new: dart.definiteFunctionType(math._JSRandom, [])}),
  methods: () => ({
    nextInt: dart.definiteFunctionType(core.int, [core.int]),
    nextDouble: dart.definiteFunctionType(core.double, []),
    nextBool: dart.definiteFunctionType(core.bool, [])
  })
});
const _lo = Symbol('_lo');
const _hi = Symbol('_hi');
const _nextState = Symbol('_nextState');
math._Random = class _Random extends core.Object {
  new(seed) {
    this[_lo] = 0;
    this[_hi] = 0;
    let empty_seed = 0;
    if (dart.notNull(seed) < 0) {
      empty_seed = -1;
    }
    do {
      let low = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
      seed = ((dart.notNull(seed) - low) / math._POW2_32)[dartx.truncate]();
      let high = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
      seed = ((dart.notNull(seed) - high) / math._POW2_32)[dartx.truncate]();
      let tmplow = low << 21 >>> 0;
      let tmphigh = (high << 21 | low[dartx['>>']](11)) >>> 0;
      tmplow = ((~low & math._Random._MASK32) >>> 0) + tmplow;
      low = (tmplow & math._Random._MASK32) >>> 0;
      high = ((~high >>> 0) + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
      tmphigh = high[dartx['>>']](24);
      tmplow = (low[dartx['>>']](24) | high << 8) >>> 0;
      low = (low ^ tmplow) >>> 0;
      high = (high ^ tmphigh) >>> 0;
      tmplow = low * 265;
      low = (tmplow & math._Random._MASK32) >>> 0;
      high = (high * 265 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
      tmphigh = high[dartx['>>']](14);
      tmplow = (low[dartx['>>']](14) | high << 18) >>> 0;
      low = (low ^ tmplow) >>> 0;
      high = (high ^ tmphigh) >>> 0;
      tmplow = low * 21;
      low = (tmplow & math._Random._MASK32) >>> 0;
      high = (high * 21 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
      tmphigh = high[dartx['>>']](28);
      tmplow = (low[dartx['>>']](28) | high << 4) >>> 0;
      low = (low ^ tmplow) >>> 0;
      high = (high ^ tmphigh) >>> 0;
      tmplow = low << 31 >>> 0;
      tmphigh = (high << 31 | low[dartx['>>']](1)) >>> 0;
      tmplow = tmplow + low;
      low = (tmplow & math._Random._MASK32) >>> 0;
      high = (high + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
      tmplow = dart.notNull(this[_lo]) * 1037;
      this[_lo] = (tmplow & math._Random._MASK32) >>> 0;
      this[_hi] = (dart.notNull(this[_hi]) * 1037 + ((tmplow - dart.notNull(this[_lo])) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
      this[_lo] = (dart.notNull(this[_lo]) ^ low) >>> 0;
      this[_hi] = (dart.notNull(this[_hi]) ^ high) >>> 0;
    } while (seed != empty_seed);
    if (this[_hi] == 0 && this[_lo] == 0) {
      this[_lo] = 23063;
    }
    this[_nextState]();
    this[_nextState]();
    this[_nextState]();
    this[_nextState]();
  }
  [_nextState]() {
    let tmpHi = 4294901760 * dart.notNull(this[_lo]);
    let tmpHiLo = (tmpHi & math._Random._MASK32) >>> 0;
    let tmpHiHi = tmpHi - tmpHiLo;
    let tmpLo = 55905 * dart.notNull(this[_lo]);
    let tmpLoLo = (tmpLo & math._Random._MASK32) >>> 0;
    let tmpLoHi = tmpLo - tmpLoLo;
    let newLo = tmpLoLo + tmpHiLo + dart.notNull(this[_hi]);
    this[_lo] = (newLo & math._Random._MASK32) >>> 0;
    let newLoHi = newLo - dart.notNull(this[_lo]);
    this[_hi] = (((tmpLoHi + tmpHiHi + newLoHi) / math._POW2_32)[dartx.truncate]() & math._Random._MASK32) >>> 0;
    dart.assert(dart.notNull(this[_lo]) < math._POW2_32);
    dart.assert(dart.notNull(this[_hi]) < math._POW2_32);
  }
  nextInt(max) {
    if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
      dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
    }
    if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
      this[_nextState]();
      return (dart.notNull(this[_lo]) & dart.notNull(max) - 1) >>> 0;
    }
    let rnd32 = null;
    let result = null;
    do {
      this[_nextState]();
      rnd32 = this[_lo];
      result = dart.asInt(rnd32[dartx.remainder](max));
    } while (dart.notNull(rnd32) - dart.notNull(result) + dart.notNull(max) >= math._POW2_32);
    return result;
  }
  nextDouble() {
    this[_nextState]();
    let bits26 = (dart.notNull(this[_lo]) & (1 << 26) - 1) >>> 0;
    this[_nextState]();
    let bits27 = (dart.notNull(this[_lo]) & (1 << 27) - 1) >>> 0;
    return (bits26 * math._Random._POW2_27_D + bits27) / math._Random._POW2_53_D;
  }
  nextBool() {
    this[_nextState]();
    return (dart.notNull(this[_lo]) & 1) == 0;
  }
};
math._Random[dart.implements] = () => [math.Random];
dart.setSignature(math._Random, {
  constructors: () => ({new: dart.definiteFunctionType(math._Random, [core.int])}),
  fields: () => ({
    [_lo]: core.int,
    [_hi]: core.int
  }),
  methods: () => ({
    [_nextState]: dart.definiteFunctionType(dart.void, []),
    nextInt: dart.definiteFunctionType(core.int, [core.int]),
    nextDouble: dart.definiteFunctionType(core.double, []),
    nextBool: dart.definiteFunctionType(core.bool, [])
  }),
  sfields: () => ({
    _POW2_53_D: core.double,
    _POW2_27_D: core.double,
    _MASK32: core.int
  })
});
math._Random._POW2_53_D = 1.0 * 9007199254740992;
math._Random._POW2_27_D = 1.0 * (1 << 27);
math._Random._MASK32 = 4294967295;
const _buffer$0 = Symbol('_buffer');
const _getRandomBytes = Symbol('_getRandomBytes');
math._JSSecureRandom = class _JSSecureRandom extends core.Object {
  new() {
    this[_buffer$0] = typed_data.ByteData.new(8);
    let crypto = self.crypto;
    if (crypto != null) {
      let getRandomValues = crypto.getRandomValues;
      if (getRandomValues != null) {
        return;
      }
    }
    dart.throw(new core.UnsupportedError("No source of cryptographically secure random numbers available."));
  }
  [_getRandomBytes](start, length) {
    crypto.getRandomValues(this[_buffer$0][dartx.buffer][dartx.asUint8List](start, length));
  }
  nextBool() {
    this[_getRandomBytes](0, 1);
    return this[_buffer$0][dartx.getUint8](0)[dartx.isOdd];
  }
  nextDouble() {
    this[_getRandomBytes](1, 7);
    this[_buffer$0][dartx.setUint8](0, 63);
    let highByte = this[_buffer$0][dartx.getUint8](1);
    this[_buffer$0][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
    let result = dart.notNull(this[_buffer$0][dartx.getFloat64](0)) - 1.0;
    if ((dart.notNull(highByte) & 16) != 0) {
      result = result + 1.1102230246251565e-16;
    }
    return result;
  }
  nextInt(max) {
    if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
      dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
    }
    let byteCount = 1;
    if (dart.notNull(max) > 255) {
      byteCount++;
      if (dart.notNull(max) > 65535) {
        byteCount++;
        if (dart.notNull(max) > 16777215) {
          byteCount++;
        }
      }
    }
    this[_buffer$0][dartx.setUint32](0, 0);
    let start = 4 - byteCount;
    let randomLimit = dart.asInt(math.pow(256, byteCount));
    while (true) {
      this[_getRandomBytes](start, byteCount);
      let random = this[_buffer$0][dartx.getUint32](0);
      if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
        return (dart.notNull(random) & dart.notNull(max) - 1) >>> 0;
      }
      let result = dart.asInt(random[dartx.remainder](max));
      if (dart.notNull(random) - dart.notNull(result) + dart.notNull(max) < dart.notNull(randomLimit)) {
        return result;
      }
    }
  }
};
math._JSSecureRandom[dart.implements] = () => [math.Random];
dart.setSignature(math._JSSecureRandom, {
  constructors: () => ({new: dart.definiteFunctionType(math._JSSecureRandom, [])}),
  fields: () => ({[_buffer$0]: typed_data.ByteData}),
  methods: () => ({
    [_getRandomBytes]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    nextBool: dart.definiteFunctionType(core.bool, []),
    nextDouble: dart.definiteFunctionType(core.double, []),
    nextInt: dart.definiteFunctionType(core.int, [core.int])
  })
});
math._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
  static combine(hash, value) {
    hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
    hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
    return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
  }
  static finish(hash) {
    hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
    hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
    return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
  }
  static hash2(a, b) {
    return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
  }
  static hash4(a, b, c, d) {
    return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
  }
};
dart.setSignature(math._JenkinsSmiHash, {
  statics: () => ({
    combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
    finish: dart.definiteFunctionType(core.int, [core.int]),
    hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
    hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['combine', 'finish', 'hash2', 'hash4']
});
math.Point$ = dart.generic(T => {
  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
  class Point extends core.Object {
    new(x, y) {
      this.x = x;
      this.y = y;
    }
    toString() {
      return dart.str`Point(${this.x}, ${this.y})`;
    }
    ['=='](other) {
      if (!PointOfnum().is(other)) return false;
      return dart.equals(this.x, dart.dload(other, 'x')) && dart.equals(this.y, dart.dload(other, 'y'));
    }
    get hashCode() {
      return math._JenkinsSmiHash.hash2(dart.hashCode(this.x), dart.hashCode(this.y));
    }
    ['+'](other) {
      PointOfT()._check(other);
      return new (PointOfT())(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
    }
    ['-'](other) {
      PointOfT()._check(other);
      return new (PointOfT())(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
    }
    ['*'](factor) {
      return new (PointOfT())(dart.notNull(this.x) * dart.notNull(factor), dart.notNull(this.y) * dart.notNull(factor));
    }
    get magnitude() {
      return math.sqrt(dart.notNull(this.x) * dart.notNull(this.x) + dart.notNull(this.y) * dart.notNull(this.y));
    }
    distanceTo(other) {
      PointOfT()._check(other);
      let dx = dart.notNull(this.x) - dart.notNull(other.x);
      let dy = dart.notNull(this.y) - dart.notNull(other.y);
      return math.sqrt(dx * dx + dy * dy);
    }
    squaredDistanceTo(other) {
      PointOfT()._check(other);
      let dx = dart.notNull(this.x) - dart.notNull(other.x);
      let dy = dart.notNull(this.y) - dart.notNull(other.y);
      return dx * dx + dy * dy;
    }
  }
  dart.addTypeTests(Point);
  dart.setSignature(Point, {
    constructors: () => ({new: dart.definiteFunctionType(math.Point$(T), [T, T])}),
    fields: () => ({
      x: T,
      y: T
    }),
    getters: () => ({magnitude: dart.definiteFunctionType(core.double, [])}),
    methods: () => ({
      '+': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
      '-': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
      '*': dart.definiteFunctionType(math.Point$(T), [core.num]),
      distanceTo: dart.definiteFunctionType(core.double, [PointOfT()]),
      squaredDistanceTo: dart.definiteFunctionType(T, [PointOfT()])
    })
  });
  return Point;
});
math.Point = Point$();
let const$82;
math.Random = class Random extends core.Object {
  static new(seed) {
    if (seed === void 0) seed = null;
    return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
  }
  static secure() {
    return math.Random._secureRandom;
  }
};
dart.setSignature(math.Random, {
  constructors: () => ({
    new: dart.definiteFunctionType(math.Random, [], [core.int]),
    secure: dart.definiteFunctionType(math.Random, [])
  }),
  sfields: () => ({_secureRandom: math._JSSecureRandom})
});
dart.defineLazy(math.Random, {
  get _secureRandom() {
    return new math._JSSecureRandom();
  }
});
math._RectangleBase$ = dart.generic(T => {
  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
  dart.defineExtensionNames([
    'right',
    'bottom',
    'toString',
    '==',
    'hashCode',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft'
  ]);
  class _RectangleBase extends core.Object {
    new() {
    }
    get right() {
      return dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]);
    }
    get bottom() {
      return dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    toString() {
      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
    }
    ['=='](other) {
      if (!RectangleOfnum().is(other)) return false;
      let otherRect = RectangleOfnum().as(other);
      return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
    }
    get hashCode() {
      return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
    }
    intersection(other) {
      RectangleOfT()._check(other);
      let x0 = math.max(T)(this[dartx.left], other[dartx.left]);
      let x1 = math.min(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      if (dart.notNull(x0) <= dart.notNull(x1)) {
        let y0 = math.max(T)(this[dartx.top], other[dartx.top]);
        let y1 = math.min(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        if (dart.notNull(y0) <= dart.notNull(y1)) {
          return new (RectangleOfT())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
        }
      }
      return null;
    }
    intersects(other) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    boundingBox(other) {
      RectangleOfT()._check(other);
      let right = math.max(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      let bottom = math.max(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      let left = math.min(T)(this[dartx.left], other[dartx.left]);
      let top = math.min(T)(this[dartx.top], other[dartx.top]);
      return new (RectangleOfT())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
    }
    containsRectangle(another) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
    }
    containsPoint(another) {
      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    get topLeft() {
      return new (PointOfT())(this[dartx.left], this[dartx.top]);
    }
    get topRight() {
      return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
    }
    get bottomRight() {
      return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    get bottomLeft() {
      return new (PointOfT())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
  }
  dart.addTypeTests(_RectangleBase);
  dart.setSignature(_RectangleBase, {
    constructors: () => ({new: dart.definiteFunctionType(math._RectangleBase$(T), [])}),
    getters: () => ({
      right: dart.definiteFunctionType(T, []),
      bottom: dart.definiteFunctionType(T, []),
      topLeft: dart.definiteFunctionType(math.Point$(T), []),
      topRight: dart.definiteFunctionType(math.Point$(T), []),
      bottomRight: dart.definiteFunctionType(math.Point$(T), []),
      bottomLeft: dart.definiteFunctionType(math.Point$(T), [])
    }),
    methods: () => ({
      intersection: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
      intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      boundingBox: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
      containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
    })
  });
  dart.defineExtensionMembers(_RectangleBase, [
    'toString',
    '==',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'right',
    'bottom',
    'hashCode',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft'
  ]);
  return _RectangleBase;
});
math._RectangleBase = _RectangleBase();
math.Rectangle$ = dart.generic(T => {
  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
  dart.defineExtensionNames([
    'left',
    'top',
    'width',
    'height'
  ]);
  class Rectangle extends math._RectangleBase$(T) {
    get left() {
      return this[left$];
    }
    set left(value) {
      super.left = value;
    }
    get top() {
      return this[top$];
    }
    set top(value) {
      super.top = value;
    }
    get width() {
      return this[width$];
    }
    set width(value) {
      super.width = value;
    }
    get height() {
      return this[height$];
    }
    set height(value) {
      super.height = value;
    }
    new(left, top, width, height) {
      this[left$] = left;
      this[top$] = top;
      this[width$] = dart.notNull(width) < 0 ? -dart.notNull(width) * 0 : width;
      this[height$] = dart.notNull(height) < 0 ? -dart.notNull(height) * 0 : height;
      super.new();
    }
    static fromPoints(a, b) {
      let left = math.min(T)(a.x, b.x);
      let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
      let top = math.min(T)(a.y, b.y);
      let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
      return new (RectangleOfT())(left, top, width, height);
    }
  }
  const left$ = Symbol(Rectangle.name + "." + 'left'.toString());
  const top$ = Symbol(Rectangle.name + "." + 'top'.toString());
  const width$ = Symbol(Rectangle.name + "." + 'width'.toString());
  const height$ = Symbol(Rectangle.name + "." + 'height'.toString());
  dart.setSignature(Rectangle, {
    constructors: () => ({
      new: dart.definiteFunctionType(math.Rectangle$(T), [T, T, T, T]),
      fromPoints: dart.definiteFunctionType(math.Rectangle$(T), [PointOfT(), PointOfT()])
    }),
    fields: () => ({
      left: T,
      top: T,
      width: T,
      height: T
    })
  });
  dart.defineExtensionMembers(Rectangle, ['left', 'top', 'width', 'height']);
  return Rectangle;
});
math.Rectangle = Rectangle();
const _width = Symbol('_width');
const _height = Symbol('_height');
math.MutableRectangle$ = dart.generic(T => {
  let MutableRectangleOfT = () => (MutableRectangleOfT = dart.constFn(math.MutableRectangle$(T)))();
  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
  class MutableRectangle extends math._RectangleBase$(T) {
    get left() {
      return this[left$];
    }
    set left(value) {
      this[left$] = value;
    }
    get top() {
      return this[top$];
    }
    set top(value) {
      this[top$] = value;
    }
    new(left, top, width, height) {
      this[left$] = left;
      this[top$] = top;
      this[_width] = dart.notNull(width) < 0 ? math._clampToZero(T)(width) : width;
      this[_height] = dart.notNull(height) < 0 ? math._clampToZero(T)(height) : height;
      super.new();
    }
    static fromPoints(a, b) {
      let left = math.min(T)(a.x, b.x);
      let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
      let top = math.min(T)(a.y, b.y);
      let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
      return new (MutableRectangleOfT())(left, top, width, height);
    }
    get width() {
      return this[_width];
    }
    set width(width) {
      T._check(width);
      if (dart.notNull(width) < 0) width = math._clampToZero(T)(width);
      this[_width] = width;
    }
    get height() {
      return this[_height];
    }
    set height(height) {
      T._check(height);
      if (dart.notNull(height) < 0) height = math._clampToZero(T)(height);
      this[_height] = height;
    }
  }
  const left$ = Symbol(MutableRectangle.name + "." + 'left'.toString());
  const top$ = Symbol(MutableRectangle.name + "." + 'top'.toString());
  MutableRectangle[dart.implements] = () => [RectangleOfT()];
  dart.setSignature(MutableRectangle, {
    constructors: () => ({
      new: dart.definiteFunctionType(math.MutableRectangle$(T), [T, T, T, T]),
      fromPoints: dart.definiteFunctionType(math.MutableRectangle$(T), [PointOfT(), PointOfT()])
    }),
    fields: () => ({
      left: T,
      top: T,
      [_width]: T,
      [_height]: T
    }),
    getters: () => ({
      width: dart.definiteFunctionType(T, []),
      height: dart.definiteFunctionType(T, [])
    }),
    setters: () => ({
      width: dart.definiteFunctionType(dart.void, [T]),
      height: dart.definiteFunctionType(dart.void, [T])
    })
  });
  dart.defineExtensionMembers(MutableRectangle, ['left', 'top', 'width', 'height']);
  return MutableRectangle;
});
math.MutableRectangle = MutableRectangle();
math._clampToZero = function(T) {
  return value => {
    dart.assert(dart.notNull(value) < 0);
    return -dart.notNull(value) * 0;
  };
};
dart.fn(math._clampToZero, TToT());
mirrors.MirrorSystem = class MirrorSystem extends core.Object {
  findLibrary(libraryName) {
    return this.libraries[dartx.values][dartx.singleWhere](dart.fn(library => dart.equals(library.simpleName, libraryName), LibraryMirrorTobool()));
  }
  static getName(symbol) {
    return _js_mirrors.getName(symbol);
  }
  static getSymbol(name, library) {
    if (library === void 0) library = null;
    return _js_mirrors.getSymbol(name, library);
  }
};
dart.setSignature(mirrors.MirrorSystem, {
  methods: () => ({findLibrary: dart.definiteFunctionType(mirrors.LibraryMirror, [core.Symbol])}),
  statics: () => ({
    getName: dart.definiteFunctionType(core.String, [core.Symbol]),
    getSymbol: dart.definiteFunctionType(core.Symbol, [core.String], [mirrors.LibraryMirror])
  }),
  names: ['getName', 'getSymbol']
});
mirrors.currentMirrorSystem = function() {
  return mirrors.MirrorSystem._check(_js_mirrors.currentJsMirrorSystem);
};
dart.fn(mirrors.currentMirrorSystem, VoidToMirrorSystem());
mirrors.reflect = function(reflectee) {
  return _js_mirrors.reflect(reflectee);
};
dart.lazyFn(mirrors.reflect, () => ObjectToInstanceMirror());
mirrors.reflectClass = function(key) {
  if (!core.Type.is(key) || dart.equals(key, dart.wrapType(dart.dynamic))) {
    dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
  }
  let tm = mirrors.reflectType(key);
  if (!mirrors.ClassMirror.is(tm)) {
    dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
  }
  return mirrors.ClassMirror._check(mirrors.ClassMirror.as(tm).originalDeclaration);
};
dart.lazyFn(mirrors.reflectClass, () => TypeToClassMirror());
mirrors.reflectType = function(key) {
  if (dart.equals(key, dart.wrapType(dart.dynamic))) {
    return mirrors.currentMirrorSystem().dynamicType;
  }
  return _js_mirrors.reflectType(key);
};
dart.lazyFn(mirrors.reflectType, () => TypeToTypeMirror());
mirrors.Mirror = class Mirror extends core.Object {};
mirrors.IsolateMirror = class IsolateMirror extends core.Object {};
mirrors.IsolateMirror[dart.implements] = () => [mirrors.Mirror];
mirrors.DeclarationMirror = class DeclarationMirror extends core.Object {};
mirrors.DeclarationMirror[dart.implements] = () => [mirrors.Mirror];
mirrors.ObjectMirror = class ObjectMirror extends core.Object {};
mirrors.ObjectMirror[dart.implements] = () => [mirrors.Mirror];
mirrors.InstanceMirror = class InstanceMirror extends core.Object {};
mirrors.InstanceMirror[dart.implements] = () => [mirrors.ObjectMirror];
mirrors.ClosureMirror = class ClosureMirror extends core.Object {};
mirrors.ClosureMirror[dart.implements] = () => [mirrors.InstanceMirror];
mirrors.LibraryMirror = class LibraryMirror extends core.Object {};
mirrors.LibraryMirror[dart.implements] = () => [mirrors.DeclarationMirror, mirrors.ObjectMirror];
mirrors.LibraryDependencyMirror = class LibraryDependencyMirror extends core.Object {};
mirrors.LibraryDependencyMirror[dart.implements] = () => [mirrors.Mirror];
mirrors.CombinatorMirror = class CombinatorMirror extends core.Object {};
mirrors.CombinatorMirror[dart.implements] = () => [mirrors.Mirror];
mirrors.TypeMirror = class TypeMirror extends core.Object {};
mirrors.TypeMirror[dart.implements] = () => [mirrors.DeclarationMirror];
mirrors.ClassMirror = class ClassMirror extends core.Object {};
mirrors.ClassMirror[dart.implements] = () => [mirrors.TypeMirror, mirrors.ObjectMirror];
mirrors.FunctionTypeMirror = class FunctionTypeMirror extends core.Object {};
mirrors.FunctionTypeMirror[dart.implements] = () => [mirrors.ClassMirror];
mirrors.TypeVariableMirror = class TypeVariableMirror extends mirrors.TypeMirror {};
mirrors.TypedefMirror = class TypedefMirror extends core.Object {};
mirrors.TypedefMirror[dart.implements] = () => [mirrors.TypeMirror];
mirrors.MethodMirror = class MethodMirror extends core.Object {};
mirrors.MethodMirror[dart.implements] = () => [mirrors.DeclarationMirror];
mirrors.VariableMirror = class VariableMirror extends core.Object {};
mirrors.VariableMirror[dart.implements] = () => [mirrors.DeclarationMirror];
mirrors.ParameterMirror = class ParameterMirror extends core.Object {};
mirrors.ParameterMirror[dart.implements] = () => [mirrors.VariableMirror];
mirrors.SourceLocation = class SourceLocation extends core.Object {};
mirrors.Comment = class Comment extends core.Object {
  new(text, trimmedText, isDocComment) {
    this.text = text;
    this.trimmedText = trimmedText;
    this.isDocComment = isDocComment;
  }
};
dart.setSignature(mirrors.Comment, {
  constructors: () => ({new: dart.definiteFunctionType(mirrors.Comment, [core.String, core.String, core.bool])}),
  fields: () => ({
    text: core.String,
    trimmedText: core.String,
    isDocComment: core.bool
  })
});
mirrors.MirrorsUsed = class MirrorsUsed extends core.Object {
  new(opts) {
    let symbols = opts && 'symbols' in opts ? opts.symbols : null;
    let targets = opts && 'targets' in opts ? opts.targets : null;
    let metaTargets = opts && 'metaTargets' in opts ? opts.metaTargets : null;
    let override = opts && 'override' in opts ? opts.override : null;
    this.symbols = symbols;
    this.targets = targets;
    this.metaTargets = metaTargets;
    this.override = override;
  }
};
dart.setSignature(mirrors.MirrorsUsed, {
  constructors: () => ({new: dart.definiteFunctionType(mirrors.MirrorsUsed, [], {symbols: dart.dynamic, targets: dart.dynamic, metaTargets: dart.dynamic, override: dart.dynamic})}),
  fields: () => ({
    symbols: dart.dynamic,
    targets: dart.dynamic,
    metaTargets: dart.dynamic,
    override: dart.dynamic
  })
});
typed_data.ByteBuffer = class ByteBuffer extends core.Object {};
typed_data.TypedData = class TypedData extends core.Object {};
const _littleEndian = Symbol('_littleEndian');
typed_data.Endianness = class Endianness extends core.Object {
  _(littleEndian) {
    this[_littleEndian] = littleEndian;
  }
};
dart.defineNamedConstructor(typed_data.Endianness, '_');
dart.setSignature(typed_data.Endianness, {
  constructors: () => ({_: dart.definiteFunctionType(typed_data.Endianness, [core.bool])}),
  fields: () => ({[_littleEndian]: core.bool}),
  sfields: () => ({
    BIG_ENDIAN: typed_data.Endianness,
    LITTLE_ENDIAN: typed_data.Endianness,
    HOST_ENDIAN: typed_data.Endianness
  })
});
dart.defineLazy(typed_data.Endianness, {
  get BIG_ENDIAN() {
    return dart.const(new typed_data.Endianness._(false));
  },
  get LITTLE_ENDIAN() {
    return dart.const(new typed_data.Endianness._(true));
  },
  get HOST_ENDIAN() {
    return typed_data.ByteData.view(typed_data.Uint16List.fromList(JSArrayOfint().of([1]))[dartx.buffer])[dartx.getInt8](0) == 1 ? typed_data.Endianness.LITTLE_ENDIAN : typed_data.Endianness.BIG_ENDIAN;
  }
});
typed_data.ByteData = class ByteData extends core.Object {
  static new(length) {
    return _native_typed_data.NativeByteData.new(length);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asByteData](offsetInBytes, length);
  }
};
typed_data.ByteData[dart.implements] = () => [typed_data.TypedData];
dart.setSignature(typed_data.ByteData, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.ByteData, [core.int]),
    view: dart.definiteFunctionType(typed_data.ByteData, [typed_data.ByteBuffer], [core.int, core.int])
  })
});
typed_data.Int8List = class Int8List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeInt8List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt8List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asInt8List](offsetInBytes, length);
  }
};
typed_data.Int8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Int8List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Int8List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Int8List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Int8List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Int8List.BYTES_PER_ELEMENT = 1;
typed_data.Uint8List = class Uint8List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint8List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asUint8List](offsetInBytes, length);
  }
};
typed_data.Uint8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Uint8List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Uint8List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Uint8List.BYTES_PER_ELEMENT = 1;
typed_data.Uint8ClampedList = class Uint8ClampedList extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint8ClampedList.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8ClampedList.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asUint8ClampedList](offsetInBytes, length);
  }
};
typed_data.Uint8ClampedList[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Uint8ClampedList, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Uint8ClampedList, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Uint8ClampedList, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Uint8ClampedList, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Uint8ClampedList.BYTES_PER_ELEMENT = 1;
typed_data.Int16List = class Int16List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeInt16List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt16List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asInt16List](offsetInBytes, length);
  }
};
typed_data.Int16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Int16List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Int16List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Int16List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Int16List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Int16List.BYTES_PER_ELEMENT = 2;
typed_data.Uint16List = class Uint16List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint16List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint16List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asUint16List](offsetInBytes, length);
  }
};
typed_data.Uint16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Uint16List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Uint16List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Uint16List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Uint16List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Uint16List.BYTES_PER_ELEMENT = 2;
typed_data.Int32List = class Int32List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeInt32List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt32List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asInt32List](offsetInBytes, length);
  }
};
typed_data.Int32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Int32List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Int32List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Int32List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Int32List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Int32List.BYTES_PER_ELEMENT = 4;
typed_data.Uint32List = class Uint32List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint32List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint32List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asUint32List](offsetInBytes, length);
  }
};
typed_data.Uint32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Uint32List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Uint32List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Uint32List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Uint32List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Uint32List.BYTES_PER_ELEMENT = 4;
typed_data.Int64List = class Int64List extends core.Object {
  static new(length) {
    dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
  }
  static fromList(elements) {
    dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asInt64List](offsetInBytes, length);
  }
};
typed_data.Int64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Int64List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Int64List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Int64List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Int64List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Int64List.BYTES_PER_ELEMENT = 8;
typed_data.Uint64List = class Uint64List extends core.Object {
  static new(length) {
    dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
  }
  static fromList(elements) {
    dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asUint64List](offsetInBytes, length);
  }
};
typed_data.Uint64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
dart.setSignature(typed_data.Uint64List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Uint64List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Uint64List, [ListOfint()]),
    view: dart.definiteFunctionType(typed_data.Uint64List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Uint64List.BYTES_PER_ELEMENT = 8;
typed_data.Float32List = class Float32List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeFloat32List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat32List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asFloat32List](offsetInBytes, length);
  }
};
typed_data.Float32List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
dart.setSignature(typed_data.Float32List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Float32List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Float32List, [ListOfdouble()]),
    view: dart.definiteFunctionType(typed_data.Float32List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Float32List.BYTES_PER_ELEMENT = 4;
typed_data.Float64List = class Float64List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeFloat64List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat64List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asFloat64List](offsetInBytes, length);
  }
};
typed_data.Float64List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
dart.setSignature(typed_data.Float64List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Float64List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Float64List, [ListOfdouble()]),
    view: dart.definiteFunctionType(typed_data.Float64List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Float64List.BYTES_PER_ELEMENT = 8;
typed_data.Float32x4List = class Float32x4List extends core.Object {
  static new(length) {
    return new _native_typed_data.NativeFloat32x4List(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat32x4List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asFloat32x4List](offsetInBytes, length);
  }
};
typed_data.Float32x4List[dart.implements] = () => [ListOfFloat32x4(), typed_data.TypedData];
dart.setSignature(typed_data.Float32x4List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Float32x4List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Float32x4List, [ListOfFloat32x4()]),
    view: dart.definiteFunctionType(typed_data.Float32x4List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Float32x4List.BYTES_PER_ELEMENT = 16;
typed_data.Int32x4List = class Int32x4List extends core.Object {
  static new(length) {
    return new _native_typed_data.NativeInt32x4List(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt32x4List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asInt32x4List](offsetInBytes, length);
  }
};
typed_data.Int32x4List[dart.implements] = () => [ListOfInt32x4(), typed_data.TypedData];
dart.setSignature(typed_data.Int32x4List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Int32x4List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Int32x4List, [ListOfInt32x4()]),
    view: dart.definiteFunctionType(typed_data.Int32x4List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Int32x4List.BYTES_PER_ELEMENT = 16;
typed_data.Float64x2List = class Float64x2List extends core.Object {
  static new(length) {
    return new _native_typed_data.NativeFloat64x2List(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat64x2List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[dartx.asFloat64x2List](offsetInBytes, length);
  }
};
typed_data.Float64x2List[dart.implements] = () => [ListOfFloat64x2(), typed_data.TypedData];
dart.setSignature(typed_data.Float64x2List, {
  constructors: () => ({
    new: dart.definiteFunctionType(typed_data.Float64x2List, [core.int]),
    fromList: dart.definiteFunctionType(typed_data.Float64x2List, [ListOfFloat64x2()]),
    view: dart.definiteFunctionType(typed_data.Float64x2List, [typed_data.ByteBuffer], [core.int, core.int])
  }),
  sfields: () => ({BYTES_PER_ELEMENT: core.int})
});
typed_data.Float64x2List.BYTES_PER_ELEMENT = 16;
indexed_db._KeyRangeFactoryProvider = class _KeyRangeFactoryProvider extends core.Object {
  static createKeyRange_only(value) {
    return indexed_db._KeyRangeFactoryProvider._only(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(value));
  }
  static createKeyRange_lowerBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider._lowerBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
  }
  static createKeyRange_upperBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider._upperBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
  }
  static createKeyRange_bound(lower, upper, lowerOpen, upperOpen) {
    if (lowerOpen === void 0) lowerOpen = false;
    if (upperOpen === void 0) upperOpen = false;
    return indexed_db._KeyRangeFactoryProvider._bound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(lower), indexed_db._KeyRangeFactoryProvider._translateKey(upper), lowerOpen, upperOpen);
  }
  static _class() {
    if (indexed_db._KeyRangeFactoryProvider._cachedClass != null) return indexed_db._KeyRangeFactoryProvider._cachedClass;
    return indexed_db._KeyRangeFactoryProvider._cachedClass = indexed_db._KeyRangeFactoryProvider._uncachedClass();
  }
  static _uncachedClass() {
    return window.webkitIDBKeyRange || window.mozIDBKeyRange || window.msIDBKeyRange || window.IDBKeyRange;
  }
  static _translateKey(idbkey) {
    return idbkey;
  }
  static _only(cls, value) {
    return cls.only(value);
  }
  static _lowerBound(cls, bound, open) {
    return cls.lowerBound(bound, open);
  }
  static _upperBound(cls, bound, open) {
    return cls.upperBound(bound, open);
  }
  static _bound(cls, lower, upper, lowerOpen, upperOpen) {
    return cls.bound(lower, upper, lowerOpen, upperOpen);
  }
};
dart.setSignature(indexed_db._KeyRangeFactoryProvider, {
  sfields: () => ({_cachedClass: dart.dynamic}),
  statics: () => ({
    createKeyRange_only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
    createKeyRange_lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
    createKeyRange_upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
    createKeyRange_bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
    _class: dart.definiteFunctionType(dart.dynamic, []),
    _uncachedClass: dart.definiteFunctionType(dart.dynamic, []),
    _translateKey: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic]),
    _lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['createKeyRange_only', 'createKeyRange_lowerBound', 'createKeyRange_upperBound', 'createKeyRange_bound', '_class', '_uncachedClass', '_translateKey', '_only', '_lowerBound', '_upperBound', '_bound']
});
indexed_db._KeyRangeFactoryProvider._cachedClass = null;
indexed_db._convertNativeToDart_IDBKey = function(nativeKey) {
  function containsDate(object) {
    if (dart.test(html_common.isJavaScriptDate(object))) return true;
    if (core.List.is(object)) {
      for (let i = 0; i < dart.notNull(object[dartx.length]); i++) {
        if (dart.test(containsDate(object[dartx._get](i)))) return true;
      }
    }
    return false;
  }
  dart.fn(containsDate, dynamicTobool$());
  if (dart.test(containsDate(nativeKey))) {
    dart.throw(new core.UnimplementedError('Key containing DateTime'));
  }
  return nativeKey;
};
dart.fn(indexed_db._convertNativeToDart_IDBKey, dynamicTodynamic$());
indexed_db._convertDartToNative_IDBKey = function(dartKey) {
  return dartKey;
};
dart.fn(indexed_db._convertDartToNative_IDBKey, dynamicTodynamic$());
indexed_db._convertNativeToDart_IDBAny = function(object) {
  return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false});
};
dart.fn(indexed_db._convertNativeToDart_IDBAny, dynamicTodynamic$());
indexed_db._idbKey = 'JSExtendableArray|=Object|num|String';
indexed_db._annotation_Creates_IDBKey = dart.const(new _js_helper.Creates(indexed_db._idbKey));
indexed_db._annotation_Returns_IDBKey = dart.const(new _js_helper.Returns(indexed_db._idbKey));
const _delete$ = Symbol('_delete');
const _update = Symbol('_update');
const _update_1 = Symbol('_update_1');
dart.defineExtensionNames([
  'delete',
  'update',
  'next',
  'advance',
  'continuePrimaryKey',
  'direction',
  'key',
  'primaryKey',
  'source'
]);
indexed_db.Cursor = class Cursor extends _interceptors.Interceptor {
  [dartx.delete]() {
    try {
      return indexed_db._completeRequest(dart.dynamic)(this[_delete$]());
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.update](value) {
    try {
      return indexed_db._completeRequest(dart.dynamic)(this[_update](value));
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.next](key) {
    if (key === void 0) key = null;
    if (key == null) {
      this.continue();
    } else {
      this.continue(key);
    }
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.direction]() {
    return this.direction;
  }
  get [dartx.key]() {
    return this.key;
  }
  get [dartx.primaryKey]() {
    return this.primaryKey;
  }
  get [dartx.source]() {
    return this.source;
  }
  [dartx.advance](...args) {
    return this.advance.apply(this, args);
  }
  [dartx.continuePrimaryKey](...args) {
    return this.continuePrimaryKey.apply(this, args);
  }
  [_delete$](...args) {
    return this.delete.apply(this, args);
  }
  [_update](value) {
    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
    return this[_update_1](value_1);
  }
  [_update_1](...args) {
    return this.update.apply(this, args);
  }
};
dart.setSignature(indexed_db.Cursor, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Cursor, [])}),
  fields: () => ({
    [dartx.direction]: core.String,
    [dartx.key]: core.Object,
    [dartx.primaryKey]: core.Object,
    [dartx.source]: core.Object
  }),
  methods: () => ({
    [dartx.delete]: dart.definiteFunctionType(async.Future, []),
    [dartx.update]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.next]: dart.definiteFunctionType(dart.void, [], [core.Object]),
    [dartx.advance]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.continuePrimaryKey]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
    [_delete$]: dart.definiteFunctionType(indexed_db.Request, []),
    [_update]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
    [_update_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.IDBCursor, indexed_db.Cursor);
const _get_value = Symbol('_get_value');
dart.defineExtensionNames([
  'value'
]);
indexed_db.CursorWithValue = class CursorWithValue extends indexed_db.Cursor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.value]() {
    return indexed_db._convertNativeToDart_IDBAny(this[_get_value]);
  }
  get [_get_value]() {
    return this.value;
  }
};
dart.setSignature(indexed_db.CursorWithValue, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.CursorWithValue, [])}),
  fields: () => ({[_get_value]: dart.dynamic}),
  getters: () => ({[dartx.value]: dart.definiteFunctionType(dart.dynamic, [])})
});
dart.registerExtension(dart.global.IDBCursorWithValue, indexed_db.CursorWithValue);
const _createObjectStore = Symbol('_createObjectStore');
const _transaction = Symbol('_transaction');
const _createObjectStore_1 = Symbol('_createObjectStore_1');
const _createObjectStore_2 = Symbol('_createObjectStore_2');
const _addEventListener = Symbol('_addEventListener');
const _removeEventListener = Symbol('_removeEventListener');
dart.defineExtensionNames([
  'on',
  'addEventListener',
  'removeEventListener',
  'dispatchEvent'
]);
html$.EventTarget = class EventTarget extends _interceptors.Interceptor {
  _created() {
    super.new();
  }
  get [dartx.on]() {
    return new html$.Events(this);
  }
  [dartx.addEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    if (listener != null) {
      this[_addEventListener](type, listener, useCapture);
    }
  }
  [dartx.removeEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    if (listener != null) {
      this[_removeEventListener](type, listener, useCapture);
    }
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [_addEventListener](...args) {
    return this.addEventListener.apply(this, args);
  }
  [dartx.dispatchEvent](...args) {
    return this.dispatchEvent.apply(this, args);
  }
  [_removeEventListener](...args) {
    return this.removeEventListener.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.EventTarget, '_created');
dart.setSignature(html$.EventTarget, {
  constructors: () => ({
    _created: dart.definiteFunctionType(html$.EventTarget, []),
    _: dart.definiteFunctionType(html$.EventTarget, [])
  }),
  getters: () => ({[dartx.on]: dart.definiteFunctionType(html$.Events, [])}),
  methods: () => ({
    [dartx.addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
    [dartx.removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
    [dartx.dispatchEvent]: dart.definiteFunctionType(core.bool, [html$.Event]),
    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
  })
});
dart.registerExtension(dart.global.EventTarget, html$.EventTarget);
dart.defineExtensionNames([
  'createObjectStore',
  'transaction',
  'transactionStore',
  'transactionList',
  'transactionStores',
  'close',
  'deleteObjectStore',
  'onAbort',
  'onClose',
  'onError',
  'onVersionChange',
  'name',
  'objectStoreNames',
  'version'
]);
indexed_db.Database = class Database extends html$.EventTarget {
  [dartx.createObjectStore](name, opts) {
    let keyPath = opts && 'keyPath' in opts ? opts.keyPath : null;
    let autoIncrement = opts && 'autoIncrement' in opts ? opts.autoIncrement : null;
    let options = dart.map();
    if (keyPath != null) {
      options[dartx._set]('keyPath', keyPath);
    }
    if (autoIncrement != null) {
      options[dartx._set]('autoIncrement', autoIncrement);
    }
    return this[_createObjectStore](name, options);
  }
  [dartx.transaction](storeName_OR_storeNames, mode) {
    if (mode != 'readonly' && mode != 'readwrite') {
      dart.throw(new core.ArgumentError(mode));
    }
    return this[_transaction](storeName_OR_storeNames, mode);
  }
  [dartx.transactionStore](storeName, mode) {
    if (mode != 'readonly' && mode != 'readwrite') {
      dart.throw(new core.ArgumentError(mode));
    }
    return this[_transaction](storeName, mode);
  }
  [dartx.transactionList](storeNames, mode) {
    if (mode != 'readonly' && mode != 'readwrite') {
      dart.throw(new core.ArgumentError(mode));
    }
    let storeNames_1 = html_common.convertDartToNative_StringArray(storeNames);
    return this[_transaction](storeNames_1, mode);
  }
  [dartx.transactionStores](storeNames, mode) {
    if (mode != 'readonly' && mode != 'readwrite') {
      dart.throw(new core.ArgumentError(mode));
    }
    return this[_transaction](storeNames, mode);
  }
  [_transaction](...args) {
    return this.transaction.apply(this, args);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.objectStoreNames]() {
    return this.objectStoreNames;
  }
  get [dartx.version]() {
    return this.version;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [_createObjectStore](name, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_createObjectStore_1](name, options_1);
    }
    return this[_createObjectStore_2](name);
  }
  [_createObjectStore_1](...args) {
    return this.createObjectStore.apply(this, args);
  }
  [_createObjectStore_2](...args) {
    return this.createObjectStore.apply(this, args);
  }
  [dartx.deleteObjectStore](...args) {
    return this.deleteObjectStore.apply(this, args);
  }
  get [dartx.onAbort]() {
    return indexed_db.Database.abortEvent.forTarget(this);
  }
  get [dartx.onClose]() {
    return indexed_db.Database.closeEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return indexed_db.Database.errorEvent.forTarget(this);
  }
  get [dartx.onVersionChange]() {
    return indexed_db.Database.versionChangeEvent.forTarget(this);
  }
};
dart.setSignature(indexed_db.Database, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Database, [])}),
  fields: () => ({
    [dartx.name]: core.String,
    [dartx.objectStoreNames]: ListOfString(),
    [dartx.version]: core.Object
  }),
  getters: () => ({
    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onVersionChange]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
  }),
  methods: () => ({
    [dartx.createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], {keyPath: core.String, autoIncrement: core.bool}),
    [dartx.transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, core.String]),
    [dartx.transactionStore]: dart.definiteFunctionType(indexed_db.Transaction, [core.String, core.String]),
    [dartx.transactionList]: dart.definiteFunctionType(indexed_db.Transaction, [ListOfString(), core.String]),
    [dartx.transactionStores]: dart.definiteFunctionType(indexed_db.Transaction, [html$.DomStringList, core.String]),
    [_transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, dart.dynamic]),
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [_createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], [core.Map]),
    [_createObjectStore_1]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic, dart.dynamic]),
    [_createObjectStore_2]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic]),
    [dartx.deleteObjectStore]: dart.definiteFunctionType(dart.void, [core.String])
  }),
  sfields: () => ({
    abortEvent: EventStreamProviderOfEvent(),
    closeEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    versionChangeEvent: EventStreamProviderOfVersionChangeEvent()
  })
});
dart.defineLazy(indexed_db.Database, {
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('abort'));
  },
  get closeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('close'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get versionChangeEvent() {
    return dart.const(new (EventStreamProviderOfVersionChangeEvent())('versionchange'));
  }
});
dart.registerExtension(dart.global.IDBDatabase, indexed_db.Database);
const _open = Symbol('_open');
const _deleteDatabase = Symbol('_deleteDatabase');
const _webkitGetDatabaseNames = Symbol('_webkitGetDatabaseNames');
dart.defineExtensionNames([
  'open',
  'deleteDatabase',
  'getDatabaseNames',
  'supportsDatabaseNames',
  'cmp'
]);
indexed_db.IdbFactory = class IdbFactory extends _interceptors.Interceptor {
  static get supported() {
    return !!(window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB);
  }
  [dartx.open](name, opts) {
    let version = opts && 'version' in opts ? opts.version : null;
    let onUpgradeNeeded = opts && 'onUpgradeNeeded' in opts ? opts.onUpgradeNeeded : null;
    let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
    if (version == null != (onUpgradeNeeded == null)) {
      return FutureOfDatabase().error(new core.ArgumentError('version and onUpgradeNeeded must be specified together'));
    }
    try {
      let request = null;
      if (version != null) {
        request = this[_open](name, version);
      } else {
        request = this[_open](name);
      }
      if (onUpgradeNeeded != null) {
        dart.dsend(dart.dload(request, 'onUpgradeNeeded'), 'listen', onUpgradeNeeded);
      }
      if (onBlocked != null) {
        dart.dsend(dart.dload(request, 'onBlocked'), 'listen', onBlocked);
      }
      return indexed_db._completeRequest(indexed_db.Database)(indexed_db.Request._check(request));
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return FutureOfDatabase().error(e, stacktrace);
    }

  }
  [dartx.deleteDatabase](name, opts) {
    let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
    try {
      let request = this[_deleteDatabase](name);
      if (onBlocked != null) {
        request[dartx.onBlocked].listen(onBlocked);
      }
      let completer = CompleterOfIdbFactory().sync();
      request[dartx.onSuccess].listen(dart.fn(e => {
        completer.complete(this);
      }, EventToNull()));
      request[dartx.onError].listen(dart.bind(completer, 'completeError'));
      return completer.future;
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return FutureOfIdbFactory().error(e, stacktrace);
    }

  }
  [dartx.getDatabaseNames]() {
    try {
      let request = this[_webkitGetDatabaseNames]();
      return indexed_db._completeRequest(ListOfString())(request);
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return FutureOfListOfString().error(e, stacktrace);
    }

  }
  get [dartx.supportsDatabaseNames]() {
    return dart.test(indexed_db.IdbFactory.supported) && !!(this.getDatabaseNames || this.webkitGetDatabaseNames);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.cmp](...args) {
    return this.cmp.apply(this, args);
  }
  [_deleteDatabase](...args) {
    return this.deleteDatabase.apply(this, args);
  }
  [_open](...args) {
    return this.open.apply(this, args);
  }
  [_webkitGetDatabaseNames](...args) {
    return this.webkitGetDatabaseNames.apply(this, args);
  }
};
dart.setSignature(indexed_db.IdbFactory, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.IdbFactory, [])}),
  getters: () => ({[dartx.supportsDatabaseNames]: dart.definiteFunctionType(core.bool, [])}),
  methods: () => ({
    [dartx.open]: dart.definiteFunctionType(async.Future$(indexed_db.Database), [core.String], {version: core.int, onUpgradeNeeded: dynamicTovoid(), onBlocked: dynamicTovoid()}),
    [dartx.deleteDatabase]: dart.definiteFunctionType(async.Future$(indexed_db.IdbFactory), [core.String], {onBlocked: EventTovoid()}),
    [dartx.getDatabaseNames]: dart.definiteFunctionType(async.Future$(core.List$(core.String)), []),
    [dartx.cmp]: dart.definiteFunctionType(core.int, [core.Object, core.Object]),
    [_deleteDatabase]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String]),
    [_open]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String], [core.int]),
    [_webkitGetDatabaseNames]: dart.definiteFunctionType(indexed_db.Request, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.IDBFactory, indexed_db.IdbFactory);
indexed_db._completeRequest = function(T) {
  return request => {
    let completer = async.Completer$(T).sync();
    request[dartx.onSuccess].listen(dart.fn(e => {
      let result = indexed_db._cast(T)(request[dartx.result]);
      completer.complete(result);
    }, EventToNull()));
    request[dartx.onError].listen(dart.bind(completer, 'completeError'));
    return completer.future;
  };
};
dart.lazyFn(indexed_db._completeRequest, () => RequestToFutureOfT());
const _count$0 = Symbol('_count');
const _get$ = Symbol('_get');
const _getKey$ = Symbol('_getKey');
const _openCursor = Symbol('_openCursor');
const _openKeyCursor = Symbol('_openKeyCursor');
dart.defineExtensionNames([
  'count',
  'get',
  'getKey',
  'openCursor',
  'openKeyCursor',
  'getAll',
  'getAllKeys',
  'keyPath',
  'multiEntry',
  'name',
  'objectStore',
  'unique'
]);
indexed_db.Index = class Index extends _interceptors.Interceptor {
  [dartx.count](key_OR_range) {
    if (key_OR_range === void 0) key_OR_range = null;
    try {
      let request = this[_count$0](key_OR_range);
      return indexed_db._completeRequest(core.int)(request);
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return FutureOfint().error(e, stacktrace);
    }

  }
  [dartx.get](key) {
    try {
      let request = this[_get$](key);
      return indexed_db._completeRequest(dart.dynamic)(request);
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.getKey](key) {
    try {
      let request = this[_getKey$](key);
      return indexed_db._completeRequest(dart.dynamic)(request);
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.openCursor](opts) {
    let key = opts && 'key' in opts ? opts.key : null;
    let range = opts && 'range' in opts ? opts.range : null;
    let direction = opts && 'direction' in opts ? opts.direction : null;
    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
    let key_OR_range = null;
    if (key != null) {
      if (range != null) {
        dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
      }
      key_OR_range = key;
    } else {
      key_OR_range = range;
    }
    let request = null;
    if (direction == null) {
      request = this[_openCursor](key_OR_range, "next");
    } else {
      request = this[_openCursor](key_OR_range, direction);
    }
    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
  }
  [dartx.openKeyCursor](opts) {
    let key = opts && 'key' in opts ? opts.key : null;
    let range = opts && 'range' in opts ? opts.range : null;
    let direction = opts && 'direction' in opts ? opts.direction : null;
    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
    let key_OR_range = null;
    if (key != null) {
      if (range != null) {
        dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
      }
      key_OR_range = key;
    } else {
      key_OR_range = range;
    }
    let request = null;
    if (direction == null) {
      request = this[_openKeyCursor](key_OR_range, "next");
    } else {
      request = this[_openKeyCursor](key_OR_range, direction);
    }
    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.Cursor)(indexed_db.Request._check(request), autoAdvance);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.keyPath]() {
    return this.keyPath;
  }
  get [dartx.multiEntry]() {
    return this.multiEntry;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.objectStore]() {
    return this.objectStore;
  }
  get [dartx.unique]() {
    return this.unique;
  }
  [_count$0](...args) {
    return this.count.apply(this, args);
  }
  [_get$](...args) {
    return this.get.apply(this, args);
  }
  [dartx.getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [dartx.getAllKeys](...args) {
    return this.getAllKeys.apply(this, args);
  }
  [_getKey$](...args) {
    return this.getKey.apply(this, args);
  }
  [_openCursor](...args) {
    return this.openCursor.apply(this, args);
  }
  [_openKeyCursor](...args) {
    return this.openKeyCursor.apply(this, args);
  }
};
dart.setSignature(indexed_db.Index, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Index, [])}),
  fields: () => ({
    [dartx.keyPath]: core.Object,
    [dartx.multiEntry]: core.bool,
    [dartx.name]: core.String,
    [dartx.objectStore]: indexed_db.ObjectStore,
    [dartx.unique]: core.bool
  }),
  methods: () => ({
    [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
    [dartx.get]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.getKey]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
    [dartx.openKeyCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.Cursor), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
    [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
    [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
    [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
    [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
    [_getKey$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
    [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
    [_openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String])
  })
});
dart.registerExtension(dart.global.IDBIndex, indexed_db.Index);
dart.defineExtensionNames([
  'lower',
  'lowerOpen',
  'upper',
  'upperOpen'
]);
indexed_db.KeyRange = class KeyRange extends _interceptors.Interceptor {
  static only(value) {
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_only(value);
  }
  static lowerBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
  }
  static upperBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
  }
  static bound(lower, upper, lowerOpen, upperOpen) {
    if (lowerOpen === void 0) lowerOpen = false;
    if (upperOpen === void 0) upperOpen = false;
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_bound(lower, upper, lowerOpen, upperOpen);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.lower]() {
    return this.lower;
  }
  get [dartx.lowerOpen]() {
    return this.lowerOpen;
  }
  get [dartx.upper]() {
    return this.upper;
  }
  get [dartx.upperOpen]() {
    return this.upperOpen;
  }
};
dart.setSignature(indexed_db.KeyRange, {
  constructors: () => ({
    only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
    lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
    upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
    bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
    _: dart.definiteFunctionType(indexed_db.KeyRange, [])
  }),
  fields: () => ({
    [dartx.lower]: core.Object,
    [dartx.lowerOpen]: core.bool,
    [dartx.upper]: core.Object,
    [dartx.upperOpen]: core.bool
  }),
  statics: () => ({
    bound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object, core.Object], [core.bool, core.bool]),
    lowerBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool]),
    only_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object]),
    upperBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool])
  }),
  names: ['bound_', 'lowerBound_', 'only_', 'upperBound_']
});
dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
const _add$3 = Symbol('_add');
const _clear$0 = Symbol('_clear');
const _put = Symbol('_put');
const _createIndex = Symbol('_createIndex');
const _add_1 = Symbol('_add_1');
const _add_2 = Symbol('_add_2');
const _createIndex_1 = Symbol('_createIndex_1');
const _createIndex_2 = Symbol('_createIndex_2');
const _put_1 = Symbol('_put_1');
const _put_2 = Symbol('_put_2');
dart.defineExtensionNames([
  'add',
  'clear',
  'delete',
  'count',
  'put',
  'getObject',
  'openCursor',
  'createIndex',
  'deleteIndex',
  'getAll',
  'getAllKeys',
  'index',
  'openKeyCursor',
  'autoIncrement',
  'indexNames',
  'keyPath',
  'name',
  'transaction'
]);
indexed_db.ObjectStore = class ObjectStore extends _interceptors.Interceptor {
  [dartx.add](value, key) {
    if (key === void 0) key = null;
    try {
      let request = null;
      if (key != null) {
        request = this[_add$3](value, key);
      } else {
        request = this[_add$3](value);
      }
      return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.clear]() {
    try {
      return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.delete](key_OR_keyRange) {
    try {
      return indexed_db._completeRequest(dart.dynamic)(this[_delete$](key_OR_keyRange));
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.count](key_OR_range) {
    if (key_OR_range === void 0) key_OR_range = null;
    try {
      let request = this[_count$0](key_OR_range);
      return indexed_db._completeRequest(core.int)(request);
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return FutureOfint().error(e, stacktrace);
    }

  }
  [dartx.put](value, key) {
    if (key === void 0) key = null;
    try {
      let request = null;
      if (key != null) {
        request = this[_put](value, key);
      } else {
        request = this[_put](value);
      }
      return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.getObject](key) {
    try {
      let request = this[_get$](key);
      return indexed_db._completeRequest(dart.dynamic)(request);
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      return async.Future.error(e, stacktrace);
    }

  }
  [dartx.openCursor](opts) {
    let key = opts && 'key' in opts ? opts.key : null;
    let range = opts && 'range' in opts ? opts.range : null;
    let direction = opts && 'direction' in opts ? opts.direction : null;
    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
    let key_OR_range = null;
    if (key != null) {
      if (range != null) {
        dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
      }
      key_OR_range = key;
    } else {
      key_OR_range = range;
    }
    let request = null;
    if (direction == null) {
      request = this[_openCursor](key_OR_range);
    } else {
      request = this[_openCursor](key_OR_range, direction);
    }
    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
  }
  [dartx.createIndex](name, keyPath, opts) {
    let unique = opts && 'unique' in opts ? opts.unique : null;
    let multiEntry = opts && 'multiEntry' in opts ? opts.multiEntry : null;
    let options = dart.map();
    if (unique != null) {
      options[dartx._set]('unique', unique);
    }
    if (multiEntry != null) {
      options[dartx._set]('multiEntry', multiEntry);
    }
    return this[_createIndex](name, keyPath, options);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.autoIncrement]() {
    return this.autoIncrement;
  }
  get [dartx.indexNames]() {
    return this.indexNames;
  }
  get [dartx.keyPath]() {
    return this.keyPath;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.transaction]() {
    return this.transaction;
  }
  [_add$3](value, key) {
    if (key === void 0) key = null;
    if (key != null) {
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
      return this[_add_1](value_1, key_2);
    }
    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
    return this[_add_2](value_1);
  }
  [_add_1](...args) {
    return this.add.apply(this, args);
  }
  [_add_2](...args) {
    return this.add.apply(this, args);
  }
  [_clear$0](...args) {
    return this.clear.apply(this, args);
  }
  [_count$0](...args) {
    return this.count.apply(this, args);
  }
  [_createIndex](name, keyPath, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_createIndex_1](name, keyPath, options_1);
    }
    return this[_createIndex_2](name, keyPath);
  }
  [_createIndex_1](...args) {
    return this.createIndex.apply(this, args);
  }
  [_createIndex_2](...args) {
    return this.createIndex.apply(this, args);
  }
  [_delete$](...args) {
    return this.delete.apply(this, args);
  }
  [dartx.deleteIndex](...args) {
    return this.deleteIndex.apply(this, args);
  }
  [_get$](...args) {
    return this.get.apply(this, args);
  }
  [dartx.getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [dartx.getAllKeys](...args) {
    return this.getAllKeys.apply(this, args);
  }
  [dartx.index](...args) {
    return this.index.apply(this, args);
  }
  [_openCursor](...args) {
    return this.openCursor.apply(this, args);
  }
  [dartx.openKeyCursor](...args) {
    return this.openKeyCursor.apply(this, args);
  }
  [_put](value, key) {
    if (key === void 0) key = null;
    if (key != null) {
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
      return this[_put_1](value_1, key_2);
    }
    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
    return this[_put_2](value_1);
  }
  [_put_1](...args) {
    return this.put.apply(this, args);
  }
  [_put_2](...args) {
    return this.put.apply(this, args);
  }
  static _cursorStreamFromResult(T) {
    return (request, autoAdvance) => {
      let controller = async.StreamController$(T).new({sync: true});
      request[dartx.onError].listen(dart.bind(controller, 'addError'));
      request[dartx.onSuccess].listen(dart.fn(e => {
        let cursor = indexed_db._cast(T)(request[dartx.result]);
        if (cursor == null) {
          controller.close();
        } else {
          controller.add(cursor);
          if (autoAdvance == true && dart.test(controller.hasListener)) {
            cursor[dartx.next]();
          }
        }
      }, EventToNull()));
      return controller.stream;
    };
  }
};
dart.setSignature(indexed_db.ObjectStore, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.ObjectStore, [])}),
  fields: () => ({
    [dartx.autoIncrement]: core.bool,
    [dartx.indexNames]: ListOfString(),
    [dartx.keyPath]: core.Object,
    [dartx.name]: core.String,
    [dartx.transaction]: indexed_db.Transaction
  }),
  methods: () => ({
    [dartx.add]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
    [dartx.clear]: dart.definiteFunctionType(async.Future, []),
    [dartx.delete]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
    [dartx.put]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
    [dartx.getObject]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
    [dartx.createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, dart.dynamic], {unique: core.bool, multiEntry: core.bool}),
    [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
    [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
    [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
    [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
    [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
    [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
    [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
    [_createIndex_2]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic]),
    [_delete$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
    [dartx.deleteIndex]: dart.definiteFunctionType(dart.void, [core.String]),
    [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
    [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
    [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
    [dartx.index]: dart.definiteFunctionType(indexed_db.Index, [core.String]),
    [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
    [dartx.openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
    [_put]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
    [_put_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
    [_put_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
  }),
  statics: () => ({_cursorStreamFromResult: dart.definiteFunctionType(T => [async.Stream$(T), [indexed_db.Request, core.bool]])}),
  names: ['_cursorStreamFromResult']
});
dart.registerExtension(dart.global.IDBObjectStore, indexed_db.ObjectStore);
indexed_db._cast = function(To) {
  return x => {
    return To._check(x);
  };
};
dart.fn(indexed_db._cast, dynamicToTo());
const _get_result = Symbol('_get_result');
dart.defineExtensionNames([
  'result',
  'onError',
  'onSuccess',
  'error',
  'readyState',
  'source',
  'transaction'
]);
indexed_db.Request = class Request extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.error]() {
    return this.error;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.result]() {
    return indexed_db._convertNativeToDart_IDBAny(this[_get_result]);
  }
  get [_get_result]() {
    return this.result;
  }
  get [dartx.source]() {
    return this.source;
  }
  get [dartx.transaction]() {
    return this.transaction;
  }
  get [dartx.onError]() {
    return indexed_db.Request.errorEvent.forTarget(this);
  }
  get [dartx.onSuccess]() {
    return indexed_db.Request.successEvent.forTarget(this);
  }
};
dart.setSignature(indexed_db.Request, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Request, [])}),
  fields: () => ({
    [dartx.error]: html$.DomError,
    [dartx.readyState]: core.String,
    [_get_result]: dart.dynamic,
    [dartx.source]: core.Object,
    [dartx.transaction]: indexed_db.Transaction
  }),
  getters: () => ({
    [dartx.result]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSuccess]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  sfields: () => ({
    errorEvent: EventStreamProviderOfEvent(),
    successEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(indexed_db.Request, {
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get successEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('success'));
  }
});
dart.registerExtension(dart.global.IDBRequest, indexed_db.Request);
dart.defineExtensionNames([
  'onBlocked',
  'onUpgradeNeeded'
]);
indexed_db.OpenDBRequest = class OpenDBRequest extends indexed_db.Request {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.onBlocked]() {
    return indexed_db.OpenDBRequest.blockedEvent.forTarget(this);
  }
  get [dartx.onUpgradeNeeded]() {
    return indexed_db.OpenDBRequest.upgradeNeededEvent.forTarget(this);
  }
};
dart.setSignature(indexed_db.OpenDBRequest, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.OpenDBRequest, [])}),
  getters: () => ({
    [dartx.onBlocked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onUpgradeNeeded]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
  }),
  sfields: () => ({
    blockedEvent: EventStreamProviderOfEvent(),
    upgradeNeededEvent: EventStreamProviderOfVersionChangeEvent()
  })
});
dart.defineLazy(indexed_db.OpenDBRequest, {
  get blockedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('blocked'));
  },
  get upgradeNeededEvent() {
    return dart.const(new (EventStreamProviderOfVersionChangeEvent())('upgradeneeded'));
  }
});
dart.registerExtension(dart.global.IDBOpenDBRequest, indexed_db.OpenDBRequest);
dart.registerExtension(dart.global.IDBVersionChangeRequest, indexed_db.OpenDBRequest);
dart.defineExtensionNames([
  'completed',
  'abort',
  'objectStore',
  'onAbort',
  'onComplete',
  'onError',
  'db',
  'error',
  'mode',
  'objectStoreNames'
]);
indexed_db.Transaction = class Transaction extends html$.EventTarget {
  get [dartx.completed]() {
    let completer = CompleterOfDatabase().new();
    this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
      completer.complete(this[dartx.db]);
    }, EventToNull()));
    this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
      completer.completeError(e);
    }, EventToNull()));
    this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
      if (!dart.test(completer.isCompleted)) {
        completer.completeError(e);
      }
    }, EventToNull()));
    return completer.future;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.db]() {
    return this.db;
  }
  get [dartx.error]() {
    return this.error;
  }
  get [dartx.mode]() {
    return this.mode;
  }
  get [dartx.objectStoreNames]() {
    return this.objectStoreNames;
  }
  [dartx.abort](...args) {
    return this.abort.apply(this, args);
  }
  [dartx.objectStore](...args) {
    return this.objectStore.apply(this, args);
  }
  get [dartx.onAbort]() {
    return indexed_db.Transaction.abortEvent.forTarget(this);
  }
  get [dartx.onComplete]() {
    return indexed_db.Transaction.completeEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return indexed_db.Transaction.errorEvent.forTarget(this);
  }
};
dart.setSignature(indexed_db.Transaction, {
  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Transaction, [])}),
  fields: () => ({
    [dartx.db]: indexed_db.Database,
    [dartx.error]: html$.DomError,
    [dartx.mode]: core.String,
    [dartx.objectStoreNames]: ListOfString()
  }),
  getters: () => ({
    [dartx.completed]: dart.definiteFunctionType(async.Future$(indexed_db.Database), []),
    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
    [dartx.objectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String])
  }),
  sfields: () => ({
    abortEvent: EventStreamProviderOfEvent(),
    completeEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(indexed_db.Transaction, {
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('abort'));
  },
  get completeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('complete'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  }
});
dart.registerExtension(dart.global.IDBTransaction, indexed_db.Transaction);
const _createEvent = Symbol('_createEvent');
const _initEvent = Symbol('_initEvent');
const _selector = Symbol('_selector');
const _get_currentTarget = Symbol('_get_currentTarget');
const _get_target = Symbol('_get_target');
dart.defineExtensionNames([
  'matchingTarget',
  'currentTarget',
  'target',
  'preventDefault',
  'stopImmediatePropagation',
  'stopPropagation',
  'bubbles',
  'cancelable',
  'defaultPrevented',
  'eventPhase',
  'path',
  'timeStamp',
  'type'
]);
html$.Event = class Event extends _interceptors.Interceptor {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    return html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
  }
  static eventType(type, name, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let e = html$.document[_createEvent](type);
    e[_initEvent](name, canBubble, cancelable);
    return e;
  }
  get [_selector]() {
    return this._selector;
  }
  set [_selector](value) {
    this._selector = value;
  }
  get [dartx.matchingTarget]() {
    if (this[_selector] == null) {
      dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
    }
    let currentTarget = html$.Element._check(this[dartx.currentTarget]);
    let target = html$.Element._check(this[dartx.target]);
    let matchedTarget = null;
    do {
      if (dart.test(target[dartx.matches](this[_selector]))) return target;
      target = target[dartx.parent];
    } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
    dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.Event._create_1(type, eventInitDict_1);
    }
    return html$.Event._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.Event(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.Event(type);
  }
  get [dartx.bubbles]() {
    return this.bubbles;
  }
  get [dartx.cancelable]() {
    return this.cancelable;
  }
  get [dartx.currentTarget]() {
    return html$._convertNativeToDart_EventTarget(this[_get_currentTarget]);
  }
  get [_get_currentTarget]() {
    return this.currentTarget;
  }
  get [dartx.defaultPrevented]() {
    return this.defaultPrevented;
  }
  get [dartx.eventPhase]() {
    return this.eventPhase;
  }
  get [dartx.path]() {
    return this.path;
  }
  get [dartx.target]() {
    return html$._convertNativeToDart_EventTarget(this[_get_target]);
  }
  get [_get_target]() {
    return this.target;
  }
  get [dartx.timeStamp]() {
    return this.timeStamp;
  }
  get [dartx.type]() {
    return this.type;
  }
  [_initEvent](...args) {
    return this.initEvent.apply(this, args);
  }
  [dartx.preventDefault](...args) {
    return this.preventDefault.apply(this, args);
  }
  [dartx.stopImmediatePropagation](...args) {
    return this.stopImmediatePropagation.apply(this, args);
  }
  [dartx.stopPropagation](...args) {
    return this.stopPropagation.apply(this, args);
  }
};
dart.setSignature(html$.Event, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.Event, [core.String], {canBubble: core.bool, cancelable: core.bool}),
    eventType: dart.definiteFunctionType(html$.Event, [core.String, core.String], {canBubble: core.bool, cancelable: core.bool}),
    _: dart.definiteFunctionType(html$.Event, [core.String], [core.Map])
  }),
  fields: () => ({
    [_selector]: core.String,
    [dartx.bubbles]: core.bool,
    [dartx.cancelable]: core.bool,
    [_get_currentTarget]: dart.dynamic,
    [dartx.defaultPrevented]: core.bool,
    [dartx.eventPhase]: core.int,
    [dartx.path]: ListOfEventTarget(),
    [_get_target]: dart.dynamic,
    [dartx.timeStamp]: core.int,
    [dartx.type]: core.String
  }),
  getters: () => ({
    [dartx.matchingTarget]: dart.definiteFunctionType(html$.Element, []),
    [dartx.currentTarget]: dart.definiteFunctionType(html$.EventTarget, []),
    [dartx.target]: dart.definiteFunctionType(html$.EventTarget, [])
  }),
  methods: () => ({
    [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
    [dartx.preventDefault]: dart.definiteFunctionType(dart.void, []),
    [dartx.stopImmediatePropagation]: dart.definiteFunctionType(dart.void, []),
    [dartx.stopPropagation]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    AT_TARGET: core.int,
    BUBBLING_PHASE: core.int,
    CAPTURING_PHASE: core.int
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.Event, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.Event, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
html$.Event.AT_TARGET = 2;
html$.Event.BUBBLING_PHASE = 3;
html$.Event.CAPTURING_PHASE = 1;
dart.registerExtension(dart.global.Event, html$.Event);
dart.registerExtension(dart.global.InputEvent, html$.Event);
dart.defineExtensionNames([
  'dataLoss',
  'dataLossMessage',
  'newVersion',
  'oldVersion'
]);
indexed_db.VersionChangeEvent = class VersionChangeEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return indexed_db.VersionChangeEvent._create_1(type, eventInitDict_1);
    }
    return indexed_db.VersionChangeEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new IDBVersionChangeEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new IDBVersionChangeEvent(type);
  }
  get [dartx.dataLoss]() {
    return this.dataLoss;
  }
  get [dartx.dataLossMessage]() {
    return this.dataLossMessage;
  }
  get [dartx.newVersion]() {
    return this.newVersion;
  }
  get [dartx.oldVersion]() {
    return this.oldVersion;
  }
};
dart.setSignature(indexed_db.VersionChangeEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(indexed_db.VersionChangeEvent, []),
    new: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.dataLoss]: core.String,
    [dartx.dataLossMessage]: core.String,
    [dartx.newVersion]: core.int,
    [dartx.oldVersion]: core.int
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.IDBVersionChangeEvent, indexed_db.VersionChangeEvent);
dart.copyProperties(html$, {
  get window() {
    return window;
  }
});
dart.copyProperties(html$, {
  get document() {
    return document;
  }
});
const _xtag = Symbol('_xtag');
const _attributes$ = Symbol('_attributes');
const _innerHtml = Symbol('_innerHtml');
const _scrollHeight = Symbol('_scrollHeight');
const _scrollLeft = Symbol('_scrollLeft');
const _scrollTop = Symbol('_scrollTop');
const _scrollWidth = Symbol('_scrollWidth');
const _childElementCount = Symbol('_childElementCount');
const _children = Symbol('_children');
const _firstElementChild = Symbol('_firstElementChild');
const _lastElementChild = Symbol('_lastElementChild');
const _querySelectorAll = Symbol('_querySelectorAll');
const _getComputedStyle = Symbol('_getComputedStyle');
const _animate = Symbol('_animate');
const _localName = Symbol('_localName');
const _namespaceUri = Symbol('_namespaceUri');
const _scrollIntoView = Symbol('_scrollIntoView');
const _scrollIntoViewIfNeeded = Symbol('_scrollIntoViewIfNeeded');
const _insertAdjacentText = Symbol('_insertAdjacentText');
const _insertAdjacentNode = Symbol('_insertAdjacentNode');
const _insertAdjacentHtml = Symbol('_insertAdjacentHtml');
const _insertAdjacentElement = Symbol('_insertAdjacentElement');
const _canBeUsedToCreateContextualFragment = Symbol('_canBeUsedToCreateContextualFragment');
const _cannotBeUsedToCreateContextualFragment = Symbol('_cannotBeUsedToCreateContextualFragment');
const _getElementsByTagName = Symbol('_getElementsByTagName');
const _hasAttribute = Symbol('_hasAttribute');
const _hasAttributeNS = Symbol('_hasAttributeNS');
const _removeAttribute = Symbol('_removeAttribute');
const _removeAttributeNS = Symbol('_removeAttributeNS');
const _scroll_1 = Symbol('_scroll_1');
const _scroll_2 = Symbol('_scroll_2');
const _scroll_3 = Symbol('_scroll_3');
const _scrollBy_1 = Symbol('_scrollBy_1');
const _scrollBy_2 = Symbol('_scrollBy_2');
const _scrollBy_3 = Symbol('_scrollBy_3');
const _scrollTo_1 = Symbol('_scrollTo_1');
const _scrollTo_2 = Symbol('_scrollTo_2');
const _scrollTo_3 = Symbol('_scrollTo_3');
const _removeChild = Symbol('_removeChild');
const _replaceChild = Symbol('_replaceChild');
const _this = Symbol('_this');
const _clearChildren = Symbol('_clearChildren');
dart.defineExtensionNames([
  'nodes',
  'nodes',
  'remove',
  'replaceWith',
  'insertAllBefore',
  'toString',
  'append',
  'clone',
  'contains',
  'hasChildNodes',
  'insertBefore',
  'childNodes',
  'baseUri',
  'firstChild',
  'lastChild',
  'nextNode',
  'nodeName',
  'nodeType',
  'nodeValue',
  'ownerDocument',
  'parent',
  'parentNode',
  'previousNode',
  'text'
]);
html$.Node = class Node extends html$.EventTarget {
  _created() {
    this[dartx.childNodes] = null;
    this[dartx.baseUri] = null;
    this[dartx.firstChild] = null;
    this[dartx.lastChild] = null;
    this[_localName] = null;
    this[_namespaceUri] = null;
    this[dartx.nextNode] = null;
    this[dartx.nodeName] = null;
    this[dartx.nodeType] = null;
    this[dartx.nodeValue] = null;
    this[dartx.ownerDocument] = null;
    this[dartx.parent] = null;
    this[dartx.parentNode] = null;
    this[dartx.previousNode] = null;
    this[dartx.text] = null;
    super._created();
  }
  get [dartx.nodes]() {
    return new html$._ChildNodeListLazy(this);
  }
  set [dartx.nodes](value) {
    let copy = value[dartx.toList]();
    this[dartx.text] = '';
    for (let node of copy) {
      this[dartx.append](node);
    }
  }
  [dartx.remove]() {
    if (this[dartx.parentNode] != null) {
      let parent = this[dartx.parentNode];
      this[dartx.parentNode][_removeChild](this);
    }
  }
  [dartx.replaceWith](otherNode) {
    try {
      let parent = this[dartx.parentNode];
      parent[_replaceChild](otherNode, this);
    } catch (e) {
    }

    ;
    return this;
  }
  [dartx.insertAllBefore](newNodes, refChild) {
    if (html$._ChildNodeListLazy.is(newNodes)) {
      let otherList = newNodes;
      if (core.identical(otherList[_this], this)) {
        dart.throw(new core.ArgumentError(newNodes));
      }
      for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
        this[dartx.insertBefore](otherList[_this][dartx.firstChild], refChild);
      }
    } else {
      for (let node of newNodes) {
        this[dartx.insertBefore](node, refChild);
      }
    }
  }
  [_clearChildren]() {
    while (this[dartx.firstChild] != null) {
      this[_removeChild](this[dartx.firstChild]);
    }
  }
  [dartx.toString]() {
    let value = this[dartx.nodeValue];
    return value == null ? super.toString() : value;
  }
  get [dartx.childNodes]() {
    return this.childNodes;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.baseUri]() {
    return this.baseURI;
  }
  get [dartx.firstChild]() {
    return this.firstChild;
  }
  get [dartx.lastChild]() {
    return this.lastChild;
  }
  get [_localName]() {
    return this.localName;
  }
  get [_namespaceUri]() {
    return this.namespaceURI;
  }
  get [dartx.nextNode]() {
    return this.nextSibling;
  }
  get [dartx.nodeName]() {
    return this.nodeName;
  }
  get [dartx.nodeType]() {
    return this.nodeType;
  }
  get [dartx.nodeValue]() {
    return this.nodeValue;
  }
  get [dartx.ownerDocument]() {
    return this.ownerDocument;
  }
  get [dartx.parent]() {
    return this.parentElement;
  }
  get [dartx.parentNode]() {
    return this.parentNode;
  }
  get [dartx.previousNode]() {
    return this.previousSibling;
  }
  get [dartx.text]() {
    return this.textContent;
  }
  set [dartx.text](value) {
    this.textContent = value;
  }
  [dartx.append](...args) {
    return this.appendChild.apply(this, args);
  }
  [dartx.clone](...args) {
    return this.cloneNode.apply(this, args);
  }
  [dartx.contains](...args) {
    return this.contains.apply(this, args);
  }
  [dartx.hasChildNodes](...args) {
    return this.hasChildNodes.apply(this, args);
  }
  [dartx.insertBefore](...args) {
    return this.insertBefore.apply(this, args);
  }
  [_removeChild](...args) {
    return this.removeChild.apply(this, args);
  }
  [_replaceChild](...args) {
    return this.replaceChild.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.Node, '_created');
dart.setSignature(html$.Node, {
  constructors: () => ({
    _created: dart.definiteFunctionType(html$.Node, []),
    _: dart.definiteFunctionType(html$.Node, [])
  }),
  fields: () => ({
    [dartx.childNodes]: ListOfNode(),
    [dartx.baseUri]: core.String,
    [dartx.firstChild]: html$.Node,
    [dartx.lastChild]: html$.Node,
    [_localName]: core.String,
    [_namespaceUri]: core.String,
    [dartx.nextNode]: html$.Node,
    [dartx.nodeName]: core.String,
    [dartx.nodeType]: core.int,
    [dartx.nodeValue]: core.String,
    [dartx.ownerDocument]: html$.Document,
    [dartx.parent]: html$.Element,
    [dartx.parentNode]: html$.Node,
    [dartx.previousNode]: html$.Node,
    [dartx.text]: core.String
  }),
  getters: () => ({[dartx.nodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
  setters: () => ({[dartx.nodes]: dart.definiteFunctionType(dart.void, [IterableOfNode()])}),
  methods: () => ({
    [dartx.remove]: dart.definiteFunctionType(dart.void, []),
    [dartx.replaceWith]: dart.definiteFunctionType(html$.Node, [html$.Node]),
    [dartx.insertAllBefore]: dart.definiteFunctionType(html$.Node, [IterableOfNode(), html$.Node]),
    [_clearChildren]: dart.definiteFunctionType(dart.void, []),
    [dartx.append]: dart.definiteFunctionType(html$.Node, [html$.Node]),
    [dartx.clone]: dart.definiteFunctionType(html$.Node, [core.bool]),
    [dartx.contains]: dart.definiteFunctionType(core.bool, [html$.Node]),
    [dartx.hasChildNodes]: dart.definiteFunctionType(core.bool, []),
    [dartx.insertBefore]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node]),
    [_removeChild]: dart.definiteFunctionType(html$.Node, [html$.Node]),
    [_replaceChild]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node])
  }),
  sfields: () => ({
    ATTRIBUTE_NODE: core.int,
    CDATA_SECTION_NODE: core.int,
    COMMENT_NODE: core.int,
    DOCUMENT_FRAGMENT_NODE: core.int,
    DOCUMENT_NODE: core.int,
    DOCUMENT_TYPE_NODE: core.int,
    ELEMENT_NODE: core.int,
    ENTITY_NODE: core.int,
    ENTITY_REFERENCE_NODE: core.int,
    NOTATION_NODE: core.int,
    PROCESSING_INSTRUCTION_NODE: core.int,
    TEXT_NODE: core.int
  })
});
html$.Node.ATTRIBUTE_NODE = 2;
html$.Node.CDATA_SECTION_NODE = 4;
html$.Node.COMMENT_NODE = 8;
html$.Node.DOCUMENT_FRAGMENT_NODE = 11;
html$.Node.DOCUMENT_NODE = 9;
html$.Node.DOCUMENT_TYPE_NODE = 10;
html$.Node.ELEMENT_NODE = 1;
html$.Node.ENTITY_NODE = 6;
html$.Node.ENTITY_REFERENCE_NODE = 5;
html$.Node.NOTATION_NODE = 12;
html$.Node.PROCESSING_INSTRUCTION_NODE = 7;
html$.Node.TEXT_NODE = 3;
dart.registerExtension(dart.global.Node, html$.Node);
dart.defineExtensionNames([
  'attributes',
  'attributes',
  'children',
  'children',
  'querySelectorAll',
  'query',
  'queryAll',
  'classes',
  'classes',
  'dataset',
  'dataset',
  'getNamespacedAttributes',
  'getComputedStyle',
  'client',
  'offset',
  'appendText',
  'appendHtml',
  'attached',
  'detached',
  'enteredView',
  'leftView',
  'animate',
  'attributeChanged',
  'xtag',
  'xtag',
  'localName',
  'namespaceUri',
  'toString',
  'scrollIntoView',
  'insertAdjacentText',
  'insertAdjacentHtml',
  'insertAdjacentElement',
  'matches',
  'matchesWithAncestors',
  'createShadowRoot',
  'shadowRoot',
  'contentEdge',
  'paddingEdge',
  'borderEdge',
  'marginEdge',
  'documentOffset',
  'offsetTo',
  'createFragment',
  'innerHtml',
  'setInnerHtml',
  'innerHtml',
  'on',
  'offsetHeight',
  'offsetLeft',
  'offsetTop',
  'offsetWidth',
  'scrollHeight',
  'scrollLeft',
  'scrollLeft',
  'scrollTop',
  'scrollTop',
  'scrollWidth',
  'isContentEditable',
  'blur',
  'click',
  'focus',
  'outerHtml',
  'closest',
  'getAnimations',
  'getAttribute',
  'getAttributeNS',
  'getBoundingClientRect',
  'getClientRects',
  'getDestinationInsertionPoints',
  'getElementsByClassName',
  'requestFullscreen',
  'requestPointerLock',
  'scroll',
  'scrollBy',
  'scrollTo',
  'setAttribute',
  'setAttributeNS',
  'after',
  'before',
  'querySelector',
  'onAbort',
  'onBeforeCopy',
  'onBeforeCut',
  'onBeforePaste',
  'onBlur',
  'onCanPlay',
  'onCanPlayThrough',
  'onChange',
  'onClick',
  'onContextMenu',
  'onCopy',
  'onCut',
  'onDoubleClick',
  'onDrag',
  'onDragEnd',
  'onDragEnter',
  'onDragLeave',
  'onDragOver',
  'onDragStart',
  'onDrop',
  'onDurationChange',
  'onEmptied',
  'onEnded',
  'onError',
  'onFocus',
  'onInput',
  'onInvalid',
  'onKeyDown',
  'onKeyPress',
  'onKeyUp',
  'onLoad',
  'onLoadedData',
  'onLoadedMetadata',
  'onMouseDown',
  'onMouseEnter',
  'onMouseLeave',
  'onMouseMove',
  'onMouseOut',
  'onMouseOver',
  'onMouseUp',
  'onMouseWheel',
  'onPaste',
  'onPause',
  'onPlay',
  'onPlaying',
  'onRateChange',
  'onReset',
  'onResize',
  'onScroll',
  'onSearch',
  'onSeeked',
  'onSeeking',
  'onSelect',
  'onSelectStart',
  'onStalled',
  'onSubmit',
  'onSuspend',
  'onTimeUpdate',
  'onTouchCancel',
  'onTouchEnd',
  'onTouchEnter',
  'onTouchLeave',
  'onTouchMove',
  'onTouchStart',
  'onTransitionEnd',
  'onVolumeChange',
  'onWaiting',
  'onFullscreenChange',
  'onFullscreenError',
  'offsetParent',
  'contentEditable',
  'contextMenu',
  'dir',
  'draggable',
  'hidden',
  'lang',
  'spellcheck',
  'style',
  'tabIndex',
  'title',
  'translate',
  'dropzone',
  'className',
  'clientHeight',
  'clientLeft',
  'clientTop',
  'clientWidth',
  'computedName',
  'computedRole',
  'id',
  'tagName',
  'nextElementSibling',
  'previousElementSibling'
]);
html$.Element = class Element extends html$.Node {
  static html(html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    let fragment = html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    return html$.Element._check(fragment[dartx.nodes][dartx.where](dart.fn(e => html$.Element.is(e), NodeTobool$()))[dartx.single]);
  }
  created() {
    this[_xtag] = null;
    this[dartx.offsetParent] = null;
    this[dartx.contentEditable] = null;
    this[dartx.contextMenu] = null;
    this[dartx.dir] = null;
    this[dartx.draggable] = null;
    this[dartx.hidden] = null;
    this[dartx.lang] = null;
    this[dartx.spellcheck] = null;
    this[dartx.style] = null;
    this[dartx.tabIndex] = null;
    this[dartx.title] = null;
    this[dartx.translate] = null;
    this[dartx.dropzone] = null;
    this[_attributes$] = null;
    this[dartx.className] = null;
    this[dartx.clientHeight] = null;
    this[dartx.clientLeft] = null;
    this[dartx.clientTop] = null;
    this[dartx.clientWidth] = null;
    this[dartx.computedName] = null;
    this[dartx.computedRole] = null;
    this[dartx.id] = null;
    this[_innerHtml] = null;
    this[_scrollHeight] = null;
    this[_scrollLeft] = null;
    this[_scrollTop] = null;
    this[_scrollWidth] = null;
    this[dartx.tagName] = null;
    this[dartx.nextElementSibling] = null;
    this[dartx.previousElementSibling] = null;
    this[_childElementCount] = null;
    this[_children] = null;
    this[_firstElementChild] = null;
    this[_lastElementChild] = null;
    super._created();
  }
  static tag(tag, typeExtention) {
    if (typeExtention === void 0) typeExtention = null;
    return html$.Element._check(html$._ElementFactoryProvider.createElement_tag(tag, typeExtention));
  }
  static a() {
    return html$.Element.tag('a');
  }
  static article() {
    return html$.Element.tag('article');
  }
  static aside() {
    return html$.Element.tag('aside');
  }
  static audio() {
    return html$.Element.tag('audio');
  }
  static br() {
    return html$.Element.tag('br');
  }
  static canvas() {
    return html$.Element.tag('canvas');
  }
  static div() {
    return html$.Element.tag('div');
  }
  static footer() {
    return html$.Element.tag('footer');
  }
  static header() {
    return html$.Element.tag('header');
  }
  static hr() {
    return html$.Element.tag('hr');
  }
  static iframe() {
    return html$.Element.tag('iframe');
  }
  static img() {
    return html$.Element.tag('img');
  }
  static li() {
    return html$.Element.tag('li');
  }
  static nav() {
    return html$.Element.tag('nav');
  }
  static ol() {
    return html$.Element.tag('ol');
  }
  static option() {
    return html$.Element.tag('option');
  }
  static p() {
    return html$.Element.tag('p');
  }
  static pre() {
    return html$.Element.tag('pre');
  }
  static section() {
    return html$.Element.tag('section');
  }
  static select() {
    return html$.Element.tag('select');
  }
  static span() {
    return html$.Element.tag('span');
  }
  static svg() {
    return html$.Element.tag('svg');
  }
  static table() {
    return html$.Element.tag('table');
  }
  static td() {
    return html$.Element.tag('td');
  }
  static textarea() {
    return html$.Element.tag('textarea');
  }
  static th() {
    return html$.Element.tag('th');
  }
  static tr() {
    return html$.Element.tag('tr');
  }
  static ul() {
    return html$.Element.tag('ul');
  }
  static video() {
    return html$.Element.tag('video');
  }
  get [dartx.attributes]() {
    return new html$._ElementAttributeMap(this);
  }
  set [dartx.attributes](value) {
    let attributes = this[dartx.attributes];
    attributes[dartx.clear]();
    for (let key of value[dartx.keys]) {
      attributes[dartx._set](key, value[dartx._get](key));
    }
  }
  get [dartx.children]() {
    return new html$._ChildrenElementList._wrap(this);
  }
  set [dartx.children](value) {
    let copy = value[dartx.toList]();
    let children = this[dartx.children];
    children[dartx.clear]();
    children[dartx.addAll](copy);
  }
  [dartx.querySelectorAll](T) {
    return selectors => {
      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
    };
  }
  [dartx.query](relativeSelectors) {
    return this[dartx.querySelector](relativeSelectors);
  }
  [dartx.queryAll](T) {
    return relativeSelectors => {
      return this[dartx.querySelectorAll](T)(relativeSelectors);
    };
  }
  get [dartx.classes]() {
    return new html$._ElementCssClassSet(this);
  }
  set [dartx.classes](value) {
    let classSet = this[dartx.classes];
    classSet.clear();
    classSet.addAll(value);
  }
  get [dartx.dataset]() {
    return new html$._DataAttributeMap(this[dartx.attributes]);
  }
  set [dartx.dataset](value) {
    let data = this[dartx.dataset];
    data[dartx.clear]();
    for (let key of value[dartx.keys]) {
      data[dartx._set](key, value[dartx._get](key));
    }
  }
  [dartx.getNamespacedAttributes](namespace) {
    return new html$._NamespacedAttributeMap(this, namespace);
  }
  [dartx.getComputedStyle](pseudoElement) {
    if (pseudoElement === void 0) pseudoElement = null;
    if (pseudoElement == null) {
      pseudoElement = '';
    }
    return html$.window[_getComputedStyle](this, pseudoElement);
  }
  get [dartx.client]() {
    return new (RectangleOfint())(this[dartx.clientLeft], this[dartx.clientTop], this[dartx.clientWidth], this[dartx.clientHeight]);
  }
  get [dartx.offset]() {
    return new (RectangleOfint())(this[dartx.offsetLeft], this[dartx.offsetTop], this[dartx.offsetWidth], this[dartx.offsetHeight]);
  }
  [dartx.appendText](text) {
    this[dartx.append](html$.Text.new(text));
  }
  [dartx.appendHtml](text, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[dartx.insertAdjacentHtml]('beforeend', text, {validator: validator, treeSanitizer: treeSanitizer});
  }
  static isTagSupported(tag) {
    let e = html$._ElementFactoryProvider.createElement_tag(tag, null);
    return html$.Element.is(e) && !html$.UnknownElement.is(e);
  }
  [dartx.attached]() {
    this[dartx.enteredView]();
  }
  [dartx.detached]() {
    this[dartx.leftView]();
  }
  [dartx.enteredView]() {}
  [dartx.leftView]() {}
  [dartx.animate](frames, timing) {
    if (timing === void 0) timing = null;
    if (!core.Iterable.is(frames) || !dart.test(frames[dartx.every](dart.fn(x => core.Map.is(x), MapOfString$dynamicTobool())))) {
      dart.throw(new core.ArgumentError("The frames parameter should be a List of Maps " + "with frame information"));
    }
    let convertedFrames = null;
    if (core.Iterable.is(frames)) {
      convertedFrames = frames[dartx.map](dart.dynamic)(html_common.convertDartToNative_Dictionary)[dartx.toList]();
    } else {
      convertedFrames = frames;
    }
    let convertedTiming = core.Map.is(timing) ? html_common.convertDartToNative_Dictionary(timing) : timing;
    return convertedTiming == null ? this[_animate](convertedFrames) : this[_animate](convertedFrames, convertedTiming);
  }
  [_animate](...args) {
    return this.animate.apply(this, args);
  }
  [dartx.attributeChanged](name, oldValue, newValue) {}
  get [_xtag]() {
    return this._xtag;
  }
  set [_xtag](value) {
    this._xtag = value;
  }
  get [dartx.xtag]() {
    return this[_xtag] != null ? this[_xtag] : this;
  }
  set [dartx.xtag](value) {
    this[_xtag] = value;
  }
  get [dartx.localName]() {
    return this[_localName];
  }
  get [dartx.namespaceUri]() {
    return this[_namespaceUri];
  }
  [dartx.toString]() {
    return this[dartx.localName];
  }
  [dartx.scrollIntoView](alignment) {
    if (alignment === void 0) alignment = null;
    let hasScrollIntoViewIfNeeded = true;
    hasScrollIntoViewIfNeeded = !!this.scrollIntoViewIfNeeded;
    if (dart.equals(alignment, html$.ScrollAlignment.TOP)) {
      this[_scrollIntoView](true);
    } else if (dart.equals(alignment, html$.ScrollAlignment.BOTTOM)) {
      this[_scrollIntoView](false);
    } else if (hasScrollIntoViewIfNeeded) {
      if (dart.equals(alignment, html$.ScrollAlignment.CENTER)) {
        this[_scrollIntoViewIfNeeded](true);
      } else {
        this[_scrollIntoViewIfNeeded]();
      }
    } else {
      this[_scrollIntoView]();
    }
  }
  static _determineMouseWheelEventType(e) {
    return 'wheel';
  }
  static _determineTransitionEventType(e) {
    if (dart.test(html_common.Device.isWebKit)) {
      return 'webkitTransitionEnd';
    } else if (dart.test(html_common.Device.isOpera)) {
      return 'oTransitionEnd';
    }
    return 'transitionend';
  }
  [dartx.insertAdjacentText](where, text) {
    if (!!this.insertAdjacentText) {
      this[_insertAdjacentText](where, text);
    } else {
      this[_insertAdjacentNode](where, html$.Text.new(text));
    }
  }
  [_insertAdjacentText](...args) {
    return this.insertAdjacentText.apply(this, args);
  }
  [dartx.insertAdjacentHtml](where, html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
      this[_insertAdjacentHtml](where, html);
    } else {
      this[_insertAdjacentNode](where, this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
    }
  }
  [_insertAdjacentHtml](...args) {
    return this.insertAdjacentHTML.apply(this, args);
  }
  [dartx.insertAdjacentElement](where, element) {
    if (!!this.insertAdjacentElement) {
      this[_insertAdjacentElement](where, element);
    } else {
      this[_insertAdjacentNode](where, element);
    }
    return element;
  }
  [_insertAdjacentElement](...args) {
    return this.insertAdjacentElement.apply(this, args);
  }
  [_insertAdjacentNode](where, node) {
    switch (where[dartx.toLowerCase]()) {
      case 'beforebegin':
      {
        this[dartx.parentNode][dartx.insertBefore](node, this);
        break;
      }
      case 'afterbegin':
      {
        let first = dart.notNull(this[dartx.nodes][dartx.length]) > 0 ? this[dartx.nodes][dartx._get](0) : null;
        this[dartx.insertBefore](node, first);
        break;
      }
      case 'beforeend':
      {
        this[dartx.append](node);
        break;
      }
      case 'afterend':
      {
        this[dartx.parentNode][dartx.insertBefore](node, this[dartx.nextNode]);
        break;
      }
      default:
      {
        dart.throw(new core.ArgumentError(dart.str`Invalid position ${where}`));
      }
    }
  }
  [dartx.matches](selectors) {
    if (!!this.matches) {
      return this.matches(selectors);
    } else if (!!this.webkitMatchesSelector) {
      return this.webkitMatchesSelector(selectors);
    } else if (!!this.mozMatchesSelector) {
      return this.mozMatchesSelector(selectors);
    } else if (!!this.msMatchesSelector) {
      return this.msMatchesSelector(selectors);
    } else if (!!this.oMatchesSelector) {
      return this.oMatchesSelector(selectors);
    } else {
      dart.throw(new core.UnsupportedError("Not supported on this platform"));
    }
  }
  [dartx.matchesWithAncestors](selectors) {
    let elem = this;
    do {
      if (dart.test(elem[dartx.matches](selectors))) return true;
      elem = elem[dartx.parent];
    } while (elem != null);
    return false;
  }
  [dartx.createShadowRoot]() {
    return (this.createShadowRoot || this.webkitCreateShadowRoot).call(this);
  }
  get [dartx.shadowRoot]() {
    return this.shadowRoot || this.webkitShadowRoot;
  }
  get [dartx.contentEdge]() {
    return new html$._ContentCssRect(this);
  }
  get [dartx.paddingEdge]() {
    return new html$._PaddingCssRect(this);
  }
  get [dartx.borderEdge]() {
    return new html$._BorderCssRect(this);
  }
  get [dartx.marginEdge]() {
    return new html$._MarginCssRect(this);
  }
  get [dartx.documentOffset]() {
    return this[dartx.offsetTo](html$.document[dartx.documentElement]);
  }
  [dartx.offsetTo](parent) {
    return html$.Element._offsetToHelper(this, parent);
  }
  static _offsetToHelper(current, parent) {
    let sameAsParent = core.identical(current, parent);
    let foundAsParent = sameAsParent || parent[dartx.tagName] == 'HTML';
    if (current == null || sameAsParent) {
      if (foundAsParent) return new (PointOfnum())(0, 0);
      dart.throw(new core.ArgumentError("Specified element is not a transitive offset " + "parent of this element."));
    }
    let parentOffset = current[dartx.offsetParent];
    let p = html$.Element._offsetToHelper(parentOffset, parent);
    return new (PointOfnum())(dart.notNull(p.x) + dart.notNull(current[dartx.offsetLeft]), dart.notNull(p.y) + dart.notNull(current[dartx.offsetTop]));
  }
  [dartx.createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (treeSanitizer == null) {
      if (validator == null) {
        if (html$.Element._defaultValidator == null) {
          html$.Element._defaultValidator = new html$.NodeValidatorBuilder.common();
        }
        validator = html$.Element._defaultValidator;
      }
      if (html$.Element._defaultSanitizer == null) {
        html$.Element._defaultSanitizer = new html$._ValidatingTreeSanitizer(validator);
      } else {
        html$.Element._defaultSanitizer.validator = validator;
      }
      treeSanitizer = html$.Element._defaultSanitizer;
    } else if (validator != null) {
      dart.throw(new core.ArgumentError('validator can only be passed if treeSanitizer is null'));
    }
    if (html$.Element._parseDocument == null) {
      html$.Element._parseDocument = html$.document[dartx.implementation][dartx.createHtmlDocument]('');
      html$.Element._parseRange = html$.Element._parseDocument[dartx.createRange]();
      let base = html$.BaseElement._check(html$.Element._parseDocument[dartx.createElement]('base'));
      base[dartx.href] = html$.document[dartx.baseUri];
      html$.Element._parseDocument[dartx.head][dartx.append](base);
    }
    let contextElement = null;
    if (html$.BodyElement.is(this)) {
      contextElement = html$.Element._parseDocument[dartx.body];
    } else {
      contextElement = html$.Element._parseDocument[dartx.createElement](this[dartx.tagName]);
      html$.Element._parseDocument[dartx.body][dartx.append](html$.Node._check(contextElement));
    }
    let fragment = null;
    if (dart.test(html$.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
      html$.Element._parseRange[dartx.selectNodeContents](html$.Node._check(contextElement));
      fragment = html$.Element._parseRange[dartx.createContextualFragment](html);
    } else {
      dart.dput(contextElement, _innerHtml, html);
      fragment = html$.Element._parseDocument[dartx.createDocumentFragment]();
      while (dart.dload(contextElement, 'firstChild') != null) {
        dart.dsend(fragment, 'append', dart.dload(contextElement, 'firstChild'));
      }
    }
    if (!dart.equals(contextElement, html$.Element._parseDocument[dartx.body])) {
      dart.dsend(contextElement, 'remove');
    }
    treeSanitizer.sanitizeTree(html$.Node._check(fragment));
    html$.document[dartx.adoptNode](html$.Node._check(fragment));
    return html$.DocumentFragment._check(fragment);
  }
  get [_canBeUsedToCreateContextualFragment]() {
    return !dart.test(this[_cannotBeUsedToCreateContextualFragment]);
  }
  get [_cannotBeUsedToCreateContextualFragment]() {
    return html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported[dartx.contains](this[dartx.tagName]);
  }
  set [dartx.innerHtml](html) {
    this[dartx.setInnerHtml](html);
  }
  [dartx.setInnerHtml](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[dartx.text] = null;
    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
      this[_innerHtml] = html;
    } else {
      this[dartx.append](this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
    }
  }
  get [dartx.innerHtml]() {
    return this[_innerHtml];
  }
  get [dartx.on]() {
    return new html$.ElementEvents(this);
  }
  static _hasCorruptedAttributes(element) {
    return (function(element) {
      if (!(element.attributes instanceof NamedNodeMap)) {
        return true;
      }
      var childNodes = element.childNodes;
      if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1]) {
        return true;
      }
      if (element.children) {
        if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList)) {
          return true;
        }
      }
      var length = 0;
      if (element.children) {
        length = element.children.length;
      }
      for (var i = 0; i < length; i++) {
        var child = element.children[i];
        if (child.id == 'attributes' || child.name == 'attributes' || child.id == 'lastChild' || child.name == 'lastChild' || child.id == 'children' || child.name == 'children') {
          return true;
        }
      }
      return false;
    })(element);
  }
  static _hasCorruptedAttributesAdditionalCheck(element) {
    return !(element.attributes instanceof NamedNodeMap);
  }
  static _safeTagName(element) {
    let result = 'element tag unavailable';
    try {
      if (typeof dart.dload(element, 'tagName') == 'string') {
        result = core.String._check(dart.dload(element, 'tagName'));
      }
    } catch (e) {
    }

    return result;
  }
  get [dartx.offsetParent]() {
    return this.offsetParent;
  }
  get [dartx.offsetHeight]() {
    return this.offsetHeight[dartx.round]();
  }
  get [dartx.offsetLeft]() {
    return this.offsetLeft[dartx.round]();
  }
  get [dartx.offsetTop]() {
    return this.offsetTop[dartx.round]();
  }
  get [dartx.offsetWidth]() {
    return this.offsetWidth[dartx.round]();
  }
  get [dartx.scrollHeight]() {
    return this.scrollHeight[dartx.round]();
  }
  get [dartx.scrollLeft]() {
    return this.scrollLeft[dartx.round]();
  }
  set [dartx.scrollLeft](value) {
    this.scrollLeft = value[dartx.round]();
  }
  get [dartx.scrollTop]() {
    return this.scrollTop[dartx.round]();
  }
  set [dartx.scrollTop](value) {
    this.scrollTop = value[dartx.round]();
  }
  get [dartx.scrollWidth]() {
    return this.scrollWidth[dartx.round]();
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.contentEditable]() {
    return this.contentEditable;
  }
  set [dartx.contentEditable](value) {
    this.contentEditable = value;
  }
  get [dartx.contextMenu]() {
    return this.contextMenu;
  }
  set [dartx.contextMenu](value) {
    this.contextMenu = value;
  }
  get [dartx.dir]() {
    return this.dir;
  }
  set [dartx.dir](value) {
    this.dir = value;
  }
  get [dartx.draggable]() {
    return this.draggable;
  }
  set [dartx.draggable](value) {
    this.draggable = value;
  }
  get [dartx.hidden]() {
    return this.hidden;
  }
  set [dartx.hidden](value) {
    this.hidden = value;
  }
  get [dartx.isContentEditable]() {
    return this.isContentEditable;
  }
  get [dartx.lang]() {
    return this.lang;
  }
  set [dartx.lang](value) {
    this.lang = value;
  }
  get [dartx.spellcheck]() {
    return this.spellcheck;
  }
  set [dartx.spellcheck](value) {
    this.spellcheck = value;
  }
  get [dartx.style]() {
    return this.style;
  }
  get [dartx.tabIndex]() {
    return this.tabIndex;
  }
  set [dartx.tabIndex](value) {
    this.tabIndex = value;
  }
  get [dartx.title]() {
    return this.title;
  }
  set [dartx.title](value) {
    this.title = value;
  }
  get [dartx.translate]() {
    return this.translate;
  }
  set [dartx.translate](value) {
    this.translate = value;
  }
  get [dartx.dropzone]() {
    return this.webkitdropzone;
  }
  set [dartx.dropzone](value) {
    this.webkitdropzone = value;
  }
  [dartx.blur](...args) {
    return this.blur.apply(this, args);
  }
  [dartx.click](...args) {
    return this.click.apply(this, args);
  }
  [dartx.focus](...args) {
    return this.focus.apply(this, args);
  }
  get [_attributes$]() {
    return this.attributes;
  }
  get [dartx.className]() {
    return this.className;
  }
  set [dartx.className](value) {
    this.className = value;
  }
  get [dartx.clientHeight]() {
    return this.clientHeight;
  }
  get [dartx.clientLeft]() {
    return this.clientLeft;
  }
  get [dartx.clientTop]() {
    return this.clientTop;
  }
  get [dartx.clientWidth]() {
    return this.clientWidth;
  }
  get [dartx.computedName]() {
    return this.computedName;
  }
  get [dartx.computedRole]() {
    return this.computedRole;
  }
  get [dartx.id]() {
    return this.id;
  }
  set [dartx.id](value) {
    this.id = value;
  }
  get [_innerHtml]() {
    return this.innerHTML;
  }
  set [_innerHtml](value) {
    this.innerHTML = value;
  }
  get [dartx.outerHtml]() {
    return this.outerHTML;
  }
  get [_scrollHeight]() {
    return this.scrollHeight;
  }
  get [_scrollLeft]() {
    return this.scrollLeft;
  }
  set [_scrollLeft](value) {
    this.scrollLeft = value;
  }
  get [_scrollTop]() {
    return this.scrollTop;
  }
  set [_scrollTop](value) {
    this.scrollTop = value;
  }
  get [_scrollWidth]() {
    return this.scrollWidth;
  }
  get [dartx.tagName]() {
    return this.tagName;
  }
  [dartx.closest](...args) {
    return this.closest.apply(this, args);
  }
  [dartx.getAnimations](...args) {
    return this.getAnimations.apply(this, args);
  }
  [dartx.getAttribute](...args) {
    return this.getAttribute.apply(this, args);
  }
  [dartx.getAttributeNS](...args) {
    return this.getAttributeNS.apply(this, args);
  }
  [dartx.getBoundingClientRect](...args) {
    return this.getBoundingClientRect.apply(this, args);
  }
  [dartx.getClientRects](...args) {
    return this.getClientRects.apply(this, args);
  }
  [dartx.getDestinationInsertionPoints](...args) {
    return this.getDestinationInsertionPoints.apply(this, args);
  }
  [dartx.getElementsByClassName](...args) {
    return this.getElementsByClassName.apply(this, args);
  }
  [_getElementsByTagName](...args) {
    return this.getElementsByTagName.apply(this, args);
  }
  [_hasAttribute](...args) {
    return this.hasAttribute.apply(this, args);
  }
  [_hasAttributeNS](...args) {
    return this.hasAttributeNS.apply(this, args);
  }
  [_removeAttribute](...args) {
    return this.removeAttribute.apply(this, args);
  }
  [_removeAttributeNS](...args) {
    return this.removeAttributeNS.apply(this, args);
  }
  [dartx.requestFullscreen](...args) {
    return this.requestFullscreen.apply(this, args);
  }
  [dartx.requestPointerLock](...args) {
    return this.requestPointerLock.apply(this, args);
  }
  [dartx.scroll](options_OR_x, y) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (options_OR_x == null && y == null) {
      this[_scroll_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scroll_2](options_1);
      return;
    }
    if (y != null && typeof options_OR_x == 'number') {
      this[_scroll_3](options_OR_x, y);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_scroll_1](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_2](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_3](...args) {
    return this.scroll.apply(this, args);
  }
  [dartx.scrollBy](options_OR_x, y) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (options_OR_x == null && y == null) {
      this[_scrollBy_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollBy_2](options_1);
      return;
    }
    if (y != null && typeof options_OR_x == 'number') {
      this[_scrollBy_3](options_OR_x, y);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_scrollBy_1](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_2](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_3](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollIntoView](...args) {
    return this.scrollIntoView.apply(this, args);
  }
  [_scrollIntoViewIfNeeded](...args) {
    return this.scrollIntoViewIfNeeded.apply(this, args);
  }
  [dartx.scrollTo](options_OR_x, y) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (options_OR_x == null && y == null) {
      this[_scrollTo_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollTo_2](options_1);
      return;
    }
    if (y != null && typeof options_OR_x == 'number') {
      this[_scrollTo_3](options_OR_x, y);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_scrollTo_1](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_2](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_3](...args) {
    return this.scrollTo.apply(this, args);
  }
  [dartx.setAttribute](...args) {
    return this.setAttribute.apply(this, args);
  }
  [dartx.setAttributeNS](...args) {
    return this.setAttributeNS.apply(this, args);
  }
  [dartx.after](...args) {
    return this.after.apply(this, args);
  }
  [dartx.before](...args) {
    return this.before.apply(this, args);
  }
  get [dartx.nextElementSibling]() {
    return this.nextElementSibling;
  }
  get [dartx.previousElementSibling]() {
    return this.previousElementSibling;
  }
  get [_childElementCount]() {
    return this.childElementCount;
  }
  get [_children]() {
    return this.children;
  }
  get [_firstElementChild]() {
    return this.firstElementChild;
  }
  get [_lastElementChild]() {
    return this.lastElementChild;
  }
  [dartx.querySelector](...args) {
    return this.querySelector.apply(this, args);
  }
  [_querySelectorAll](...args) {
    return this.querySelectorAll.apply(this, args);
  }
  get [dartx.onAbort]() {
    return html$.Element.abortEvent.forElement(this);
  }
  get [dartx.onBeforeCopy]() {
    return html$.Element.beforeCopyEvent.forElement(this);
  }
  get [dartx.onBeforeCut]() {
    return html$.Element.beforeCutEvent.forElement(this);
  }
  get [dartx.onBeforePaste]() {
    return html$.Element.beforePasteEvent.forElement(this);
  }
  get [dartx.onBlur]() {
    return html$.Element.blurEvent.forElement(this);
  }
  get [dartx.onCanPlay]() {
    return html$.Element.canPlayEvent.forElement(this);
  }
  get [dartx.onCanPlayThrough]() {
    return html$.Element.canPlayThroughEvent.forElement(this);
  }
  get [dartx.onChange]() {
    return html$.Element.changeEvent.forElement(this);
  }
  get [dartx.onClick]() {
    return html$.Element.clickEvent.forElement(this);
  }
  get [dartx.onContextMenu]() {
    return html$.Element.contextMenuEvent.forElement(this);
  }
  get [dartx.onCopy]() {
    return html$.Element.copyEvent.forElement(this);
  }
  get [dartx.onCut]() {
    return html$.Element.cutEvent.forElement(this);
  }
  get [dartx.onDoubleClick]() {
    return html$.Element.doubleClickEvent.forElement(this);
  }
  get [dartx.onDrag]() {
    return html$.Element.dragEvent.forElement(this);
  }
  get [dartx.onDragEnd]() {
    return html$.Element.dragEndEvent.forElement(this);
  }
  get [dartx.onDragEnter]() {
    return html$.Element.dragEnterEvent.forElement(this);
  }
  get [dartx.onDragLeave]() {
    return html$.Element.dragLeaveEvent.forElement(this);
  }
  get [dartx.onDragOver]() {
    return html$.Element.dragOverEvent.forElement(this);
  }
  get [dartx.onDragStart]() {
    return html$.Element.dragStartEvent.forElement(this);
  }
  get [dartx.onDrop]() {
    return html$.Element.dropEvent.forElement(this);
  }
  get [dartx.onDurationChange]() {
    return html$.Element.durationChangeEvent.forElement(this);
  }
  get [dartx.onEmptied]() {
    return html$.Element.emptiedEvent.forElement(this);
  }
  get [dartx.onEnded]() {
    return html$.Element.endedEvent.forElement(this);
  }
  get [dartx.onError]() {
    return html$.Element.errorEvent.forElement(this);
  }
  get [dartx.onFocus]() {
    return html$.Element.focusEvent.forElement(this);
  }
  get [dartx.onInput]() {
    return html$.Element.inputEvent.forElement(this);
  }
  get [dartx.onInvalid]() {
    return html$.Element.invalidEvent.forElement(this);
  }
  get [dartx.onKeyDown]() {
    return html$.Element.keyDownEvent.forElement(this);
  }
  get [dartx.onKeyPress]() {
    return html$.Element.keyPressEvent.forElement(this);
  }
  get [dartx.onKeyUp]() {
    return html$.Element.keyUpEvent.forElement(this);
  }
  get [dartx.onLoad]() {
    return html$.Element.loadEvent.forElement(this);
  }
  get [dartx.onLoadedData]() {
    return html$.Element.loadedDataEvent.forElement(this);
  }
  get [dartx.onLoadedMetadata]() {
    return html$.Element.loadedMetadataEvent.forElement(this);
  }
  get [dartx.onMouseDown]() {
    return html$.Element.mouseDownEvent.forElement(this);
  }
  get [dartx.onMouseEnter]() {
    return html$.Element.mouseEnterEvent.forElement(this);
  }
  get [dartx.onMouseLeave]() {
    return html$.Element.mouseLeaveEvent.forElement(this);
  }
  get [dartx.onMouseMove]() {
    return html$.Element.mouseMoveEvent.forElement(this);
  }
  get [dartx.onMouseOut]() {
    return html$.Element.mouseOutEvent.forElement(this);
  }
  get [dartx.onMouseOver]() {
    return html$.Element.mouseOverEvent.forElement(this);
  }
  get [dartx.onMouseUp]() {
    return html$.Element.mouseUpEvent.forElement(this);
  }
  get [dartx.onMouseWheel]() {
    return html$.Element.mouseWheelEvent.forElement(this);
  }
  get [dartx.onPaste]() {
    return html$.Element.pasteEvent.forElement(this);
  }
  get [dartx.onPause]() {
    return html$.Element.pauseEvent.forElement(this);
  }
  get [dartx.onPlay]() {
    return html$.Element.playEvent.forElement(this);
  }
  get [dartx.onPlaying]() {
    return html$.Element.playingEvent.forElement(this);
  }
  get [dartx.onRateChange]() {
    return html$.Element.rateChangeEvent.forElement(this);
  }
  get [dartx.onReset]() {
    return html$.Element.resetEvent.forElement(this);
  }
  get [dartx.onResize]() {
    return html$.Element.resizeEvent.forElement(this);
  }
  get [dartx.onScroll]() {
    return html$.Element.scrollEvent.forElement(this);
  }
  get [dartx.onSearch]() {
    return html$.Element.searchEvent.forElement(this);
  }
  get [dartx.onSeeked]() {
    return html$.Element.seekedEvent.forElement(this);
  }
  get [dartx.onSeeking]() {
    return html$.Element.seekingEvent.forElement(this);
  }
  get [dartx.onSelect]() {
    return html$.Element.selectEvent.forElement(this);
  }
  get [dartx.onSelectStart]() {
    return html$.Element.selectStartEvent.forElement(this);
  }
  get [dartx.onStalled]() {
    return html$.Element.stalledEvent.forElement(this);
  }
  get [dartx.onSubmit]() {
    return html$.Element.submitEvent.forElement(this);
  }
  get [dartx.onSuspend]() {
    return html$.Element.suspendEvent.forElement(this);
  }
  get [dartx.onTimeUpdate]() {
    return html$.Element.timeUpdateEvent.forElement(this);
  }
  get [dartx.onTouchCancel]() {
    return html$.Element.touchCancelEvent.forElement(this);
  }
  get [dartx.onTouchEnd]() {
    return html$.Element.touchEndEvent.forElement(this);
  }
  get [dartx.onTouchEnter]() {
    return html$.Element.touchEnterEvent.forElement(this);
  }
  get [dartx.onTouchLeave]() {
    return html$.Element.touchLeaveEvent.forElement(this);
  }
  get [dartx.onTouchMove]() {
    return html$.Element.touchMoveEvent.forElement(this);
  }
  get [dartx.onTouchStart]() {
    return html$.Element.touchStartEvent.forElement(this);
  }
  get [dartx.onTransitionEnd]() {
    return html$.Element.transitionEndEvent.forElement(this);
  }
  get [dartx.onVolumeChange]() {
    return html$.Element.volumeChangeEvent.forElement(this);
  }
  get [dartx.onWaiting]() {
    return html$.Element.waitingEvent.forElement(this);
  }
  get [dartx.onFullscreenChange]() {
    return html$.Element.fullscreenChangeEvent.forElement(this);
  }
  get [dartx.onFullscreenError]() {
    return html$.Element.fullscreenErrorEvent.forElement(this);
  }
};
dart.defineNamedConstructor(html$.Element, 'created');
html$.Element[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.GlobalEventHandlers, html$.ParentNode, html$.ChildNode];
dart.setSignature(html$.Element, {
  constructors: () => ({
    html: dart.definiteFunctionType(html$.Element, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    created: dart.definiteFunctionType(html$.Element, []),
    tag: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
    a: dart.definiteFunctionType(html$.Element, []),
    article: dart.definiteFunctionType(html$.Element, []),
    aside: dart.definiteFunctionType(html$.Element, []),
    audio: dart.definiteFunctionType(html$.Element, []),
    br: dart.definiteFunctionType(html$.Element, []),
    canvas: dart.definiteFunctionType(html$.Element, []),
    div: dart.definiteFunctionType(html$.Element, []),
    footer: dart.definiteFunctionType(html$.Element, []),
    header: dart.definiteFunctionType(html$.Element, []),
    hr: dart.definiteFunctionType(html$.Element, []),
    iframe: dart.definiteFunctionType(html$.Element, []),
    img: dart.definiteFunctionType(html$.Element, []),
    li: dart.definiteFunctionType(html$.Element, []),
    nav: dart.definiteFunctionType(html$.Element, []),
    ol: dart.definiteFunctionType(html$.Element, []),
    option: dart.definiteFunctionType(html$.Element, []),
    p: dart.definiteFunctionType(html$.Element, []),
    pre: dart.definiteFunctionType(html$.Element, []),
    section: dart.definiteFunctionType(html$.Element, []),
    select: dart.definiteFunctionType(html$.Element, []),
    span: dart.definiteFunctionType(html$.Element, []),
    svg: dart.definiteFunctionType(html$.Element, []),
    table: dart.definiteFunctionType(html$.Element, []),
    td: dart.definiteFunctionType(html$.Element, []),
    textarea: dart.definiteFunctionType(html$.Element, []),
    th: dart.definiteFunctionType(html$.Element, []),
    tr: dart.definiteFunctionType(html$.Element, []),
    ul: dart.definiteFunctionType(html$.Element, []),
    video: dart.definiteFunctionType(html$.Element, []),
    _: dart.definiteFunctionType(html$.Element, [])
  }),
  fields: () => ({
    [_xtag]: html$.Element,
    [dartx.offsetParent]: html$.Element,
    [dartx.contentEditable]: core.String,
    [dartx.contextMenu]: html$.MenuElement,
    [dartx.dir]: core.String,
    [dartx.draggable]: core.bool,
    [dartx.hidden]: core.bool,
    [dartx.lang]: core.String,
    [dartx.spellcheck]: core.bool,
    [dartx.style]: html$.CssStyleDeclaration,
    [dartx.tabIndex]: core.int,
    [dartx.title]: core.String,
    [dartx.translate]: core.bool,
    [dartx.dropzone]: core.String,
    [_attributes$]: html$._NamedNodeMap,
    [dartx.className]: core.String,
    [dartx.clientHeight]: core.int,
    [dartx.clientLeft]: core.int,
    [dartx.clientTop]: core.int,
    [dartx.clientWidth]: core.int,
    [dartx.computedName]: core.String,
    [dartx.computedRole]: core.String,
    [dartx.id]: core.String,
    [_innerHtml]: core.String,
    [_scrollHeight]: core.int,
    [_scrollLeft]: core.num,
    [_scrollTop]: core.num,
    [_scrollWidth]: core.int,
    [dartx.tagName]: core.String,
    [dartx.nextElementSibling]: html$.Element,
    [dartx.previousElementSibling]: html$.Element,
    [_childElementCount]: core.int,
    [_children]: ListOfNode(),
    [_firstElementChild]: html$.Element,
    [_lastElementChild]: html$.Element
  }),
  getters: () => ({
    [dartx.attributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
    [dartx.classes]: dart.definiteFunctionType(html$.CssClassSet, []),
    [dartx.dataset]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    [dartx.client]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
    [dartx.offset]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
    [dartx.xtag]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.localName]: dart.definiteFunctionType(core.String, []),
    [dartx.namespaceUri]: dart.definiteFunctionType(core.String, []),
    [dartx.shadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
    [dartx.contentEdge]: dart.definiteFunctionType(html$.CssRect, []),
    [dartx.paddingEdge]: dart.definiteFunctionType(html$.CssRect, []),
    [dartx.borderEdge]: dart.definiteFunctionType(html$.CssRect, []),
    [dartx.marginEdge]: dart.definiteFunctionType(html$.CssRect, []),
    [dartx.documentOffset]: dart.definiteFunctionType(math.Point$(core.num), []),
    [_canBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
    [_cannotBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
    [dartx.innerHtml]: dart.definiteFunctionType(core.String, []),
    [dartx.on]: dart.definiteFunctionType(html$.ElementEvents, []),
    [dartx.offsetHeight]: dart.definiteFunctionType(core.int, []),
    [dartx.offsetLeft]: dart.definiteFunctionType(core.int, []),
    [dartx.offsetTop]: dart.definiteFunctionType(core.int, []),
    [dartx.offsetWidth]: dart.definiteFunctionType(core.int, []),
    [dartx.scrollHeight]: dart.definiteFunctionType(core.int, []),
    [dartx.scrollLeft]: dart.definiteFunctionType(core.int, []),
    [dartx.scrollTop]: dart.definiteFunctionType(core.int, []),
    [dartx.scrollWidth]: dart.definiteFunctionType(core.int, []),
    [dartx.isContentEditable]: dart.definiteFunctionType(core.bool, []),
    [dartx.outerHtml]: dart.definiteFunctionType(core.String, []),
    [dartx.onAbort]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onBeforeCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onBeforeCut]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onBeforePaste]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onBlur]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onCanPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onCanPlayThrough]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onClick]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onContextMenu]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
    [dartx.onCut]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
    [dartx.onDoubleClick]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onDrag]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onDragEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onDragEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onDragLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onDragOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onDragStart]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onDrop]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onDurationChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onEmptied]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onEnded]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onFocus]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onInput]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onInvalid]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onKeyDown]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
    [dartx.onKeyPress]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
    [dartx.onKeyUp]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
    [dartx.onLoad]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onLoadedData]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onLoadedMetadata]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onMouseDown]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onMouseEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onMouseLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onMouseMove]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onMouseOut]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onMouseOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onMouseUp]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
    [dartx.onMouseWheel]: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
    [dartx.onPaste]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
    [dartx.onPause]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onPlaying]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onRateChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onReset]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onResize]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onScroll]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onSearch]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onSeeked]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onSeeking]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onSelect]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onSelectStart]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onStalled]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onSubmit]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onSuspend]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onTimeUpdate]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onTouchCancel]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
    [dartx.onTouchEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
    [dartx.onTouchEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
    [dartx.onTouchLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
    [dartx.onTouchMove]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
    [dartx.onTouchStart]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
    [dartx.onTransitionEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
    [dartx.onVolumeChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onWaiting]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onFullscreenChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onFullscreenError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
  }),
  setters: () => ({
    [dartx.attributes]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
    [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
    [dartx.classes]: dart.definiteFunctionType(dart.void, [IterableOfString()]),
    [dartx.dataset]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
    [dartx.xtag]: dart.definiteFunctionType(dart.void, [html$.Element]),
    [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.scrollLeft]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.scrollTop]: dart.definiteFunctionType(dart.void, [core.int])
  }),
  methods: () => ({
    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
    [dartx.getNamespacedAttributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String]),
    [dartx.getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [], [core.String]),
    [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    [dartx.attached]: dart.definiteFunctionType(dart.void, []),
    [dartx.detached]: dart.definiteFunctionType(dart.void, []),
    [dartx.enteredView]: dart.definiteFunctionType(dart.void, []),
    [dartx.leftView]: dart.definiteFunctionType(dart.void, []),
    [dartx.animate]: dart.definiteFunctionType(html$.Animation, [IterableOfMapOfString$dynamic()], [dart.dynamic]),
    [_animate]: dart.definiteFunctionType(html$.Animation, [core.Object], [dart.dynamic]),
    [dartx.attributeChanged]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
    [dartx.scrollIntoView]: dart.definiteFunctionType(dart.void, [], [html$.ScrollAlignment]),
    [dartx.insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [_insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    [_insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.insertAdjacentElement]: dart.definiteFunctionType(html$.Element, [core.String, html$.Element]),
    [_insertAdjacentElement]: dart.definiteFunctionType(dart.void, [core.String, html$.Element]),
    [_insertAdjacentNode]: dart.definiteFunctionType(dart.void, [core.String, html$.Node]),
    [dartx.matches]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.matchesWithAncestors]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.createShadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
    [dartx.offsetTo]: dart.definiteFunctionType(math.Point$(core.num), [html$.Element]),
    [dartx.createFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    [dartx.blur]: dart.definiteFunctionType(dart.void, []),
    [dartx.click]: dart.definiteFunctionType(dart.void, []),
    [dartx.focus]: dart.definiteFunctionType(dart.void, []),
    [dartx.closest]: dart.definiteFunctionType(html$.Element, [core.String]),
    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
    [dartx.getAttribute]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.getAttributeNS]: dart.definiteFunctionType(core.String, [core.String, core.String]),
    [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
    [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
    [_getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
    [_hasAttribute]: dart.definiteFunctionType(core.bool, [core.String]),
    [_hasAttributeNS]: dart.definiteFunctionType(core.bool, [core.String, core.String]),
    [_removeAttribute]: dart.definiteFunctionType(dart.void, [core.String]),
    [_removeAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.requestFullscreen]: dart.definiteFunctionType(dart.void, []),
    [dartx.requestPointerLock]: dart.definiteFunctionType(dart.void, []),
    [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
    [_scroll_1]: dart.definiteFunctionType(dart.void, []),
    [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
    [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
    [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
    [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
    [_scrollIntoView]: dart.definiteFunctionType(dart.void, [], [core.bool]),
    [_scrollIntoViewIfNeeded]: dart.definiteFunctionType(dart.void, [], [core.bool]),
    [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
    [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
    [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
    [dartx.setAttribute]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.setAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
    [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
    [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object]),
    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
  }),
  sfields: () => ({
    mouseWheelEvent: EventStreamProviderOfWheelEvent(),
    transitionEndEvent: EventStreamProviderOfTransitionEvent(),
    _parseDocument: html$.HtmlDocument,
    _parseRange: html$.Range,
    _defaultValidator: html$.NodeValidatorBuilder,
    _defaultSanitizer: html$._ValidatingTreeSanitizer,
    _tagsForWhichCreateContextualFragmentIsNotSupported: ListOfString(),
    abortEvent: EventStreamProviderOfEvent(),
    beforeCopyEvent: EventStreamProviderOfEvent(),
    beforeCutEvent: EventStreamProviderOfEvent(),
    beforePasteEvent: EventStreamProviderOfEvent(),
    blurEvent: EventStreamProviderOfEvent(),
    canPlayEvent: EventStreamProviderOfEvent(),
    canPlayThroughEvent: EventStreamProviderOfEvent(),
    changeEvent: EventStreamProviderOfEvent(),
    clickEvent: EventStreamProviderOfMouseEvent(),
    contextMenuEvent: EventStreamProviderOfMouseEvent(),
    copyEvent: EventStreamProviderOfClipboardEvent(),
    cutEvent: EventStreamProviderOfClipboardEvent(),
    doubleClickEvent: EventStreamProviderOfEvent(),
    dragEvent: EventStreamProviderOfMouseEvent(),
    dragEndEvent: EventStreamProviderOfMouseEvent(),
    dragEnterEvent: EventStreamProviderOfMouseEvent(),
    dragLeaveEvent: EventStreamProviderOfMouseEvent(),
    dragOverEvent: EventStreamProviderOfMouseEvent(),
    dragStartEvent: EventStreamProviderOfMouseEvent(),
    dropEvent: EventStreamProviderOfMouseEvent(),
    durationChangeEvent: EventStreamProviderOfEvent(),
    emptiedEvent: EventStreamProviderOfEvent(),
    endedEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    focusEvent: EventStreamProviderOfEvent(),
    inputEvent: EventStreamProviderOfEvent(),
    invalidEvent: EventStreamProviderOfEvent(),
    keyDownEvent: EventStreamProviderOfKeyboardEvent(),
    keyPressEvent: EventStreamProviderOfKeyboardEvent(),
    keyUpEvent: EventStreamProviderOfKeyboardEvent(),
    loadEvent: EventStreamProviderOfEvent(),
    loadedDataEvent: EventStreamProviderOfEvent(),
    loadedMetadataEvent: EventStreamProviderOfEvent(),
    mouseDownEvent: EventStreamProviderOfMouseEvent(),
    mouseEnterEvent: EventStreamProviderOfMouseEvent(),
    mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
    mouseMoveEvent: EventStreamProviderOfMouseEvent(),
    mouseOutEvent: EventStreamProviderOfMouseEvent(),
    mouseOverEvent: EventStreamProviderOfMouseEvent(),
    mouseUpEvent: EventStreamProviderOfMouseEvent(),
    pasteEvent: EventStreamProviderOfClipboardEvent(),
    pauseEvent: EventStreamProviderOfEvent(),
    playEvent: EventStreamProviderOfEvent(),
    playingEvent: EventStreamProviderOfEvent(),
    rateChangeEvent: EventStreamProviderOfEvent(),
    resetEvent: EventStreamProviderOfEvent(),
    resizeEvent: EventStreamProviderOfEvent(),
    scrollEvent: EventStreamProviderOfEvent(),
    searchEvent: EventStreamProviderOfEvent(),
    seekedEvent: EventStreamProviderOfEvent(),
    seekingEvent: EventStreamProviderOfEvent(),
    selectEvent: EventStreamProviderOfEvent(),
    selectStartEvent: EventStreamProviderOfEvent(),
    stalledEvent: EventStreamProviderOfEvent(),
    submitEvent: EventStreamProviderOfEvent(),
    suspendEvent: EventStreamProviderOfEvent(),
    timeUpdateEvent: EventStreamProviderOfEvent(),
    touchCancelEvent: EventStreamProviderOfTouchEvent(),
    touchEndEvent: EventStreamProviderOfTouchEvent(),
    touchEnterEvent: EventStreamProviderOfTouchEvent(),
    touchLeaveEvent: EventStreamProviderOfTouchEvent(),
    touchMoveEvent: EventStreamProviderOfTouchEvent(),
    touchStartEvent: EventStreamProviderOfTouchEvent(),
    volumeChangeEvent: EventStreamProviderOfEvent(),
    waitingEvent: EventStreamProviderOfEvent(),
    fullscreenChangeEvent: EventStreamProviderOfEvent(),
    fullscreenErrorEvent: EventStreamProviderOfEvent()
  }),
  statics: () => ({
    isTagSupported: dart.definiteFunctionType(core.bool, [core.String]),
    _determineMouseWheelEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
    _determineTransitionEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
    _offsetToHelper: dart.definiteFunctionType(math.Point$(core.num), [html$.Element, html$.Element]),
    _hasCorruptedAttributes: dart.definiteFunctionType(core.bool, [html$.Element]),
    _hasCorruptedAttributesAdditionalCheck: dart.definiteFunctionType(core.bool, [html$.Element]),
    _safeTagName: dart.definiteFunctionType(core.String, [dart.dynamic])
  }),
  names: ['isTagSupported', '_determineMouseWheelEventType', '_determineTransitionEventType', '_offsetToHelper', '_hasCorruptedAttributes', '_hasCorruptedAttributesAdditionalCheck', '_safeTagName']
});
html$.Element._parseDocument = null;
html$.Element._parseRange = null;
html$.Element._defaultValidator = null;
html$.Element._defaultSanitizer = null;
html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported = dart.constList(['HEAD', 'AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET', 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM', 'SOURCE', 'STYLE', 'TITLE', 'WBR'], core.String);
dart.defineLazy(html$.Element, {
  get mouseWheelEvent() {
    return dart.const(new (_CustomEventStreamProviderOfWheelEvent())(html$.Element._determineMouseWheelEventType));
  },
  get transitionEndEvent() {
    return dart.const(new (_CustomEventStreamProviderOfTransitionEvent())(html$.Element._determineTransitionEventType));
  },
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('abort'));
  },
  get beforeCopyEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('beforecopy'));
  },
  get beforeCutEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('beforecut'));
  },
  get beforePasteEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('beforepaste'));
  },
  get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('blur'));
  },
  get canPlayEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('canplay'));
  },
  get canPlayThroughEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
  },
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  },
  get clickEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
  },
  get contextMenuEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
  },
  get copyEvent() {
    return dart.const(new (EventStreamProviderOfClipboardEvent())('copy'));
  },
  get cutEvent() {
    return dart.const(new (EventStreamProviderOfClipboardEvent())('cut'));
  },
  get doubleClickEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
  },
  get dragEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
  },
  get dragEndEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
  },
  get dragEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
  },
  get dragLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
  },
  get dragOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
  },
  get dragStartEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
  },
  get dropEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
  },
  get durationChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
  },
  get emptiedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('emptied'));
  },
  get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ended'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('focus'));
  },
  get inputEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('input'));
  },
  get invalidEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('invalid'));
  },
  get keyDownEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
  },
  get keyPressEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
  },
  get keyUpEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
  },
  get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('load'));
  },
  get loadedDataEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
  },
  get loadedMetadataEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
  },
  get mouseDownEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
  },
  get mouseEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
  },
  get mouseLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
  },
  get mouseMoveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
  },
  get mouseOutEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
  },
  get mouseOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
  },
  get mouseUpEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
  },
  get pasteEvent() {
    return dart.const(new (EventStreamProviderOfClipboardEvent())('paste'));
  },
  get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pause'));
  },
  get playEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('play'));
  },
  get playingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('playing'));
  },
  get rateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
  },
  get resetEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('reset'));
  },
  get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('resize'));
  },
  get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
  },
  get searchEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('search'));
  },
  get seekedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('seeked'));
  },
  get seekingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('seeking'));
  },
  get selectEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('select'));
  },
  get selectStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('selectstart'));
  },
  get stalledEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('stalled'));
  },
  get submitEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('submit'));
  },
  get suspendEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('suspend'));
  },
  get timeUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
  },
  get touchCancelEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent())('touchcancel'));
  },
  get touchEndEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent())('touchend'));
  },
  get touchEnterEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent())('touchenter'));
  },
  get touchLeaveEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent())('touchleave'));
  },
  get touchMoveEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent())('touchmove'));
  },
  get touchStartEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent())('touchstart'));
  },
  get volumeChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
  },
  get waitingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('waiting'));
  },
  get fullscreenChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenchange'));
  },
  get fullscreenErrorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenerror'));
  }
});
dart.registerExtension(dart.global.Element, html$.Element);
html$.HtmlElement = class HtmlElement extends html$.Element {
  static new() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.HtmlElement, 'created');
dart.setSignature(html$.HtmlElement, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.HtmlElement, []),
    created: dart.definiteFunctionType(html$.HtmlElement, [])
  })
});
dart.registerExtension(dart.global.HTMLElement, html$.HtmlElement);
html$._EntryArray = class _EntryArray extends core.Object {};
html$._EntryArray[dart.implements] = () => [ListOfEntry()];
dart.registerExtension(dart.global.EntryArray, html$._EntryArray);
html$.spawnDomUri = function(uri, args, message) {
  dart.throw(new core.UnimplementedError());
};
dart.fn(html$.spawnDomUri, UriAndListOfStringAnddynamicToFutureOfIsolate());
html$.createCustomUpgrader = function(customElementClass, $this) {
  return $this;
};
dart.fn(html$.createCustomUpgrader, TypeAnddynamicTodynamic());
dart.defineExtensionNames([
  'onError'
]);
html$.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get onError() {
    return html$.AbstractWorker.errorEvent.forTarget(this);
  }
};
html$.AbstractWorker[dart.implements] = () => [html$.EventTarget];
dart.setSignature(html$.AbstractWorker, {
  constructors: () => ({_: dart.definiteFunctionType(html$.AbstractWorker, [])}),
  getters: () => ({onError: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  sfields: () => ({errorEvent: EventStreamProviderOfEvent()})
});
dart.defineExtensionMembers(html$.AbstractWorker, ['onError']);
dart.defineLazy(html$.AbstractWorker, {
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  }
});
dart.defineExtensionNames([
  'toString',
  'download',
  'hreflang',
  'rel',
  'target',
  'type',
  'hash',
  'host',
  'hostname',
  'href',
  'origin',
  'password',
  'pathname',
  'port',
  'protocol',
  'search',
  'username'
]);
html$.AnchorElement = class AnchorElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(opts) {
    let href = opts && 'href' in opts ? opts.href : null;
    let e = html$.AnchorElement._check(html$.document[dartx.createElement]("a"));
    if (href != null) e[dartx.href] = href;
    return e;
  }
  created() {
    this[dartx.download] = null;
    this[dartx.hreflang] = null;
    this[dartx.rel] = null;
    this[dartx.target] = null;
    this[dartx.type] = null;
    this[dartx.hash] = null;
    this[dartx.host] = null;
    this[dartx.hostname] = null;
    this[dartx.href] = null;
    this[dartx.origin] = null;
    this[dartx.password] = null;
    this[dartx.pathname] = null;
    this[dartx.port] = null;
    this[dartx.protocol] = null;
    this[dartx.search] = null;
    this[dartx.username] = null;
    super.created();
  }
  get [dartx.download]() {
    return this.download;
  }
  set [dartx.download](value) {
    this.download = value;
  }
  get [dartx.hreflang]() {
    return this.hreflang;
  }
  set [dartx.hreflang](value) {
    this.hreflang = value;
  }
  get [dartx.rel]() {
    return this.rel;
  }
  set [dartx.rel](value) {
    this.rel = value;
  }
  get [dartx.target]() {
    return this.target;
  }
  set [dartx.target](value) {
    this.target = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  get [dartx.hash]() {
    return this.hash;
  }
  set [dartx.hash](value) {
    this.hash = value;
  }
  get [dartx.host]() {
    return this.host;
  }
  set [dartx.host](value) {
    this.host = value;
  }
  get [dartx.hostname]() {
    return this.hostname;
  }
  set [dartx.hostname](value) {
    this.hostname = value;
  }
  get [dartx.href]() {
    return this.href;
  }
  set [dartx.href](value) {
    this.href = value;
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.password]() {
    return this.password;
  }
  set [dartx.password](value) {
    this.password = value;
  }
  get [dartx.pathname]() {
    return this.pathname;
  }
  set [dartx.pathname](value) {
    this.pathname = value;
  }
  get [dartx.port]() {
    return this.port;
  }
  set [dartx.port](value) {
    this.port = value;
  }
  get [dartx.protocol]() {
    return this.protocol;
  }
  set [dartx.protocol](value) {
    this.protocol = value;
  }
  get [dartx.search]() {
    return this.search;
  }
  set [dartx.search](value) {
    this.search = value;
  }
  get [dartx.username]() {
    return this.username;
  }
  set [dartx.username](value) {
    this.username = value;
  }
  [dartx.toString]() {
    return String(this);
  }
};
dart.defineNamedConstructor(html$.AnchorElement, 'created');
html$.AnchorElement[dart.implements] = () => [html$.UrlUtils];
dart.setSignature(html$.AnchorElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.AnchorElement, []),
    new: dart.definiteFunctionType(html$.AnchorElement, [], {href: core.String}),
    created: dart.definiteFunctionType(html$.AnchorElement, [])
  }),
  fields: () => ({
    [dartx.download]: core.String,
    [dartx.hreflang]: core.String,
    [dartx.rel]: core.String,
    [dartx.target]: core.String,
    [dartx.type]: core.String,
    [dartx.hash]: core.String,
    [dartx.host]: core.String,
    [dartx.hostname]: core.String,
    [dartx.href]: core.String,
    [dartx.origin]: core.String,
    [dartx.password]: core.String,
    [dartx.pathname]: core.String,
    [dartx.port]: core.String,
    [dartx.protocol]: core.String,
    [dartx.search]: core.String,
    [dartx.username]: core.String
  })
});
dart.registerExtension(dart.global.HTMLAnchorElement, html$.AnchorElement);
dart.defineExtensionNames([
  'cancel',
  'finish',
  'pause',
  'play',
  'reverse',
  'currentTime',
  'effect',
  'endClip',
  'finished',
  'playState',
  'playbackRate',
  'ready',
  'startClip',
  'startTime'
]);
html$.Animation = class Animation extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!document.body.animate;
  }
  get [dartx.currentTime]() {
    return this.currentTime;
  }
  set [dartx.currentTime](value) {
    this.currentTime = value;
  }
  get [dartx.effect]() {
    return this.effect;
  }
  set [dartx.effect](value) {
    this.effect = value;
  }
  get [dartx.endClip]() {
    return this.endClip;
  }
  set [dartx.endClip](value) {
    this.endClip = value;
  }
  get [dartx.finished]() {
    return this.finished;
  }
  get [dartx.playState]() {
    return this.playState;
  }
  get [dartx.playbackRate]() {
    return this.playbackRate;
  }
  set [dartx.playbackRate](value) {
    this.playbackRate = value;
  }
  get [dartx.ready]() {
    return this.ready;
  }
  get [dartx.startClip]() {
    return this.startClip;
  }
  set [dartx.startClip](value) {
    this.startClip = value;
  }
  get [dartx.startTime]() {
    return this.startTime;
  }
  set [dartx.startTime](value) {
    this.startTime = value;
  }
  [dartx.cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [dartx.finish](...args) {
    return this.finish.apply(this, args);
  }
  [dartx.pause](...args) {
    return this.pause.apply(this, args);
  }
  [dartx.play](...args) {
    return this.play.apply(this, args);
  }
  [dartx.reverse](...args) {
    return this.reverse.apply(this, args);
  }
};
dart.setSignature(html$.Animation, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Animation, [])}),
  fields: () => ({
    [dartx.currentTime]: core.num,
    [dartx.effect]: html$.AnimationEffectReadOnly,
    [dartx.endClip]: core.num,
    [dartx.finished]: async.Future,
    [dartx.playState]: core.String,
    [dartx.playbackRate]: core.num,
    [dartx.ready]: async.Future,
    [dartx.startClip]: core.num,
    [dartx.startTime]: core.num
  }),
  methods: () => ({
    [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
    [dartx.finish]: dart.definiteFunctionType(dart.void, []),
    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
    [dartx.play]: dart.definiteFunctionType(dart.void, []),
    [dartx.reverse]: dart.definiteFunctionType(dart.void, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.Animation, html$.Animation);
const _get_computedTiming = Symbol('_get_computedTiming');
dart.defineExtensionNames([
  'computedTiming',
  'timing'
]);
html$.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.computedTiming]() {
    return html_common.convertNativeToDart_Dictionary(this[_get_computedTiming]);
  }
  get [_get_computedTiming]() {
    return this.computedTiming;
  }
  get [dartx.timing]() {
    return this.timing;
  }
};
dart.setSignature(html$.AnimationEffectReadOnly, {
  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectReadOnly, [])}),
  fields: () => ({
    [_get_computedTiming]: dart.dynamic,
    [dartx.timing]: html$.AnimationEffectTiming
  }),
  getters: () => ({[dartx.computedTiming]: dart.definiteFunctionType(core.Map, [])})
});
dart.registerExtension(dart.global.AnimationEffectReadOnly, html$.AnimationEffectReadOnly);
dart.defineExtensionNames([
  'delay',
  'direction',
  'duration',
  'easing',
  'endDelay',
  'fill',
  'iterationStart',
  'iterations',
  'playbackRate'
]);
html$.AnimationEffectTiming = class AnimationEffectTiming extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.delay]() {
    return this.delay;
  }
  set [dartx.delay](value) {
    this.delay = value;
  }
  get [dartx.direction]() {
    return this.direction;
  }
  set [dartx.direction](value) {
    this.direction = value;
  }
  get [dartx.duration]() {
    return this.duration;
  }
  set [dartx.duration](value) {
    this.duration = value;
  }
  get [dartx.easing]() {
    return this.easing;
  }
  set [dartx.easing](value) {
    this.easing = value;
  }
  get [dartx.endDelay]() {
    return this.endDelay;
  }
  set [dartx.endDelay](value) {
    this.endDelay = value;
  }
  get [dartx.fill]() {
    return this.fill;
  }
  set [dartx.fill](value) {
    this.fill = value;
  }
  get [dartx.iterationStart]() {
    return this.iterationStart;
  }
  set [dartx.iterationStart](value) {
    this.iterationStart = value;
  }
  get [dartx.iterations]() {
    return this.iterations;
  }
  set [dartx.iterations](value) {
    this.iterations = value;
  }
  get [dartx.playbackRate]() {
    return this.playbackRate;
  }
  set [dartx.playbackRate](value) {
    this.playbackRate = value;
  }
};
dart.setSignature(html$.AnimationEffectTiming, {
  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectTiming, [])}),
  fields: () => ({
    [dartx.delay]: core.num,
    [dartx.direction]: core.String,
    [dartx.duration]: core.Object,
    [dartx.easing]: core.String,
    [dartx.endDelay]: core.num,
    [dartx.fill]: core.String,
    [dartx.iterationStart]: core.num,
    [dartx.iterations]: core.num,
    [dartx.playbackRate]: core.num
  })
});
dart.registerExtension(dart.global.AnimationEffectTiming, html$.AnimationEffectTiming);
dart.defineExtensionNames([
  'animationName',
  'elapsedTime'
]);
html$.AnimationEvent = class AnimationEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.AnimationEvent._create_1(type, eventInitDict_1);
    }
    return html$.AnimationEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.AnimationEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.AnimationEvent(type);
  }
  get [dartx.animationName]() {
    return this.animationName;
  }
  get [dartx.elapsedTime]() {
    return this.elapsedTime;
  }
};
dart.setSignature(html$.AnimationEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.AnimationEvent, []),
    new: dart.definiteFunctionType(html$.AnimationEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.animationName]: core.String,
    [dartx.elapsedTime]: core.double
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.AnimationEvent, html$.AnimationEvent);
dart.defineExtensionNames([
  'currentTime',
  'timelineTime'
]);
html$.AnimationPlayerEvent = class AnimationPlayerEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.AnimationPlayerEvent._create_1(type, eventInitDict_1);
    }
    return html$.AnimationPlayerEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.AnimationPlayerEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.AnimationPlayerEvent(type);
  }
  get [dartx.currentTime]() {
    return this.currentTime;
  }
  get [dartx.timelineTime]() {
    return this.timelineTime;
  }
};
dart.setSignature(html$.AnimationPlayerEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.AnimationPlayerEvent, []),
    new: dart.definiteFunctionType(html$.AnimationPlayerEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.currentTime]: core.double,
    [dartx.timelineTime]: core.double
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.AnimationPlayerEvent, html$.AnimationPlayerEvent);
dart.defineExtensionNames([
  'getAnimations',
  'play',
  'currentTime',
  'playbackRate'
]);
html$.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.currentTime]() {
    return this.currentTime;
  }
  set [dartx.currentTime](value) {
    this.currentTime = value;
  }
  get [dartx.playbackRate]() {
    return this.playbackRate;
  }
  set [dartx.playbackRate](value) {
    this.playbackRate = value;
  }
  [dartx.getAnimations](...args) {
    return this.getAnimations.apply(this, args);
  }
  [dartx.play](...args) {
    return this.play.apply(this, args);
  }
};
dart.setSignature(html$.AnimationTimeline, {
  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationTimeline, [])}),
  fields: () => ({
    [dartx.currentTime]: core.num,
    [dartx.playbackRate]: core.num
  }),
  methods: () => ({
    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
    [dartx.play]: dart.definiteFunctionType(html$.Animation, [html$.AnimationEffectReadOnly])
  })
});
dart.registerExtension(dart.global.AnimationTimeline, html$.AnimationTimeline);
dart.defineExtensionNames([
  'outcome',
  'platform'
]);
html$.AppBannerPromptResult = class AppBannerPromptResult extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.outcome]() {
    return this.outcome;
  }
  get [dartx.platform]() {
    return this.platform;
  }
};
dart.setSignature(html$.AppBannerPromptResult, {
  constructors: () => ({_: dart.definiteFunctionType(html$.AppBannerPromptResult, [])}),
  fields: () => ({
    [dartx.outcome]: core.String,
    [dartx.platform]: core.String
  })
});
dart.registerExtension(dart.global.AppBannerPromptResult, html$.AppBannerPromptResult);
dart.defineExtensionNames([
  'abort',
  'swapCache',
  'update',
  'onCached',
  'onChecking',
  'onDownloading',
  'onError',
  'onNoUpdate',
  'onObsolete',
  'onProgress',
  'onUpdateReady',
  'status'
]);
html$.ApplicationCache = class ApplicationCache extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!window.applicationCache;
  }
  get [dartx.status]() {
    return this.status;
  }
  [dartx.abort](...args) {
    return this.abort.apply(this, args);
  }
  [dartx.swapCache](...args) {
    return this.swapCache.apply(this, args);
  }
  [dartx.update](...args) {
    return this.update.apply(this, args);
  }
  get [dartx.onCached]() {
    return html$.ApplicationCache.cachedEvent.forTarget(this);
  }
  get [dartx.onChecking]() {
    return html$.ApplicationCache.checkingEvent.forTarget(this);
  }
  get [dartx.onDownloading]() {
    return html$.ApplicationCache.downloadingEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.ApplicationCache.errorEvent.forTarget(this);
  }
  get [dartx.onNoUpdate]() {
    return html$.ApplicationCache.noUpdateEvent.forTarget(this);
  }
  get [dartx.onObsolete]() {
    return html$.ApplicationCache.obsoleteEvent.forTarget(this);
  }
  get [dartx.onProgress]() {
    return html$.ApplicationCache.progressEvent.forTarget(this);
  }
  get [dartx.onUpdateReady]() {
    return html$.ApplicationCache.updateReadyEvent.forTarget(this);
  }
};
dart.setSignature(html$.ApplicationCache, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ApplicationCache, [])}),
  fields: () => ({[dartx.status]: core.int}),
  getters: () => ({
    [dartx.onCached]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onChecking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onDownloading]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onNoUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onObsolete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onUpdateReady]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
    [dartx.swapCache]: dart.definiteFunctionType(dart.void, []),
    [dartx.update]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    cachedEvent: EventStreamProviderOfEvent(),
    checkingEvent: EventStreamProviderOfEvent(),
    downloadingEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    noUpdateEvent: EventStreamProviderOfEvent(),
    obsoleteEvent: EventStreamProviderOfEvent(),
    progressEvent: EventStreamProviderOfProgressEvent(),
    updateReadyEvent: EventStreamProviderOfEvent(),
    CHECKING: core.int,
    DOWNLOADING: core.int,
    IDLE: core.int,
    OBSOLETE: core.int,
    UNCACHED: core.int,
    UPDATEREADY: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
html$.ApplicationCache.CHECKING = 2;
html$.ApplicationCache.DOWNLOADING = 3;
html$.ApplicationCache.IDLE = 1;
html$.ApplicationCache.OBSOLETE = 5;
html$.ApplicationCache.UNCACHED = 0;
html$.ApplicationCache.UPDATEREADY = 4;
dart.defineLazy(html$.ApplicationCache, {
  get cachedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('cached'));
  },
  get checkingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('checking'));
  },
  get downloadingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('downloading'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get noUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('noupdate'));
  },
  get obsoleteEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('obsolete'));
  },
  get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
  },
  get updateReadyEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('updateready'));
  }
});
dart.registerExtension(dart.global.ApplicationCache, html$.ApplicationCache);
dart.registerExtension(dart.global.DOMApplicationCache, html$.ApplicationCache);
dart.registerExtension(dart.global.OfflineResourceList, html$.ApplicationCache);
dart.defineExtensionNames([
  'message',
  'reason',
  'status',
  'url'
]);
html$.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
    }
    return html$.ApplicationCacheErrorEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.ApplicationCacheErrorEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.ApplicationCacheErrorEvent(type);
  }
  get [dartx.message]() {
    return this.message;
  }
  get [dartx.reason]() {
    return this.reason;
  }
  get [dartx.status]() {
    return this.status;
  }
  get [dartx.url]() {
    return this.url;
  }
};
dart.setSignature(html$.ApplicationCacheErrorEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, []),
    new: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.message]: core.String,
    [dartx.reason]: core.String,
    [dartx.status]: core.int,
    [dartx.url]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.ApplicationCacheErrorEvent, html$.ApplicationCacheErrorEvent);
dart.defineExtensionNames([
  'toString',
  'alt',
  'coords',
  'shape',
  'target',
  'hash',
  'host',
  'hostname',
  'href',
  'origin',
  'password',
  'pathname',
  'port',
  'protocol',
  'search',
  'username'
]);
html$.AreaElement = class AreaElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.AreaElement._check(html$.document[dartx.createElement]("area"));
  }
  created() {
    this[dartx.alt] = null;
    this[dartx.coords] = null;
    this[dartx.shape] = null;
    this[dartx.target] = null;
    this[dartx.hash] = null;
    this[dartx.host] = null;
    this[dartx.hostname] = null;
    this[dartx.href] = null;
    this[dartx.origin] = null;
    this[dartx.password] = null;
    this[dartx.pathname] = null;
    this[dartx.port] = null;
    this[dartx.protocol] = null;
    this[dartx.search] = null;
    this[dartx.username] = null;
    super.created();
  }
  get [dartx.alt]() {
    return this.alt;
  }
  set [dartx.alt](value) {
    this.alt = value;
  }
  get [dartx.coords]() {
    return this.coords;
  }
  set [dartx.coords](value) {
    this.coords = value;
  }
  get [dartx.shape]() {
    return this.shape;
  }
  set [dartx.shape](value) {
    this.shape = value;
  }
  get [dartx.target]() {
    return this.target;
  }
  set [dartx.target](value) {
    this.target = value;
  }
  get [dartx.hash]() {
    return this.hash;
  }
  set [dartx.hash](value) {
    this.hash = value;
  }
  get [dartx.host]() {
    return this.host;
  }
  set [dartx.host](value) {
    this.host = value;
  }
  get [dartx.hostname]() {
    return this.hostname;
  }
  set [dartx.hostname](value) {
    this.hostname = value;
  }
  get [dartx.href]() {
    return this.href;
  }
  set [dartx.href](value) {
    this.href = value;
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.password]() {
    return this.password;
  }
  set [dartx.password](value) {
    this.password = value;
  }
  get [dartx.pathname]() {
    return this.pathname;
  }
  set [dartx.pathname](value) {
    this.pathname = value;
  }
  get [dartx.port]() {
    return this.port;
  }
  set [dartx.port](value) {
    this.port = value;
  }
  get [dartx.protocol]() {
    return this.protocol;
  }
  set [dartx.protocol](value) {
    this.protocol = value;
  }
  get [dartx.search]() {
    return this.search;
  }
  set [dartx.search](value) {
    this.search = value;
  }
  get [dartx.username]() {
    return this.username;
  }
  set [dartx.username](value) {
    this.username = value;
  }
  [dartx.toString]() {
    return String(this);
  }
};
dart.defineNamedConstructor(html$.AreaElement, 'created');
html$.AreaElement[dart.implements] = () => [html$.UrlUtils];
dart.setSignature(html$.AreaElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.AreaElement, []),
    new: dart.definiteFunctionType(html$.AreaElement, []),
    created: dart.definiteFunctionType(html$.AreaElement, [])
  }),
  fields: () => ({
    [dartx.alt]: core.String,
    [dartx.coords]: core.String,
    [dartx.shape]: core.String,
    [dartx.target]: core.String,
    [dartx.hash]: core.String,
    [dartx.host]: core.String,
    [dartx.hostname]: core.String,
    [dartx.href]: core.String,
    [dartx.origin]: core.String,
    [dartx.password]: core.String,
    [dartx.pathname]: core.String,
    [dartx.port]: core.String,
    [dartx.protocol]: core.String,
    [dartx.search]: core.String,
    [dartx.username]: core.String
  })
});
dart.registerExtension(dart.global.HTMLAreaElement, html$.AreaElement);
dart.defineExtensionNames([
  'addTextTrack',
  'canPlayType',
  'load',
  'pause',
  'play',
  'setMediaKeys',
  'setSinkId',
  'addKey',
  'cancelKeyRequest',
  'generateKeyRequest',
  'onKeyAdded',
  'onKeyError',
  'onKeyMessage',
  'onNeedKey',
  'audioTracks',
  'autoplay',
  'buffered',
  'controller',
  'controls',
  'crossOrigin',
  'currentSrc',
  'currentTime',
  'defaultMuted',
  'defaultPlaybackRate',
  'duration',
  'ended',
  'error',
  'loop',
  'mediaGroup',
  'mediaKeys',
  'muted',
  'networkState',
  'paused',
  'playbackRate',
  'played',
  'preload',
  'readyState',
  'seekable',
  'seeking',
  'session',
  'sinkId',
  'src',
  'textTracks',
  'videoTracks',
  'volume',
  'audioDecodedByteCount',
  'videoDecodedByteCount'
]);
html$.MediaElement = class MediaElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.audioTracks] = null;
    this[dartx.autoplay] = null;
    this[dartx.buffered] = null;
    this[dartx.controller] = null;
    this[dartx.controls] = null;
    this[dartx.crossOrigin] = null;
    this[dartx.currentSrc] = null;
    this[dartx.currentTime] = null;
    this[dartx.defaultMuted] = null;
    this[dartx.defaultPlaybackRate] = null;
    this[dartx.duration] = null;
    this[dartx.ended] = null;
    this[dartx.error] = null;
    this[dartx.loop] = null;
    this[dartx.mediaGroup] = null;
    this[dartx.mediaKeys] = null;
    this[dartx.muted] = null;
    this[dartx.networkState] = null;
    this[dartx.paused] = null;
    this[dartx.playbackRate] = null;
    this[dartx.played] = null;
    this[dartx.preload] = null;
    this[dartx.readyState] = null;
    this[dartx.seekable] = null;
    this[dartx.seeking] = null;
    this[dartx.session] = null;
    this[dartx.sinkId] = null;
    this[dartx.src] = null;
    this[dartx.textTracks] = null;
    this[dartx.videoTracks] = null;
    this[dartx.volume] = null;
    this[dartx.audioDecodedByteCount] = null;
    this[dartx.videoDecodedByteCount] = null;
    super.created();
  }
  get [dartx.audioTracks]() {
    return this.audioTracks;
  }
  get [dartx.autoplay]() {
    return this.autoplay;
  }
  set [dartx.autoplay](value) {
    this.autoplay = value;
  }
  get [dartx.buffered]() {
    return this.buffered;
  }
  get [dartx.controller]() {
    return this.controller;
  }
  set [dartx.controller](value) {
    this.controller = value;
  }
  get [dartx.controls]() {
    return this.controls;
  }
  set [dartx.controls](value) {
    this.controls = value;
  }
  get [dartx.crossOrigin]() {
    return this.crossOrigin;
  }
  set [dartx.crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [dartx.currentSrc]() {
    return this.currentSrc;
  }
  get [dartx.currentTime]() {
    return this.currentTime;
  }
  set [dartx.currentTime](value) {
    this.currentTime = value;
  }
  get [dartx.defaultMuted]() {
    return this.defaultMuted;
  }
  set [dartx.defaultMuted](value) {
    this.defaultMuted = value;
  }
  get [dartx.defaultPlaybackRate]() {
    return this.defaultPlaybackRate;
  }
  set [dartx.defaultPlaybackRate](value) {
    this.defaultPlaybackRate = value;
  }
  get [dartx.duration]() {
    return this.duration;
  }
  get [dartx.ended]() {
    return this.ended;
  }
  get [dartx.error]() {
    return this.error;
  }
  get [dartx.loop]() {
    return this.loop;
  }
  set [dartx.loop](value) {
    this.loop = value;
  }
  get [dartx.mediaGroup]() {
    return this.mediaGroup;
  }
  set [dartx.mediaGroup](value) {
    this.mediaGroup = value;
  }
  get [dartx.mediaKeys]() {
    return this.mediaKeys;
  }
  get [dartx.muted]() {
    return this.muted;
  }
  set [dartx.muted](value) {
    this.muted = value;
  }
  get [dartx.networkState]() {
    return this.networkState;
  }
  get [dartx.paused]() {
    return this.paused;
  }
  get [dartx.playbackRate]() {
    return this.playbackRate;
  }
  set [dartx.playbackRate](value) {
    this.playbackRate = value;
  }
  get [dartx.played]() {
    return this.played;
  }
  get [dartx.preload]() {
    return this.preload;
  }
  set [dartx.preload](value) {
    this.preload = value;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.seekable]() {
    return this.seekable;
  }
  get [dartx.seeking]() {
    return this.seeking;
  }
  get [dartx.session]() {
    return this.session;
  }
  set [dartx.session](value) {
    this.session = value;
  }
  get [dartx.sinkId]() {
    return this.sinkId;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.textTracks]() {
    return this.textTracks;
  }
  get [dartx.videoTracks]() {
    return this.videoTracks;
  }
  get [dartx.volume]() {
    return this.volume;
  }
  set [dartx.volume](value) {
    this.volume = value;
  }
  get [dartx.audioDecodedByteCount]() {
    return this.webkitAudioDecodedByteCount;
  }
  get [dartx.videoDecodedByteCount]() {
    return this.webkitVideoDecodedByteCount;
  }
  [dartx.addTextTrack](...args) {
    return this.addTextTrack.apply(this, args);
  }
  [dartx.canPlayType](...args) {
    return this.canPlayType.apply(this, args);
  }
  [dartx.load](...args) {
    return this.load.apply(this, args);
  }
  [dartx.pause](...args) {
    return this.pause.apply(this, args);
  }
  [dartx.play](...args) {
    return this.play.apply(this, args);
  }
  [dartx.setMediaKeys](...args) {
    return this.setMediaKeys.apply(this, args);
  }
  [dartx.setSinkId](...args) {
    return this.setSinkId.apply(this, args);
  }
  [dartx.addKey](...args) {
    return this.webkitAddKey.apply(this, args);
  }
  [dartx.cancelKeyRequest](...args) {
    return this.webkitCancelKeyRequest.apply(this, args);
  }
  [dartx.generateKeyRequest](...args) {
    return this.webkitGenerateKeyRequest.apply(this, args);
  }
  get [dartx.onKeyAdded]() {
    return html$.MediaElement.keyAddedEvent.forElement(this);
  }
  get [dartx.onKeyError]() {
    return html$.MediaElement.keyErrorEvent.forElement(this);
  }
  get [dartx.onKeyMessage]() {
    return html$.MediaElement.keyMessageEvent.forElement(this);
  }
  get [dartx.onNeedKey]() {
    return html$.MediaElement.needKeyEvent.forElement(this);
  }
};
dart.defineNamedConstructor(html$.MediaElement, 'created');
dart.setSignature(html$.MediaElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaElement, []),
    created: dart.definiteFunctionType(html$.MediaElement, [])
  }),
  fields: () => ({
    [dartx.audioTracks]: html$.AudioTrackList,
    [dartx.autoplay]: core.bool,
    [dartx.buffered]: html$.TimeRanges,
    [dartx.controller]: html$.MediaController,
    [dartx.controls]: core.bool,
    [dartx.crossOrigin]: core.String,
    [dartx.currentSrc]: core.String,
    [dartx.currentTime]: core.num,
    [dartx.defaultMuted]: core.bool,
    [dartx.defaultPlaybackRate]: core.num,
    [dartx.duration]: core.double,
    [dartx.ended]: core.bool,
    [dartx.error]: html$.MediaError,
    [dartx.loop]: core.bool,
    [dartx.mediaGroup]: core.String,
    [dartx.mediaKeys]: html$.MediaKeys,
    [dartx.muted]: core.bool,
    [dartx.networkState]: core.int,
    [dartx.paused]: core.bool,
    [dartx.playbackRate]: core.num,
    [dartx.played]: html$.TimeRanges,
    [dartx.preload]: core.String,
    [dartx.readyState]: core.int,
    [dartx.seekable]: html$.TimeRanges,
    [dartx.seeking]: core.bool,
    [dartx.session]: html$.MediaSession,
    [dartx.sinkId]: core.String,
    [dartx.src]: core.String,
    [dartx.textTracks]: html$.TextTrackList,
    [dartx.videoTracks]: html$.VideoTrackList,
    [dartx.volume]: core.num,
    [dartx.audioDecodedByteCount]: core.int,
    [dartx.videoDecodedByteCount]: core.int
  }),
  getters: () => ({
    [dartx.onKeyAdded]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
    [dartx.onKeyError]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
    [dartx.onKeyMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
    [dartx.onNeedKey]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), [])
  }),
  methods: () => ({
    [dartx.addTextTrack]: dart.definiteFunctionType(html$.TextTrack, [core.String], [core.String, core.String]),
    [dartx.canPlayType]: dart.definiteFunctionType(core.String, [core.String], [core.String]),
    [dartx.load]: dart.definiteFunctionType(dart.void, []),
    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
    [dartx.play]: dart.definiteFunctionType(dart.void, []),
    [dartx.setMediaKeys]: dart.definiteFunctionType(async.Future, [html$.MediaKeys]),
    [dartx.setSinkId]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.addKey]: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List], [typed_data.Uint8List, core.String]),
    [dartx.cancelKeyRequest]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.generateKeyRequest]: dart.definiteFunctionType(dart.void, [core.String], [typed_data.Uint8List])
  }),
  sfields: () => ({
    keyAddedEvent: EventStreamProviderOfMediaKeyEvent(),
    keyErrorEvent: EventStreamProviderOfMediaKeyEvent(),
    keyMessageEvent: EventStreamProviderOfMediaKeyEvent(),
    needKeyEvent: EventStreamProviderOfMediaKeyEvent(),
    HAVE_CURRENT_DATA: core.int,
    HAVE_ENOUGH_DATA: core.int,
    HAVE_FUTURE_DATA: core.int,
    HAVE_METADATA: core.int,
    HAVE_NOTHING: core.int,
    NETWORK_EMPTY: core.int,
    NETWORK_IDLE: core.int,
    NETWORK_LOADING: core.int,
    NETWORK_NO_SOURCE: core.int
  })
});
html$.MediaElement.HAVE_CURRENT_DATA = 2;
html$.MediaElement.HAVE_ENOUGH_DATA = 4;
html$.MediaElement.HAVE_FUTURE_DATA = 3;
html$.MediaElement.HAVE_METADATA = 1;
html$.MediaElement.HAVE_NOTHING = 0;
html$.MediaElement.NETWORK_EMPTY = 0;
html$.MediaElement.NETWORK_IDLE = 1;
html$.MediaElement.NETWORK_LOADING = 2;
html$.MediaElement.NETWORK_NO_SOURCE = 3;
dart.defineLazy(html$.MediaElement, {
  get keyAddedEvent() {
    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyadded'));
  },
  get keyErrorEvent() {
    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyerror'));
  },
  get keyMessageEvent() {
    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeymessage'));
  },
  get needKeyEvent() {
    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitneedkey'));
  }
});
dart.registerExtension(dart.global.HTMLMediaElement, html$.MediaElement);
html$.AudioElement = class AudioElement extends html$.MediaElement {
  static _(src) {
    if (src === void 0) src = null;
    if (src != null) {
      return html$.AudioElement._create_1(src);
    }
    return html$.AudioElement._create_2();
  }
  static _create_1(src) {
    return new Audio(src);
  }
  static _create_2() {
    return new Audio();
  }
  created() {
    super.created();
  }
  static new(src) {
    if (src === void 0) src = null;
    return html$.AudioElement._(src);
  }
};
dart.defineNamedConstructor(html$.AudioElement, 'created');
dart.setSignature(html$.AudioElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.AudioElement, [], [core.String]),
    created: dart.definiteFunctionType(html$.AudioElement, []),
    new: dart.definiteFunctionType(html$.AudioElement, [], [core.String])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.AudioElement, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.AudioElement, [])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.HTMLAudioElement, html$.AudioElement);
dart.defineExtensionNames([
  'enabled',
  'id',
  'kind',
  'label',
  'language'
]);
html$.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.enabled]() {
    return this.enabled;
  }
  set [dartx.enabled](value) {
    this.enabled = value;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.kind]() {
    return this.kind;
  }
  get [dartx.label]() {
    return this.label;
  }
  get [dartx.language]() {
    return this.language;
  }
};
dart.setSignature(html$.AudioTrack, {
  constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrack, [])}),
  fields: () => ({
    [dartx.enabled]: core.bool,
    [dartx.id]: core.String,
    [dartx.kind]: core.String,
    [dartx.label]: core.String,
    [dartx.language]: core.String
  })
});
dart.registerExtension(dart.global.AudioTrack, html$.AudioTrack);
const __getter__ = Symbol('__getter__');
dart.defineExtensionNames([
  'getTrackById',
  'onChange',
  'length'
]);
html$.AudioTrackList = class AudioTrackList extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  get [dartx.onChange]() {
    return html$.AudioTrackList.changeEvent.forTarget(this);
  }
};
dart.setSignature(html$.AudioTrackList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrackList, [])}),
  fields: () => ({[dartx.length]: core.int}),
  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [__getter__]: dart.definiteFunctionType(html$.AudioTrack, [core.int]),
    [dartx.getTrackById]: dart.definiteFunctionType(html$.AudioTrack, [core.String])
  }),
  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.AudioTrackList, {
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  }
});
dart.registerExtension(dart.global.AudioTrackList, html$.AudioTrackList);
dart.defineExtensionNames([
  'reason'
]);
html$.AutocompleteErrorEvent = class AutocompleteErrorEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.AutocompleteErrorEvent._create_1(type, eventInitDict_1);
    }
    return html$.AutocompleteErrorEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.AutocompleteErrorEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.AutocompleteErrorEvent(type);
  }
  get [dartx.reason]() {
    return this.reason;
  }
};
dart.setSignature(html$.AutocompleteErrorEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.AutocompleteErrorEvent, []),
    new: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.reason]: core.String}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.AutocompleteErrorEvent, html$.AutocompleteErrorEvent);
html$.BRElement = class BRElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.BRElement._check(html$.document[dartx.createElement]("br"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.BRElement, 'created');
dart.setSignature(html$.BRElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.BRElement, []),
    new: dart.definiteFunctionType(html$.BRElement, []),
    created: dart.definiteFunctionType(html$.BRElement, [])
  })
});
dart.registerExtension(dart.global.HTMLBRElement, html$.BRElement);
dart.defineExtensionNames([
  'visible'
]);
html$.BarProp = class BarProp extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.visible]() {
    return this.visible;
  }
};
dart.setSignature(html$.BarProp, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BarProp, [])}),
  fields: () => ({[dartx.visible]: core.bool})
});
dart.registerExtension(dart.global.BarProp, html$.BarProp);
dart.defineExtensionNames([
  'href',
  'target'
]);
html$.BaseElement = class BaseElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.BaseElement._check(html$.document[dartx.createElement]("base"));
  }
  created() {
    this[dartx.href] = null;
    this[dartx.target] = null;
    super.created();
  }
  get [dartx.href]() {
    return this.href;
  }
  set [dartx.href](value) {
    this.href = value;
  }
  get [dartx.target]() {
    return this.target;
  }
  set [dartx.target](value) {
    this.target = value;
  }
};
dart.defineNamedConstructor(html$.BaseElement, 'created');
dart.setSignature(html$.BaseElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.BaseElement, []),
    new: dart.definiteFunctionType(html$.BaseElement, []),
    created: dart.definiteFunctionType(html$.BaseElement, [])
  }),
  fields: () => ({
    [dartx.href]: core.String,
    [dartx.target]: core.String
  })
});
dart.registerExtension(dart.global.HTMLBaseElement, html$.BaseElement);
dart.defineExtensionNames([
  'charging',
  'chargingTime',
  'dischargingTime',
  'level'
]);
html$.BatteryManager = class BatteryManager extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.charging]() {
    return this.charging;
  }
  get [dartx.chargingTime]() {
    return this.chargingTime;
  }
  get [dartx.dischargingTime]() {
    return this.dischargingTime;
  }
  get [dartx.level]() {
    return this.level;
  }
};
dart.setSignature(html$.BatteryManager, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BatteryManager, [])}),
  fields: () => ({
    [dartx.charging]: core.bool,
    [dartx.chargingTime]: core.double,
    [dartx.dischargingTime]: core.double,
    [dartx.level]: core.double
  })
});
dart.registerExtension(dart.global.BatteryManager, html$.BatteryManager);
dart.defineExtensionNames([
  'platforms',
  'prompt',
  'userChoice'
]);
html$.BeforeInstallPromptEvent = class BeforeInstallPromptEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
    }
    return html$.BeforeInstallPromptEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.BeforeInstallPromptEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.BeforeInstallPromptEvent(type);
  }
  get [dartx.platforms]() {
    return this.platforms;
  }
  get [dartx.userChoice]() {
    return this.userChoice;
  }
  [dartx.prompt](...args) {
    return this.prompt.apply(this, args);
  }
};
dart.setSignature(html$.BeforeInstallPromptEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, []),
    new: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.userChoice]: async.Future}),
  getters: () => ({[dartx.platforms]: dart.definiteFunctionType(core.List$(core.String), [])}),
  methods: () => ({[dartx.prompt]: dart.definiteFunctionType(async.Future, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.BeforeInstallPromptEvent, html$.BeforeInstallPromptEvent);
dart.defineExtensionNames([
  'returnValue',
  'returnValue'
]);
html$.BeforeUnloadEvent = class BeforeUnloadEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.returnValue]() {
    return this.returnValue;
  }
  set [dartx.returnValue](value) {
    this.returnValue = value;
  }
};
dart.setSignature(html$.BeforeUnloadEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BeforeUnloadEvent, [])}),
  getters: () => ({[dartx.returnValue]: dart.definiteFunctionType(core.String, [])}),
  setters: () => ({[dartx.returnValue]: dart.definiteFunctionType(dart.void, [core.String])})
});
dart.registerExtension(dart.global.BeforeUnloadEvent, html$.BeforeUnloadEvent);
dart.defineExtensionNames([
  'close',
  'slice',
  'size',
  'type'
]);
html$.Blob = class Blob extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.size]() {
    return this.size;
  }
  get [dartx.type]() {
    return this.type;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.slice](...args) {
    return this.slice.apply(this, args);
  }
  static new(blobParts, type, endings) {
    if (type === void 0) type = null;
    if (endings === void 0) endings = null;
    if (type == null && endings == null) {
      return html$.Blob._check(html$.Blob._create_1(blobParts));
    }
    let bag = html$.Blob._create_bag();
    if (type != null) html$.Blob._bag_set(bag, 'type', type);
    if (endings != null) html$.Blob._bag_set(bag, 'endings', endings);
    return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
  }
  static _create_1(parts) {
    return new self.Blob(parts);
  }
  static _create_2(parts, bag) {
    return new self.Blob(parts, bag);
  }
  static _create_bag() {
    return {};
  }
  static _bag_set(bag, key, value) {
    bag[key] = value;
  }
};
dart.setSignature(html$.Blob, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.Blob, []),
    new: dart.definiteFunctionType(html$.Blob, [core.List], [core.String, core.String])
  }),
  fields: () => ({
    [dartx.size]: core.int,
    [dartx.type]: core.String
  }),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [dartx.slice]: dart.definiteFunctionType(html$.Blob, [], [core.int, core.int, core.String])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    _create_bag: dart.definiteFunctionType(dart.dynamic, []),
    _bag_set: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_bag', '_bag_set']
});
dart.registerExtension(dart.global.Blob, html$.Blob);
const _requestDevice_1 = Symbol('_requestDevice_1');
dart.defineExtensionNames([
  'requestDevice'
]);
html$.Bluetooth = class Bluetooth extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.requestDevice](options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    return this[_requestDevice_1](options_1);
  }
  [_requestDevice_1](...args) {
    return this.requestDevice.apply(this, args);
  }
};
dart.setSignature(html$.Bluetooth, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Bluetooth, [])}),
  methods: () => ({
    [dartx.requestDevice]: dart.definiteFunctionType(async.Future, [core.Map]),
    [_requestDevice_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.Bluetooth, html$.Bluetooth);
dart.defineExtensionNames([
  'connectGatt',
  'deviceClass',
  'instanceID',
  'name',
  'paired',
  'productID',
  'productVersion',
  'vendorID',
  'vendorIDSource'
]);
html$.BluetoothDevice = class BluetoothDevice extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.deviceClass]() {
    return this.deviceClass;
  }
  get [dartx.instanceID]() {
    return this.instanceID;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.paired]() {
    return this.paired;
  }
  get [dartx.productID]() {
    return this.productID;
  }
  get [dartx.productVersion]() {
    return this.productVersion;
  }
  get [dartx.vendorID]() {
    return this.vendorID;
  }
  get [dartx.vendorIDSource]() {
    return this.vendorIDSource;
  }
  [dartx.connectGatt](...args) {
    return this.connectGATT.apply(this, args);
  }
};
dart.setSignature(html$.BluetoothDevice, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothDevice, [])}),
  fields: () => ({
    [dartx.deviceClass]: core.int,
    [dartx.instanceID]: core.String,
    [dartx.name]: core.String,
    [dartx.paired]: core.bool,
    [dartx.productID]: core.int,
    [dartx.productVersion]: core.int,
    [dartx.vendorID]: core.int,
    [dartx.vendorIDSource]: core.String
  }),
  methods: () => ({[dartx.connectGatt]: dart.definiteFunctionType(async.Future, [])})
});
dart.registerExtension(dart.global.BluetoothDevice, html$.BluetoothDevice);
dart.defineExtensionNames([
  'readValue',
  'writeValue',
  'uuid'
]);
html$.BluetoothGattCharacteristic = class BluetoothGattCharacteristic extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.uuid]() {
    return this.uuid;
  }
  [dartx.readValue](...args) {
    return this.readValue.apply(this, args);
  }
  [dartx.writeValue](...args) {
    return this.writeValue.apply(this, args);
  }
};
dart.setSignature(html$.BluetoothGattCharacteristic, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattCharacteristic, [])}),
  fields: () => ({[dartx.uuid]: core.String}),
  methods: () => ({
    [dartx.readValue]: dart.definiteFunctionType(async.Future, []),
    [dartx.writeValue]: dart.definiteFunctionType(async.Future, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.BluetoothGATTCharacteristic, html$.BluetoothGattCharacteristic);
dart.defineExtensionNames([
  'getPrimaryService',
  'connected'
]);
html$.BluetoothGattRemoteServer = class BluetoothGattRemoteServer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.connected]() {
    return this.connected;
  }
  [dartx.getPrimaryService](...args) {
    return this.getPrimaryService.apply(this, args);
  }
};
dart.setSignature(html$.BluetoothGattRemoteServer, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattRemoteServer, [])}),
  fields: () => ({[dartx.connected]: core.bool}),
  methods: () => ({[dartx.getPrimaryService]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
});
dart.registerExtension(dart.global.BluetoothGATTRemoteServer, html$.BluetoothGattRemoteServer);
dart.defineExtensionNames([
  'getCharacteristic',
  'isPrimary',
  'uuid'
]);
html$.BluetoothGattService = class BluetoothGattService extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.isPrimary]() {
    return this.isPrimary;
  }
  get [dartx.uuid]() {
    return this.uuid;
  }
  [dartx.getCharacteristic](...args) {
    return this.getCharacteristic.apply(this, args);
  }
};
dart.setSignature(html$.BluetoothGattService, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattService, [])}),
  fields: () => ({
    [dartx.isPrimary]: core.bool,
    [dartx.uuid]: core.String
  }),
  methods: () => ({[dartx.getCharacteristic]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
});
dart.registerExtension(dart.global.BluetoothGATTService, html$.BluetoothGattService);
html$.BluetoothUuid = class BluetoothUuid extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.BluetoothUuid, {
  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothUuid, [])}),
  statics: () => ({
    canonicalUuid: dart.definiteFunctionType(core.String, [core.int]),
    getCharacteristic: dart.definiteFunctionType(core.String, [core.Object]),
    getDescriptor: dart.definiteFunctionType(core.String, [core.Object]),
    getService: dart.definiteFunctionType(core.String, [core.Object])
  }),
  names: ['canonicalUuid', 'getCharacteristic', 'getDescriptor', 'getService']
});
dart.registerExtension(dart.global.BluetoothUUID, html$.BluetoothUuid);
dart.defineExtensionNames([
  'arrayBuffer',
  'blob',
  'json',
  'text',
  'bodyUsed'
]);
html$.Body = class Body extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.bodyUsed]() {
    return this.bodyUsed;
  }
  [dartx.arrayBuffer](...args) {
    return this.arrayBuffer.apply(this, args);
  }
  [dartx.blob](...args) {
    return this.blob.apply(this, args);
  }
  [dartx.json](...args) {
    return this.json.apply(this, args);
  }
  [dartx.text](...args) {
    return this.text.apply(this, args);
  }
};
dart.setSignature(html$.Body, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Body, [])}),
  fields: () => ({[dartx.bodyUsed]: core.bool}),
  methods: () => ({
    [dartx.arrayBuffer]: dart.definiteFunctionType(async.Future, []),
    [dartx.blob]: dart.definiteFunctionType(async.Future, []),
    [dartx.json]: dart.definiteFunctionType(async.Future, []),
    [dartx.text]: dart.definiteFunctionType(async.Future, [])
  })
});
dart.registerExtension(dart.global.Body, html$.Body);
dart.defineExtensionNames([
  'onBlur',
  'onError',
  'onFocus',
  'onHashChange',
  'onLoad',
  'onMessage',
  'onOffline',
  'onOnline',
  'onPopState',
  'onResize',
  'onScroll',
  'onStorage',
  'onUnload'
]);
html$.BodyElement = class BodyElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.BodyElement._check(html$.document[dartx.createElement]("body"));
  }
  created() {
    super.created();
  }
  get [dartx.onBlur]() {
    return html$.BodyElement.blurEvent.forElement(this);
  }
  get [dartx.onError]() {
    return html$.BodyElement.errorEvent.forElement(this);
  }
  get [dartx.onFocus]() {
    return html$.BodyElement.focusEvent.forElement(this);
  }
  get [dartx.onHashChange]() {
    return html$.BodyElement.hashChangeEvent.forElement(this);
  }
  get [dartx.onLoad]() {
    return html$.BodyElement.loadEvent.forElement(this);
  }
  get [dartx.onMessage]() {
    return html$.BodyElement.messageEvent.forElement(this);
  }
  get [dartx.onOffline]() {
    return html$.BodyElement.offlineEvent.forElement(this);
  }
  get [dartx.onOnline]() {
    return html$.BodyElement.onlineEvent.forElement(this);
  }
  get [dartx.onPopState]() {
    return html$.BodyElement.popStateEvent.forElement(this);
  }
  get [dartx.onResize]() {
    return html$.BodyElement.resizeEvent.forElement(this);
  }
  get [dartx.onScroll]() {
    return html$.BodyElement.scrollEvent.forElement(this);
  }
  get [dartx.onStorage]() {
    return html$.BodyElement.storageEvent.forElement(this);
  }
  get [dartx.onUnload]() {
    return html$.BodyElement.unloadEvent.forElement(this);
  }
};
dart.defineNamedConstructor(html$.BodyElement, 'created');
html$.BodyElement[dart.implements] = () => [html$.WindowEventHandlers];
dart.setSignature(html$.BodyElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.BodyElement, []),
    new: dart.definiteFunctionType(html$.BodyElement, []),
    created: dart.definiteFunctionType(html$.BodyElement, [])
  }),
  getters: () => ({
    [dartx.onHashChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MessageEvent), []),
    [dartx.onOffline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onOnline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
    [dartx.onPopState]: dart.definiteFunctionType(html$.ElementStream$(html$.PopStateEvent), []),
    [dartx.onStorage]: dart.definiteFunctionType(html$.ElementStream$(html$.StorageEvent), []),
    [dartx.onUnload]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
  }),
  sfields: () => ({
    blurEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    focusEvent: EventStreamProviderOfEvent(),
    hashChangeEvent: EventStreamProviderOfEvent(),
    loadEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent(),
    offlineEvent: EventStreamProviderOfEvent(),
    onlineEvent: EventStreamProviderOfEvent(),
    popStateEvent: EventStreamProviderOfPopStateEvent(),
    resizeEvent: EventStreamProviderOfEvent(),
    scrollEvent: EventStreamProviderOfEvent(),
    storageEvent: EventStreamProviderOfStorageEvent(),
    unloadEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(html$.BodyElement, {
  get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('blur'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('focus'));
  },
  get hashChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
  },
  get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('load'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  },
  get offlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('offline'));
  },
  get onlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('online'));
  },
  get popStateEvent() {
    return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
  },
  get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('resize'));
  },
  get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
  },
  get storageEvent() {
    return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
  },
  get unloadEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('unload'));
  }
});
dart.registerExtension(dart.global.HTMLBodyElement, html$.BodyElement);
dart.defineExtensionNames([
  'checkValidity',
  'reportValidity',
  'setCustomValidity',
  'autofocus',
  'disabled',
  'form',
  'formAction',
  'formEnctype',
  'formMethod',
  'formNoValidate',
  'formTarget',
  'labels',
  'name',
  'type',
  'validationMessage',
  'validity',
  'value',
  'willValidate'
]);
html$.ButtonElement = class ButtonElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ButtonElement._check(html$.document[dartx.createElement]("button"));
  }
  created() {
    this[dartx.autofocus] = null;
    this[dartx.disabled] = null;
    this[dartx.form] = null;
    this[dartx.formAction] = null;
    this[dartx.formEnctype] = null;
    this[dartx.formMethod] = null;
    this[dartx.formNoValidate] = null;
    this[dartx.formTarget] = null;
    this[dartx.labels] = null;
    this[dartx.name] = null;
    this[dartx.type] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.value] = null;
    this[dartx.willValidate] = null;
    super.created();
  }
  get [dartx.autofocus]() {
    return this.autofocus;
  }
  set [dartx.autofocus](value) {
    this.autofocus = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.formAction]() {
    return this.formAction;
  }
  set [dartx.formAction](value) {
    this.formAction = value;
  }
  get [dartx.formEnctype]() {
    return this.formEnctype;
  }
  set [dartx.formEnctype](value) {
    this.formEnctype = value;
  }
  get [dartx.formMethod]() {
    return this.formMethod;
  }
  set [dartx.formMethod](value) {
    this.formMethod = value;
  }
  get [dartx.formNoValidate]() {
    return this.formNoValidate;
  }
  set [dartx.formNoValidate](value) {
    this.formNoValidate = value;
  }
  get [dartx.formTarget]() {
    return this.formTarget;
  }
  set [dartx.formTarget](value) {
    this.formTarget = value;
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.ButtonElement, 'created');
dart.setSignature(html$.ButtonElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ButtonElement, []),
    new: dart.definiteFunctionType(html$.ButtonElement, []),
    created: dart.definiteFunctionType(html$.ButtonElement, [])
  }),
  fields: () => ({
    [dartx.autofocus]: core.bool,
    [dartx.disabled]: core.bool,
    [dartx.form]: html$.FormElement,
    [dartx.formAction]: core.String,
    [dartx.formEnctype]: core.String,
    [dartx.formMethod]: core.String,
    [dartx.formNoValidate]: core.bool,
    [dartx.formTarget]: core.String,
    [dartx.labels]: ListOfNode(),
    [dartx.name]: core.String,
    [dartx.type]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.value]: core.String,
    [dartx.willValidate]: core.bool
  }),
  methods: () => ({
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
  })
});
dart.registerExtension(dart.global.HTMLButtonElement, html$.ButtonElement);
const _createTextNode = Symbol('_createTextNode');
dart.defineExtensionNames([
  'appendData',
  'deleteData',
  'insertData',
  'replaceData',
  'substringData',
  'after',
  'before',
  'data',
  'length',
  'nextElementSibling',
  'previousElementSibling'
]);
html$.CharacterData = class CharacterData extends html$.Node {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.data]() {
    return this.data;
  }
  set [dartx.data](value) {
    this.data = value;
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx.appendData](...args) {
    return this.appendData.apply(this, args);
  }
  [dartx.deleteData](...args) {
    return this.deleteData.apply(this, args);
  }
  [dartx.insertData](...args) {
    return this.insertData.apply(this, args);
  }
  [dartx.replaceData](...args) {
    return this.replaceData.apply(this, args);
  }
  [dartx.substringData](...args) {
    return this.substringData.apply(this, args);
  }
  [dartx.after](...args) {
    return this.after.apply(this, args);
  }
  [dartx.before](...args) {
    return this.before.apply(this, args);
  }
  get [dartx.nextElementSibling]() {
    return this.nextElementSibling;
  }
  get [dartx.previousElementSibling]() {
    return this.previousElementSibling;
  }
};
html$.CharacterData[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.ChildNode];
dart.setSignature(html$.CharacterData, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CharacterData, [])}),
  fields: () => ({
    [dartx.data]: core.String,
    [dartx.length]: core.int,
    [dartx.nextElementSibling]: html$.Element,
    [dartx.previousElementSibling]: html$.Element
  }),
  methods: () => ({
    [dartx.appendData]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.deleteData]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.insertData]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
    [dartx.replaceData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
    [dartx.substringData]: dart.definiteFunctionType(core.String, [core.int, core.int]),
    [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
    [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object])
  })
});
dart.registerExtension(dart.global.CharacterData, html$.CharacterData);
dart.defineExtensionNames([
  'getDestinationInsertionPoints',
  'splitText',
  'wholeText'
]);
html$.Text = class Text extends html$.CharacterData {
  static new(data) {
    return html$.document[_createTextNode](data);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.wholeText]() {
    return this.wholeText;
  }
  [dartx.getDestinationInsertionPoints](...args) {
    return this.getDestinationInsertionPoints.apply(this, args);
  }
  [dartx.splitText](...args) {
    return this.splitText.apply(this, args);
  }
};
dart.setSignature(html$.Text, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.Text, [core.String]),
    _: dart.definiteFunctionType(html$.Text, [])
  }),
  fields: () => ({[dartx.wholeText]: core.String}),
  methods: () => ({
    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
    [dartx.splitText]: dart.definiteFunctionType(html$.Text, [core.int])
  })
});
dart.registerExtension(dart.global.Text, html$.Text);
html$.CDataSection = class CDataSection extends html$.Text {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.CDataSection, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CDataSection, [])})
});
dart.registerExtension(dart.global.CDATASection, html$.CDataSection);
const _match_1 = Symbol('_match_1');
const _match_2 = Symbol('_match_2');
dart.defineExtensionNames([
  'delete',
  'has',
  'keys',
  'match',
  'open'
]);
html$.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.delete](...args) {
    return this.delete.apply(this, args);
  }
  [dartx.has](...args) {
    return this.has.apply(this, args);
  }
  [dartx.keys](...args) {
    return this.keys.apply(this, args);
  }
  [dartx.match](request, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_match_1](request, options_1);
    }
    return this[_match_2](request);
  }
  [_match_1](...args) {
    return this.match.apply(this, args);
  }
  [_match_2](...args) {
    return this.match.apply(this, args);
  }
  [dartx.open](...args) {
    return this.open.apply(this, args);
  }
};
dart.setSignature(html$.CacheStorage, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CacheStorage, [])}),
  methods: () => ({
    [dartx.delete]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.has]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.keys]: dart.definiteFunctionType(async.Future, []),
    [dartx.match]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
    [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
    [_match_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.open]: dart.definiteFunctionType(async.Future, [core.String])
  })
});
dart.registerExtension(dart.global.CacheStorage, html$.CacheStorage);
const _getContext_1 = Symbol('_getContext_1');
const _getContext_2 = Symbol('_getContext_2');
const _toDataUrl = Symbol('_toDataUrl');
dart.defineExtensionNames([
  'getContext',
  'onWebGlContextLost',
  'onWebGlContextRestored',
  'context2D',
  'getContext3d',
  'toDataUrl',
  'height',
  'width'
]);
html$.CanvasElement = class CanvasElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(opts) {
    let width = opts && 'width' in opts ? opts.width : null;
    let height = opts && 'height' in opts ? opts.height : null;
    let e = html$.CanvasElement._check(html$.document[dartx.createElement]("canvas"));
    if (width != null) e[dartx.width] = width;
    if (height != null) e[dartx.height] = height;
    return e;
  }
  created() {
    this[dartx.height] = null;
    this[dartx.width] = null;
    super.created();
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
  [dartx.getContext](contextId, attributes) {
    if (attributes === void 0) attributes = null;
    if (attributes != null) {
      let attributes_1 = html_common.convertDartToNative_Dictionary(attributes);
      return this[_getContext_1](contextId, attributes_1);
    }
    return this[_getContext_2](contextId);
  }
  [_getContext_1](...args) {
    return this.getContext.apply(this, args);
  }
  [_getContext_2](...args) {
    return this.getContext.apply(this, args);
  }
  [_toDataUrl](...args) {
    return this.toDataURL.apply(this, args);
  }
  get [dartx.onWebGlContextLost]() {
    return html$.CanvasElement.webGlContextLostEvent.forElement(this);
  }
  get [dartx.onWebGlContextRestored]() {
    return html$.CanvasElement.webGlContextRestoredEvent.forElement(this);
  }
  get [dartx.context2D]() {
    return this.getContext('2d');
  }
  [dartx.getContext3d](opts) {
    let alpha = opts && 'alpha' in opts ? opts.alpha : true;
    let depth = opts && 'depth' in opts ? opts.depth : true;
    let stencil = opts && 'stencil' in opts ? opts.stencil : false;
    let antialias = opts && 'antialias' in opts ? opts.antialias : true;
    let premultipliedAlpha = opts && 'premultipliedAlpha' in opts ? opts.premultipliedAlpha : true;
    let preserveDrawingBuffer = opts && 'preserveDrawingBuffer' in opts ? opts.preserveDrawingBuffer : false;
    let options = dart.map({alpha: alpha, depth: depth, stencil: stencil, antialias: antialias, premultipliedAlpha: premultipliedAlpha, preserveDrawingBuffer: preserveDrawingBuffer}, core.String, dart.dynamic);
    let context = this[dartx.getContext]('webgl', options);
    if (context == null) {
      context = this[dartx.getContext]('experimental-webgl', options);
    }
    return web_gl.RenderingContext._check(context);
  }
  [dartx.toDataUrl](type, quality) {
    if (type === void 0) type = 'image/png';
    if (quality === void 0) quality = null;
    return this[_toDataUrl](type, quality);
  }
};
dart.defineNamedConstructor(html$.CanvasElement, 'created');
html$.CanvasElement[dart.implements] = () => [html$.CanvasImageSource];
dart.setSignature(html$.CanvasElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.CanvasElement, []),
    new: dart.definiteFunctionType(html$.CanvasElement, [], {width: core.int, height: core.int}),
    created: dart.definiteFunctionType(html$.CanvasElement, [])
  }),
  fields: () => ({
    [dartx.height]: core.int,
    [dartx.width]: core.int
  }),
  getters: () => ({
    [dartx.onWebGlContextLost]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
    [dartx.onWebGlContextRestored]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
    [dartx.context2D]: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])
  }),
  methods: () => ({
    [dartx.getContext]: dart.definiteFunctionType(core.Object, [core.String], [core.Map]),
    [_getContext_1]: dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic]),
    [_getContext_2]: dart.definiteFunctionType(core.Object, [dart.dynamic]),
    [_toDataUrl]: dart.definiteFunctionType(core.String, [core.String], [dart.dynamic]),
    [dartx.getContext3d]: dart.definiteFunctionType(web_gl.RenderingContext, [], {alpha: dart.dynamic, depth: dart.dynamic, stencil: dart.dynamic, antialias: dart.dynamic, premultipliedAlpha: dart.dynamic, preserveDrawingBuffer: dart.dynamic}),
    [dartx.toDataUrl]: dart.definiteFunctionType(core.String, [], [core.String, core.num])
  }),
  sfields: () => ({
    webGlContextLostEvent: EventStreamProviderOfContextEvent(),
    webGlContextRestoredEvent: EventStreamProviderOfContextEvent()
  })
});
dart.defineLazy(html$.CanvasElement, {
  get webGlContextLostEvent() {
    return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextlost'));
  },
  get webGlContextRestoredEvent() {
    return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextrestored'));
  }
});
dart.registerExtension(dart.global.HTMLCanvasElement, html$.CanvasElement);
dart.defineExtensionNames([
  'addColorStop'
]);
html$.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.addColorStop](...args) {
    return this.addColorStop.apply(this, args);
  }
};
dart.setSignature(html$.CanvasGradient, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasGradient, [])}),
  methods: () => ({[dartx.addColorStop]: dart.definiteFunctionType(dart.void, [core.num, core.String])})
});
dart.registerExtension(dart.global.CanvasGradient, html$.CanvasGradient);
dart.defineExtensionNames([
  'setTransform'
]);
html$.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.setTransform](...args) {
    return this.setTransform.apply(this, args);
  }
};
dart.setSignature(html$.CanvasPattern, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasPattern, [])}),
  methods: () => ({[dartx.setTransform]: dart.definiteFunctionType(dart.void, [svg$.Matrix])})
});
dart.registerExtension(dart.global.CanvasPattern, html$.CanvasPattern);
html$.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
const _addHitRegion_1 = Symbol('_addHitRegion_1');
const _addHitRegion_2 = Symbol('_addHitRegion_2');
const _createImageData_1 = Symbol('_createImageData_1');
const _createImageData_2 = Symbol('_createImageData_2');
const _getContextAttributes_1 = Symbol('_getContextAttributes_1');
const _getImageData_1 = Symbol('_getImageData_1');
const _getLineDash = Symbol('_getLineDash');
const _putImageData_1 = Symbol('_putImageData_1');
const _putImageData_2 = Symbol('_putImageData_2');
const _arc = Symbol('_arc');
dart.defineExtensionNames([
  'addHitRegion',
  'beginPath',
  'clearHitRegions',
  'clearRect',
  'clip',
  'createImageData',
  'createLinearGradient',
  'createPattern',
  'createRadialGradient',
  'drawFocusIfNeeded',
  'fillRect',
  'getContextAttributes',
  'getImageData',
  'isContextLost',
  'isPointInPath',
  'isPointInStroke',
  'measureText',
  'putImageData',
  'removeHitRegion',
  'resetTransform',
  'restore',
  'rotate',
  'save',
  'scale',
  'scrollPathIntoView',
  'setTransform',
  'stroke',
  'strokeRect',
  'strokeText',
  'transform',
  'translate',
  'arcTo',
  'bezierCurveTo',
  'closePath',
  'ellipse',
  'lineTo',
  'moveTo',
  'quadraticCurveTo',
  'rect',
  'createImageDataFromImageData',
  'setFillColorRgb',
  'setFillColorHsl',
  'setStrokeColorRgb',
  'setStrokeColorHsl',
  'arc',
  'createPatternFromImage',
  'drawImageToRect',
  'drawImage',
  'drawImageScaled',
  'drawImageScaledFromSource',
  'lineDashOffset',
  'lineDashOffset',
  'getLineDash',
  'setLineDash',
  'fillText',
  'fill',
  'backingStorePixelRatio',
  'canvas',
  'currentTransform',
  'direction',
  'fillStyle',
  'filter',
  'font',
  'globalAlpha',
  'globalCompositeOperation',
  'imageSmoothingEnabled',
  'lineCap',
  'lineJoin',
  'lineWidth',
  'miterLimit',
  'shadowBlur',
  'shadowColor',
  'shadowOffsetX',
  'shadowOffsetY',
  'strokeStyle',
  'textAlign',
  'textBaseline'
]);
html$.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.canvas]() {
    return this.canvas;
  }
  get [dartx.currentTransform]() {
    return this.currentTransform;
  }
  set [dartx.currentTransform](value) {
    this.currentTransform = value;
  }
  get [dartx.direction]() {
    return this.direction;
  }
  set [dartx.direction](value) {
    this.direction = value;
  }
  get [dartx.fillStyle]() {
    return this.fillStyle;
  }
  set [dartx.fillStyle](value) {
    this.fillStyle = value;
  }
  get [dartx.filter]() {
    return this.filter;
  }
  set [dartx.filter](value) {
    this.filter = value;
  }
  get [dartx.font]() {
    return this.font;
  }
  set [dartx.font](value) {
    this.font = value;
  }
  get [dartx.globalAlpha]() {
    return this.globalAlpha;
  }
  set [dartx.globalAlpha](value) {
    this.globalAlpha = value;
  }
  get [dartx.globalCompositeOperation]() {
    return this.globalCompositeOperation;
  }
  set [dartx.globalCompositeOperation](value) {
    this.globalCompositeOperation = value;
  }
  get [dartx.imageSmoothingEnabled]() {
    return this.imageSmoothingEnabled;
  }
  set [dartx.imageSmoothingEnabled](value) {
    this.imageSmoothingEnabled = value;
  }
  get [dartx.lineCap]() {
    return this.lineCap;
  }
  set [dartx.lineCap](value) {
    this.lineCap = value;
  }
  get [dartx.lineJoin]() {
    return this.lineJoin;
  }
  set [dartx.lineJoin](value) {
    this.lineJoin = value;
  }
  get [dartx.lineWidth]() {
    return this.lineWidth;
  }
  set [dartx.lineWidth](value) {
    this.lineWidth = value;
  }
  get [dartx.miterLimit]() {
    return this.miterLimit;
  }
  set [dartx.miterLimit](value) {
    this.miterLimit = value;
  }
  get [dartx.shadowBlur]() {
    return this.shadowBlur;
  }
  set [dartx.shadowBlur](value) {
    this.shadowBlur = value;
  }
  get [dartx.shadowColor]() {
    return this.shadowColor;
  }
  set [dartx.shadowColor](value) {
    this.shadowColor = value;
  }
  get [dartx.shadowOffsetX]() {
    return this.shadowOffsetX;
  }
  set [dartx.shadowOffsetX](value) {
    this.shadowOffsetX = value;
  }
  get [dartx.shadowOffsetY]() {
    return this.shadowOffsetY;
  }
  set [dartx.shadowOffsetY](value) {
    this.shadowOffsetY = value;
  }
  get [dartx.strokeStyle]() {
    return this.strokeStyle;
  }
  set [dartx.strokeStyle](value) {
    this.strokeStyle = value;
  }
  get [dartx.textAlign]() {
    return this.textAlign;
  }
  set [dartx.textAlign](value) {
    this.textAlign = value;
  }
  get [dartx.textBaseline]() {
    return this.textBaseline;
  }
  set [dartx.textBaseline](value) {
    this.textBaseline = value;
  }
  [dartx.addHitRegion](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[_addHitRegion_1](options_1);
      return;
    }
    this[_addHitRegion_2]();
    return;
  }
  [_addHitRegion_1](...args) {
    return this.addHitRegion.apply(this, args);
  }
  [_addHitRegion_2](...args) {
    return this.addHitRegion.apply(this, args);
  }
  [dartx.beginPath](...args) {
    return this.beginPath.apply(this, args);
  }
  [dartx.clearHitRegions](...args) {
    return this.clearHitRegions.apply(this, args);
  }
  [dartx.clearRect](...args) {
    return this.clearRect.apply(this, args);
  }
  [dartx.clip](...args) {
    return this.clip.apply(this, args);
  }
  [dartx.createImageData](imagedata_OR_sw, sh) {
    if (sh === void 0) sh = null;
    if (html$.ImageData.is(imagedata_OR_sw) && sh == null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata_OR_sw);
      return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
    }
    if (sh != null && typeof imagedata_OR_sw == 'number') {
      return html_common.convertNativeToDart_ImageData(this[_createImageData_2](imagedata_OR_sw, sh));
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_createImageData_1](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_2](...args) {
    return this.createImageData.apply(this, args);
  }
  [dartx.createLinearGradient](...args) {
    return this.createLinearGradient.apply(this, args);
  }
  [dartx.createPattern](...args) {
    return this.createPattern.apply(this, args);
  }
  [dartx.createRadialGradient](...args) {
    return this.createRadialGradient.apply(this, args);
  }
  [dartx.drawFocusIfNeeded](...args) {
    return this.drawFocusIfNeeded.apply(this, args);
  }
  [dartx.fillRect](...args) {
    return this.fillRect.apply(this, args);
  }
  [dartx.getContextAttributes]() {
    return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1]());
  }
  [_getContextAttributes_1](...args) {
    return this.getContextAttributes.apply(this, args);
  }
  [dartx.getImageData](sx, sy, sw, sh) {
    return html_common.convertNativeToDart_ImageData(this[_getImageData_1](sx, sy, sw, sh));
  }
  [_getImageData_1](...args) {
    return this.getImageData.apply(this, args);
  }
  [_getLineDash](...args) {
    return this.getLineDash.apply(this, args);
  }
  [dartx.isContextLost](...args) {
    return this.isContextLost.apply(this, args);
  }
  [dartx.isPointInPath](...args) {
    return this.isPointInPath.apply(this, args);
  }
  [dartx.isPointInStroke](...args) {
    return this.isPointInStroke.apply(this, args);
  }
  [dartx.measureText](...args) {
    return this.measureText.apply(this, args);
  }
  [dartx.putImageData](imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
    if (dirtyX === void 0) dirtyX = null;
    if (dirtyY === void 0) dirtyY = null;
    if (dirtyWidth === void 0) dirtyWidth = null;
    if (dirtyHeight === void 0) dirtyHeight = null;
    if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
      this[_putImageData_1](imagedata_1, dx, dy);
      return;
    }
    if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
      this[_putImageData_2](imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_putImageData_1](...args) {
    return this.putImageData.apply(this, args);
  }
  [_putImageData_2](...args) {
    return this.putImageData.apply(this, args);
  }
  [dartx.removeHitRegion](...args) {
    return this.removeHitRegion.apply(this, args);
  }
  [dartx.resetTransform](...args) {
    return this.resetTransform.apply(this, args);
  }
  [dartx.restore](...args) {
    return this.restore.apply(this, args);
  }
  [dartx.rotate](...args) {
    return this.rotate.apply(this, args);
  }
  [dartx.save](...args) {
    return this.save.apply(this, args);
  }
  [dartx.scale](...args) {
    return this.scale.apply(this, args);
  }
  [dartx.scrollPathIntoView](...args) {
    return this.scrollPathIntoView.apply(this, args);
  }
  [dartx.setTransform](...args) {
    return this.setTransform.apply(this, args);
  }
  [dartx.stroke](...args) {
    return this.stroke.apply(this, args);
  }
  [dartx.strokeRect](...args) {
    return this.strokeRect.apply(this, args);
  }
  [dartx.strokeText](...args) {
    return this.strokeText.apply(this, args);
  }
  [dartx.transform](...args) {
    return this.transform.apply(this, args);
  }
  [dartx.translate](...args) {
    return this.translate.apply(this, args);
  }
  [_arc](...args) {
    return this.arc.apply(this, args);
  }
  [dartx.arcTo](...args) {
    return this.arcTo.apply(this, args);
  }
  [dartx.bezierCurveTo](...args) {
    return this.bezierCurveTo.apply(this, args);
  }
  [dartx.closePath](...args) {
    return this.closePath.apply(this, args);
  }
  [dartx.ellipse](...args) {
    return this.ellipse.apply(this, args);
  }
  [dartx.lineTo](...args) {
    return this.lineTo.apply(this, args);
  }
  [dartx.moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [dartx.quadraticCurveTo](...args) {
    return this.quadraticCurveTo.apply(this, args);
  }
  [dartx.rect](...args) {
    return this.rect.apply(this, args);
  }
  [dartx.createImageDataFromImageData](imagedata) {
    return this.createImageData(imagedata);
  }
  [dartx.setFillColorRgb](r, g, b, a) {
    if (a === void 0) a = 1;
    this[dartx.fillStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
  }
  [dartx.setFillColorHsl](h, s, l, a) {
    if (a === void 0) a = 1;
    this[dartx.fillStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
  }
  [dartx.setStrokeColorRgb](r, g, b, a) {
    if (a === void 0) a = 1;
    this[dartx.strokeStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
  }
  [dartx.setStrokeColorHsl](h, s, l, a) {
    if (a === void 0) a = 1;
    this[dartx.strokeStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
  }
  [dartx.arc](x, y, radius, startAngle, endAngle, anticlockwise) {
    if (anticlockwise === void 0) anticlockwise = false;
    this.arc(x, y, radius, startAngle, endAngle, anticlockwise);
  }
  [dartx.createPatternFromImage](image, repetitionType) {
    return this.createPattern(image, repetitionType);
  }
  [dartx.drawImageToRect](source, destRect, opts) {
    let sourceRect = opts && 'sourceRect' in opts ? opts.sourceRect : null;
    if (sourceRect == null) {
      this[dartx.drawImageScaled](source, destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
    } else {
      this[dartx.drawImageScaledFromSource](source, sourceRect[dartx.left], sourceRect[dartx.top], sourceRect[dartx.width], sourceRect[dartx.height], destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
    }
  }
  [dartx.drawImage](...args) {
    return this.drawImage.apply(this, args);
  }
  [dartx.drawImageScaled](...args) {
    return this.drawImage.apply(this, args);
  }
  [dartx.drawImageScaledFromSource](...args) {
    return this.drawImage.apply(this, args);
  }
  get [dartx.lineDashOffset]() {
    return this.lineDashOffset || this.webkitLineDashOffset;
  }
  set [dartx.lineDashOffset](value) {
    typeof this.lineDashOffset != "undefined" ? this.lineDashOffset = value : this.webkitLineDashOffset = value;
  }
  [dartx.getLineDash]() {
    if (!!this.getLineDash) {
      return this.getLineDash();
    } else if (!!this.webkitLineDash) {
      return this.webkitLineDash;
    }
  }
  [dartx.setLineDash](dash) {
    if (!!this.setLineDash) {
      this.setLineDash(dash);
    } else if (!!this.webkitLineDash) {
      this.webkitLineDash = dash;
    }
  }
  [dartx.fillText](text, x, y, maxWidth) {
    if (maxWidth === void 0) maxWidth = null;
    if (maxWidth != null) {
      this.fillText(text, x, y, maxWidth);
    } else {
      this.fillText(text, x, y);
    }
  }
  [dartx.fill](winding) {
    if (winding === void 0) winding = 'nonzero';
    this.fill(winding);
  }
  get [dartx.backingStorePixelRatio]() {
    return 1.0;
  }
};
html$.CanvasRenderingContext2D[dart.implements] = () => [html$.CanvasRenderingContext];
dart.setSignature(html$.CanvasRenderingContext2D, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])}),
  fields: () => ({
    [dartx.canvas]: html$.CanvasElement,
    [dartx.currentTransform]: svg$.Matrix,
    [dartx.direction]: core.String,
    [dartx.fillStyle]: core.Object,
    [dartx.filter]: core.String,
    [dartx.font]: core.String,
    [dartx.globalAlpha]: core.num,
    [dartx.globalCompositeOperation]: core.String,
    [dartx.imageSmoothingEnabled]: core.bool,
    [dartx.lineCap]: core.String,
    [dartx.lineJoin]: core.String,
    [dartx.lineWidth]: core.num,
    [dartx.miterLimit]: core.num,
    [dartx.shadowBlur]: core.num,
    [dartx.shadowColor]: core.String,
    [dartx.shadowOffsetX]: core.num,
    [dartx.shadowOffsetY]: core.num,
    [dartx.strokeStyle]: core.Object,
    [dartx.textAlign]: core.String,
    [dartx.textBaseline]: core.String
  }),
  getters: () => ({
    [dartx.lineDashOffset]: dart.definiteFunctionType(core.num, []),
    [dartx.backingStorePixelRatio]: dart.definiteFunctionType(core.double, [])
  }),
  setters: () => ({[dartx.lineDashOffset]: dart.definiteFunctionType(dart.void, [core.num])}),
  methods: () => ({
    [dartx.addHitRegion]: dart.definiteFunctionType(dart.void, [], [core.Map]),
    [_addHitRegion_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_addHitRegion_2]: dart.definiteFunctionType(dart.void, []),
    [dartx.beginPath]: dart.definiteFunctionType(dart.void, []),
    [dartx.clearHitRegions]: dart.definiteFunctionType(dart.void, []),
    [dartx.clearRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.clip]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.String]),
    [dartx.createImageData]: dart.definiteFunctionType(html$.ImageData, [dart.dynamic], [core.num]),
    [_createImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    [_createImageData_2]: dart.definiteFunctionType(dart.dynamic, [core.num, dart.dynamic]),
    [dartx.createLinearGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
    [dartx.createPattern]: dart.definiteFunctionType(html$.CanvasPattern, [core.Object, core.String]),
    [dartx.createRadialGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.drawFocusIfNeeded]: dart.definiteFunctionType(dart.void, [dart.dynamic], [html$.Element]),
    [dartx.fillRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.getContextAttributes]: dart.definiteFunctionType(core.Map, []),
    [_getContextAttributes_1]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.getImageData]: dart.definiteFunctionType(html$.ImageData, [core.num, core.num, core.num, core.num]),
    [_getImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [_getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
    [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
    [dartx.isPointInPath]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
    [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [core.num]),
    [dartx.measureText]: dart.definiteFunctionType(html$.TextMetrics, [core.String]),
    [dartx.putImageData]: dart.definiteFunctionType(dart.void, [html$.ImageData, core.num, core.num], [core.num, core.num, core.num, core.num]),
    [_putImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
    [_putImageData_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [dartx.removeHitRegion]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.resetTransform]: dart.definiteFunctionType(dart.void, []),
    [dartx.restore]: dart.definiteFunctionType(dart.void, []),
    [dartx.rotate]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.save]: dart.definiteFunctionType(dart.void, []),
    [dartx.scale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.scrollPathIntoView]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
    [dartx.setTransform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.stroke]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
    [dartx.strokeRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.strokeText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
    [dartx.transform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.translate]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [_arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
    [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
    [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
    [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
    [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.createImageDataFromImageData]: dart.definiteFunctionType(html$.ImageData, [html$.ImageData]),
    [dartx.setFillColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
    [dartx.setFillColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
    [dartx.setStrokeColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
    [dartx.setStrokeColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
    [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num], [core.bool]),
    [dartx.createPatternFromImage]: dart.definiteFunctionType(html$.CanvasPattern, [html$.ImageElement, core.String]),
    [dartx.drawImageToRect]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, RectangleOfnum()], {sourceRect: RectangleOfnum()}),
    [dartx.drawImage]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num]),
    [dartx.drawImageScaled]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num]),
    [dartx.drawImageScaledFromSource]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
    [dartx.setLineDash]: dart.definiteFunctionType(dart.void, [ListOfnum()]),
    [dartx.fillText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
    [dartx.fill]: dart.definiteFunctionType(dart.void, [], [core.String])
  })
});
dart.registerExtension(dart.global.CanvasRenderingContext2D, html$.CanvasRenderingContext2D);
html$.ChildNode = class ChildNode extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.ChildNode, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ChildNode, [])})
});
html$.ChromiumValuebuffer = class ChromiumValuebuffer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.ChromiumValuebuffer, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ChromiumValuebuffer, [])})
});
dart.registerExtension(dart.global.CHROMIUMValuebuffer, html$.ChromiumValuebuffer);
dart.defineExtensionNames([
  'id'
]);
html$.GeofencingRegion = class GeofencingRegion extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.id]() {
    return this.id;
  }
};
dart.setSignature(html$.GeofencingRegion, {
  constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingRegion, [])}),
  fields: () => ({[dartx.id]: core.String})
});
dart.registerExtension(dart.global.GeofencingRegion, html$.GeofencingRegion);
dart.defineExtensionNames([
  'latitude',
  'longitude',
  'radius'
]);
html$.CircularGeofencingRegion = class CircularGeofencingRegion extends html$.GeofencingRegion {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.CircularGeofencingRegion._create_1(init_1);
  }
  static _create_1(init) {
    return new self.CircularGeofencingRegion(init);
  }
  get [dartx.latitude]() {
    return this.latitude;
  }
  get [dartx.longitude]() {
    return this.longitude;
  }
  get [dartx.radius]() {
    return this.radius;
  }
};
dart.setSignature(html$.CircularGeofencingRegion, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.CircularGeofencingRegion, []),
    new: dart.definiteFunctionType(html$.CircularGeofencingRegion, [core.Map])
  }),
  fields: () => ({
    [dartx.latitude]: core.double,
    [dartx.longitude]: core.double,
    [dartx.radius]: core.double
  }),
  sfields: () => ({
    MAX_RADIUS: core.num,
    MIN_RADIUS: core.num
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.CircularGeofencingRegion, [dart.dynamic])}),
  names: ['_create_1']
});
html$.CircularGeofencingRegion.MAX_RADIUS = 100.0;
html$.CircularGeofencingRegion.MIN_RADIUS = 1.0;
dart.registerExtension(dart.global.CircularGeofencingRegion, html$.CircularGeofencingRegion);
const _postMessage_1 = Symbol('_postMessage_1');
const _postMessage_2 = Symbol('_postMessage_2');
dart.defineExtensionNames([
  'postMessage',
  'frameType',
  'id',
  'url'
]);
html$.Client = class Client extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.frameType]() {
    return this.frameType;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.url]() {
    return this.url;
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
};
dart.setSignature(html$.Client, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Client, [])}),
  fields: () => ({
    [dartx.frameType]: core.String,
    [dartx.id]: core.String,
    [dartx.url]: core.String
  }),
  methods: () => ({
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.Client, html$.Client);
const _matchAll_1 = Symbol('_matchAll_1');
const _matchAll_2 = Symbol('_matchAll_2');
dart.defineExtensionNames([
  'claim',
  'matchAll',
  'openWindow'
]);
html$.Clients = class Clients extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.claim](...args) {
    return this.claim.apply(this, args);
  }
  [dartx.matchAll](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_matchAll_1](options_1);
    }
    return this[_matchAll_2]();
  }
  [_matchAll_1](...args) {
    return this.matchAll.apply(this, args);
  }
  [_matchAll_2](...args) {
    return this.matchAll.apply(this, args);
  }
  [dartx.openWindow](...args) {
    return this.openWindow.apply(this, args);
  }
};
dart.setSignature(html$.Clients, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Clients, [])}),
  methods: () => ({
    [dartx.claim]: dart.definiteFunctionType(async.Future, []),
    [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_matchAll_2]: dart.definiteFunctionType(async.Future, []),
    [dartx.openWindow]: dart.definiteFunctionType(async.Future, [core.String])
  })
});
dart.registerExtension(dart.global.Clients, html$.Clients);
dart.defineExtensionNames([
  'clipboardData'
]);
html$.ClipboardEvent = class ClipboardEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.clipboardData]() {
    return this.clipboardData;
  }
};
dart.setSignature(html$.ClipboardEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ClipboardEvent, [])}),
  fields: () => ({[dartx.clipboardData]: html$.DataTransfer})
});
dart.registerExtension(dart.global.ClipboardEvent, html$.ClipboardEvent);
dart.defineExtensionNames([
  'code',
  'reason',
  'wasClean'
]);
html$.CloseEvent = class CloseEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.CloseEvent._create_1(type, eventInitDict_1);
    }
    return html$.CloseEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.CloseEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.CloseEvent(type);
  }
  get [dartx.code]() {
    return this.code;
  }
  get [dartx.reason]() {
    return this.reason;
  }
  get [dartx.wasClean]() {
    return this.wasClean;
  }
};
dart.setSignature(html$.CloseEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.CloseEvent, []),
    new: dart.definiteFunctionType(html$.CloseEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.code]: core.int,
    [dartx.reason]: core.String,
    [dartx.wasClean]: core.bool
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.CloseEvent, html$.CloseEvent);
html$.Comment = class Comment extends html$.CharacterData {
  static new(data) {
    if (data === void 0) data = null;
    if (data != null) {
      return html$.document.createComment(data);
    }
    return html$.document.createComment("");
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.Comment, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.Comment, [], [core.String]),
    _: dart.definiteFunctionType(html$.Comment, [])
  })
});
dart.registerExtension(dart.global.Comment, html$.Comment);
const _initCompositionEvent = Symbol('_initCompositionEvent');
const _initUIEvent = Symbol('_initUIEvent');
const _charCode = Symbol('_charCode');
const _keyCode = Symbol('_keyCode');
const _get_view = Symbol('_get_view');
const _which = Symbol('_which');
dart.defineExtensionNames([
  'view',
  'detail',
  'sourceDevice'
]);
html$.UIEvent = class UIEvent extends html$.Event {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let detail = opts && 'detail' in opts ? opts.detail : 0;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.UIEvent._check(html$.document[_createEvent]("UIEvent"));
    e[_initUIEvent](type, canBubble, cancelable, view, detail);
    return e;
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.UIEvent._create_1(type, eventInitDict_1);
    }
    return html$.UIEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.UIEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.UIEvent(type);
  }
  get [_charCode]() {
    return this.charCode;
  }
  get [dartx.detail]() {
    return this.detail;
  }
  get [_keyCode]() {
    return this.keyCode;
  }
  get [dartx.sourceDevice]() {
    return this.sourceDevice;
  }
  get [dartx.view]() {
    return html$._convertNativeToDart_Window(this[_get_view]);
  }
  get [_get_view]() {
    return this.view;
  }
  get [_which]() {
    return this.which;
  }
  [_initUIEvent](...args) {
    return this.initUIEvent.apply(this, args);
  }
};
dart.setSignature(html$.UIEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.UIEvent, [core.String], {view: html$.Window, detail: core.int, canBubble: core.bool, cancelable: core.bool}),
    _: dart.definiteFunctionType(html$.UIEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [_charCode]: core.int,
    [dartx.detail]: core.int,
    [_keyCode]: core.int,
    [dartx.sourceDevice]: html$.InputDevice,
    [_get_view]: dart.dynamic,
    [_which]: core.int
  }),
  getters: () => ({[dartx.view]: dart.definiteFunctionType(html$.WindowBase, [])}),
  methods: () => ({[_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.UIEvent, html$.UIEvent);
dart.defineExtensionNames([
  'data'
]);
html$.CompositionEvent = class CompositionEvent extends html$.UIEvent {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let view = opts && 'view' in opts ? opts.view : null;
    let data = opts && 'data' in opts ? opts.data : null;
    let locale = opts && 'locale' in opts ? opts.locale : null;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.CompositionEvent._check(html$.document[_createEvent]("CompositionEvent"));
    if (dart.test(html_common.Device.isFirefox)) {
      e.initCompositionEvent(type, canBubble, cancelable, view, data, locale);
    } else {
      e[_initCompositionEvent](type, canBubble, cancelable, view, data);
    }
    return e;
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.CompositionEvent._create_1(type, eventInitDict_1);
    }
    return html$.CompositionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.CompositionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.CompositionEvent(type);
  }
  get [dartx.data]() {
    return this.data;
  }
  [_initCompositionEvent](...args) {
    return this.initCompositionEvent.apply(this, args);
  }
};
dart.setSignature(html$.CompositionEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.CompositionEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String, locale: core.String}),
    _: dart.definiteFunctionType(html$.CompositionEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.data]: core.String}),
  methods: () => ({[_initCompositionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.CompositionEvent, html$.CompositionEvent);
dart.defineExtensionNames([
  'disconnect',
  'supports',
  'opacity',
  'scrollLeft',
  'scrollTop',
  'transform'
]);
html$.CompositorProxy = class CompositorProxy extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(element, attributeArray) {
    return html$.CompositorProxy._create_1(element, attributeArray);
  }
  static _create_1(element, attributeArray) {
    return new self.CompositorProxy(element, attributeArray);
  }
  get [dartx.opacity]() {
    return this.opacity;
  }
  set [dartx.opacity](value) {
    this.opacity = value;
  }
  get [dartx.scrollLeft]() {
    return this.scrollLeft;
  }
  set [dartx.scrollLeft](value) {
    this.scrollLeft = value;
  }
  get [dartx.scrollTop]() {
    return this.scrollTop;
  }
  set [dartx.scrollTop](value) {
    this.scrollTop = value;
  }
  get [dartx.transform]() {
    return this.transform;
  }
  set [dartx.transform](value) {
    this.transform = value;
  }
  [dartx.disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [dartx.supports](...args) {
    return this.supports.apply(this, args);
  }
};
dart.setSignature(html$.CompositorProxy, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.CompositorProxy, []),
    new: dart.definiteFunctionType(html$.CompositorProxy, [html$.Element, ListOfString()])
  }),
  fields: () => ({
    [dartx.opacity]: core.num,
    [dartx.scrollLeft]: core.num,
    [dartx.scrollTop]: core.num,
    [dartx.transform]: html$.DomMatrix
  }),
  methods: () => ({
    [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
    [dartx.supports]: dart.definiteFunctionType(core.bool, [core.String])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorProxy, [dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.CompositorProxy, html$.CompositorProxy);
dart.defineExtensionNames([
  'postMessage',
  'terminate',
  'onError',
  'onMessage'
]);
html$.CompositorWorker = class CompositorWorker extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(scriptUrl) {
    return html$.CompositorWorker._create_1(scriptUrl);
  }
  static _create_1(scriptUrl) {
    return new self.CompositorWorker(scriptUrl);
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [dartx.terminate](...args) {
    return this.terminate.apply(this, args);
  }
  get [dartx.onError]() {
    return html$.CompositorWorker.errorEvent.forTarget(this);
  }
  get [dartx.onMessage]() {
    return html$.CompositorWorker.messageEvent.forTarget(this);
  }
};
html$.CompositorWorker[dart.implements] = () => [html$.AbstractWorker];
dart.setSignature(html$.CompositorWorker, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.CompositorWorker, []),
    new: dart.definiteFunctionType(html$.CompositorWorker, [core.String])
  }),
  getters: () => ({
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
  }),
  methods: () => ({
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    errorEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent()
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorWorker, [dart.dynamic])}),
  names: ['_create_1']
});
dart.defineLazy(html$.CompositorWorker, {
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.CompositorWorker, html$.CompositorWorker);
const _fetch_1 = Symbol('_fetch_1');
const _fetch_2 = Symbol('_fetch_2');
const _webkitRequestFileSystem = Symbol('_webkitRequestFileSystem');
const _webkitResolveLocalFileSystemUrl = Symbol('_webkitResolveLocalFileSystemUrl');
const _setInterval_String = Symbol('_setInterval_String');
const _setTimeout_String = Symbol('_setTimeout_String');
const _clearInterval = Symbol('_clearInterval');
const _clearTimeout = Symbol('_clearTimeout');
const _setInterval = Symbol('_setInterval');
const _setTimeout = Symbol('_setTimeout');
dart.defineExtensionNames([
  'close',
  'fetch',
  'importScripts',
  'webkitRequestFileSystem',
  'requestFileSystemSync',
  'resolveLocalFileSystemSyncUrl',
  'webkitResolveLocalFileSystemUrl',
  'atob',
  'btoa',
  'onError',
  'caches',
  'console',
  'crypto',
  'indexedDB',
  'location',
  'navigator',
  'performance',
  'self'
]);
html$.WorkerGlobalScope = class WorkerGlobalScope extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.caches]() {
    return this.caches;
  }
  get [dartx.console]() {
    return this.console;
  }
  get [dartx.crypto]() {
    return this.crypto;
  }
  get [dartx.indexedDB]() {
    return this.indexedDB;
  }
  get [dartx.location]() {
    return this.location;
  }
  get [dartx.navigator]() {
    return this.navigator;
  }
  get [dartx.performance]() {
    return this.performance;
  }
  get [dartx.self]() {
    return this.self;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.fetch](input, init) {
    if (init === void 0) init = null;
    if (init != null) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return this[_fetch_1](input, init_1);
    }
    return this[_fetch_2](input);
  }
  [_fetch_1](...args) {
    return this.fetch.apply(this, args);
  }
  [_fetch_2](...args) {
    return this.fetch.apply(this, args);
  }
  [dartx.importScripts](...args) {
    return this.importScripts.apply(this, args);
  }
  [_webkitRequestFileSystem](...args) {
    return this.webkitRequestFileSystem.apply(this, args);
  }
  [dartx.webkitRequestFileSystem](type, size) {
    let completer = CompleterOfFileSystem().new();
    this[_webkitRequestFileSystem](type, size, dart.fn(value => {
      completer.complete(value);
    }, FileSystemToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [dartx.requestFileSystemSync](...args) {
    return this.webkitRequestFileSystemSync.apply(this, args);
  }
  [dartx.resolveLocalFileSystemSyncUrl](...args) {
    return this.webkitResolveLocalFileSystemSyncURL.apply(this, args);
  }
  [_webkitResolveLocalFileSystemUrl](...args) {
    return this.webkitResolveLocalFileSystemURL.apply(this, args);
  }
  [dartx.webkitResolveLocalFileSystemUrl](url) {
    let completer = CompleterOfEntry().new();
    this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [dartx.atob](...args) {
    return this.atob.apply(this, args);
  }
  [dartx.btoa](...args) {
    return this.btoa.apply(this, args);
  }
  [_setInterval_String](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout_String](...args) {
    return this.setTimeout.apply(this, args);
  }
  [_clearInterval](...args) {
    return this.clearInterval.apply(this, args);
  }
  [_clearTimeout](...args) {
    return this.clearTimeout.apply(this, args);
  }
  [_setInterval](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout](...args) {
    return this.setTimeout.apply(this, args);
  }
  get [dartx.onError]() {
    return html$.WorkerGlobalScope.errorEvent.forTarget(this);
  }
};
html$.WorkerGlobalScope[dart.implements] = () => [html$._WindowTimers, html$.WindowBase64];
dart.setSignature(html$.WorkerGlobalScope, {
  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerGlobalScope, [])}),
  fields: () => ({
    [dartx.caches]: html$.CacheStorage,
    [dartx.console]: html$.WorkerConsole,
    [dartx.crypto]: html$.Crypto,
    [dartx.indexedDB]: indexed_db.IdbFactory,
    [dartx.location]: html$._WorkerLocation,
    [dartx.navigator]: html$._WorkerNavigator,
    [dartx.performance]: html$.WorkerPerformance,
    [dartx.self]: html$.WorkerGlobalScope
  }),
  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
    [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
    [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.importScripts]: dart.definiteFunctionType(dart.void, [core.String]),
    [_webkitRequestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$._FileSystemCallback, html$._ErrorCallback]),
    [dartx.webkitRequestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
    [dartx.requestFileSystemSync]: dart.definiteFunctionType(html$._DOMFileSystemSync, [core.int, core.int]),
    [dartx.resolveLocalFileSystemSyncUrl]: dart.definiteFunctionType(html$._EntrySync, [core.String]),
    [_webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
    [dartx.webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
    [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
    [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
    [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
    [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
    [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
    [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
    [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int])
  }),
  sfields: () => ({
    errorEvent: EventStreamProviderOfEvent(),
    PERSISTENT: core.int,
    TEMPORARY: core.int
  })
});
html$.WorkerGlobalScope.PERSISTENT = 1;
html$.WorkerGlobalScope.TEMPORARY = 0;
dart.defineLazy(html$.WorkerGlobalScope, {
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  }
});
dart.registerExtension(dart.global.WorkerGlobalScope, html$.WorkerGlobalScope);
dart.defineExtensionNames([
  'cancelAnimationFrame',
  'postMessage',
  'requestAnimationFrame',
  'onMessage'
]);
html$.CompositorWorkerGlobalScope = class CompositorWorkerGlobalScope extends html$.WorkerGlobalScope {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.cancelAnimationFrame](...args) {
    return this.cancelAnimationFrame.apply(this, args);
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [dartx.requestAnimationFrame](...args) {
    return this.requestAnimationFrame.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.CompositorWorkerGlobalScope.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.CompositorWorkerGlobalScope, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CompositorWorkerGlobalScope, [])}),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({
    [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback])
  }),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.CompositorWorkerGlobalScope, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.CompositorWorkerGlobalScope, html$.CompositorWorkerGlobalScope);
const _isConsoleDefined = Symbol('_isConsoleDefined');
html$.Console = class Console extends core.Object {
  _safe() {
  }
  get [_isConsoleDefined]() {
    return typeof console != "undefined";
  }
  get memory() {
    return html$.MemoryInfo._check(dart.test(this[_isConsoleDefined]) ? console.memory : null);
  }
  assertCondition(condition, arg) {
    return dart.test(this[_isConsoleDefined]) ? console.assertCondition(condition, arg) : null;
  }
  clear(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.clear(arg) : null;
  }
  count(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.count(arg) : null;
  }
  debug(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.debug(arg) : null;
  }
  dir(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.dir(arg) : null;
  }
  dirxml(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.dirxml(arg) : null;
  }
  error(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.error(arg) : null;
  }
  group(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.group(arg) : null;
  }
  groupCollapsed(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.groupCollapsed(arg) : null;
  }
  groupEnd() {
    return dart.test(this[_isConsoleDefined]) ? console.groupEnd() : null;
  }
  info(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.info(arg) : null;
  }
  log(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.log(arg) : null;
  }
  markTimeline(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.markTimeline(arg) : null;
  }
  profile(title) {
    return dart.test(this[_isConsoleDefined]) ? console.profile(title) : null;
  }
  profileEnd(title) {
    return dart.test(this[_isConsoleDefined]) ? console.profileEnd(title) : null;
  }
  table(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.table(arg) : null;
  }
  time(title) {
    return dart.test(this[_isConsoleDefined]) ? console.time(title) : null;
  }
  timeEnd(title) {
    return dart.test(this[_isConsoleDefined]) ? console.timeEnd(title) : null;
  }
  timeStamp(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.timeStamp(arg) : null;
  }
  trace(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.trace(arg) : null;
  }
  warn(arg) {
    return dart.test(this[_isConsoleDefined]) ? console.warn(arg) : null;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.defineNamedConstructor(html$.Console, '_safe');
dart.setSignature(html$.Console, {
  constructors: () => ({
    _safe: dart.definiteFunctionType(html$.Console, []),
    _: dart.definiteFunctionType(html$.Console, [])
  }),
  getters: () => ({
    [_isConsoleDefined]: dart.definiteFunctionType(core.bool, []),
    memory: dart.definiteFunctionType(html$.MemoryInfo, [])
  }),
  methods: () => ({
    assertCondition: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
    clear: dart.definiteFunctionType(dart.void, [core.Object]),
    count: dart.definiteFunctionType(dart.void, [core.Object]),
    debug: dart.definiteFunctionType(dart.void, [core.Object]),
    dir: dart.definiteFunctionType(dart.void, [core.Object]),
    dirxml: dart.definiteFunctionType(dart.void, [core.Object]),
    error: dart.definiteFunctionType(dart.void, [core.Object]),
    group: dart.definiteFunctionType(dart.void, [core.Object]),
    groupCollapsed: dart.definiteFunctionType(dart.void, [core.Object]),
    groupEnd: dart.definiteFunctionType(dart.void, []),
    info: dart.definiteFunctionType(dart.void, [core.Object]),
    log: dart.definiteFunctionType(dart.void, [core.Object]),
    markTimeline: dart.definiteFunctionType(dart.void, [core.Object]),
    profile: dart.definiteFunctionType(dart.void, [core.String]),
    profileEnd: dart.definiteFunctionType(dart.void, [core.String]),
    table: dart.definiteFunctionType(dart.void, [core.Object]),
    time: dart.definiteFunctionType(dart.void, [core.String]),
    timeEnd: dart.definiteFunctionType(dart.void, [core.String]),
    timeStamp: dart.definiteFunctionType(dart.void, [core.Object]),
    trace: dart.definiteFunctionType(dart.void, [core.Object]),
    warn: dart.definiteFunctionType(dart.void, [core.Object])
  }),
  sfields: () => ({_safeConsole: html$.Console})
});
dart.defineLazy(html$.Console, {
  get _safeConsole() {
    return dart.const(new html$.Console._safe());
  }
});
dart.defineExtensionNames([
  'assertCondition',
  'timeline',
  'timelineEnd'
]);
html$.ConsoleBase = class ConsoleBase extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.assertCondition](...args) {
    return this.assert.apply(this, args);
  }
  [dartx.timeline](...args) {
    return this.timeline.apply(this, args);
  }
  [dartx.timelineEnd](...args) {
    return this.timelineEnd.apply(this, args);
  }
};
dart.setSignature(html$.ConsoleBase, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ConsoleBase, [])}),
  methods: () => ({
    [dartx.assertCondition]: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
    [dartx.timeline]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.timelineEnd]: dart.definiteFunctionType(dart.void, [core.String])
  })
});
dart.registerExtension(dart.global.ConsoleBase, html$.ConsoleBase);
dart.defineExtensionNames([
  'getDistributedNodes',
  'select'
]);
html$.ContentElement = class ContentElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ContentElement._check(html$.document[dartx.createElement]("content"));
  }
  created() {
    this[dartx.select] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('content');
  }
  get [dartx.select]() {
    return this.select;
  }
  set [dartx.select](value) {
    this.select = value;
  }
  [dartx.getDistributedNodes](...args) {
    return this.getDistributedNodes.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.ContentElement, 'created');
dart.setSignature(html$.ContentElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ContentElement, []),
    new: dart.definiteFunctionType(html$.ContentElement, []),
    created: dart.definiteFunctionType(html$.ContentElement, [])
  }),
  fields: () => ({[dartx.select]: core.String}),
  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLContentElement, html$.ContentElement);
dart.defineExtensionNames([
  'accuracy',
  'altitude',
  'altitudeAccuracy',
  'heading',
  'latitude',
  'longitude',
  'speed'
]);
html$.Coordinates = class Coordinates extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.accuracy]() {
    return this.accuracy;
  }
  get [dartx.altitude]() {
    return this.altitude;
  }
  get [dartx.altitudeAccuracy]() {
    return this.altitudeAccuracy;
  }
  get [dartx.heading]() {
    return this.heading;
  }
  get [dartx.latitude]() {
    return this.latitude;
  }
  get [dartx.longitude]() {
    return this.longitude;
  }
  get [dartx.speed]() {
    return this.speed;
  }
};
dart.setSignature(html$.Coordinates, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Coordinates, [])}),
  fields: () => ({
    [dartx.accuracy]: core.double,
    [dartx.altitude]: core.double,
    [dartx.altitudeAccuracy]: core.double,
    [dartx.heading]: core.double,
    [dartx.latitude]: core.double,
    [dartx.longitude]: core.double,
    [dartx.speed]: core.double
  })
});
dart.registerExtension(dart.global.Coordinates, html$.Coordinates);
dart.defineExtensionNames([
  'iconUrl',
  'id',
  'name',
  'type'
]);
html$.Credential = class Credential extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.iconUrl]() {
    return this.iconURL;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.Credential, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Credential, [])}),
  fields: () => ({
    [dartx.iconUrl]: core.String,
    [dartx.id]: core.String,
    [dartx.name]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.Credential, html$.Credential);
const _request_1 = Symbol('_request_1');
const _request_2 = Symbol('_request_2');
dart.defineExtensionNames([
  'notifySignedIn',
  'request',
  'requireUserMediation'
]);
html$.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.notifySignedIn](...args) {
    return this.notifySignedIn.apply(this, args);
  }
  [dartx.request](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_request_1](options_1);
    }
    return this[_request_2]();
  }
  [_request_1](...args) {
    return this.request.apply(this, args);
  }
  [_request_2](...args) {
    return this.request.apply(this, args);
  }
  [dartx.requireUserMediation](...args) {
    return this.requireUserMediation.apply(this, args);
  }
};
dart.setSignature(html$.CredentialsContainer, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CredentialsContainer, [])}),
  methods: () => ({
    [dartx.notifySignedIn]: dart.definiteFunctionType(async.Future, [html$.Credential]),
    [dartx.request]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_request_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_request_2]: dart.definiteFunctionType(async.Future, []),
    [dartx.requireUserMediation]: dart.definiteFunctionType(async.Future, [])
  })
});
dart.registerExtension(dart.global.CredentialsContainer, html$.CredentialsContainer);
dart.defineExtensionNames([
  'acceptConnection',
  'client'
]);
html$.CrossOriginConnectEvent = class CrossOriginConnectEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.client]() {
    return this.client;
  }
  [dartx.acceptConnection](...args) {
    return this.acceptConnection.apply(this, args);
  }
};
dart.setSignature(html$.CrossOriginConnectEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginConnectEvent, [])}),
  fields: () => ({[dartx.client]: html$.CrossOriginServiceWorkerClient}),
  methods: () => ({[dartx.acceptConnection]: dart.definiteFunctionType(dart.void, [async.Future])})
});
dart.registerExtension(dart.global.CrossOriginConnectEvent, html$.CrossOriginConnectEvent);
dart.defineExtensionNames([
  'postMessage',
  'origin',
  'targetUrl'
]);
html$.CrossOriginServiceWorkerClient = class CrossOriginServiceWorkerClient extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.targetUrl]() {
    return this.targetUrl;
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
};
dart.setSignature(html$.CrossOriginServiceWorkerClient, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginServiceWorkerClient, [])}),
  fields: () => ({
    [dartx.origin]: core.String,
    [dartx.targetUrl]: core.String
  }),
  methods: () => ({
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.CrossOriginServiceWorkerClient, html$.CrossOriginServiceWorkerClient);
const _getRandomValues = Symbol('_getRandomValues');
dart.defineExtensionNames([
  'getRandomValues',
  'subtle'
]);
html$.Crypto = class Crypto extends _interceptors.Interceptor {
  [dartx.getRandomValues](array) {
    return this[_getRandomValues](array);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!(window.crypto && window.crypto.getRandomValues);
  }
  get [dartx.subtle]() {
    return this.subtle;
  }
  [_getRandomValues](...args) {
    return this.getRandomValues.apply(this, args);
  }
};
dart.setSignature(html$.Crypto, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Crypto, [])}),
  fields: () => ({[dartx.subtle]: html$._SubtleCrypto}),
  methods: () => ({
    [dartx.getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData]),
    [_getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.Crypto, html$.Crypto);
dart.defineExtensionNames([
  'algorithm',
  'extractable',
  'type',
  'usages'
]);
html$.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.algorithm]() {
    return this.algorithm;
  }
  get [dartx.extractable]() {
    return this.extractable;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.usages]() {
    return this.usages;
  }
};
dart.setSignature(html$.CryptoKey, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CryptoKey, [])}),
  fields: () => ({
    [dartx.algorithm]: core.Object,
    [dartx.extractable]: core.bool,
    [dartx.type]: core.String,
    [dartx.usages]: ListOfString()
  })
});
dart.registerExtension(dart.global.CryptoKey, html$.CryptoKey);
html$.Css = class Css extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.Css, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Css, [])}),
  statics: () => ({
    supports: dart.definiteFunctionType(core.bool, [core.String, core.String]),
    supportsCondition: dart.definiteFunctionType(core.bool, [core.String])
  }),
  names: ['supports', 'supportsCondition']
});
dart.registerExtension(dart.global.CSS, html$.Css);
dart.defineExtensionNames([
  'cssText',
  'parentRule',
  'parentStyleSheet',
  'type'
]);
html$.CssRule = class CssRule extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.cssText]() {
    return this.cssText;
  }
  set [dartx.cssText](value) {
    this.cssText = value;
  }
  get [dartx.parentRule]() {
    return this.parentRule;
  }
  get [dartx.parentStyleSheet]() {
    return this.parentStyleSheet;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.CssRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssRule, [])}),
  fields: () => ({
    [dartx.cssText]: core.String,
    [dartx.parentRule]: html$.CssRule,
    [dartx.parentStyleSheet]: html$.CssStyleSheet,
    [dartx.type]: core.int
  }),
  sfields: () => ({
    CHARSET_RULE: core.int,
    FONT_FACE_RULE: core.int,
    IMPORT_RULE: core.int,
    KEYFRAMES_RULE: core.int,
    KEYFRAME_RULE: core.int,
    MEDIA_RULE: core.int,
    PAGE_RULE: core.int,
    STYLE_RULE: core.int,
    SUPPORTS_RULE: core.int,
    VIEWPORT_RULE: core.int,
    WEBKIT_KEYFRAMES_RULE: core.int,
    WEBKIT_KEYFRAME_RULE: core.int
  })
});
html$.CssRule.CHARSET_RULE = 2;
html$.CssRule.FONT_FACE_RULE = 5;
html$.CssRule.IMPORT_RULE = 3;
html$.CssRule.KEYFRAMES_RULE = 7;
html$.CssRule.KEYFRAME_RULE = 8;
html$.CssRule.MEDIA_RULE = 4;
html$.CssRule.PAGE_RULE = 6;
html$.CssRule.STYLE_RULE = 1;
html$.CssRule.SUPPORTS_RULE = 12;
html$.CssRule.VIEWPORT_RULE = 15;
html$.CssRule.WEBKIT_KEYFRAMES_RULE = 7;
html$.CssRule.WEBKIT_KEYFRAME_RULE = 8;
dart.registerExtension(dart.global.CSSRule, html$.CssRule);
dart.defineExtensionNames([
  'encoding'
]);
html$.CssCharsetRule = class CssCharsetRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.encoding]() {
    return this.encoding;
  }
  set [dartx.encoding](value) {
    this.encoding = value;
  }
};
dart.setSignature(html$.CssCharsetRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssCharsetRule, [])}),
  fields: () => ({[dartx.encoding]: core.String})
});
dart.registerExtension(dart.global.CSSCharsetRule, html$.CssCharsetRule);
dart.defineExtensionNames([
  'style'
]);
html$.CssFontFaceRule = class CssFontFaceRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.style]() {
    return this.style;
  }
};
dart.setSignature(html$.CssFontFaceRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssFontFaceRule, [])}),
  fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
});
dart.registerExtension(dart.global.CSSFontFaceRule, html$.CssFontFaceRule);
dart.defineExtensionNames([
  'deleteRule',
  'insertRule',
  'cssRules'
]);
html$.CssGroupingRule = class CssGroupingRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.cssRules]() {
    return this.cssRules;
  }
  [dartx.deleteRule](...args) {
    return this.deleteRule.apply(this, args);
  }
  [dartx.insertRule](...args) {
    return this.insertRule.apply(this, args);
  }
};
dart.setSignature(html$.CssGroupingRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssGroupingRule, [])}),
  fields: () => ({[dartx.cssRules]: ListOfCssRule()}),
  methods: () => ({
    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
  })
});
dart.registerExtension(dart.global.CSSGroupingRule, html$.CssGroupingRule);
dart.defineExtensionNames([
  'href',
  'media',
  'styleSheet'
]);
html$.CssImportRule = class CssImportRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.href]() {
    return this.href;
  }
  get [dartx.media]() {
    return this.media;
  }
  get [dartx.styleSheet]() {
    return this.styleSheet;
  }
};
dart.setSignature(html$.CssImportRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssImportRule, [])}),
  fields: () => ({
    [dartx.href]: core.String,
    [dartx.media]: html$.MediaList,
    [dartx.styleSheet]: html$.CssStyleSheet
  })
});
dart.registerExtension(dart.global.CSSImportRule, html$.CssImportRule);
dart.defineExtensionNames([
  'keyText',
  'style'
]);
html$.CssKeyframeRule = class CssKeyframeRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.keyText]() {
    return this.keyText;
  }
  set [dartx.keyText](value) {
    this.keyText = value;
  }
  get [dartx.style]() {
    return this.style;
  }
};
dart.setSignature(html$.CssKeyframeRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframeRule, [])}),
  fields: () => ({
    [dartx.keyText]: core.String,
    [dartx.style]: html$.CssStyleDeclaration
  })
});
dart.registerExtension(dart.global.CSSKeyframeRule, html$.CssKeyframeRule);
dart.registerExtension(dart.global.MozCSSKeyframeRule, html$.CssKeyframeRule);
dart.registerExtension(dart.global.WebKitCSSKeyframeRule, html$.CssKeyframeRule);
dart.defineExtensionNames([
  'appendRule',
  'deleteRule',
  'findRule',
  'cssRules',
  'name'
]);
html$.CssKeyframesRule = class CssKeyframesRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.cssRules]() {
    return this.cssRules;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.appendRule](...args) {
    return this.appendRule.apply(this, args);
  }
  [dartx.deleteRule](...args) {
    return this.deleteRule.apply(this, args);
  }
  [dartx.findRule](...args) {
    return this.findRule.apply(this, args);
  }
};
dart.setSignature(html$.CssKeyframesRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframesRule, [])}),
  fields: () => ({
    [dartx.cssRules]: ListOfCssRule(),
    [dartx.name]: core.String
  }),
  methods: () => ({
    [__getter__]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.int]),
    [dartx.appendRule]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.findRule]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.String])
  })
});
dart.registerExtension(dart.global.CSSKeyframesRule, html$.CssKeyframesRule);
dart.registerExtension(dart.global.MozCSSKeyframesRule, html$.CssKeyframesRule);
dart.registerExtension(dart.global.WebKitCSSKeyframesRule, html$.CssKeyframesRule);
dart.defineExtensionNames([
  'media'
]);
html$.CssMediaRule = class CssMediaRule extends html$.CssGroupingRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.media]() {
    return this.media;
  }
};
dart.setSignature(html$.CssMediaRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssMediaRule, [])}),
  fields: () => ({[dartx.media]: html$.MediaList})
});
dart.registerExtension(dart.global.CSSMediaRule, html$.CssMediaRule);
dart.defineExtensionNames([
  'selectorText',
  'style'
]);
html$.CssPageRule = class CssPageRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.selectorText]() {
    return this.selectorText;
  }
  set [dartx.selectorText](value) {
    this.selectorText = value;
  }
  get [dartx.style]() {
    return this.style;
  }
};
dart.setSignature(html$.CssPageRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssPageRule, [])}),
  fields: () => ({
    [dartx.selectorText]: core.String,
    [dartx.style]: html$.CssStyleDeclaration
  })
});
dart.registerExtension(dart.global.CSSPageRule, html$.CssPageRule);
const _getPropertyValueHelper = Symbol('_getPropertyValueHelper');
const _supportsProperty = Symbol('_supportsProperty');
const _getPropertyValue = Symbol('_getPropertyValue');
const _setPropertyHelper = Symbol('_setPropertyHelper');
const _browserPropertyName = Symbol('_browserPropertyName');
const _background = Symbol('_background');
const _backgroundAttachment = Symbol('_backgroundAttachment');
const _backgroundColor = Symbol('_backgroundColor');
const _backgroundImage = Symbol('_backgroundImage');
const _backgroundPosition = Symbol('_backgroundPosition');
const _backgroundRepeat = Symbol('_backgroundRepeat');
const _border = Symbol('_border');
const _borderBottom = Symbol('_borderBottom');
const _borderBottomColor = Symbol('_borderBottomColor');
const _borderBottomStyle = Symbol('_borderBottomStyle');
const _borderBottomWidth = Symbol('_borderBottomWidth');
const _borderCollapse = Symbol('_borderCollapse');
const _borderColor = Symbol('_borderColor');
const _borderLeft = Symbol('_borderLeft');
const _borderLeftColor = Symbol('_borderLeftColor');
const _borderLeftStyle = Symbol('_borderLeftStyle');
const _borderLeftWidth = Symbol('_borderLeftWidth');
const _borderRight = Symbol('_borderRight');
const _borderRightColor = Symbol('_borderRightColor');
const _borderRightStyle = Symbol('_borderRightStyle');
const _borderRightWidth = Symbol('_borderRightWidth');
const _borderSpacing = Symbol('_borderSpacing');
const _borderStyle = Symbol('_borderStyle');
const _borderTop = Symbol('_borderTop');
const _borderTopColor = Symbol('_borderTopColor');
const _borderTopStyle = Symbol('_borderTopStyle');
const _borderTopWidth = Symbol('_borderTopWidth');
const _borderWidth = Symbol('_borderWidth');
const _bottom = Symbol('_bottom');
const _captionSide = Symbol('_captionSide');
const _clear$1 = Symbol('_clear');
const _clip = Symbol('_clip');
const _color = Symbol('_color');
const _content = Symbol('_content');
const _cursor = Symbol('_cursor');
const _direction = Symbol('_direction');
const _display = Symbol('_display');
const _emptyCells = Symbol('_emptyCells');
const _font = Symbol('_font');
const _fontFamily = Symbol('_fontFamily');
const _fontSize = Symbol('_fontSize');
const _fontStyle = Symbol('_fontStyle');
const _fontVariant = Symbol('_fontVariant');
const _fontWeight = Symbol('_fontWeight');
const _height$ = Symbol('_height');
const _left = Symbol('_left');
const _letterSpacing = Symbol('_letterSpacing');
const _lineHeight = Symbol('_lineHeight');
const _listStyle = Symbol('_listStyle');
const _listStyleImage = Symbol('_listStyleImage');
const _listStylePosition = Symbol('_listStylePosition');
const _listStyleType = Symbol('_listStyleType');
const _margin = Symbol('_margin');
const _marginBottom = Symbol('_marginBottom');
const _marginLeft = Symbol('_marginLeft');
const _marginRight = Symbol('_marginRight');
const _marginTop = Symbol('_marginTop');
const _maxHeight = Symbol('_maxHeight');
const _maxWidth = Symbol('_maxWidth');
const _minHeight = Symbol('_minHeight');
const _minWidth = Symbol('_minWidth');
const _outline = Symbol('_outline');
const _outlineColor = Symbol('_outlineColor');
const _outlineStyle = Symbol('_outlineStyle');
const _outlineWidth = Symbol('_outlineWidth');
const _overflow = Symbol('_overflow');
const _padding = Symbol('_padding');
const _paddingBottom = Symbol('_paddingBottom');
const _paddingLeft = Symbol('_paddingLeft');
const _paddingRight = Symbol('_paddingRight');
const _paddingTop = Symbol('_paddingTop');
const _pageBreakAfter = Symbol('_pageBreakAfter');
const _pageBreakBefore = Symbol('_pageBreakBefore');
const _pageBreakInside = Symbol('_pageBreakInside');
const _position$1 = Symbol('_position');
const _quotes = Symbol('_quotes');
const _right = Symbol('_right');
const _tableLayout = Symbol('_tableLayout');
const _textAlign = Symbol('_textAlign');
const _textDecoration = Symbol('_textDecoration');
const _textIndent = Symbol('_textIndent');
const _textTransform = Symbol('_textTransform');
const _top = Symbol('_top');
const _unicodeBidi = Symbol('_unicodeBidi');
const _verticalAlign = Symbol('_verticalAlign');
const _visibility = Symbol('_visibility');
const _whiteSpace = Symbol('_whiteSpace');
const _width$ = Symbol('_width');
const _wordSpacing = Symbol('_wordSpacing');
const _zIndex = Symbol('_zIndex');
dart.defineExtensionNames([
  'alignContent',
  'alignContent',
  'alignItems',
  'alignItems',
  'alignSelf',
  'alignSelf',
  'animation',
  'animation',
  'animationDelay',
  'animationDelay',
  'animationDirection',
  'animationDirection',
  'animationDuration',
  'animationDuration',
  'animationFillMode',
  'animationFillMode',
  'animationIterationCount',
  'animationIterationCount',
  'animationName',
  'animationName',
  'animationPlayState',
  'animationPlayState',
  'animationTimingFunction',
  'animationTimingFunction',
  'appRegion',
  'appRegion',
  'appearance',
  'appearance',
  'aspectRatio',
  'aspectRatio',
  'backfaceVisibility',
  'backfaceVisibility',
  'background',
  'background',
  'backgroundAttachment',
  'backgroundAttachment',
  'backgroundBlendMode',
  'backgroundBlendMode',
  'backgroundClip',
  'backgroundClip',
  'backgroundColor',
  'backgroundColor',
  'backgroundComposite',
  'backgroundComposite',
  'backgroundImage',
  'backgroundImage',
  'backgroundOrigin',
  'backgroundOrigin',
  'backgroundPosition',
  'backgroundPosition',
  'backgroundPositionX',
  'backgroundPositionX',
  'backgroundPositionY',
  'backgroundPositionY',
  'backgroundRepeat',
  'backgroundRepeat',
  'backgroundRepeatX',
  'backgroundRepeatX',
  'backgroundRepeatY',
  'backgroundRepeatY',
  'backgroundSize',
  'backgroundSize',
  'border',
  'border',
  'borderAfter',
  'borderAfter',
  'borderAfterColor',
  'borderAfterColor',
  'borderAfterStyle',
  'borderAfterStyle',
  'borderAfterWidth',
  'borderAfterWidth',
  'borderBefore',
  'borderBefore',
  'borderBeforeColor',
  'borderBeforeColor',
  'borderBeforeStyle',
  'borderBeforeStyle',
  'borderBeforeWidth',
  'borderBeforeWidth',
  'borderBottom',
  'borderBottom',
  'borderBottomColor',
  'borderBottomColor',
  'borderBottomLeftRadius',
  'borderBottomLeftRadius',
  'borderBottomRightRadius',
  'borderBottomRightRadius',
  'borderBottomStyle',
  'borderBottomStyle',
  'borderBottomWidth',
  'borderBottomWidth',
  'borderCollapse',
  'borderCollapse',
  'borderColor',
  'borderColor',
  'borderEnd',
  'borderEnd',
  'borderEndColor',
  'borderEndColor',
  'borderEndStyle',
  'borderEndStyle',
  'borderEndWidth',
  'borderEndWidth',
  'borderFit',
  'borderFit',
  'borderHorizontalSpacing',
  'borderHorizontalSpacing',
  'borderImage',
  'borderImage',
  'borderImageOutset',
  'borderImageOutset',
  'borderImageRepeat',
  'borderImageRepeat',
  'borderImageSlice',
  'borderImageSlice',
  'borderImageSource',
  'borderImageSource',
  'borderImageWidth',
  'borderImageWidth',
  'borderLeft',
  'borderLeft',
  'borderLeftColor',
  'borderLeftColor',
  'borderLeftStyle',
  'borderLeftStyle',
  'borderLeftWidth',
  'borderLeftWidth',
  'borderRadius',
  'borderRadius',
  'borderRight',
  'borderRight',
  'borderRightColor',
  'borderRightColor',
  'borderRightStyle',
  'borderRightStyle',
  'borderRightWidth',
  'borderRightWidth',
  'borderSpacing',
  'borderSpacing',
  'borderStart',
  'borderStart',
  'borderStartColor',
  'borderStartColor',
  'borderStartStyle',
  'borderStartStyle',
  'borderStartWidth',
  'borderStartWidth',
  'borderStyle',
  'borderStyle',
  'borderTop',
  'borderTop',
  'borderTopColor',
  'borderTopColor',
  'borderTopLeftRadius',
  'borderTopLeftRadius',
  'borderTopRightRadius',
  'borderTopRightRadius',
  'borderTopStyle',
  'borderTopStyle',
  'borderTopWidth',
  'borderTopWidth',
  'borderVerticalSpacing',
  'borderVerticalSpacing',
  'borderWidth',
  'borderWidth',
  'bottom',
  'bottom',
  'boxAlign',
  'boxAlign',
  'boxDecorationBreak',
  'boxDecorationBreak',
  'boxDirection',
  'boxDirection',
  'boxFlex',
  'boxFlex',
  'boxFlexGroup',
  'boxFlexGroup',
  'boxLines',
  'boxLines',
  'boxOrdinalGroup',
  'boxOrdinalGroup',
  'boxOrient',
  'boxOrient',
  'boxPack',
  'boxPack',
  'boxReflect',
  'boxReflect',
  'boxShadow',
  'boxShadow',
  'boxSizing',
  'boxSizing',
  'captionSide',
  'captionSide',
  'clear',
  'clear',
  'clip',
  'clip',
  'clipPath',
  'clipPath',
  'color',
  'color',
  'columnBreakAfter',
  'columnBreakAfter',
  'columnBreakBefore',
  'columnBreakBefore',
  'columnBreakInside',
  'columnBreakInside',
  'columnCount',
  'columnCount',
  'columnFill',
  'columnFill',
  'columnGap',
  'columnGap',
  'columnRule',
  'columnRule',
  'columnRuleColor',
  'columnRuleColor',
  'columnRuleStyle',
  'columnRuleStyle',
  'columnRuleWidth',
  'columnRuleWidth',
  'columnSpan',
  'columnSpan',
  'columnWidth',
  'columnWidth',
  'columns',
  'columns',
  'content',
  'content',
  'counterIncrement',
  'counterIncrement',
  'counterReset',
  'counterReset',
  'cursor',
  'cursor',
  'direction',
  'direction',
  'display',
  'display',
  'emptyCells',
  'emptyCells',
  'filter',
  'filter',
  'flex',
  'flex',
  'flexBasis',
  'flexBasis',
  'flexDirection',
  'flexDirection',
  'flexFlow',
  'flexFlow',
  'flexGrow',
  'flexGrow',
  'flexShrink',
  'flexShrink',
  'flexWrap',
  'flexWrap',
  'float',
  'float',
  'font',
  'font',
  'fontFamily',
  'fontFamily',
  'fontFeatureSettings',
  'fontFeatureSettings',
  'fontKerning',
  'fontKerning',
  'fontSize',
  'fontSize',
  'fontSizeDelta',
  'fontSizeDelta',
  'fontSmoothing',
  'fontSmoothing',
  'fontStretch',
  'fontStretch',
  'fontStyle',
  'fontStyle',
  'fontVariant',
  'fontVariant',
  'fontVariantLigatures',
  'fontVariantLigatures',
  'fontWeight',
  'fontWeight',
  'grid',
  'grid',
  'gridArea',
  'gridArea',
  'gridAutoColumns',
  'gridAutoColumns',
  'gridAutoFlow',
  'gridAutoFlow',
  'gridAutoRows',
  'gridAutoRows',
  'gridColumn',
  'gridColumn',
  'gridColumnEnd',
  'gridColumnEnd',
  'gridColumnStart',
  'gridColumnStart',
  'gridRow',
  'gridRow',
  'gridRowEnd',
  'gridRowEnd',
  'gridRowStart',
  'gridRowStart',
  'gridTemplate',
  'gridTemplate',
  'gridTemplateAreas',
  'gridTemplateAreas',
  'gridTemplateColumns',
  'gridTemplateColumns',
  'gridTemplateRows',
  'gridTemplateRows',
  'height',
  'height',
  'highlight',
  'highlight',
  'hyphenateCharacter',
  'hyphenateCharacter',
  'imageRendering',
  'imageRendering',
  'isolation',
  'isolation',
  'justifyContent',
  'justifyContent',
  'justifySelf',
  'justifySelf',
  'left',
  'left',
  'letterSpacing',
  'letterSpacing',
  'lineBoxContain',
  'lineBoxContain',
  'lineBreak',
  'lineBreak',
  'lineClamp',
  'lineClamp',
  'lineHeight',
  'lineHeight',
  'listStyle',
  'listStyle',
  'listStyleImage',
  'listStyleImage',
  'listStylePosition',
  'listStylePosition',
  'listStyleType',
  'listStyleType',
  'locale',
  'locale',
  'logicalHeight',
  'logicalHeight',
  'logicalWidth',
  'logicalWidth',
  'margin',
  'margin',
  'marginAfter',
  'marginAfter',
  'marginAfterCollapse',
  'marginAfterCollapse',
  'marginBefore',
  'marginBefore',
  'marginBeforeCollapse',
  'marginBeforeCollapse',
  'marginBottom',
  'marginBottom',
  'marginBottomCollapse',
  'marginBottomCollapse',
  'marginCollapse',
  'marginCollapse',
  'marginEnd',
  'marginEnd',
  'marginLeft',
  'marginLeft',
  'marginRight',
  'marginRight',
  'marginStart',
  'marginStart',
  'marginTop',
  'marginTop',
  'marginTopCollapse',
  'marginTopCollapse',
  'mask',
  'mask',
  'maskBoxImage',
  'maskBoxImage',
  'maskBoxImageOutset',
  'maskBoxImageOutset',
  'maskBoxImageRepeat',
  'maskBoxImageRepeat',
  'maskBoxImageSlice',
  'maskBoxImageSlice',
  'maskBoxImageSource',
  'maskBoxImageSource',
  'maskBoxImageWidth',
  'maskBoxImageWidth',
  'maskClip',
  'maskClip',
  'maskComposite',
  'maskComposite',
  'maskImage',
  'maskImage',
  'maskOrigin',
  'maskOrigin',
  'maskPosition',
  'maskPosition',
  'maskPositionX',
  'maskPositionX',
  'maskPositionY',
  'maskPositionY',
  'maskRepeat',
  'maskRepeat',
  'maskRepeatX',
  'maskRepeatX',
  'maskRepeatY',
  'maskRepeatY',
  'maskSize',
  'maskSize',
  'maskSourceType',
  'maskSourceType',
  'maxHeight',
  'maxHeight',
  'maxLogicalHeight',
  'maxLogicalHeight',
  'maxLogicalWidth',
  'maxLogicalWidth',
  'maxWidth',
  'maxWidth',
  'maxZoom',
  'maxZoom',
  'minHeight',
  'minHeight',
  'minLogicalHeight',
  'minLogicalHeight',
  'minLogicalWidth',
  'minLogicalWidth',
  'minWidth',
  'minWidth',
  'minZoom',
  'minZoom',
  'mixBlendMode',
  'mixBlendMode',
  'objectFit',
  'objectFit',
  'objectPosition',
  'objectPosition',
  'opacity',
  'opacity',
  'order',
  'order',
  'orientation',
  'orientation',
  'orphans',
  'orphans',
  'outline',
  'outline',
  'outlineColor',
  'outlineColor',
  'outlineOffset',
  'outlineOffset',
  'outlineStyle',
  'outlineStyle',
  'outlineWidth',
  'outlineWidth',
  'overflow',
  'overflow',
  'overflowWrap',
  'overflowWrap',
  'overflowX',
  'overflowX',
  'overflowY',
  'overflowY',
  'padding',
  'padding',
  'paddingAfter',
  'paddingAfter',
  'paddingBefore',
  'paddingBefore',
  'paddingBottom',
  'paddingBottom',
  'paddingEnd',
  'paddingEnd',
  'paddingLeft',
  'paddingLeft',
  'paddingRight',
  'paddingRight',
  'paddingStart',
  'paddingStart',
  'paddingTop',
  'paddingTop',
  'page',
  'page',
  'pageBreakAfter',
  'pageBreakAfter',
  'pageBreakBefore',
  'pageBreakBefore',
  'pageBreakInside',
  'pageBreakInside',
  'perspective',
  'perspective',
  'perspectiveOrigin',
  'perspectiveOrigin',
  'perspectiveOriginX',
  'perspectiveOriginX',
  'perspectiveOriginY',
  'perspectiveOriginY',
  'pointerEvents',
  'pointerEvents',
  'position',
  'position',
  'printColorAdjust',
  'printColorAdjust',
  'quotes',
  'quotes',
  'resize',
  'resize',
  'right',
  'right',
  'rtlOrdering',
  'rtlOrdering',
  'rubyPosition',
  'rubyPosition',
  'scrollBehavior',
  'scrollBehavior',
  'shapeImageThreshold',
  'shapeImageThreshold',
  'shapeMargin',
  'shapeMargin',
  'shapeOutside',
  'shapeOutside',
  'size',
  'size',
  'speak',
  'speak',
  'src',
  'src',
  'tabSize',
  'tabSize',
  'tableLayout',
  'tableLayout',
  'tapHighlightColor',
  'tapHighlightColor',
  'textAlign',
  'textAlign',
  'textAlignLast',
  'textAlignLast',
  'textCombine',
  'textCombine',
  'textDecoration',
  'textDecoration',
  'textDecorationColor',
  'textDecorationColor',
  'textDecorationLine',
  'textDecorationLine',
  'textDecorationStyle',
  'textDecorationStyle',
  'textDecorationsInEffect',
  'textDecorationsInEffect',
  'textEmphasis',
  'textEmphasis',
  'textEmphasisColor',
  'textEmphasisColor',
  'textEmphasisPosition',
  'textEmphasisPosition',
  'textEmphasisStyle',
  'textEmphasisStyle',
  'textFillColor',
  'textFillColor',
  'textIndent',
  'textIndent',
  'textJustify',
  'textJustify',
  'textLineThroughColor',
  'textLineThroughColor',
  'textLineThroughMode',
  'textLineThroughMode',
  'textLineThroughStyle',
  'textLineThroughStyle',
  'textLineThroughWidth',
  'textLineThroughWidth',
  'textOrientation',
  'textOrientation',
  'textOverflow',
  'textOverflow',
  'textOverlineColor',
  'textOverlineColor',
  'textOverlineMode',
  'textOverlineMode',
  'textOverlineStyle',
  'textOverlineStyle',
  'textOverlineWidth',
  'textOverlineWidth',
  'textRendering',
  'textRendering',
  'textSecurity',
  'textSecurity',
  'textShadow',
  'textShadow',
  'textStroke',
  'textStroke',
  'textStrokeColor',
  'textStrokeColor',
  'textStrokeWidth',
  'textStrokeWidth',
  'textTransform',
  'textTransform',
  'textUnderlineColor',
  'textUnderlineColor',
  'textUnderlineMode',
  'textUnderlineMode',
  'textUnderlinePosition',
  'textUnderlinePosition',
  'textUnderlineStyle',
  'textUnderlineStyle',
  'textUnderlineWidth',
  'textUnderlineWidth',
  'top',
  'top',
  'touchAction',
  'touchAction',
  'touchActionDelay',
  'touchActionDelay',
  'transform',
  'transform',
  'transformOrigin',
  'transformOrigin',
  'transformOriginX',
  'transformOriginX',
  'transformOriginY',
  'transformOriginY',
  'transformOriginZ',
  'transformOriginZ',
  'transformStyle',
  'transformStyle',
  'transition',
  'transition',
  'transitionDelay',
  'transitionDelay',
  'transitionDuration',
  'transitionDuration',
  'transitionProperty',
  'transitionProperty',
  'transitionTimingFunction',
  'transitionTimingFunction',
  'unicodeBidi',
  'unicodeBidi',
  'unicodeRange',
  'unicodeRange',
  'userDrag',
  'userDrag',
  'userModify',
  'userModify',
  'userSelect',
  'userSelect',
  'userZoom',
  'userZoom',
  'verticalAlign',
  'verticalAlign',
  'visibility',
  'visibility',
  'whiteSpace',
  'whiteSpace',
  'widows',
  'widows',
  'width',
  'width',
  'willChange',
  'willChange',
  'wordBreak',
  'wordBreak',
  'wordSpacing',
  'wordSpacing',
  'wordWrap',
  'wordWrap',
  'wrapFlow',
  'wrapFlow',
  'wrapThrough',
  'wrapThrough',
  'writingMode',
  'writingMode',
  'zIndex',
  'zIndex',
  'zoom',
  'zoom'
]);
html$.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
  get alignContent() {
    return this[dartx.getPropertyValue]('align-content');
  }
  set alignContent(value) {
    this[dartx.setProperty]('align-content', value, '');
  }
  get alignItems() {
    return this[dartx.getPropertyValue]('align-items');
  }
  set alignItems(value) {
    this[dartx.setProperty]('align-items', value, '');
  }
  get alignSelf() {
    return this[dartx.getPropertyValue]('align-self');
  }
  set alignSelf(value) {
    this[dartx.setProperty]('align-self', value, '');
  }
  get animation() {
    return this[dartx.getPropertyValue]('animation');
  }
  set animation(value) {
    this[dartx.setProperty]('animation', value, '');
  }
  get animationDelay() {
    return this[dartx.getPropertyValue]('animation-delay');
  }
  set animationDelay(value) {
    this[dartx.setProperty]('animation-delay', value, '');
  }
  get animationDirection() {
    return this[dartx.getPropertyValue]('animation-direction');
  }
  set animationDirection(value) {
    this[dartx.setProperty]('animation-direction', value, '');
  }
  get animationDuration() {
    return this[dartx.getPropertyValue]('animation-duration');
  }
  set animationDuration(value) {
    this[dartx.setProperty]('animation-duration', value, '');
  }
  get animationFillMode() {
    return this[dartx.getPropertyValue]('animation-fill-mode');
  }
  set animationFillMode(value) {
    this[dartx.setProperty]('animation-fill-mode', value, '');
  }
  get animationIterationCount() {
    return this[dartx.getPropertyValue]('animation-iteration-count');
  }
  set animationIterationCount(value) {
    this[dartx.setProperty]('animation-iteration-count', value, '');
  }
  get animationName() {
    return this[dartx.getPropertyValue]('animation-name');
  }
  set animationName(value) {
    this[dartx.setProperty]('animation-name', value, '');
  }
  get animationPlayState() {
    return this[dartx.getPropertyValue]('animation-play-state');
  }
  set animationPlayState(value) {
    this[dartx.setProperty]('animation-play-state', value, '');
  }
  get animationTimingFunction() {
    return this[dartx.getPropertyValue]('animation-timing-function');
  }
  set animationTimingFunction(value) {
    this[dartx.setProperty]('animation-timing-function', value, '');
  }
  get appRegion() {
    return this[dartx.getPropertyValue]('app-region');
  }
  set appRegion(value) {
    this[dartx.setProperty]('app-region', value, '');
  }
  get appearance() {
    return this[dartx.getPropertyValue]('appearance');
  }
  set appearance(value) {
    this[dartx.setProperty]('appearance', value, '');
  }
  get aspectRatio() {
    return this[dartx.getPropertyValue]('aspect-ratio');
  }
  set aspectRatio(value) {
    this[dartx.setProperty]('aspect-ratio', value, '');
  }
  get backfaceVisibility() {
    return this[dartx.getPropertyValue]('backface-visibility');
  }
  set backfaceVisibility(value) {
    this[dartx.setProperty]('backface-visibility', value, '');
  }
  get background() {
    return this[dartx.getPropertyValue]('background');
  }
  set background(value) {
    this[dartx.setProperty]('background', value, '');
  }
  get backgroundAttachment() {
    return this[dartx.getPropertyValue]('background-attachment');
  }
  set backgroundAttachment(value) {
    this[dartx.setProperty]('background-attachment', value, '');
  }
  get backgroundBlendMode() {
    return this[dartx.getPropertyValue]('background-blend-mode');
  }
  set backgroundBlendMode(value) {
    this[dartx.setProperty]('background-blend-mode', value, '');
  }
  get backgroundClip() {
    return this[dartx.getPropertyValue]('background-clip');
  }
  set backgroundClip(value) {
    this[dartx.setProperty]('background-clip', value, '');
  }
  get backgroundColor() {
    return this[dartx.getPropertyValue]('background-color');
  }
  set backgroundColor(value) {
    this[dartx.setProperty]('background-color', value, '');
  }
  get backgroundComposite() {
    return this[dartx.getPropertyValue]('background-composite');
  }
  set backgroundComposite(value) {
    this[dartx.setProperty]('background-composite', value, '');
  }
  get backgroundImage() {
    return this[dartx.getPropertyValue]('background-image');
  }
  set backgroundImage(value) {
    this[dartx.setProperty]('background-image', value, '');
  }
  get backgroundOrigin() {
    return this[dartx.getPropertyValue]('background-origin');
  }
  set backgroundOrigin(value) {
    this[dartx.setProperty]('background-origin', value, '');
  }
  get backgroundPosition() {
    return this[dartx.getPropertyValue]('background-position');
  }
  set backgroundPosition(value) {
    this[dartx.setProperty]('background-position', value, '');
  }
  get backgroundPositionX() {
    return this[dartx.getPropertyValue]('background-position-x');
  }
  set backgroundPositionX(value) {
    this[dartx.setProperty]('background-position-x', value, '');
  }
  get backgroundPositionY() {
    return this[dartx.getPropertyValue]('background-position-y');
  }
  set backgroundPositionY(value) {
    this[dartx.setProperty]('background-position-y', value, '');
  }
  get backgroundRepeat() {
    return this[dartx.getPropertyValue]('background-repeat');
  }
  set backgroundRepeat(value) {
    this[dartx.setProperty]('background-repeat', value, '');
  }
  get backgroundRepeatX() {
    return this[dartx.getPropertyValue]('background-repeat-x');
  }
  set backgroundRepeatX(value) {
    this[dartx.setProperty]('background-repeat-x', value, '');
  }
  get backgroundRepeatY() {
    return this[dartx.getPropertyValue]('background-repeat-y');
  }
  set backgroundRepeatY(value) {
    this[dartx.setProperty]('background-repeat-y', value, '');
  }
  get backgroundSize() {
    return this[dartx.getPropertyValue]('background-size');
  }
  set backgroundSize(value) {
    this[dartx.setProperty]('background-size', value, '');
  }
  get border() {
    return this[dartx.getPropertyValue]('border');
  }
  set border(value) {
    this[dartx.setProperty]('border', value, '');
  }
  get borderAfter() {
    return this[dartx.getPropertyValue]('border-after');
  }
  set borderAfter(value) {
    this[dartx.setProperty]('border-after', value, '');
  }
  get borderAfterColor() {
    return this[dartx.getPropertyValue]('border-after-color');
  }
  set borderAfterColor(value) {
    this[dartx.setProperty]('border-after-color', value, '');
  }
  get borderAfterStyle() {
    return this[dartx.getPropertyValue]('border-after-style');
  }
  set borderAfterStyle(value) {
    this[dartx.setProperty]('border-after-style', value, '');
  }
  get borderAfterWidth() {
    return this[dartx.getPropertyValue]('border-after-width');
  }
  set borderAfterWidth(value) {
    this[dartx.setProperty]('border-after-width', value, '');
  }
  get borderBefore() {
    return this[dartx.getPropertyValue]('border-before');
  }
  set borderBefore(value) {
    this[dartx.setProperty]('border-before', value, '');
  }
  get borderBeforeColor() {
    return this[dartx.getPropertyValue]('border-before-color');
  }
  set borderBeforeColor(value) {
    this[dartx.setProperty]('border-before-color', value, '');
  }
  get borderBeforeStyle() {
    return this[dartx.getPropertyValue]('border-before-style');
  }
  set borderBeforeStyle(value) {
    this[dartx.setProperty]('border-before-style', value, '');
  }
  get borderBeforeWidth() {
    return this[dartx.getPropertyValue]('border-before-width');
  }
  set borderBeforeWidth(value) {
    this[dartx.setProperty]('border-before-width', value, '');
  }
  get borderBottom() {
    return this[dartx.getPropertyValue]('border-bottom');
  }
  set borderBottom(value) {
    this[dartx.setProperty]('border-bottom', value, '');
  }
  get borderBottomColor() {
    return this[dartx.getPropertyValue]('border-bottom-color');
  }
  set borderBottomColor(value) {
    this[dartx.setProperty]('border-bottom-color', value, '');
  }
  get borderBottomLeftRadius() {
    return this[dartx.getPropertyValue]('border-bottom-left-radius');
  }
  set borderBottomLeftRadius(value) {
    this[dartx.setProperty]('border-bottom-left-radius', value, '');
  }
  get borderBottomRightRadius() {
    return this[dartx.getPropertyValue]('border-bottom-right-radius');
  }
  set borderBottomRightRadius(value) {
    this[dartx.setProperty]('border-bottom-right-radius', value, '');
  }
  get borderBottomStyle() {
    return this[dartx.getPropertyValue]('border-bottom-style');
  }
  set borderBottomStyle(value) {
    this[dartx.setProperty]('border-bottom-style', value, '');
  }
  get borderBottomWidth() {
    return this[dartx.getPropertyValue]('border-bottom-width');
  }
  set borderBottomWidth(value) {
    this[dartx.setProperty]('border-bottom-width', value, '');
  }
  get borderCollapse() {
    return this[dartx.getPropertyValue]('border-collapse');
  }
  set borderCollapse(value) {
    this[dartx.setProperty]('border-collapse', value, '');
  }
  get borderColor() {
    return this[dartx.getPropertyValue]('border-color');
  }
  set borderColor(value) {
    this[dartx.setProperty]('border-color', value, '');
  }
  get borderEnd() {
    return this[dartx.getPropertyValue]('border-end');
  }
  set borderEnd(value) {
    this[dartx.setProperty]('border-end', value, '');
  }
  get borderEndColor() {
    return this[dartx.getPropertyValue]('border-end-color');
  }
  set borderEndColor(value) {
    this[dartx.setProperty]('border-end-color', value, '');
  }
  get borderEndStyle() {
    return this[dartx.getPropertyValue]('border-end-style');
  }
  set borderEndStyle(value) {
    this[dartx.setProperty]('border-end-style', value, '');
  }
  get borderEndWidth() {
    return this[dartx.getPropertyValue]('border-end-width');
  }
  set borderEndWidth(value) {
    this[dartx.setProperty]('border-end-width', value, '');
  }
  get borderFit() {
    return this[dartx.getPropertyValue]('border-fit');
  }
  set borderFit(value) {
    this[dartx.setProperty]('border-fit', value, '');
  }
  get borderHorizontalSpacing() {
    return this[dartx.getPropertyValue]('border-horizontal-spacing');
  }
  set borderHorizontalSpacing(value) {
    this[dartx.setProperty]('border-horizontal-spacing', value, '');
  }
  get borderImage() {
    return this[dartx.getPropertyValue]('border-image');
  }
  set borderImage(value) {
    this[dartx.setProperty]('border-image', value, '');
  }
  get borderImageOutset() {
    return this[dartx.getPropertyValue]('border-image-outset');
  }
  set borderImageOutset(value) {
    this[dartx.setProperty]('border-image-outset', value, '');
  }
  get borderImageRepeat() {
    return this[dartx.getPropertyValue]('border-image-repeat');
  }
  set borderImageRepeat(value) {
    this[dartx.setProperty]('border-image-repeat', value, '');
  }
  get borderImageSlice() {
    return this[dartx.getPropertyValue]('border-image-slice');
  }
  set borderImageSlice(value) {
    this[dartx.setProperty]('border-image-slice', value, '');
  }
  get borderImageSource() {
    return this[dartx.getPropertyValue]('border-image-source');
  }
  set borderImageSource(value) {
    this[dartx.setProperty]('border-image-source', value, '');
  }
  get borderImageWidth() {
    return this[dartx.getPropertyValue]('border-image-width');
  }
  set borderImageWidth(value) {
    this[dartx.setProperty]('border-image-width', value, '');
  }
  get borderLeft() {
    return this[dartx.getPropertyValue]('border-left');
  }
  set borderLeft(value) {
    this[dartx.setProperty]('border-left', value, '');
  }
  get borderLeftColor() {
    return this[dartx.getPropertyValue]('border-left-color');
  }
  set borderLeftColor(value) {
    this[dartx.setProperty]('border-left-color', value, '');
  }
  get borderLeftStyle() {
    return this[dartx.getPropertyValue]('border-left-style');
  }
  set borderLeftStyle(value) {
    this[dartx.setProperty]('border-left-style', value, '');
  }
  get borderLeftWidth() {
    return this[dartx.getPropertyValue]('border-left-width');
  }
  set borderLeftWidth(value) {
    this[dartx.setProperty]('border-left-width', value, '');
  }
  get borderRadius() {
    return this[dartx.getPropertyValue]('border-radius');
  }
  set borderRadius(value) {
    this[dartx.setProperty]('border-radius', value, '');
  }
  get borderRight() {
    return this[dartx.getPropertyValue]('border-right');
  }
  set borderRight(value) {
    this[dartx.setProperty]('border-right', value, '');
  }
  get borderRightColor() {
    return this[dartx.getPropertyValue]('border-right-color');
  }
  set borderRightColor(value) {
    this[dartx.setProperty]('border-right-color', value, '');
  }
  get borderRightStyle() {
    return this[dartx.getPropertyValue]('border-right-style');
  }
  set borderRightStyle(value) {
    this[dartx.setProperty]('border-right-style', value, '');
  }
  get borderRightWidth() {
    return this[dartx.getPropertyValue]('border-right-width');
  }
  set borderRightWidth(value) {
    this[dartx.setProperty]('border-right-width', value, '');
  }
  get borderSpacing() {
    return this[dartx.getPropertyValue]('border-spacing');
  }
  set borderSpacing(value) {
    this[dartx.setProperty]('border-spacing', value, '');
  }
  get borderStart() {
    return this[dartx.getPropertyValue]('border-start');
  }
  set borderStart(value) {
    this[dartx.setProperty]('border-start', value, '');
  }
  get borderStartColor() {
    return this[dartx.getPropertyValue]('border-start-color');
  }
  set borderStartColor(value) {
    this[dartx.setProperty]('border-start-color', value, '');
  }
  get borderStartStyle() {
    return this[dartx.getPropertyValue]('border-start-style');
  }
  set borderStartStyle(value) {
    this[dartx.setProperty]('border-start-style', value, '');
  }
  get borderStartWidth() {
    return this[dartx.getPropertyValue]('border-start-width');
  }
  set borderStartWidth(value) {
    this[dartx.setProperty]('border-start-width', value, '');
  }
  get borderStyle() {
    return this[dartx.getPropertyValue]('border-style');
  }
  set borderStyle(value) {
    this[dartx.setProperty]('border-style', value, '');
  }
  get borderTop() {
    return this[dartx.getPropertyValue]('border-top');
  }
  set borderTop(value) {
    this[dartx.setProperty]('border-top', value, '');
  }
  get borderTopColor() {
    return this[dartx.getPropertyValue]('border-top-color');
  }
  set borderTopColor(value) {
    this[dartx.setProperty]('border-top-color', value, '');
  }
  get borderTopLeftRadius() {
    return this[dartx.getPropertyValue]('border-top-left-radius');
  }
  set borderTopLeftRadius(value) {
    this[dartx.setProperty]('border-top-left-radius', value, '');
  }
  get borderTopRightRadius() {
    return this[dartx.getPropertyValue]('border-top-right-radius');
  }
  set borderTopRightRadius(value) {
    this[dartx.setProperty]('border-top-right-radius', value, '');
  }
  get borderTopStyle() {
    return this[dartx.getPropertyValue]('border-top-style');
  }
  set borderTopStyle(value) {
    this[dartx.setProperty]('border-top-style', value, '');
  }
  get borderTopWidth() {
    return this[dartx.getPropertyValue]('border-top-width');
  }
  set borderTopWidth(value) {
    this[dartx.setProperty]('border-top-width', value, '');
  }
  get borderVerticalSpacing() {
    return this[dartx.getPropertyValue]('border-vertical-spacing');
  }
  set borderVerticalSpacing(value) {
    this[dartx.setProperty]('border-vertical-spacing', value, '');
  }
  get borderWidth() {
    return this[dartx.getPropertyValue]('border-width');
  }
  set borderWidth(value) {
    this[dartx.setProperty]('border-width', value, '');
  }
  get bottom() {
    return this[dartx.getPropertyValue]('bottom');
  }
  set bottom(value) {
    this[dartx.setProperty]('bottom', value, '');
  }
  get boxAlign() {
    return this[dartx.getPropertyValue]('box-align');
  }
  set boxAlign(value) {
    this[dartx.setProperty]('box-align', value, '');
  }
  get boxDecorationBreak() {
    return this[dartx.getPropertyValue]('box-decoration-break');
  }
  set boxDecorationBreak(value) {
    this[dartx.setProperty]('box-decoration-break', value, '');
  }
  get boxDirection() {
    return this[dartx.getPropertyValue]('box-direction');
  }
  set boxDirection(value) {
    this[dartx.setProperty]('box-direction', value, '');
  }
  get boxFlex() {
    return this[dartx.getPropertyValue]('box-flex');
  }
  set boxFlex(value) {
    this[dartx.setProperty]('box-flex', value, '');
  }
  get boxFlexGroup() {
    return this[dartx.getPropertyValue]('box-flex-group');
  }
  set boxFlexGroup(value) {
    this[dartx.setProperty]('box-flex-group', value, '');
  }
  get boxLines() {
    return this[dartx.getPropertyValue]('box-lines');
  }
  set boxLines(value) {
    this[dartx.setProperty]('box-lines', value, '');
  }
  get boxOrdinalGroup() {
    return this[dartx.getPropertyValue]('box-ordinal-group');
  }
  set boxOrdinalGroup(value) {
    this[dartx.setProperty]('box-ordinal-group', value, '');
  }
  get boxOrient() {
    return this[dartx.getPropertyValue]('box-orient');
  }
  set boxOrient(value) {
    this[dartx.setProperty]('box-orient', value, '');
  }
  get boxPack() {
    return this[dartx.getPropertyValue]('box-pack');
  }
  set boxPack(value) {
    this[dartx.setProperty]('box-pack', value, '');
  }
  get boxReflect() {
    return this[dartx.getPropertyValue]('box-reflect');
  }
  set boxReflect(value) {
    this[dartx.setProperty]('box-reflect', value, '');
  }
  get boxShadow() {
    return this[dartx.getPropertyValue]('box-shadow');
  }
  set boxShadow(value) {
    this[dartx.setProperty]('box-shadow', value, '');
  }
  get boxSizing() {
    return this[dartx.getPropertyValue]('box-sizing');
  }
  set boxSizing(value) {
    this[dartx.setProperty]('box-sizing', value, '');
  }
  get captionSide() {
    return this[dartx.getPropertyValue]('caption-side');
  }
  set captionSide(value) {
    this[dartx.setProperty]('caption-side', value, '');
  }
  get clear() {
    return this[dartx.getPropertyValue]('clear');
  }
  set clear(value) {
    this[dartx.setProperty]('clear', value, '');
  }
  get clip() {
    return this[dartx.getPropertyValue]('clip');
  }
  set clip(value) {
    this[dartx.setProperty]('clip', value, '');
  }
  get clipPath() {
    return this[dartx.getPropertyValue]('clip-path');
  }
  set clipPath(value) {
    this[dartx.setProperty]('clip-path', value, '');
  }
  get color() {
    return this[dartx.getPropertyValue]('color');
  }
  set color(value) {
    this[dartx.setProperty]('color', value, '');
  }
  get columnBreakAfter() {
    return this[dartx.getPropertyValue]('column-break-after');
  }
  set columnBreakAfter(value) {
    this[dartx.setProperty]('column-break-after', value, '');
  }
  get columnBreakBefore() {
    return this[dartx.getPropertyValue]('column-break-before');
  }
  set columnBreakBefore(value) {
    this[dartx.setProperty]('column-break-before', value, '');
  }
  get columnBreakInside() {
    return this[dartx.getPropertyValue]('column-break-inside');
  }
  set columnBreakInside(value) {
    this[dartx.setProperty]('column-break-inside', value, '');
  }
  get columnCount() {
    return this[dartx.getPropertyValue]('column-count');
  }
  set columnCount(value) {
    this[dartx.setProperty]('column-count', value, '');
  }
  get columnFill() {
    return this[dartx.getPropertyValue]('column-fill');
  }
  set columnFill(value) {
    this[dartx.setProperty]('column-fill', value, '');
  }
  get columnGap() {
    return this[dartx.getPropertyValue]('column-gap');
  }
  set columnGap(value) {
    this[dartx.setProperty]('column-gap', value, '');
  }
  get columnRule() {
    return this[dartx.getPropertyValue]('column-rule');
  }
  set columnRule(value) {
    this[dartx.setProperty]('column-rule', value, '');
  }
  get columnRuleColor() {
    return this[dartx.getPropertyValue]('column-rule-color');
  }
  set columnRuleColor(value) {
    this[dartx.setProperty]('column-rule-color', value, '');
  }
  get columnRuleStyle() {
    return this[dartx.getPropertyValue]('column-rule-style');
  }
  set columnRuleStyle(value) {
    this[dartx.setProperty]('column-rule-style', value, '');
  }
  get columnRuleWidth() {
    return this[dartx.getPropertyValue]('column-rule-width');
  }
  set columnRuleWidth(value) {
    this[dartx.setProperty]('column-rule-width', value, '');
  }
  get columnSpan() {
    return this[dartx.getPropertyValue]('column-span');
  }
  set columnSpan(value) {
    this[dartx.setProperty]('column-span', value, '');
  }
  get columnWidth() {
    return this[dartx.getPropertyValue]('column-width');
  }
  set columnWidth(value) {
    this[dartx.setProperty]('column-width', value, '');
  }
  get columns() {
    return this[dartx.getPropertyValue]('columns');
  }
  set columns(value) {
    this[dartx.setProperty]('columns', value, '');
  }
  get content() {
    return this[dartx.getPropertyValue]('content');
  }
  set content(value) {
    this[dartx.setProperty]('content', value, '');
  }
  get counterIncrement() {
    return this[dartx.getPropertyValue]('counter-increment');
  }
  set counterIncrement(value) {
    this[dartx.setProperty]('counter-increment', value, '');
  }
  get counterReset() {
    return this[dartx.getPropertyValue]('counter-reset');
  }
  set counterReset(value) {
    this[dartx.setProperty]('counter-reset', value, '');
  }
  get cursor() {
    return this[dartx.getPropertyValue]('cursor');
  }
  set cursor(value) {
    this[dartx.setProperty]('cursor', value, '');
  }
  get direction() {
    return this[dartx.getPropertyValue]('direction');
  }
  set direction(value) {
    this[dartx.setProperty]('direction', value, '');
  }
  get display() {
    return this[dartx.getPropertyValue]('display');
  }
  set display(value) {
    this[dartx.setProperty]('display', value, '');
  }
  get emptyCells() {
    return this[dartx.getPropertyValue]('empty-cells');
  }
  set emptyCells(value) {
    this[dartx.setProperty]('empty-cells', value, '');
  }
  get filter() {
    return this[dartx.getPropertyValue]('filter');
  }
  set filter(value) {
    this[dartx.setProperty]('filter', value, '');
  }
  get flex() {
    return this[dartx.getPropertyValue]('flex');
  }
  set flex(value) {
    this[dartx.setProperty]('flex', value, '');
  }
  get flexBasis() {
    return this[dartx.getPropertyValue]('flex-basis');
  }
  set flexBasis(value) {
    this[dartx.setProperty]('flex-basis', value, '');
  }
  get flexDirection() {
    return this[dartx.getPropertyValue]('flex-direction');
  }
  set flexDirection(value) {
    this[dartx.setProperty]('flex-direction', value, '');
  }
  get flexFlow() {
    return this[dartx.getPropertyValue]('flex-flow');
  }
  set flexFlow(value) {
    this[dartx.setProperty]('flex-flow', value, '');
  }
  get flexGrow() {
    return this[dartx.getPropertyValue]('flex-grow');
  }
  set flexGrow(value) {
    this[dartx.setProperty]('flex-grow', value, '');
  }
  get flexShrink() {
    return this[dartx.getPropertyValue]('flex-shrink');
  }
  set flexShrink(value) {
    this[dartx.setProperty]('flex-shrink', value, '');
  }
  get flexWrap() {
    return this[dartx.getPropertyValue]('flex-wrap');
  }
  set flexWrap(value) {
    this[dartx.setProperty]('flex-wrap', value, '');
  }
  get float() {
    return this[dartx.getPropertyValue]('float');
  }
  set float(value) {
    this[dartx.setProperty]('float', value, '');
  }
  get font() {
    return this[dartx.getPropertyValue]('font');
  }
  set font(value) {
    this[dartx.setProperty]('font', value, '');
  }
  get fontFamily() {
    return this[dartx.getPropertyValue]('font-family');
  }
  set fontFamily(value) {
    this[dartx.setProperty]('font-family', value, '');
  }
  get fontFeatureSettings() {
    return this[dartx.getPropertyValue]('font-feature-settings');
  }
  set fontFeatureSettings(value) {
    this[dartx.setProperty]('font-feature-settings', value, '');
  }
  get fontKerning() {
    return this[dartx.getPropertyValue]('font-kerning');
  }
  set fontKerning(value) {
    this[dartx.setProperty]('font-kerning', value, '');
  }
  get fontSize() {
    return this[dartx.getPropertyValue]('font-size');
  }
  set fontSize(value) {
    this[dartx.setProperty]('font-size', value, '');
  }
  get fontSizeDelta() {
    return this[dartx.getPropertyValue]('font-size-delta');
  }
  set fontSizeDelta(value) {
    this[dartx.setProperty]('font-size-delta', value, '');
  }
  get fontSmoothing() {
    return this[dartx.getPropertyValue]('font-smoothing');
  }
  set fontSmoothing(value) {
    this[dartx.setProperty]('font-smoothing', value, '');
  }
  get fontStretch() {
    return this[dartx.getPropertyValue]('font-stretch');
  }
  set fontStretch(value) {
    this[dartx.setProperty]('font-stretch', value, '');
  }
  get fontStyle() {
    return this[dartx.getPropertyValue]('font-style');
  }
  set fontStyle(value) {
    this[dartx.setProperty]('font-style', value, '');
  }
  get fontVariant() {
    return this[dartx.getPropertyValue]('font-variant');
  }
  set fontVariant(value) {
    this[dartx.setProperty]('font-variant', value, '');
  }
  get fontVariantLigatures() {
    return this[dartx.getPropertyValue]('font-variant-ligatures');
  }
  set fontVariantLigatures(value) {
    this[dartx.setProperty]('font-variant-ligatures', value, '');
  }
  get fontWeight() {
    return this[dartx.getPropertyValue]('font-weight');
  }
  set fontWeight(value) {
    this[dartx.setProperty]('font-weight', value, '');
  }
  get grid() {
    return this[dartx.getPropertyValue]('grid');
  }
  set grid(value) {
    this[dartx.setProperty]('grid', value, '');
  }
  get gridArea() {
    return this[dartx.getPropertyValue]('grid-area');
  }
  set gridArea(value) {
    this[dartx.setProperty]('grid-area', value, '');
  }
  get gridAutoColumns() {
    return this[dartx.getPropertyValue]('grid-auto-columns');
  }
  set gridAutoColumns(value) {
    this[dartx.setProperty]('grid-auto-columns', value, '');
  }
  get gridAutoFlow() {
    return this[dartx.getPropertyValue]('grid-auto-flow');
  }
  set gridAutoFlow(value) {
    this[dartx.setProperty]('grid-auto-flow', value, '');
  }
  get gridAutoRows() {
    return this[dartx.getPropertyValue]('grid-auto-rows');
  }
  set gridAutoRows(value) {
    this[dartx.setProperty]('grid-auto-rows', value, '');
  }
  get gridColumn() {
    return this[dartx.getPropertyValue]('grid-column');
  }
  set gridColumn(value) {
    this[dartx.setProperty]('grid-column', value, '');
  }
  get gridColumnEnd() {
    return this[dartx.getPropertyValue]('grid-column-end');
  }
  set gridColumnEnd(value) {
    this[dartx.setProperty]('grid-column-end', value, '');
  }
  get gridColumnStart() {
    return this[dartx.getPropertyValue]('grid-column-start');
  }
  set gridColumnStart(value) {
    this[dartx.setProperty]('grid-column-start', value, '');
  }
  get gridRow() {
    return this[dartx.getPropertyValue]('grid-row');
  }
  set gridRow(value) {
    this[dartx.setProperty]('grid-row', value, '');
  }
  get gridRowEnd() {
    return this[dartx.getPropertyValue]('grid-row-end');
  }
  set gridRowEnd(value) {
    this[dartx.setProperty]('grid-row-end', value, '');
  }
  get gridRowStart() {
    return this[dartx.getPropertyValue]('grid-row-start');
  }
  set gridRowStart(value) {
    this[dartx.setProperty]('grid-row-start', value, '');
  }
  get gridTemplate() {
    return this[dartx.getPropertyValue]('grid-template');
  }
  set gridTemplate(value) {
    this[dartx.setProperty]('grid-template', value, '');
  }
  get gridTemplateAreas() {
    return this[dartx.getPropertyValue]('grid-template-areas');
  }
  set gridTemplateAreas(value) {
    this[dartx.setProperty]('grid-template-areas', value, '');
  }
  get gridTemplateColumns() {
    return this[dartx.getPropertyValue]('grid-template-columns');
  }
  set gridTemplateColumns(value) {
    this[dartx.setProperty]('grid-template-columns', value, '');
  }
  get gridTemplateRows() {
    return this[dartx.getPropertyValue]('grid-template-rows');
  }
  set gridTemplateRows(value) {
    this[dartx.setProperty]('grid-template-rows', value, '');
  }
  get height() {
    return this[dartx.getPropertyValue]('height');
  }
  set height(value) {
    this[dartx.setProperty]('height', value, '');
  }
  get highlight() {
    return this[dartx.getPropertyValue]('highlight');
  }
  set highlight(value) {
    this[dartx.setProperty]('highlight', value, '');
  }
  get hyphenateCharacter() {
    return this[dartx.getPropertyValue]('hyphenate-character');
  }
  set hyphenateCharacter(value) {
    this[dartx.setProperty]('hyphenate-character', value, '');
  }
  get imageRendering() {
    return this[dartx.getPropertyValue]('image-rendering');
  }
  set imageRendering(value) {
    this[dartx.setProperty]('image-rendering', value, '');
  }
  get isolation() {
    return this[dartx.getPropertyValue]('isolation');
  }
  set isolation(value) {
    this[dartx.setProperty]('isolation', value, '');
  }
  get justifyContent() {
    return this[dartx.getPropertyValue]('justify-content');
  }
  set justifyContent(value) {
    this[dartx.setProperty]('justify-content', value, '');
  }
  get justifySelf() {
    return this[dartx.getPropertyValue]('justify-self');
  }
  set justifySelf(value) {
    this[dartx.setProperty]('justify-self', value, '');
  }
  get left() {
    return this[dartx.getPropertyValue]('left');
  }
  set left(value) {
    this[dartx.setProperty]('left', value, '');
  }
  get letterSpacing() {
    return this[dartx.getPropertyValue]('letter-spacing');
  }
  set letterSpacing(value) {
    this[dartx.setProperty]('letter-spacing', value, '');
  }
  get lineBoxContain() {
    return this[dartx.getPropertyValue]('line-box-contain');
  }
  set lineBoxContain(value) {
    this[dartx.setProperty]('line-box-contain', value, '');
  }
  get lineBreak() {
    return this[dartx.getPropertyValue]('line-break');
  }
  set lineBreak(value) {
    this[dartx.setProperty]('line-break', value, '');
  }
  get lineClamp() {
    return this[dartx.getPropertyValue]('line-clamp');
  }
  set lineClamp(value) {
    this[dartx.setProperty]('line-clamp', value, '');
  }
  get lineHeight() {
    return this[dartx.getPropertyValue]('line-height');
  }
  set lineHeight(value) {
    this[dartx.setProperty]('line-height', value, '');
  }
  get listStyle() {
    return this[dartx.getPropertyValue]('list-style');
  }
  set listStyle(value) {
    this[dartx.setProperty]('list-style', value, '');
  }
  get listStyleImage() {
    return this[dartx.getPropertyValue]('list-style-image');
  }
  set listStyleImage(value) {
    this[dartx.setProperty]('list-style-image', value, '');
  }
  get listStylePosition() {
    return this[dartx.getPropertyValue]('list-style-position');
  }
  set listStylePosition(value) {
    this[dartx.setProperty]('list-style-position', value, '');
  }
  get listStyleType() {
    return this[dartx.getPropertyValue]('list-style-type');
  }
  set listStyleType(value) {
    this[dartx.setProperty]('list-style-type', value, '');
  }
  get locale() {
    return this[dartx.getPropertyValue]('locale');
  }
  set locale(value) {
    this[dartx.setProperty]('locale', value, '');
  }
  get logicalHeight() {
    return this[dartx.getPropertyValue]('logical-height');
  }
  set logicalHeight(value) {
    this[dartx.setProperty]('logical-height', value, '');
  }
  get logicalWidth() {
    return this[dartx.getPropertyValue]('logical-width');
  }
  set logicalWidth(value) {
    this[dartx.setProperty]('logical-width', value, '');
  }
  get margin() {
    return this[dartx.getPropertyValue]('margin');
  }
  set margin(value) {
    this[dartx.setProperty]('margin', value, '');
  }
  get marginAfter() {
    return this[dartx.getPropertyValue]('margin-after');
  }
  set marginAfter(value) {
    this[dartx.setProperty]('margin-after', value, '');
  }
  get marginAfterCollapse() {
    return this[dartx.getPropertyValue]('margin-after-collapse');
  }
  set marginAfterCollapse(value) {
    this[dartx.setProperty]('margin-after-collapse', value, '');
  }
  get marginBefore() {
    return this[dartx.getPropertyValue]('margin-before');
  }
  set marginBefore(value) {
    this[dartx.setProperty]('margin-before', value, '');
  }
  get marginBeforeCollapse() {
    return this[dartx.getPropertyValue]('margin-before-collapse');
  }
  set marginBeforeCollapse(value) {
    this[dartx.setProperty]('margin-before-collapse', value, '');
  }
  get marginBottom() {
    return this[dartx.getPropertyValue]('margin-bottom');
  }
  set marginBottom(value) {
    this[dartx.setProperty]('margin-bottom', value, '');
  }
  get marginBottomCollapse() {
    return this[dartx.getPropertyValue]('margin-bottom-collapse');
  }
  set marginBottomCollapse(value) {
    this[dartx.setProperty]('margin-bottom-collapse', value, '');
  }
  get marginCollapse() {
    return this[dartx.getPropertyValue]('margin-collapse');
  }
  set marginCollapse(value) {
    this[dartx.setProperty]('margin-collapse', value, '');
  }
  get marginEnd() {
    return this[dartx.getPropertyValue]('margin-end');
  }
  set marginEnd(value) {
    this[dartx.setProperty]('margin-end', value, '');
  }
  get marginLeft() {
    return this[dartx.getPropertyValue]('margin-left');
  }
  set marginLeft(value) {
    this[dartx.setProperty]('margin-left', value, '');
  }
  get marginRight() {
    return this[dartx.getPropertyValue]('margin-right');
  }
  set marginRight(value) {
    this[dartx.setProperty]('margin-right', value, '');
  }
  get marginStart() {
    return this[dartx.getPropertyValue]('margin-start');
  }
  set marginStart(value) {
    this[dartx.setProperty]('margin-start', value, '');
  }
  get marginTop() {
    return this[dartx.getPropertyValue]('margin-top');
  }
  set marginTop(value) {
    this[dartx.setProperty]('margin-top', value, '');
  }
  get marginTopCollapse() {
    return this[dartx.getPropertyValue]('margin-top-collapse');
  }
  set marginTopCollapse(value) {
    this[dartx.setProperty]('margin-top-collapse', value, '');
  }
  get mask() {
    return this[dartx.getPropertyValue]('mask');
  }
  set mask(value) {
    this[dartx.setProperty]('mask', value, '');
  }
  get maskBoxImage() {
    return this[dartx.getPropertyValue]('mask-box-image');
  }
  set maskBoxImage(value) {
    this[dartx.setProperty]('mask-box-image', value, '');
  }
  get maskBoxImageOutset() {
    return this[dartx.getPropertyValue]('mask-box-image-outset');
  }
  set maskBoxImageOutset(value) {
    this[dartx.setProperty]('mask-box-image-outset', value, '');
  }
  get maskBoxImageRepeat() {
    return this[dartx.getPropertyValue]('mask-box-image-repeat');
  }
  set maskBoxImageRepeat(value) {
    this[dartx.setProperty]('mask-box-image-repeat', value, '');
  }
  get maskBoxImageSlice() {
    return this[dartx.getPropertyValue]('mask-box-image-slice');
  }
  set maskBoxImageSlice(value) {
    this[dartx.setProperty]('mask-box-image-slice', value, '');
  }
  get maskBoxImageSource() {
    return this[dartx.getPropertyValue]('mask-box-image-source');
  }
  set maskBoxImageSource(value) {
    this[dartx.setProperty]('mask-box-image-source', value, '');
  }
  get maskBoxImageWidth() {
    return this[dartx.getPropertyValue]('mask-box-image-width');
  }
  set maskBoxImageWidth(value) {
    this[dartx.setProperty]('mask-box-image-width', value, '');
  }
  get maskClip() {
    return this[dartx.getPropertyValue]('mask-clip');
  }
  set maskClip(value) {
    this[dartx.setProperty]('mask-clip', value, '');
  }
  get maskComposite() {
    return this[dartx.getPropertyValue]('mask-composite');
  }
  set maskComposite(value) {
    this[dartx.setProperty]('mask-composite', value, '');
  }
  get maskImage() {
    return this[dartx.getPropertyValue]('mask-image');
  }
  set maskImage(value) {
    this[dartx.setProperty]('mask-image', value, '');
  }
  get maskOrigin() {
    return this[dartx.getPropertyValue]('mask-origin');
  }
  set maskOrigin(value) {
    this[dartx.setProperty]('mask-origin', value, '');
  }
  get maskPosition() {
    return this[dartx.getPropertyValue]('mask-position');
  }
  set maskPosition(value) {
    this[dartx.setProperty]('mask-position', value, '');
  }
  get maskPositionX() {
    return this[dartx.getPropertyValue]('mask-position-x');
  }
  set maskPositionX(value) {
    this[dartx.setProperty]('mask-position-x', value, '');
  }
  get maskPositionY() {
    return this[dartx.getPropertyValue]('mask-position-y');
  }
  set maskPositionY(value) {
    this[dartx.setProperty]('mask-position-y', value, '');
  }
  get maskRepeat() {
    return this[dartx.getPropertyValue]('mask-repeat');
  }
  set maskRepeat(value) {
    this[dartx.setProperty]('mask-repeat', value, '');
  }
  get maskRepeatX() {
    return this[dartx.getPropertyValue]('mask-repeat-x');
  }
  set maskRepeatX(value) {
    this[dartx.setProperty]('mask-repeat-x', value, '');
  }
  get maskRepeatY() {
    return this[dartx.getPropertyValue]('mask-repeat-y');
  }
  set maskRepeatY(value) {
    this[dartx.setProperty]('mask-repeat-y', value, '');
  }
  get maskSize() {
    return this[dartx.getPropertyValue]('mask-size');
  }
  set maskSize(value) {
    this[dartx.setProperty]('mask-size', value, '');
  }
  get maskSourceType() {
    return this[dartx.getPropertyValue]('mask-source-type');
  }
  set maskSourceType(value) {
    this[dartx.setProperty]('mask-source-type', value, '');
  }
  get maxHeight() {
    return this[dartx.getPropertyValue]('max-height');
  }
  set maxHeight(value) {
    this[dartx.setProperty]('max-height', value, '');
  }
  get maxLogicalHeight() {
    return this[dartx.getPropertyValue]('max-logical-height');
  }
  set maxLogicalHeight(value) {
    this[dartx.setProperty]('max-logical-height', value, '');
  }
  get maxLogicalWidth() {
    return this[dartx.getPropertyValue]('max-logical-width');
  }
  set maxLogicalWidth(value) {
    this[dartx.setProperty]('max-logical-width', value, '');
  }
  get maxWidth() {
    return this[dartx.getPropertyValue]('max-width');
  }
  set maxWidth(value) {
    this[dartx.setProperty]('max-width', value, '');
  }
  get maxZoom() {
    return this[dartx.getPropertyValue]('max-zoom');
  }
  set maxZoom(value) {
    this[dartx.setProperty]('max-zoom', value, '');
  }
  get minHeight() {
    return this[dartx.getPropertyValue]('min-height');
  }
  set minHeight(value) {
    this[dartx.setProperty]('min-height', value, '');
  }
  get minLogicalHeight() {
    return this[dartx.getPropertyValue]('min-logical-height');
  }
  set minLogicalHeight(value) {
    this[dartx.setProperty]('min-logical-height', value, '');
  }
  get minLogicalWidth() {
    return this[dartx.getPropertyValue]('min-logical-width');
  }
  set minLogicalWidth(value) {
    this[dartx.setProperty]('min-logical-width', value, '');
  }
  get minWidth() {
    return this[dartx.getPropertyValue]('min-width');
  }
  set minWidth(value) {
    this[dartx.setProperty]('min-width', value, '');
  }
  get minZoom() {
    return this[dartx.getPropertyValue]('min-zoom');
  }
  set minZoom(value) {
    this[dartx.setProperty]('min-zoom', value, '');
  }
  get mixBlendMode() {
    return this[dartx.getPropertyValue]('mix-blend-mode');
  }
  set mixBlendMode(value) {
    this[dartx.setProperty]('mix-blend-mode', value, '');
  }
  get objectFit() {
    return this[dartx.getPropertyValue]('object-fit');
  }
  set objectFit(value) {
    this[dartx.setProperty]('object-fit', value, '');
  }
  get objectPosition() {
    return this[dartx.getPropertyValue]('object-position');
  }
  set objectPosition(value) {
    this[dartx.setProperty]('object-position', value, '');
  }
  get opacity() {
    return this[dartx.getPropertyValue]('opacity');
  }
  set opacity(value) {
    this[dartx.setProperty]('opacity', value, '');
  }
  get order() {
    return this[dartx.getPropertyValue]('order');
  }
  set order(value) {
    this[dartx.setProperty]('order', value, '');
  }
  get orientation() {
    return this[dartx.getPropertyValue]('orientation');
  }
  set orientation(value) {
    this[dartx.setProperty]('orientation', value, '');
  }
  get orphans() {
    return this[dartx.getPropertyValue]('orphans');
  }
  set orphans(value) {
    this[dartx.setProperty]('orphans', value, '');
  }
  get outline() {
    return this[dartx.getPropertyValue]('outline');
  }
  set outline(value) {
    this[dartx.setProperty]('outline', value, '');
  }
  get outlineColor() {
    return this[dartx.getPropertyValue]('outline-color');
  }
  set outlineColor(value) {
    this[dartx.setProperty]('outline-color', value, '');
  }
  get outlineOffset() {
    return this[dartx.getPropertyValue]('outline-offset');
  }
  set outlineOffset(value) {
    this[dartx.setProperty]('outline-offset', value, '');
  }
  get outlineStyle() {
    return this[dartx.getPropertyValue]('outline-style');
  }
  set outlineStyle(value) {
    this[dartx.setProperty]('outline-style', value, '');
  }
  get outlineWidth() {
    return this[dartx.getPropertyValue]('outline-width');
  }
  set outlineWidth(value) {
    this[dartx.setProperty]('outline-width', value, '');
  }
  get overflow() {
    return this[dartx.getPropertyValue]('overflow');
  }
  set overflow(value) {
    this[dartx.setProperty]('overflow', value, '');
  }
  get overflowWrap() {
    return this[dartx.getPropertyValue]('overflow-wrap');
  }
  set overflowWrap(value) {
    this[dartx.setProperty]('overflow-wrap', value, '');
  }
  get overflowX() {
    return this[dartx.getPropertyValue]('overflow-x');
  }
  set overflowX(value) {
    this[dartx.setProperty]('overflow-x', value, '');
  }
  get overflowY() {
    return this[dartx.getPropertyValue]('overflow-y');
  }
  set overflowY(value) {
    this[dartx.setProperty]('overflow-y', value, '');
  }
  get padding() {
    return this[dartx.getPropertyValue]('padding');
  }
  set padding(value) {
    this[dartx.setProperty]('padding', value, '');
  }
  get paddingAfter() {
    return this[dartx.getPropertyValue]('padding-after');
  }
  set paddingAfter(value) {
    this[dartx.setProperty]('padding-after', value, '');
  }
  get paddingBefore() {
    return this[dartx.getPropertyValue]('padding-before');
  }
  set paddingBefore(value) {
    this[dartx.setProperty]('padding-before', value, '');
  }
  get paddingBottom() {
    return this[dartx.getPropertyValue]('padding-bottom');
  }
  set paddingBottom(value) {
    this[dartx.setProperty]('padding-bottom', value, '');
  }
  get paddingEnd() {
    return this[dartx.getPropertyValue]('padding-end');
  }
  set paddingEnd(value) {
    this[dartx.setProperty]('padding-end', value, '');
  }
  get paddingLeft() {
    return this[dartx.getPropertyValue]('padding-left');
  }
  set paddingLeft(value) {
    this[dartx.setProperty]('padding-left', value, '');
  }
  get paddingRight() {
    return this[dartx.getPropertyValue]('padding-right');
  }
  set paddingRight(value) {
    this[dartx.setProperty]('padding-right', value, '');
  }
  get paddingStart() {
    return this[dartx.getPropertyValue]('padding-start');
  }
  set paddingStart(value) {
    this[dartx.setProperty]('padding-start', value, '');
  }
  get paddingTop() {
    return this[dartx.getPropertyValue]('padding-top');
  }
  set paddingTop(value) {
    this[dartx.setProperty]('padding-top', value, '');
  }
  get page() {
    return this[dartx.getPropertyValue]('page');
  }
  set page(value) {
    this[dartx.setProperty]('page', value, '');
  }
  get pageBreakAfter() {
    return this[dartx.getPropertyValue]('page-break-after');
  }
  set pageBreakAfter(value) {
    this[dartx.setProperty]('page-break-after', value, '');
  }
  get pageBreakBefore() {
    return this[dartx.getPropertyValue]('page-break-before');
  }
  set pageBreakBefore(value) {
    this[dartx.setProperty]('page-break-before', value, '');
  }
  get pageBreakInside() {
    return this[dartx.getPropertyValue]('page-break-inside');
  }
  set pageBreakInside(value) {
    this[dartx.setProperty]('page-break-inside', value, '');
  }
  get perspective() {
    return this[dartx.getPropertyValue]('perspective');
  }
  set perspective(value) {
    this[dartx.setProperty]('perspective', value, '');
  }
  get perspectiveOrigin() {
    return this[dartx.getPropertyValue]('perspective-origin');
  }
  set perspectiveOrigin(value) {
    this[dartx.setProperty]('perspective-origin', value, '');
  }
  get perspectiveOriginX() {
    return this[dartx.getPropertyValue]('perspective-origin-x');
  }
  set perspectiveOriginX(value) {
    this[dartx.setProperty]('perspective-origin-x', value, '');
  }
  get perspectiveOriginY() {
    return this[dartx.getPropertyValue]('perspective-origin-y');
  }
  set perspectiveOriginY(value) {
    this[dartx.setProperty]('perspective-origin-y', value, '');
  }
  get pointerEvents() {
    return this[dartx.getPropertyValue]('pointer-events');
  }
  set pointerEvents(value) {
    this[dartx.setProperty]('pointer-events', value, '');
  }
  get position() {
    return this[dartx.getPropertyValue]('position');
  }
  set position(value) {
    this[dartx.setProperty]('position', value, '');
  }
  get printColorAdjust() {
    return this[dartx.getPropertyValue]('print-color-adjust');
  }
  set printColorAdjust(value) {
    this[dartx.setProperty]('print-color-adjust', value, '');
  }
  get quotes() {
    return this[dartx.getPropertyValue]('quotes');
  }
  set quotes(value) {
    this[dartx.setProperty]('quotes', value, '');
  }
  get resize() {
    return this[dartx.getPropertyValue]('resize');
  }
  set resize(value) {
    this[dartx.setProperty]('resize', value, '');
  }
  get right() {
    return this[dartx.getPropertyValue]('right');
  }
  set right(value) {
    this[dartx.setProperty]('right', value, '');
  }
  get rtlOrdering() {
    return this[dartx.getPropertyValue]('rtl-ordering');
  }
  set rtlOrdering(value) {
    this[dartx.setProperty]('rtl-ordering', value, '');
  }
  get rubyPosition() {
    return this[dartx.getPropertyValue]('ruby-position');
  }
  set rubyPosition(value) {
    this[dartx.setProperty]('ruby-position', value, '');
  }
  get scrollBehavior() {
    return this[dartx.getPropertyValue]('scroll-behavior');
  }
  set scrollBehavior(value) {
    this[dartx.setProperty]('scroll-behavior', value, '');
  }
  get shapeImageThreshold() {
    return this[dartx.getPropertyValue]('shape-image-threshold');
  }
  set shapeImageThreshold(value) {
    this[dartx.setProperty]('shape-image-threshold', value, '');
  }
  get shapeMargin() {
    return this[dartx.getPropertyValue]('shape-margin');
  }
  set shapeMargin(value) {
    this[dartx.setProperty]('shape-margin', value, '');
  }
  get shapeOutside() {
    return this[dartx.getPropertyValue]('shape-outside');
  }
  set shapeOutside(value) {
    this[dartx.setProperty]('shape-outside', value, '');
  }
  get size() {
    return this[dartx.getPropertyValue]('size');
  }
  set size(value) {
    this[dartx.setProperty]('size', value, '');
  }
  get speak() {
    return this[dartx.getPropertyValue]('speak');
  }
  set speak(value) {
    this[dartx.setProperty]('speak', value, '');
  }
  get src() {
    return this[dartx.getPropertyValue]('src');
  }
  set src(value) {
    this[dartx.setProperty]('src', value, '');
  }
  get tabSize() {
    return this[dartx.getPropertyValue]('tab-size');
  }
  set tabSize(value) {
    this[dartx.setProperty]('tab-size', value, '');
  }
  get tableLayout() {
    return this[dartx.getPropertyValue]('table-layout');
  }
  set tableLayout(value) {
    this[dartx.setProperty]('table-layout', value, '');
  }
  get tapHighlightColor() {
    return this[dartx.getPropertyValue]('tap-highlight-color');
  }
  set tapHighlightColor(value) {
    this[dartx.setProperty]('tap-highlight-color', value, '');
  }
  get textAlign() {
    return this[dartx.getPropertyValue]('text-align');
  }
  set textAlign(value) {
    this[dartx.setProperty]('text-align', value, '');
  }
  get textAlignLast() {
    return this[dartx.getPropertyValue]('text-align-last');
  }
  set textAlignLast(value) {
    this[dartx.setProperty]('text-align-last', value, '');
  }
  get textCombine() {
    return this[dartx.getPropertyValue]('text-combine');
  }
  set textCombine(value) {
    this[dartx.setProperty]('text-combine', value, '');
  }
  get textDecoration() {
    return this[dartx.getPropertyValue]('text-decoration');
  }
  set textDecoration(value) {
    this[dartx.setProperty]('text-decoration', value, '');
  }
  get textDecorationColor() {
    return this[dartx.getPropertyValue]('text-decoration-color');
  }
  set textDecorationColor(value) {
    this[dartx.setProperty]('text-decoration-color', value, '');
  }
  get textDecorationLine() {
    return this[dartx.getPropertyValue]('text-decoration-line');
  }
  set textDecorationLine(value) {
    this[dartx.setProperty]('text-decoration-line', value, '');
  }
  get textDecorationStyle() {
    return this[dartx.getPropertyValue]('text-decoration-style');
  }
  set textDecorationStyle(value) {
    this[dartx.setProperty]('text-decoration-style', value, '');
  }
  get textDecorationsInEffect() {
    return this[dartx.getPropertyValue]('text-decorations-in-effect');
  }
  set textDecorationsInEffect(value) {
    this[dartx.setProperty]('text-decorations-in-effect', value, '');
  }
  get textEmphasis() {
    return this[dartx.getPropertyValue]('text-emphasis');
  }
  set textEmphasis(value) {
    this[dartx.setProperty]('text-emphasis', value, '');
  }
  get textEmphasisColor() {
    return this[dartx.getPropertyValue]('text-emphasis-color');
  }
  set textEmphasisColor(value) {
    this[dartx.setProperty]('text-emphasis-color', value, '');
  }
  get textEmphasisPosition() {
    return this[dartx.getPropertyValue]('text-emphasis-position');
  }
  set textEmphasisPosition(value) {
    this[dartx.setProperty]('text-emphasis-position', value, '');
  }
  get textEmphasisStyle() {
    return this[dartx.getPropertyValue]('text-emphasis-style');
  }
  set textEmphasisStyle(value) {
    this[dartx.setProperty]('text-emphasis-style', value, '');
  }
  get textFillColor() {
    return this[dartx.getPropertyValue]('text-fill-color');
  }
  set textFillColor(value) {
    this[dartx.setProperty]('text-fill-color', value, '');
  }
  get textIndent() {
    return this[dartx.getPropertyValue]('text-indent');
  }
  set textIndent(value) {
    this[dartx.setProperty]('text-indent', value, '');
  }
  get textJustify() {
    return this[dartx.getPropertyValue]('text-justify');
  }
  set textJustify(value) {
    this[dartx.setProperty]('text-justify', value, '');
  }
  get textLineThroughColor() {
    return this[dartx.getPropertyValue]('text-line-through-color');
  }
  set textLineThroughColor(value) {
    this[dartx.setProperty]('text-line-through-color', value, '');
  }
  get textLineThroughMode() {
    return this[dartx.getPropertyValue]('text-line-through-mode');
  }
  set textLineThroughMode(value) {
    this[dartx.setProperty]('text-line-through-mode', value, '');
  }
  get textLineThroughStyle() {
    return this[dartx.getPropertyValue]('text-line-through-style');
  }
  set textLineThroughStyle(value) {
    this[dartx.setProperty]('text-line-through-style', value, '');
  }
  get textLineThroughWidth() {
    return this[dartx.getPropertyValue]('text-line-through-width');
  }
  set textLineThroughWidth(value) {
    this[dartx.setProperty]('text-line-through-width', value, '');
  }
  get textOrientation() {
    return this[dartx.getPropertyValue]('text-orientation');
  }
  set textOrientation(value) {
    this[dartx.setProperty]('text-orientation', value, '');
  }
  get textOverflow() {
    return this[dartx.getPropertyValue]('text-overflow');
  }
  set textOverflow(value) {
    this[dartx.setProperty]('text-overflow', value, '');
  }
  get textOverlineColor() {
    return this[dartx.getPropertyValue]('text-overline-color');
  }
  set textOverlineColor(value) {
    this[dartx.setProperty]('text-overline-color', value, '');
  }
  get textOverlineMode() {
    return this[dartx.getPropertyValue]('text-overline-mode');
  }
  set textOverlineMode(value) {
    this[dartx.setProperty]('text-overline-mode', value, '');
  }
  get textOverlineStyle() {
    return this[dartx.getPropertyValue]('text-overline-style');
  }
  set textOverlineStyle(value) {
    this[dartx.setProperty]('text-overline-style', value, '');
  }
  get textOverlineWidth() {
    return this[dartx.getPropertyValue]('text-overline-width');
  }
  set textOverlineWidth(value) {
    this[dartx.setProperty]('text-overline-width', value, '');
  }
  get textRendering() {
    return this[dartx.getPropertyValue]('text-rendering');
  }
  set textRendering(value) {
    this[dartx.setProperty]('text-rendering', value, '');
  }
  get textSecurity() {
    return this[dartx.getPropertyValue]('text-security');
  }
  set textSecurity(value) {
    this[dartx.setProperty]('text-security', value, '');
  }
  get textShadow() {
    return this[dartx.getPropertyValue]('text-shadow');
  }
  set textShadow(value) {
    this[dartx.setProperty]('text-shadow', value, '');
  }
  get textStroke() {
    return this[dartx.getPropertyValue]('text-stroke');
  }
  set textStroke(value) {
    this[dartx.setProperty]('text-stroke', value, '');
  }
  get textStrokeColor() {
    return this[dartx.getPropertyValue]('text-stroke-color');
  }
  set textStrokeColor(value) {
    this[dartx.setProperty]('text-stroke-color', value, '');
  }
  get textStrokeWidth() {
    return this[dartx.getPropertyValue]('text-stroke-width');
  }
  set textStrokeWidth(value) {
    this[dartx.setProperty]('text-stroke-width', value, '');
  }
  get textTransform() {
    return this[dartx.getPropertyValue]('text-transform');
  }
  set textTransform(value) {
    this[dartx.setProperty]('text-transform', value, '');
  }
  get textUnderlineColor() {
    return this[dartx.getPropertyValue]('text-underline-color');
  }
  set textUnderlineColor(value) {
    this[dartx.setProperty]('text-underline-color', value, '');
  }
  get textUnderlineMode() {
    return this[dartx.getPropertyValue]('text-underline-mode');
  }
  set textUnderlineMode(value) {
    this[dartx.setProperty]('text-underline-mode', value, '');
  }
  get textUnderlinePosition() {
    return this[dartx.getPropertyValue]('text-underline-position');
  }
  set textUnderlinePosition(value) {
    this[dartx.setProperty]('text-underline-position', value, '');
  }
  get textUnderlineStyle() {
    return this[dartx.getPropertyValue]('text-underline-style');
  }
  set textUnderlineStyle(value) {
    this[dartx.setProperty]('text-underline-style', value, '');
  }
  get textUnderlineWidth() {
    return this[dartx.getPropertyValue]('text-underline-width');
  }
  set textUnderlineWidth(value) {
    this[dartx.setProperty]('text-underline-width', value, '');
  }
  get top() {
    return this[dartx.getPropertyValue]('top');
  }
  set top(value) {
    this[dartx.setProperty]('top', value, '');
  }
  get touchAction() {
    return this[dartx.getPropertyValue]('touch-action');
  }
  set touchAction(value) {
    this[dartx.setProperty]('touch-action', value, '');
  }
  get touchActionDelay() {
    return this[dartx.getPropertyValue]('touch-action-delay');
  }
  set touchActionDelay(value) {
    this[dartx.setProperty]('touch-action-delay', value, '');
  }
  get transform() {
    return this[dartx.getPropertyValue]('transform');
  }
  set transform(value) {
    this[dartx.setProperty]('transform', value, '');
  }
  get transformOrigin() {
    return this[dartx.getPropertyValue]('transform-origin');
  }
  set transformOrigin(value) {
    this[dartx.setProperty]('transform-origin', value, '');
  }
  get transformOriginX() {
    return this[dartx.getPropertyValue]('transform-origin-x');
  }
  set transformOriginX(value) {
    this[dartx.setProperty]('transform-origin-x', value, '');
  }
  get transformOriginY() {
    return this[dartx.getPropertyValue]('transform-origin-y');
  }
  set transformOriginY(value) {
    this[dartx.setProperty]('transform-origin-y', value, '');
  }
  get transformOriginZ() {
    return this[dartx.getPropertyValue]('transform-origin-z');
  }
  set transformOriginZ(value) {
    this[dartx.setProperty]('transform-origin-z', value, '');
  }
  get transformStyle() {
    return this[dartx.getPropertyValue]('transform-style');
  }
  set transformStyle(value) {
    this[dartx.setProperty]('transform-style', value, '');
  }
  get transition() {
    return this[dartx.getPropertyValue]('transition');
  }
  set transition(value) {
    this[dartx.setProperty]('transition', value, '');
  }
  get transitionDelay() {
    return this[dartx.getPropertyValue]('transition-delay');
  }
  set transitionDelay(value) {
    this[dartx.setProperty]('transition-delay', value, '');
  }
  get transitionDuration() {
    return this[dartx.getPropertyValue]('transition-duration');
  }
  set transitionDuration(value) {
    this[dartx.setProperty]('transition-duration', value, '');
  }
  get transitionProperty() {
    return this[dartx.getPropertyValue]('transition-property');
  }
  set transitionProperty(value) {
    this[dartx.setProperty]('transition-property', value, '');
  }
  get transitionTimingFunction() {
    return this[dartx.getPropertyValue]('transition-timing-function');
  }
  set transitionTimingFunction(value) {
    this[dartx.setProperty]('transition-timing-function', value, '');
  }
  get unicodeBidi() {
    return this[dartx.getPropertyValue]('unicode-bidi');
  }
  set unicodeBidi(value) {
    this[dartx.setProperty]('unicode-bidi', value, '');
  }
  get unicodeRange() {
    return this[dartx.getPropertyValue]('unicode-range');
  }
  set unicodeRange(value) {
    this[dartx.setProperty]('unicode-range', value, '');
  }
  get userDrag() {
    return this[dartx.getPropertyValue]('user-drag');
  }
  set userDrag(value) {
    this[dartx.setProperty]('user-drag', value, '');
  }
  get userModify() {
    return this[dartx.getPropertyValue]('user-modify');
  }
  set userModify(value) {
    this[dartx.setProperty]('user-modify', value, '');
  }
  get userSelect() {
    return this[dartx.getPropertyValue]('user-select');
  }
  set userSelect(value) {
    this[dartx.setProperty]('user-select', value, '');
  }
  get userZoom() {
    return this[dartx.getPropertyValue]('user-zoom');
  }
  set userZoom(value) {
    this[dartx.setProperty]('user-zoom', value, '');
  }
  get verticalAlign() {
    return this[dartx.getPropertyValue]('vertical-align');
  }
  set verticalAlign(value) {
    this[dartx.setProperty]('vertical-align', value, '');
  }
  get visibility() {
    return this[dartx.getPropertyValue]('visibility');
  }
  set visibility(value) {
    this[dartx.setProperty]('visibility', value, '');
  }
  get whiteSpace() {
    return this[dartx.getPropertyValue]('white-space');
  }
  set whiteSpace(value) {
    this[dartx.setProperty]('white-space', value, '');
  }
  get widows() {
    return this[dartx.getPropertyValue]('widows');
  }
  set widows(value) {
    this[dartx.setProperty]('widows', value, '');
  }
  get width() {
    return this[dartx.getPropertyValue]('width');
  }
  set width(value) {
    this[dartx.setProperty]('width', value, '');
  }
  get willChange() {
    return this[dartx.getPropertyValue]('will-change');
  }
  set willChange(value) {
    this[dartx.setProperty]('will-change', value, '');
  }
  get wordBreak() {
    return this[dartx.getPropertyValue]('word-break');
  }
  set wordBreak(value) {
    this[dartx.setProperty]('word-break', value, '');
  }
  get wordSpacing() {
    return this[dartx.getPropertyValue]('word-spacing');
  }
  set wordSpacing(value) {
    this[dartx.setProperty]('word-spacing', value, '');
  }
  get wordWrap() {
    return this[dartx.getPropertyValue]('word-wrap');
  }
  set wordWrap(value) {
    this[dartx.setProperty]('word-wrap', value, '');
  }
  get wrapFlow() {
    return this[dartx.getPropertyValue]('wrap-flow');
  }
  set wrapFlow(value) {
    this[dartx.setProperty]('wrap-flow', value, '');
  }
  get wrapThrough() {
    return this[dartx.getPropertyValue]('wrap-through');
  }
  set wrapThrough(value) {
    this[dartx.setProperty]('wrap-through', value, '');
  }
  get writingMode() {
    return this[dartx.getPropertyValue]('writing-mode');
  }
  set writingMode(value) {
    this[dartx.setProperty]('writing-mode', value, '');
  }
  get zIndex() {
    return this[dartx.getPropertyValue]('z-index');
  }
  set zIndex(value) {
    this[dartx.setProperty]('z-index', value, '');
  }
  get zoom() {
    return this[dartx.getPropertyValue]('zoom');
  }
  set zoom(value) {
    this[dartx.setProperty]('zoom', value, '');
  }
};
dart.setSignature(html$.CssStyleDeclarationBase, {
  getters: () => ({
    alignContent: dart.definiteFunctionType(core.String, []),
    alignItems: dart.definiteFunctionType(core.String, []),
    alignSelf: dart.definiteFunctionType(core.String, []),
    animation: dart.definiteFunctionType(core.String, []),
    animationDelay: dart.definiteFunctionType(core.String, []),
    animationDirection: dart.definiteFunctionType(core.String, []),
    animationDuration: dart.definiteFunctionType(core.String, []),
    animationFillMode: dart.definiteFunctionType(core.String, []),
    animationIterationCount: dart.definiteFunctionType(core.String, []),
    animationName: dart.definiteFunctionType(core.String, []),
    animationPlayState: dart.definiteFunctionType(core.String, []),
    animationTimingFunction: dart.definiteFunctionType(core.String, []),
    appRegion: dart.definiteFunctionType(core.String, []),
    appearance: dart.definiteFunctionType(core.String, []),
    aspectRatio: dart.definiteFunctionType(core.String, []),
    backfaceVisibility: dart.definiteFunctionType(core.String, []),
    background: dart.definiteFunctionType(core.String, []),
    backgroundAttachment: dart.definiteFunctionType(core.String, []),
    backgroundBlendMode: dart.definiteFunctionType(core.String, []),
    backgroundClip: dart.definiteFunctionType(core.String, []),
    backgroundColor: dart.definiteFunctionType(core.String, []),
    backgroundComposite: dart.definiteFunctionType(core.String, []),
    backgroundImage: dart.definiteFunctionType(core.String, []),
    backgroundOrigin: dart.definiteFunctionType(core.String, []),
    backgroundPosition: dart.definiteFunctionType(core.String, []),
    backgroundPositionX: dart.definiteFunctionType(core.String, []),
    backgroundPositionY: dart.definiteFunctionType(core.String, []),
    backgroundRepeat: dart.definiteFunctionType(core.String, []),
    backgroundRepeatX: dart.definiteFunctionType(core.String, []),
    backgroundRepeatY: dart.definiteFunctionType(core.String, []),
    backgroundSize: dart.definiteFunctionType(core.String, []),
    border: dart.definiteFunctionType(core.String, []),
    borderAfter: dart.definiteFunctionType(core.String, []),
    borderAfterColor: dart.definiteFunctionType(core.String, []),
    borderAfterStyle: dart.definiteFunctionType(core.String, []),
    borderAfterWidth: dart.definiteFunctionType(core.String, []),
    borderBefore: dart.definiteFunctionType(core.String, []),
    borderBeforeColor: dart.definiteFunctionType(core.String, []),
    borderBeforeStyle: dart.definiteFunctionType(core.String, []),
    borderBeforeWidth: dart.definiteFunctionType(core.String, []),
    borderBottom: dart.definiteFunctionType(core.String, []),
    borderBottomColor: dart.definiteFunctionType(core.String, []),
    borderBottomLeftRadius: dart.definiteFunctionType(core.String, []),
    borderBottomRightRadius: dart.definiteFunctionType(core.String, []),
    borderBottomStyle: dart.definiteFunctionType(core.String, []),
    borderBottomWidth: dart.definiteFunctionType(core.String, []),
    borderCollapse: dart.definiteFunctionType(core.String, []),
    borderColor: dart.definiteFunctionType(core.String, []),
    borderEnd: dart.definiteFunctionType(core.String, []),
    borderEndColor: dart.definiteFunctionType(core.String, []),
    borderEndStyle: dart.definiteFunctionType(core.String, []),
    borderEndWidth: dart.definiteFunctionType(core.String, []),
    borderFit: dart.definiteFunctionType(core.String, []),
    borderHorizontalSpacing: dart.definiteFunctionType(core.String, []),
    borderImage: dart.definiteFunctionType(core.String, []),
    borderImageOutset: dart.definiteFunctionType(core.String, []),
    borderImageRepeat: dart.definiteFunctionType(core.String, []),
    borderImageSlice: dart.definiteFunctionType(core.String, []),
    borderImageSource: dart.definiteFunctionType(core.String, []),
    borderImageWidth: dart.definiteFunctionType(core.String, []),
    borderLeft: dart.definiteFunctionType(core.String, []),
    borderLeftColor: dart.definiteFunctionType(core.String, []),
    borderLeftStyle: dart.definiteFunctionType(core.String, []),
    borderLeftWidth: dart.definiteFunctionType(core.String, []),
    borderRadius: dart.definiteFunctionType(core.String, []),
    borderRight: dart.definiteFunctionType(core.String, []),
    borderRightColor: dart.definiteFunctionType(core.String, []),
    borderRightStyle: dart.definiteFunctionType(core.String, []),
    borderRightWidth: dart.definiteFunctionType(core.String, []),
    borderSpacing: dart.definiteFunctionType(core.String, []),
    borderStart: dart.definiteFunctionType(core.String, []),
    borderStartColor: dart.definiteFunctionType(core.String, []),
    borderStartStyle: dart.definiteFunctionType(core.String, []),
    borderStartWidth: dart.definiteFunctionType(core.String, []),
    borderStyle: dart.definiteFunctionType(core.String, []),
    borderTop: dart.definiteFunctionType(core.String, []),
    borderTopColor: dart.definiteFunctionType(core.String, []),
    borderTopLeftRadius: dart.definiteFunctionType(core.String, []),
    borderTopRightRadius: dart.definiteFunctionType(core.String, []),
    borderTopStyle: dart.definiteFunctionType(core.String, []),
    borderTopWidth: dart.definiteFunctionType(core.String, []),
    borderVerticalSpacing: dart.definiteFunctionType(core.String, []),
    borderWidth: dart.definiteFunctionType(core.String, []),
    bottom: dart.definiteFunctionType(core.String, []),
    boxAlign: dart.definiteFunctionType(core.String, []),
    boxDecorationBreak: dart.definiteFunctionType(core.String, []),
    boxDirection: dart.definiteFunctionType(core.String, []),
    boxFlex: dart.definiteFunctionType(core.String, []),
    boxFlexGroup: dart.definiteFunctionType(core.String, []),
    boxLines: dart.definiteFunctionType(core.String, []),
    boxOrdinalGroup: dart.definiteFunctionType(core.String, []),
    boxOrient: dart.definiteFunctionType(core.String, []),
    boxPack: dart.definiteFunctionType(core.String, []),
    boxReflect: dart.definiteFunctionType(core.String, []),
    boxShadow: dart.definiteFunctionType(core.String, []),
    boxSizing: dart.definiteFunctionType(core.String, []),
    captionSide: dart.definiteFunctionType(core.String, []),
    clear: dart.definiteFunctionType(core.String, []),
    clip: dart.definiteFunctionType(core.String, []),
    clipPath: dart.definiteFunctionType(core.String, []),
    color: dart.definiteFunctionType(core.String, []),
    columnBreakAfter: dart.definiteFunctionType(core.String, []),
    columnBreakBefore: dart.definiteFunctionType(core.String, []),
    columnBreakInside: dart.definiteFunctionType(core.String, []),
    columnCount: dart.definiteFunctionType(core.String, []),
    columnFill: dart.definiteFunctionType(core.String, []),
    columnGap: dart.definiteFunctionType(core.String, []),
    columnRule: dart.definiteFunctionType(core.String, []),
    columnRuleColor: dart.definiteFunctionType(core.String, []),
    columnRuleStyle: dart.definiteFunctionType(core.String, []),
    columnRuleWidth: dart.definiteFunctionType(core.String, []),
    columnSpan: dart.definiteFunctionType(core.String, []),
    columnWidth: dart.definiteFunctionType(core.String, []),
    columns: dart.definiteFunctionType(core.String, []),
    content: dart.definiteFunctionType(core.String, []),
    counterIncrement: dart.definiteFunctionType(core.String, []),
    counterReset: dart.definiteFunctionType(core.String, []),
    cursor: dart.definiteFunctionType(core.String, []),
    direction: dart.definiteFunctionType(core.String, []),
    display: dart.definiteFunctionType(core.String, []),
    emptyCells: dart.definiteFunctionType(core.String, []),
    filter: dart.definiteFunctionType(core.String, []),
    flex: dart.definiteFunctionType(core.String, []),
    flexBasis: dart.definiteFunctionType(core.String, []),
    flexDirection: dart.definiteFunctionType(core.String, []),
    flexFlow: dart.definiteFunctionType(core.String, []),
    flexGrow: dart.definiteFunctionType(core.String, []),
    flexShrink: dart.definiteFunctionType(core.String, []),
    flexWrap: dart.definiteFunctionType(core.String, []),
    float: dart.definiteFunctionType(core.String, []),
    font: dart.definiteFunctionType(core.String, []),
    fontFamily: dart.definiteFunctionType(core.String, []),
    fontFeatureSettings: dart.definiteFunctionType(core.String, []),
    fontKerning: dart.definiteFunctionType(core.String, []),
    fontSize: dart.definiteFunctionType(core.String, []),
    fontSizeDelta: dart.definiteFunctionType(core.String, []),
    fontSmoothing: dart.definiteFunctionType(core.String, []),
    fontStretch: dart.definiteFunctionType(core.String, []),
    fontStyle: dart.definiteFunctionType(core.String, []),
    fontVariant: dart.definiteFunctionType(core.String, []),
    fontVariantLigatures: dart.definiteFunctionType(core.String, []),
    fontWeight: dart.definiteFunctionType(core.String, []),
    grid: dart.definiteFunctionType(core.String, []),
    gridArea: dart.definiteFunctionType(core.String, []),
    gridAutoColumns: dart.definiteFunctionType(core.String, []),
    gridAutoFlow: dart.definiteFunctionType(core.String, []),
    gridAutoRows: dart.definiteFunctionType(core.String, []),
    gridColumn: dart.definiteFunctionType(core.String, []),
    gridColumnEnd: dart.definiteFunctionType(core.String, []),
    gridColumnStart: dart.definiteFunctionType(core.String, []),
    gridRow: dart.definiteFunctionType(core.String, []),
    gridRowEnd: dart.definiteFunctionType(core.String, []),
    gridRowStart: dart.definiteFunctionType(core.String, []),
    gridTemplate: dart.definiteFunctionType(core.String, []),
    gridTemplateAreas: dart.definiteFunctionType(core.String, []),
    gridTemplateColumns: dart.definiteFunctionType(core.String, []),
    gridTemplateRows: dart.definiteFunctionType(core.String, []),
    height: dart.definiteFunctionType(core.String, []),
    highlight: dart.definiteFunctionType(core.String, []),
    hyphenateCharacter: dart.definiteFunctionType(core.String, []),
    imageRendering: dart.definiteFunctionType(core.String, []),
    isolation: dart.definiteFunctionType(core.String, []),
    justifyContent: dart.definiteFunctionType(core.String, []),
    justifySelf: dart.definiteFunctionType(core.String, []),
    left: dart.definiteFunctionType(core.String, []),
    letterSpacing: dart.definiteFunctionType(core.String, []),
    lineBoxContain: dart.definiteFunctionType(core.String, []),
    lineBreak: dart.definiteFunctionType(core.String, []),
    lineClamp: dart.definiteFunctionType(core.String, []),
    lineHeight: dart.definiteFunctionType(core.String, []),
    listStyle: dart.definiteFunctionType(core.String, []),
    listStyleImage: dart.definiteFunctionType(core.String, []),
    listStylePosition: dart.definiteFunctionType(core.String, []),
    listStyleType: dart.definiteFunctionType(core.String, []),
    locale: dart.definiteFunctionType(core.String, []),
    logicalHeight: dart.definiteFunctionType(core.String, []),
    logicalWidth: dart.definiteFunctionType(core.String, []),
    margin: dart.definiteFunctionType(core.String, []),
    marginAfter: dart.definiteFunctionType(core.String, []),
    marginAfterCollapse: dart.definiteFunctionType(core.String, []),
    marginBefore: dart.definiteFunctionType(core.String, []),
    marginBeforeCollapse: dart.definiteFunctionType(core.String, []),
    marginBottom: dart.definiteFunctionType(core.String, []),
    marginBottomCollapse: dart.definiteFunctionType(core.String, []),
    marginCollapse: dart.definiteFunctionType(core.String, []),
    marginEnd: dart.definiteFunctionType(core.String, []),
    marginLeft: dart.definiteFunctionType(core.String, []),
    marginRight: dart.definiteFunctionType(core.String, []),
    marginStart: dart.definiteFunctionType(core.String, []),
    marginTop: dart.definiteFunctionType(core.String, []),
    marginTopCollapse: dart.definiteFunctionType(core.String, []),
    mask: dart.definiteFunctionType(core.String, []),
    maskBoxImage: dart.definiteFunctionType(core.String, []),
    maskBoxImageOutset: dart.definiteFunctionType(core.String, []),
    maskBoxImageRepeat: dart.definiteFunctionType(core.String, []),
    maskBoxImageSlice: dart.definiteFunctionType(core.String, []),
    maskBoxImageSource: dart.definiteFunctionType(core.String, []),
    maskBoxImageWidth: dart.definiteFunctionType(core.String, []),
    maskClip: dart.definiteFunctionType(core.String, []),
    maskComposite: dart.definiteFunctionType(core.String, []),
    maskImage: dart.definiteFunctionType(core.String, []),
    maskOrigin: dart.definiteFunctionType(core.String, []),
    maskPosition: dart.definiteFunctionType(core.String, []),
    maskPositionX: dart.definiteFunctionType(core.String, []),
    maskPositionY: dart.definiteFunctionType(core.String, []),
    maskRepeat: dart.definiteFunctionType(core.String, []),
    maskRepeatX: dart.definiteFunctionType(core.String, []),
    maskRepeatY: dart.definiteFunctionType(core.String, []),
    maskSize: dart.definiteFunctionType(core.String, []),
    maskSourceType: dart.definiteFunctionType(core.String, []),
    maxHeight: dart.definiteFunctionType(core.String, []),
    maxLogicalHeight: dart.definiteFunctionType(core.String, []),
    maxLogicalWidth: dart.definiteFunctionType(core.String, []),
    maxWidth: dart.definiteFunctionType(core.String, []),
    maxZoom: dart.definiteFunctionType(core.String, []),
    minHeight: dart.definiteFunctionType(core.String, []),
    minLogicalHeight: dart.definiteFunctionType(core.String, []),
    minLogicalWidth: dart.definiteFunctionType(core.String, []),
    minWidth: dart.definiteFunctionType(core.String, []),
    minZoom: dart.definiteFunctionType(core.String, []),
    mixBlendMode: dart.definiteFunctionType(core.String, []),
    objectFit: dart.definiteFunctionType(core.String, []),
    objectPosition: dart.definiteFunctionType(core.String, []),
    opacity: dart.definiteFunctionType(core.String, []),
    order: dart.definiteFunctionType(core.String, []),
    orientation: dart.definiteFunctionType(core.String, []),
    orphans: dart.definiteFunctionType(core.String, []),
    outline: dart.definiteFunctionType(core.String, []),
    outlineColor: dart.definiteFunctionType(core.String, []),
    outlineOffset: dart.definiteFunctionType(core.String, []),
    outlineStyle: dart.definiteFunctionType(core.String, []),
    outlineWidth: dart.definiteFunctionType(core.String, []),
    overflow: dart.definiteFunctionType(core.String, []),
    overflowWrap: dart.definiteFunctionType(core.String, []),
    overflowX: dart.definiteFunctionType(core.String, []),
    overflowY: dart.definiteFunctionType(core.String, []),
    padding: dart.definiteFunctionType(core.String, []),
    paddingAfter: dart.definiteFunctionType(core.String, []),
    paddingBefore: dart.definiteFunctionType(core.String, []),
    paddingBottom: dart.definiteFunctionType(core.String, []),
    paddingEnd: dart.definiteFunctionType(core.String, []),
    paddingLeft: dart.definiteFunctionType(core.String, []),
    paddingRight: dart.definiteFunctionType(core.String, []),
    paddingStart: dart.definiteFunctionType(core.String, []),
    paddingTop: dart.definiteFunctionType(core.String, []),
    page: dart.definiteFunctionType(core.String, []),
    pageBreakAfter: dart.definiteFunctionType(core.String, []),
    pageBreakBefore: dart.definiteFunctionType(core.String, []),
    pageBreakInside: dart.definiteFunctionType(core.String, []),
    perspective: dart.definiteFunctionType(core.String, []),
    perspectiveOrigin: dart.definiteFunctionType(core.String, []),
    perspectiveOriginX: dart.definiteFunctionType(core.String, []),
    perspectiveOriginY: dart.definiteFunctionType(core.String, []),
    pointerEvents: dart.definiteFunctionType(core.String, []),
    position: dart.definiteFunctionType(core.String, []),
    printColorAdjust: dart.definiteFunctionType(core.String, []),
    quotes: dart.definiteFunctionType(core.String, []),
    resize: dart.definiteFunctionType(core.String, []),
    right: dart.definiteFunctionType(core.String, []),
    rtlOrdering: dart.definiteFunctionType(core.String, []),
    rubyPosition: dart.definiteFunctionType(core.String, []),
    scrollBehavior: dart.definiteFunctionType(core.String, []),
    shapeImageThreshold: dart.definiteFunctionType(core.String, []),
    shapeMargin: dart.definiteFunctionType(core.String, []),
    shapeOutside: dart.definiteFunctionType(core.String, []),
    size: dart.definiteFunctionType(core.String, []),
    speak: dart.definiteFunctionType(core.String, []),
    src: dart.definiteFunctionType(core.String, []),
    tabSize: dart.definiteFunctionType(core.String, []),
    tableLayout: dart.definiteFunctionType(core.String, []),
    tapHighlightColor: dart.definiteFunctionType(core.String, []),
    textAlign: dart.definiteFunctionType(core.String, []),
    textAlignLast: dart.definiteFunctionType(core.String, []),
    textCombine: dart.definiteFunctionType(core.String, []),
    textDecoration: dart.definiteFunctionType(core.String, []),
    textDecorationColor: dart.definiteFunctionType(core.String, []),
    textDecorationLine: dart.definiteFunctionType(core.String, []),
    textDecorationStyle: dart.definiteFunctionType(core.String, []),
    textDecorationsInEffect: dart.definiteFunctionType(core.String, []),
    textEmphasis: dart.definiteFunctionType(core.String, []),
    textEmphasisColor: dart.definiteFunctionType(core.String, []),
    textEmphasisPosition: dart.definiteFunctionType(core.String, []),
    textEmphasisStyle: dart.definiteFunctionType(core.String, []),
    textFillColor: dart.definiteFunctionType(core.String, []),
    textIndent: dart.definiteFunctionType(core.String, []),
    textJustify: dart.definiteFunctionType(core.String, []),
    textLineThroughColor: dart.definiteFunctionType(core.String, []),
    textLineThroughMode: dart.definiteFunctionType(core.String, []),
    textLineThroughStyle: dart.definiteFunctionType(core.String, []),
    textLineThroughWidth: dart.definiteFunctionType(core.String, []),
    textOrientation: dart.definiteFunctionType(core.String, []),
    textOverflow: dart.definiteFunctionType(core.String, []),
    textOverlineColor: dart.definiteFunctionType(core.String, []),
    textOverlineMode: dart.definiteFunctionType(core.String, []),
    textOverlineStyle: dart.definiteFunctionType(core.String, []),
    textOverlineWidth: dart.definiteFunctionType(core.String, []),
    textRendering: dart.definiteFunctionType(core.String, []),
    textSecurity: dart.definiteFunctionType(core.String, []),
    textShadow: dart.definiteFunctionType(core.String, []),
    textStroke: dart.definiteFunctionType(core.String, []),
    textStrokeColor: dart.definiteFunctionType(core.String, []),
    textStrokeWidth: dart.definiteFunctionType(core.String, []),
    textTransform: dart.definiteFunctionType(core.String, []),
    textUnderlineColor: dart.definiteFunctionType(core.String, []),
    textUnderlineMode: dart.definiteFunctionType(core.String, []),
    textUnderlinePosition: dart.definiteFunctionType(core.String, []),
    textUnderlineStyle: dart.definiteFunctionType(core.String, []),
    textUnderlineWidth: dart.definiteFunctionType(core.String, []),
    top: dart.definiteFunctionType(core.String, []),
    touchAction: dart.definiteFunctionType(core.String, []),
    touchActionDelay: dart.definiteFunctionType(core.String, []),
    transform: dart.definiteFunctionType(core.String, []),
    transformOrigin: dart.definiteFunctionType(core.String, []),
    transformOriginX: dart.definiteFunctionType(core.String, []),
    transformOriginY: dart.definiteFunctionType(core.String, []),
    transformOriginZ: dart.definiteFunctionType(core.String, []),
    transformStyle: dart.definiteFunctionType(core.String, []),
    transition: dart.definiteFunctionType(core.String, []),
    transitionDelay: dart.definiteFunctionType(core.String, []),
    transitionDuration: dart.definiteFunctionType(core.String, []),
    transitionProperty: dart.definiteFunctionType(core.String, []),
    transitionTimingFunction: dart.definiteFunctionType(core.String, []),
    unicodeBidi: dart.definiteFunctionType(core.String, []),
    unicodeRange: dart.definiteFunctionType(core.String, []),
    userDrag: dart.definiteFunctionType(core.String, []),
    userModify: dart.definiteFunctionType(core.String, []),
    userSelect: dart.definiteFunctionType(core.String, []),
    userZoom: dart.definiteFunctionType(core.String, []),
    verticalAlign: dart.definiteFunctionType(core.String, []),
    visibility: dart.definiteFunctionType(core.String, []),
    whiteSpace: dart.definiteFunctionType(core.String, []),
    widows: dart.definiteFunctionType(core.String, []),
    width: dart.definiteFunctionType(core.String, []),
    willChange: dart.definiteFunctionType(core.String, []),
    wordBreak: dart.definiteFunctionType(core.String, []),
    wordSpacing: dart.definiteFunctionType(core.String, []),
    wordWrap: dart.definiteFunctionType(core.String, []),
    wrapFlow: dart.definiteFunctionType(core.String, []),
    wrapThrough: dart.definiteFunctionType(core.String, []),
    writingMode: dart.definiteFunctionType(core.String, []),
    zIndex: dart.definiteFunctionType(core.String, []),
    zoom: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({
    alignContent: dart.definiteFunctionType(dart.void, [core.String]),
    alignItems: dart.definiteFunctionType(dart.void, [core.String]),
    alignSelf: dart.definiteFunctionType(dart.void, [core.String]),
    animation: dart.definiteFunctionType(dart.void, [core.String]),
    animationDelay: dart.definiteFunctionType(dart.void, [core.String]),
    animationDirection: dart.definiteFunctionType(dart.void, [core.String]),
    animationDuration: dart.definiteFunctionType(dart.void, [core.String]),
    animationFillMode: dart.definiteFunctionType(dart.void, [core.String]),
    animationIterationCount: dart.definiteFunctionType(dart.void, [core.String]),
    animationName: dart.definiteFunctionType(dart.void, [core.String]),
    animationPlayState: dart.definiteFunctionType(dart.void, [core.String]),
    animationTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
    appRegion: dart.definiteFunctionType(dart.void, [core.String]),
    appearance: dart.definiteFunctionType(dart.void, [core.String]),
    aspectRatio: dart.definiteFunctionType(dart.void, [core.String]),
    backfaceVisibility: dart.definiteFunctionType(dart.void, [core.String]),
    background: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundAttachment: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundClip: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundColor: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundComposite: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundImage: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundOrigin: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundPosition: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundPositionX: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundPositionY: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundRepeat: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
    backgroundSize: dart.definiteFunctionType(dart.void, [core.String]),
    border: dart.definiteFunctionType(dart.void, [core.String]),
    borderAfter: dart.definiteFunctionType(dart.void, [core.String]),
    borderAfterColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderAfterStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderAfterWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderBefore: dart.definiteFunctionType(dart.void, [core.String]),
    borderBeforeColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderBeforeStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderBeforeWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderBottom: dart.definiteFunctionType(dart.void, [core.String]),
    borderBottomColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderBottomLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
    borderBottomRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
    borderBottomStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderBottomWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderCollapse: dart.definiteFunctionType(dart.void, [core.String]),
    borderColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderEnd: dart.definiteFunctionType(dart.void, [core.String]),
    borderEndColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderEndStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderEndWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderFit: dart.definiteFunctionType(dart.void, [core.String]),
    borderHorizontalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
    borderImage: dart.definiteFunctionType(dart.void, [core.String]),
    borderImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
    borderImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
    borderImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
    borderImageSource: dart.definiteFunctionType(dart.void, [core.String]),
    borderImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderLeft: dart.definiteFunctionType(dart.void, [core.String]),
    borderLeftColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderLeftStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderLeftWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderRadius: dart.definiteFunctionType(dart.void, [core.String]),
    borderRight: dart.definiteFunctionType(dart.void, [core.String]),
    borderRightColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderRightStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderRightWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderSpacing: dart.definiteFunctionType(dart.void, [core.String]),
    borderStart: dart.definiteFunctionType(dart.void, [core.String]),
    borderStartColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderStartStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderStartWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderTop: dart.definiteFunctionType(dart.void, [core.String]),
    borderTopColor: dart.definiteFunctionType(dart.void, [core.String]),
    borderTopLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
    borderTopRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
    borderTopStyle: dart.definiteFunctionType(dart.void, [core.String]),
    borderTopWidth: dart.definiteFunctionType(dart.void, [core.String]),
    borderVerticalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
    borderWidth: dart.definiteFunctionType(dart.void, [core.String]),
    bottom: dart.definiteFunctionType(dart.void, [core.String]),
    boxAlign: dart.definiteFunctionType(dart.void, [core.String]),
    boxDecorationBreak: dart.definiteFunctionType(dart.void, [core.String]),
    boxDirection: dart.definiteFunctionType(dart.void, [core.String]),
    boxFlex: dart.definiteFunctionType(dart.void, [core.String]),
    boxFlexGroup: dart.definiteFunctionType(dart.void, [core.String]),
    boxLines: dart.definiteFunctionType(dart.void, [core.String]),
    boxOrdinalGroup: dart.definiteFunctionType(dart.void, [core.String]),
    boxOrient: dart.definiteFunctionType(dart.void, [core.String]),
    boxPack: dart.definiteFunctionType(dart.void, [core.String]),
    boxReflect: dart.definiteFunctionType(dart.void, [core.String]),
    boxShadow: dart.definiteFunctionType(dart.void, [core.String]),
    boxSizing: dart.definiteFunctionType(dart.void, [core.String]),
    captionSide: dart.definiteFunctionType(dart.void, [core.String]),
    clear: dart.definiteFunctionType(dart.void, [core.String]),
    clip: dart.definiteFunctionType(dart.void, [core.String]),
    clipPath: dart.definiteFunctionType(dart.void, [core.String]),
    color: dart.definiteFunctionType(dart.void, [core.String]),
    columnBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
    columnBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
    columnBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
    columnCount: dart.definiteFunctionType(dart.void, [core.String]),
    columnFill: dart.definiteFunctionType(dart.void, [core.String]),
    columnGap: dart.definiteFunctionType(dart.void, [core.String]),
    columnRule: dart.definiteFunctionType(dart.void, [core.String]),
    columnRuleColor: dart.definiteFunctionType(dart.void, [core.String]),
    columnRuleStyle: dart.definiteFunctionType(dart.void, [core.String]),
    columnRuleWidth: dart.definiteFunctionType(dart.void, [core.String]),
    columnSpan: dart.definiteFunctionType(dart.void, [core.String]),
    columnWidth: dart.definiteFunctionType(dart.void, [core.String]),
    columns: dart.definiteFunctionType(dart.void, [core.String]),
    content: dart.definiteFunctionType(dart.void, [core.String]),
    counterIncrement: dart.definiteFunctionType(dart.void, [core.String]),
    counterReset: dart.definiteFunctionType(dart.void, [core.String]),
    cursor: dart.definiteFunctionType(dart.void, [core.String]),
    direction: dart.definiteFunctionType(dart.void, [core.String]),
    display: dart.definiteFunctionType(dart.void, [core.String]),
    emptyCells: dart.definiteFunctionType(dart.void, [core.String]),
    filter: dart.definiteFunctionType(dart.void, [core.String]),
    flex: dart.definiteFunctionType(dart.void, [core.String]),
    flexBasis: dart.definiteFunctionType(dart.void, [core.String]),
    flexDirection: dart.definiteFunctionType(dart.void, [core.String]),
    flexFlow: dart.definiteFunctionType(dart.void, [core.String]),
    flexGrow: dart.definiteFunctionType(dart.void, [core.String]),
    flexShrink: dart.definiteFunctionType(dart.void, [core.String]),
    flexWrap: dart.definiteFunctionType(dart.void, [core.String]),
    float: dart.definiteFunctionType(dart.void, [core.String]),
    font: dart.definiteFunctionType(dart.void, [core.String]),
    fontFamily: dart.definiteFunctionType(dart.void, [core.String]),
    fontFeatureSettings: dart.definiteFunctionType(dart.void, [core.String]),
    fontKerning: dart.definiteFunctionType(dart.void, [core.String]),
    fontSize: dart.definiteFunctionType(dart.void, [core.String]),
    fontSizeDelta: dart.definiteFunctionType(dart.void, [core.String]),
    fontSmoothing: dart.definiteFunctionType(dart.void, [core.String]),
    fontStretch: dart.definiteFunctionType(dart.void, [core.String]),
    fontStyle: dart.definiteFunctionType(dart.void, [core.String]),
    fontVariant: dart.definiteFunctionType(dart.void, [core.String]),
    fontVariantLigatures: dart.definiteFunctionType(dart.void, [core.String]),
    fontWeight: dart.definiteFunctionType(dart.void, [core.String]),
    grid: dart.definiteFunctionType(dart.void, [core.String]),
    gridArea: dart.definiteFunctionType(dart.void, [core.String]),
    gridAutoColumns: dart.definiteFunctionType(dart.void, [core.String]),
    gridAutoFlow: dart.definiteFunctionType(dart.void, [core.String]),
    gridAutoRows: dart.definiteFunctionType(dart.void, [core.String]),
    gridColumn: dart.definiteFunctionType(dart.void, [core.String]),
    gridColumnEnd: dart.definiteFunctionType(dart.void, [core.String]),
    gridColumnStart: dart.definiteFunctionType(dart.void, [core.String]),
    gridRow: dart.definiteFunctionType(dart.void, [core.String]),
    gridRowEnd: dart.definiteFunctionType(dart.void, [core.String]),
    gridRowStart: dart.definiteFunctionType(dart.void, [core.String]),
    gridTemplate: dart.definiteFunctionType(dart.void, [core.String]),
    gridTemplateAreas: dart.definiteFunctionType(dart.void, [core.String]),
    gridTemplateColumns: dart.definiteFunctionType(dart.void, [core.String]),
    gridTemplateRows: dart.definiteFunctionType(dart.void, [core.String]),
    height: dart.definiteFunctionType(dart.void, [core.String]),
    highlight: dart.definiteFunctionType(dart.void, [core.String]),
    hyphenateCharacter: dart.definiteFunctionType(dart.void, [core.String]),
    imageRendering: dart.definiteFunctionType(dart.void, [core.String]),
    isolation: dart.definiteFunctionType(dart.void, [core.String]),
    justifyContent: dart.definiteFunctionType(dart.void, [core.String]),
    justifySelf: dart.definiteFunctionType(dart.void, [core.String]),
    left: dart.definiteFunctionType(dart.void, [core.String]),
    letterSpacing: dart.definiteFunctionType(dart.void, [core.String]),
    lineBoxContain: dart.definiteFunctionType(dart.void, [core.String]),
    lineBreak: dart.definiteFunctionType(dart.void, [core.String]),
    lineClamp: dart.definiteFunctionType(dart.void, [core.String]),
    lineHeight: dart.definiteFunctionType(dart.void, [core.String]),
    listStyle: dart.definiteFunctionType(dart.void, [core.String]),
    listStyleImage: dart.definiteFunctionType(dart.void, [core.String]),
    listStylePosition: dart.definiteFunctionType(dart.void, [core.String]),
    listStyleType: dart.definiteFunctionType(dart.void, [core.String]),
    locale: dart.definiteFunctionType(dart.void, [core.String]),
    logicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
    logicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
    margin: dart.definiteFunctionType(dart.void, [core.String]),
    marginAfter: dart.definiteFunctionType(dart.void, [core.String]),
    marginAfterCollapse: dart.definiteFunctionType(dart.void, [core.String]),
    marginBefore: dart.definiteFunctionType(dart.void, [core.String]),
    marginBeforeCollapse: dart.definiteFunctionType(dart.void, [core.String]),
    marginBottom: dart.definiteFunctionType(dart.void, [core.String]),
    marginBottomCollapse: dart.definiteFunctionType(dart.void, [core.String]),
    marginCollapse: dart.definiteFunctionType(dart.void, [core.String]),
    marginEnd: dart.definiteFunctionType(dart.void, [core.String]),
    marginLeft: dart.definiteFunctionType(dart.void, [core.String]),
    marginRight: dart.definiteFunctionType(dart.void, [core.String]),
    marginStart: dart.definiteFunctionType(dart.void, [core.String]),
    marginTop: dart.definiteFunctionType(dart.void, [core.String]),
    marginTopCollapse: dart.definiteFunctionType(dart.void, [core.String]),
    mask: dart.definiteFunctionType(dart.void, [core.String]),
    maskBoxImage: dart.definiteFunctionType(dart.void, [core.String]),
    maskBoxImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
    maskBoxImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
    maskBoxImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
    maskBoxImageSource: dart.definiteFunctionType(dart.void, [core.String]),
    maskBoxImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
    maskClip: dart.definiteFunctionType(dart.void, [core.String]),
    maskComposite: dart.definiteFunctionType(dart.void, [core.String]),
    maskImage: dart.definiteFunctionType(dart.void, [core.String]),
    maskOrigin: dart.definiteFunctionType(dart.void, [core.String]),
    maskPosition: dart.definiteFunctionType(dart.void, [core.String]),
    maskPositionX: dart.definiteFunctionType(dart.void, [core.String]),
    maskPositionY: dart.definiteFunctionType(dart.void, [core.String]),
    maskRepeat: dart.definiteFunctionType(dart.void, [core.String]),
    maskRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
    maskRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
    maskSize: dart.definiteFunctionType(dart.void, [core.String]),
    maskSourceType: dart.definiteFunctionType(dart.void, [core.String]),
    maxHeight: dart.definiteFunctionType(dart.void, [core.String]),
    maxLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
    maxLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
    maxWidth: dart.definiteFunctionType(dart.void, [core.String]),
    maxZoom: dart.definiteFunctionType(dart.void, [core.String]),
    minHeight: dart.definiteFunctionType(dart.void, [core.String]),
    minLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
    minLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
    minWidth: dart.definiteFunctionType(dart.void, [core.String]),
    minZoom: dart.definiteFunctionType(dart.void, [core.String]),
    mixBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
    objectFit: dart.definiteFunctionType(dart.void, [core.String]),
    objectPosition: dart.definiteFunctionType(dart.void, [core.String]),
    opacity: dart.definiteFunctionType(dart.void, [core.String]),
    order: dart.definiteFunctionType(dart.void, [core.String]),
    orientation: dart.definiteFunctionType(dart.void, [core.String]),
    orphans: dart.definiteFunctionType(dart.void, [core.String]),
    outline: dart.definiteFunctionType(dart.void, [core.String]),
    outlineColor: dart.definiteFunctionType(dart.void, [core.String]),
    outlineOffset: dart.definiteFunctionType(dart.void, [core.String]),
    outlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
    outlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
    overflow: dart.definiteFunctionType(dart.void, [core.String]),
    overflowWrap: dart.definiteFunctionType(dart.void, [core.String]),
    overflowX: dart.definiteFunctionType(dart.void, [core.String]),
    overflowY: dart.definiteFunctionType(dart.void, [core.String]),
    padding: dart.definiteFunctionType(dart.void, [core.String]),
    paddingAfter: dart.definiteFunctionType(dart.void, [core.String]),
    paddingBefore: dart.definiteFunctionType(dart.void, [core.String]),
    paddingBottom: dart.definiteFunctionType(dart.void, [core.String]),
    paddingEnd: dart.definiteFunctionType(dart.void, [core.String]),
    paddingLeft: dart.definiteFunctionType(dart.void, [core.String]),
    paddingRight: dart.definiteFunctionType(dart.void, [core.String]),
    paddingStart: dart.definiteFunctionType(dart.void, [core.String]),
    paddingTop: dart.definiteFunctionType(dart.void, [core.String]),
    page: dart.definiteFunctionType(dart.void, [core.String]),
    pageBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
    pageBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
    pageBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
    perspective: dart.definiteFunctionType(dart.void, [core.String]),
    perspectiveOrigin: dart.definiteFunctionType(dart.void, [core.String]),
    perspectiveOriginX: dart.definiteFunctionType(dart.void, [core.String]),
    perspectiveOriginY: dart.definiteFunctionType(dart.void, [core.String]),
    pointerEvents: dart.definiteFunctionType(dart.void, [core.String]),
    position: dart.definiteFunctionType(dart.void, [core.String]),
    printColorAdjust: dart.definiteFunctionType(dart.void, [core.String]),
    quotes: dart.definiteFunctionType(dart.void, [core.String]),
    resize: dart.definiteFunctionType(dart.void, [core.String]),
    right: dart.definiteFunctionType(dart.void, [core.String]),
    rtlOrdering: dart.definiteFunctionType(dart.void, [core.String]),
    rubyPosition: dart.definiteFunctionType(dart.void, [core.String]),
    scrollBehavior: dart.definiteFunctionType(dart.void, [core.String]),
    shapeImageThreshold: dart.definiteFunctionType(dart.void, [core.String]),
    shapeMargin: dart.definiteFunctionType(dart.void, [core.String]),
    shapeOutside: dart.definiteFunctionType(dart.void, [core.String]),
    size: dart.definiteFunctionType(dart.void, [core.String]),
    speak: dart.definiteFunctionType(dart.void, [core.String]),
    src: dart.definiteFunctionType(dart.void, [core.String]),
    tabSize: dart.definiteFunctionType(dart.void, [core.String]),
    tableLayout: dart.definiteFunctionType(dart.void, [core.String]),
    tapHighlightColor: dart.definiteFunctionType(dart.void, [core.String]),
    textAlign: dart.definiteFunctionType(dart.void, [core.String]),
    textAlignLast: dart.definiteFunctionType(dart.void, [core.String]),
    textCombine: dart.definiteFunctionType(dart.void, [core.String]),
    textDecoration: dart.definiteFunctionType(dart.void, [core.String]),
    textDecorationColor: dart.definiteFunctionType(dart.void, [core.String]),
    textDecorationLine: dart.definiteFunctionType(dart.void, [core.String]),
    textDecorationStyle: dart.definiteFunctionType(dart.void, [core.String]),
    textDecorationsInEffect: dart.definiteFunctionType(dart.void, [core.String]),
    textEmphasis: dart.definiteFunctionType(dart.void, [core.String]),
    textEmphasisColor: dart.definiteFunctionType(dart.void, [core.String]),
    textEmphasisPosition: dart.definiteFunctionType(dart.void, [core.String]),
    textEmphasisStyle: dart.definiteFunctionType(dart.void, [core.String]),
    textFillColor: dart.definiteFunctionType(dart.void, [core.String]),
    textIndent: dart.definiteFunctionType(dart.void, [core.String]),
    textJustify: dart.definiteFunctionType(dart.void, [core.String]),
    textLineThroughColor: dart.definiteFunctionType(dart.void, [core.String]),
    textLineThroughMode: dart.definiteFunctionType(dart.void, [core.String]),
    textLineThroughStyle: dart.definiteFunctionType(dart.void, [core.String]),
    textLineThroughWidth: dart.definiteFunctionType(dart.void, [core.String]),
    textOrientation: dart.definiteFunctionType(dart.void, [core.String]),
    textOverflow: dart.definiteFunctionType(dart.void, [core.String]),
    textOverlineColor: dart.definiteFunctionType(dart.void, [core.String]),
    textOverlineMode: dart.definiteFunctionType(dart.void, [core.String]),
    textOverlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
    textOverlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
    textRendering: dart.definiteFunctionType(dart.void, [core.String]),
    textSecurity: dart.definiteFunctionType(dart.void, [core.String]),
    textShadow: dart.definiteFunctionType(dart.void, [core.String]),
    textStroke: dart.definiteFunctionType(dart.void, [core.String]),
    textStrokeColor: dart.definiteFunctionType(dart.void, [core.String]),
    textStrokeWidth: dart.definiteFunctionType(dart.void, [core.String]),
    textTransform: dart.definiteFunctionType(dart.void, [core.String]),
    textUnderlineColor: dart.definiteFunctionType(dart.void, [core.String]),
    textUnderlineMode: dart.definiteFunctionType(dart.void, [core.String]),
    textUnderlinePosition: dart.definiteFunctionType(dart.void, [core.String]),
    textUnderlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
    textUnderlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
    top: dart.definiteFunctionType(dart.void, [core.String]),
    touchAction: dart.definiteFunctionType(dart.void, [core.String]),
    touchActionDelay: dart.definiteFunctionType(dart.void, [core.String]),
    transform: dart.definiteFunctionType(dart.void, [core.String]),
    transformOrigin: dart.definiteFunctionType(dart.void, [core.String]),
    transformOriginX: dart.definiteFunctionType(dart.void, [core.String]),
    transformOriginY: dart.definiteFunctionType(dart.void, [core.String]),
    transformOriginZ: dart.definiteFunctionType(dart.void, [core.String]),
    transformStyle: dart.definiteFunctionType(dart.void, [core.String]),
    transition: dart.definiteFunctionType(dart.void, [core.String]),
    transitionDelay: dart.definiteFunctionType(dart.void, [core.String]),
    transitionDuration: dart.definiteFunctionType(dart.void, [core.String]),
    transitionProperty: dart.definiteFunctionType(dart.void, [core.String]),
    transitionTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
    unicodeBidi: dart.definiteFunctionType(dart.void, [core.String]),
    unicodeRange: dart.definiteFunctionType(dart.void, [core.String]),
    userDrag: dart.definiteFunctionType(dart.void, [core.String]),
    userModify: dart.definiteFunctionType(dart.void, [core.String]),
    userSelect: dart.definiteFunctionType(dart.void, [core.String]),
    userZoom: dart.definiteFunctionType(dart.void, [core.String]),
    verticalAlign: dart.definiteFunctionType(dart.void, [core.String]),
    visibility: dart.definiteFunctionType(dart.void, [core.String]),
    whiteSpace: dart.definiteFunctionType(dart.void, [core.String]),
    widows: dart.definiteFunctionType(dart.void, [core.String]),
    width: dart.definiteFunctionType(dart.void, [core.String]),
    willChange: dart.definiteFunctionType(dart.void, [core.String]),
    wordBreak: dart.definiteFunctionType(dart.void, [core.String]),
    wordSpacing: dart.definiteFunctionType(dart.void, [core.String]),
    wordWrap: dart.definiteFunctionType(dart.void, [core.String]),
    wrapFlow: dart.definiteFunctionType(dart.void, [core.String]),
    wrapThrough: dart.definiteFunctionType(dart.void, [core.String]),
    writingMode: dart.definiteFunctionType(dart.void, [core.String]),
    zIndex: dart.definiteFunctionType(dart.void, [core.String]),
    zoom: dart.definiteFunctionType(dart.void, [core.String])
  })
});
dart.defineExtensionMembers(html$.CssStyleDeclarationBase, [
  'alignContent',
  'alignContent',
  'alignItems',
  'alignItems',
  'alignSelf',
  'alignSelf',
  'animation',
  'animation',
  'animationDelay',
  'animationDelay',
  'animationDirection',
  'animationDirection',
  'animationDuration',
  'animationDuration',
  'animationFillMode',
  'animationFillMode',
  'animationIterationCount',
  'animationIterationCount',
  'animationName',
  'animationName',
  'animationPlayState',
  'animationPlayState',
  'animationTimingFunction',
  'animationTimingFunction',
  'appRegion',
  'appRegion',
  'appearance',
  'appearance',
  'aspectRatio',
  'aspectRatio',
  'backfaceVisibility',
  'backfaceVisibility',
  'background',
  'background',
  'backgroundAttachment',
  'backgroundAttachment',
  'backgroundBlendMode',
  'backgroundBlendMode',
  'backgroundClip',
  'backgroundClip',
  'backgroundColor',
  'backgroundColor',
  'backgroundComposite',
  'backgroundComposite',
  'backgroundImage',
  'backgroundImage',
  'backgroundOrigin',
  'backgroundOrigin',
  'backgroundPosition',
  'backgroundPosition',
  'backgroundPositionX',
  'backgroundPositionX',
  'backgroundPositionY',
  'backgroundPositionY',
  'backgroundRepeat',
  'backgroundRepeat',
  'backgroundRepeatX',
  'backgroundRepeatX',
  'backgroundRepeatY',
  'backgroundRepeatY',
  'backgroundSize',
  'backgroundSize',
  'border',
  'border',
  'borderAfter',
  'borderAfter',
  'borderAfterColor',
  'borderAfterColor',
  'borderAfterStyle',
  'borderAfterStyle',
  'borderAfterWidth',
  'borderAfterWidth',
  'borderBefore',
  'borderBefore',
  'borderBeforeColor',
  'borderBeforeColor',
  'borderBeforeStyle',
  'borderBeforeStyle',
  'borderBeforeWidth',
  'borderBeforeWidth',
  'borderBottom',
  'borderBottom',
  'borderBottomColor',
  'borderBottomColor',
  'borderBottomLeftRadius',
  'borderBottomLeftRadius',
  'borderBottomRightRadius',
  'borderBottomRightRadius',
  'borderBottomStyle',
  'borderBottomStyle',
  'borderBottomWidth',
  'borderBottomWidth',
  'borderCollapse',
  'borderCollapse',
  'borderColor',
  'borderColor',
  'borderEnd',
  'borderEnd',
  'borderEndColor',
  'borderEndColor',
  'borderEndStyle',
  'borderEndStyle',
  'borderEndWidth',
  'borderEndWidth',
  'borderFit',
  'borderFit',
  'borderHorizontalSpacing',
  'borderHorizontalSpacing',
  'borderImage',
  'borderImage',
  'borderImageOutset',
  'borderImageOutset',
  'borderImageRepeat',
  'borderImageRepeat',
  'borderImageSlice',
  'borderImageSlice',
  'borderImageSource',
  'borderImageSource',
  'borderImageWidth',
  'borderImageWidth',
  'borderLeft',
  'borderLeft',
  'borderLeftColor',
  'borderLeftColor',
  'borderLeftStyle',
  'borderLeftStyle',
  'borderLeftWidth',
  'borderLeftWidth',
  'borderRadius',
  'borderRadius',
  'borderRight',
  'borderRight',
  'borderRightColor',
  'borderRightColor',
  'borderRightStyle',
  'borderRightStyle',
  'borderRightWidth',
  'borderRightWidth',
  'borderSpacing',
  'borderSpacing',
  'borderStart',
  'borderStart',
  'borderStartColor',
  'borderStartColor',
  'borderStartStyle',
  'borderStartStyle',
  'borderStartWidth',
  'borderStartWidth',
  'borderStyle',
  'borderStyle',
  'borderTop',
  'borderTop',
  'borderTopColor',
  'borderTopColor',
  'borderTopLeftRadius',
  'borderTopLeftRadius',
  'borderTopRightRadius',
  'borderTopRightRadius',
  'borderTopStyle',
  'borderTopStyle',
  'borderTopWidth',
  'borderTopWidth',
  'borderVerticalSpacing',
  'borderVerticalSpacing',
  'borderWidth',
  'borderWidth',
  'bottom',
  'bottom',
  'boxAlign',
  'boxAlign',
  'boxDecorationBreak',
  'boxDecorationBreak',
  'boxDirection',
  'boxDirection',
  'boxFlex',
  'boxFlex',
  'boxFlexGroup',
  'boxFlexGroup',
  'boxLines',
  'boxLines',
  'boxOrdinalGroup',
  'boxOrdinalGroup',
  'boxOrient',
  'boxOrient',
  'boxPack',
  'boxPack',
  'boxReflect',
  'boxReflect',
  'boxShadow',
  'boxShadow',
  'boxSizing',
  'boxSizing',
  'captionSide',
  'captionSide',
  'clear',
  'clear',
  'clip',
  'clip',
  'clipPath',
  'clipPath',
  'color',
  'color',
  'columnBreakAfter',
  'columnBreakAfter',
  'columnBreakBefore',
  'columnBreakBefore',
  'columnBreakInside',
  'columnBreakInside',
  'columnCount',
  'columnCount',
  'columnFill',
  'columnFill',
  'columnGap',
  'columnGap',
  'columnRule',
  'columnRule',
  'columnRuleColor',
  'columnRuleColor',
  'columnRuleStyle',
  'columnRuleStyle',
  'columnRuleWidth',
  'columnRuleWidth',
  'columnSpan',
  'columnSpan',
  'columnWidth',
  'columnWidth',
  'columns',
  'columns',
  'content',
  'content',
  'counterIncrement',
  'counterIncrement',
  'counterReset',
  'counterReset',
  'cursor',
  'cursor',
  'direction',
  'direction',
  'display',
  'display',
  'emptyCells',
  'emptyCells',
  'filter',
  'filter',
  'flex',
  'flex',
  'flexBasis',
  'flexBasis',
  'flexDirection',
  'flexDirection',
  'flexFlow',
  'flexFlow',
  'flexGrow',
  'flexGrow',
  'flexShrink',
  'flexShrink',
  'flexWrap',
  'flexWrap',
  'float',
  'float',
  'font',
  'font',
  'fontFamily',
  'fontFamily',
  'fontFeatureSettings',
  'fontFeatureSettings',
  'fontKerning',
  'fontKerning',
  'fontSize',
  'fontSize',
  'fontSizeDelta',
  'fontSizeDelta',
  'fontSmoothing',
  'fontSmoothing',
  'fontStretch',
  'fontStretch',
  'fontStyle',
  'fontStyle',
  'fontVariant',
  'fontVariant',
  'fontVariantLigatures',
  'fontVariantLigatures',
  'fontWeight',
  'fontWeight',
  'grid',
  'grid',
  'gridArea',
  'gridArea',
  'gridAutoColumns',
  'gridAutoColumns',
  'gridAutoFlow',
  'gridAutoFlow',
  'gridAutoRows',
  'gridAutoRows',
  'gridColumn',
  'gridColumn',
  'gridColumnEnd',
  'gridColumnEnd',
  'gridColumnStart',
  'gridColumnStart',
  'gridRow',
  'gridRow',
  'gridRowEnd',
  'gridRowEnd',
  'gridRowStart',
  'gridRowStart',
  'gridTemplate',
  'gridTemplate',
  'gridTemplateAreas',
  'gridTemplateAreas',
  'gridTemplateColumns',
  'gridTemplateColumns',
  'gridTemplateRows',
  'gridTemplateRows',
  'height',
  'height',
  'highlight',
  'highlight',
  'hyphenateCharacter',
  'hyphenateCharacter',
  'imageRendering',
  'imageRendering',
  'isolation',
  'isolation',
  'justifyContent',
  'justifyContent',
  'justifySelf',
  'justifySelf',
  'left',
  'left',
  'letterSpacing',
  'letterSpacing',
  'lineBoxContain',
  'lineBoxContain',
  'lineBreak',
  'lineBreak',
  'lineClamp',
  'lineClamp',
  'lineHeight',
  'lineHeight',
  'listStyle',
  'listStyle',
  'listStyleImage',
  'listStyleImage',
  'listStylePosition',
  'listStylePosition',
  'listStyleType',
  'listStyleType',
  'locale',
  'locale',
  'logicalHeight',
  'logicalHeight',
  'logicalWidth',
  'logicalWidth',
  'margin',
  'margin',
  'marginAfter',
  'marginAfter',
  'marginAfterCollapse',
  'marginAfterCollapse',
  'marginBefore',
  'marginBefore',
  'marginBeforeCollapse',
  'marginBeforeCollapse',
  'marginBottom',
  'marginBottom',
  'marginBottomCollapse',
  'marginBottomCollapse',
  'marginCollapse',
  'marginCollapse',
  'marginEnd',
  'marginEnd',
  'marginLeft',
  'marginLeft',
  'marginRight',
  'marginRight',
  'marginStart',
  'marginStart',
  'marginTop',
  'marginTop',
  'marginTopCollapse',
  'marginTopCollapse',
  'mask',
  'mask',
  'maskBoxImage',
  'maskBoxImage',
  'maskBoxImageOutset',
  'maskBoxImageOutset',
  'maskBoxImageRepeat',
  'maskBoxImageRepeat',
  'maskBoxImageSlice',
  'maskBoxImageSlice',
  'maskBoxImageSource',
  'maskBoxImageSource',
  'maskBoxImageWidth',
  'maskBoxImageWidth',
  'maskClip',
  'maskClip',
  'maskComposite',
  'maskComposite',
  'maskImage',
  'maskImage',
  'maskOrigin',
  'maskOrigin',
  'maskPosition',
  'maskPosition',
  'maskPositionX',
  'maskPositionX',
  'maskPositionY',
  'maskPositionY',
  'maskRepeat',
  'maskRepeat',
  'maskRepeatX',
  'maskRepeatX',
  'maskRepeatY',
  'maskRepeatY',
  'maskSize',
  'maskSize',
  'maskSourceType',
  'maskSourceType',
  'maxHeight',
  'maxHeight',
  'maxLogicalHeight',
  'maxLogicalHeight',
  'maxLogicalWidth',
  'maxLogicalWidth',
  'maxWidth',
  'maxWidth',
  'maxZoom',
  'maxZoom',
  'minHeight',
  'minHeight',
  'minLogicalHeight',
  'minLogicalHeight',
  'minLogicalWidth',
  'minLogicalWidth',
  'minWidth',
  'minWidth',
  'minZoom',
  'minZoom',
  'mixBlendMode',
  'mixBlendMode',
  'objectFit',
  'objectFit',
  'objectPosition',
  'objectPosition',
  'opacity',
  'opacity',
  'order',
  'order',
  'orientation',
  'orientation',
  'orphans',
  'orphans',
  'outline',
  'outline',
  'outlineColor',
  'outlineColor',
  'outlineOffset',
  'outlineOffset',
  'outlineStyle',
  'outlineStyle',
  'outlineWidth',
  'outlineWidth',
  'overflow',
  'overflow',
  'overflowWrap',
  'overflowWrap',
  'overflowX',
  'overflowX',
  'overflowY',
  'overflowY',
  'padding',
  'padding',
  'paddingAfter',
  'paddingAfter',
  'paddingBefore',
  'paddingBefore',
  'paddingBottom',
  'paddingBottom',
  'paddingEnd',
  'paddingEnd',
  'paddingLeft',
  'paddingLeft',
  'paddingRight',
  'paddingRight',
  'paddingStart',
  'paddingStart',
  'paddingTop',
  'paddingTop',
  'page',
  'page',
  'pageBreakAfter',
  'pageBreakAfter',
  'pageBreakBefore',
  'pageBreakBefore',
  'pageBreakInside',
  'pageBreakInside',
  'perspective',
  'perspective',
  'perspectiveOrigin',
  'perspectiveOrigin',
  'perspectiveOriginX',
  'perspectiveOriginX',
  'perspectiveOriginY',
  'perspectiveOriginY',
  'pointerEvents',
  'pointerEvents',
  'position',
  'position',
  'printColorAdjust',
  'printColorAdjust',
  'quotes',
  'quotes',
  'resize',
  'resize',
  'right',
  'right',
  'rtlOrdering',
  'rtlOrdering',
  'rubyPosition',
  'rubyPosition',
  'scrollBehavior',
  'scrollBehavior',
  'shapeImageThreshold',
  'shapeImageThreshold',
  'shapeMargin',
  'shapeMargin',
  'shapeOutside',
  'shapeOutside',
  'size',
  'size',
  'speak',
  'speak',
  'src',
  'src',
  'tabSize',
  'tabSize',
  'tableLayout',
  'tableLayout',
  'tapHighlightColor',
  'tapHighlightColor',
  'textAlign',
  'textAlign',
  'textAlignLast',
  'textAlignLast',
  'textCombine',
  'textCombine',
  'textDecoration',
  'textDecoration',
  'textDecorationColor',
  'textDecorationColor',
  'textDecorationLine',
  'textDecorationLine',
  'textDecorationStyle',
  'textDecorationStyle',
  'textDecorationsInEffect',
  'textDecorationsInEffect',
  'textEmphasis',
  'textEmphasis',
  'textEmphasisColor',
  'textEmphasisColor',
  'textEmphasisPosition',
  'textEmphasisPosition',
  'textEmphasisStyle',
  'textEmphasisStyle',
  'textFillColor',
  'textFillColor',
  'textIndent',
  'textIndent',
  'textJustify',
  'textJustify',
  'textLineThroughColor',
  'textLineThroughColor',
  'textLineThroughMode',
  'textLineThroughMode',
  'textLineThroughStyle',
  'textLineThroughStyle',
  'textLineThroughWidth',
  'textLineThroughWidth',
  'textOrientation',
  'textOrientation',
  'textOverflow',
  'textOverflow',
  'textOverlineColor',
  'textOverlineColor',
  'textOverlineMode',
  'textOverlineMode',
  'textOverlineStyle',
  'textOverlineStyle',
  'textOverlineWidth',
  'textOverlineWidth',
  'textRendering',
  'textRendering',
  'textSecurity',
  'textSecurity',
  'textShadow',
  'textShadow',
  'textStroke',
  'textStroke',
  'textStrokeColor',
  'textStrokeColor',
  'textStrokeWidth',
  'textStrokeWidth',
  'textTransform',
  'textTransform',
  'textUnderlineColor',
  'textUnderlineColor',
  'textUnderlineMode',
  'textUnderlineMode',
  'textUnderlinePosition',
  'textUnderlinePosition',
  'textUnderlineStyle',
  'textUnderlineStyle',
  'textUnderlineWidth',
  'textUnderlineWidth',
  'top',
  'top',
  'touchAction',
  'touchAction',
  'touchActionDelay',
  'touchActionDelay',
  'transform',
  'transform',
  'transformOrigin',
  'transformOrigin',
  'transformOriginX',
  'transformOriginX',
  'transformOriginY',
  'transformOriginY',
  'transformOriginZ',
  'transformOriginZ',
  'transformStyle',
  'transformStyle',
  'transition',
  'transition',
  'transitionDelay',
  'transitionDelay',
  'transitionDuration',
  'transitionDuration',
  'transitionProperty',
  'transitionProperty',
  'transitionTimingFunction',
  'transitionTimingFunction',
  'unicodeBidi',
  'unicodeBidi',
  'unicodeRange',
  'unicodeRange',
  'userDrag',
  'userDrag',
  'userModify',
  'userModify',
  'userSelect',
  'userSelect',
  'userZoom',
  'userZoom',
  'verticalAlign',
  'verticalAlign',
  'visibility',
  'visibility',
  'whiteSpace',
  'whiteSpace',
  'widows',
  'widows',
  'width',
  'width',
  'willChange',
  'willChange',
  'wordBreak',
  'wordBreak',
  'wordSpacing',
  'wordSpacing',
  'wordWrap',
  'wordWrap',
  'wrapFlow',
  'wrapFlow',
  'wrapThrough',
  'wrapThrough',
  'writingMode',
  'writingMode',
  'zIndex',
  'zIndex',
  'zoom',
  'zoom'
]);
dart.defineExtensionNames([
  'getPropertyValue',
  'supportsProperty',
  'setProperty',
  'getPropertyPriority',
  'item',
  'removeProperty',
  'background',
  'background',
  'backgroundAttachment',
  'backgroundAttachment',
  'backgroundColor',
  'backgroundColor',
  'backgroundImage',
  'backgroundImage',
  'backgroundPosition',
  'backgroundPosition',
  'backgroundRepeat',
  'backgroundRepeat',
  'border',
  'border',
  'borderBottom',
  'borderBottom',
  'borderBottomColor',
  'borderBottomColor',
  'borderBottomStyle',
  'borderBottomStyle',
  'borderBottomWidth',
  'borderBottomWidth',
  'borderCollapse',
  'borderCollapse',
  'borderColor',
  'borderColor',
  'borderLeft',
  'borderLeft',
  'borderLeftColor',
  'borderLeftColor',
  'borderLeftStyle',
  'borderLeftStyle',
  'borderLeftWidth',
  'borderLeftWidth',
  'borderRight',
  'borderRight',
  'borderRightColor',
  'borderRightColor',
  'borderRightStyle',
  'borderRightStyle',
  'borderRightWidth',
  'borderRightWidth',
  'borderSpacing',
  'borderSpacing',
  'borderStyle',
  'borderStyle',
  'borderTop',
  'borderTop',
  'borderTopColor',
  'borderTopColor',
  'borderTopStyle',
  'borderTopStyle',
  'borderTopWidth',
  'borderTopWidth',
  'borderWidth',
  'borderWidth',
  'bottom',
  'bottom',
  'captionSide',
  'captionSide',
  'clear',
  'clear',
  'clip',
  'clip',
  'color',
  'color',
  'content',
  'content',
  'cursor',
  'cursor',
  'direction',
  'direction',
  'display',
  'display',
  'emptyCells',
  'emptyCells',
  'font',
  'font',
  'fontFamily',
  'fontFamily',
  'fontSize',
  'fontSize',
  'fontStyle',
  'fontStyle',
  'fontVariant',
  'fontVariant',
  'fontWeight',
  'fontWeight',
  'height',
  'height',
  'left',
  'left',
  'letterSpacing',
  'letterSpacing',
  'lineHeight',
  'lineHeight',
  'listStyle',
  'listStyle',
  'listStyleImage',
  'listStyleImage',
  'listStylePosition',
  'listStylePosition',
  'listStyleType',
  'listStyleType',
  'margin',
  'margin',
  'marginBottom',
  'marginBottom',
  'marginLeft',
  'marginLeft',
  'marginRight',
  'marginRight',
  'marginTop',
  'marginTop',
  'maxHeight',
  'maxHeight',
  'maxWidth',
  'maxWidth',
  'minHeight',
  'minHeight',
  'minWidth',
  'minWidth',
  'outline',
  'outline',
  'outlineColor',
  'outlineColor',
  'outlineStyle',
  'outlineStyle',
  'outlineWidth',
  'outlineWidth',
  'overflow',
  'overflow',
  'padding',
  'padding',
  'paddingBottom',
  'paddingBottom',
  'paddingLeft',
  'paddingLeft',
  'paddingRight',
  'paddingRight',
  'paddingTop',
  'paddingTop',
  'pageBreakAfter',
  'pageBreakAfter',
  'pageBreakBefore',
  'pageBreakBefore',
  'pageBreakInside',
  'pageBreakInside',
  'position',
  'position',
  'quotes',
  'quotes',
  'right',
  'right',
  'tableLayout',
  'tableLayout',
  'textAlign',
  'textAlign',
  'textDecoration',
  'textDecoration',
  'textIndent',
  'textIndent',
  'textTransform',
  'textTransform',
  'top',
  'top',
  'unicodeBidi',
  'unicodeBidi',
  'verticalAlign',
  'verticalAlign',
  'visibility',
  'visibility',
  'whiteSpace',
  'whiteSpace',
  'width',
  'width',
  'wordSpacing',
  'wordSpacing',
  'zIndex',
  'zIndex',
  'cssText',
  'length',
  'parentRule'
]);
html$.CssStyleDeclaration = class CssStyleDeclaration extends dart.mixin(_interceptors.Interceptor, html$.CssStyleDeclarationBase) {
  static new() {
    return html$.CssStyleDeclaration.css('');
  }
  static css(css) {
    let style = html$.Element.tag('div')[dartx.style];
    style[dartx.cssText] = css;
    return style;
  }
  [dartx.getPropertyValue](propertyName) {
    let propValue = this[_getPropertyValueHelper](propertyName);
    return propValue != null ? propValue : '';
  }
  [_getPropertyValueHelper](propertyName) {
    if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
      return this[_getPropertyValue](propertyName);
    } else {
      return this[_getPropertyValue](dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName));
    }
  }
  [dartx.supportsProperty](propertyName) {
    return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName))));
  }
  [_supportsProperty](propertyName) {
    return propertyName in this;
  }
  [dartx.setProperty](propertyName, value, priority) {
    if (priority === void 0) priority = null;
    return this[_setPropertyHelper](this[_browserPropertyName](propertyName), value, priority);
  }
  [_browserPropertyName](propertyName) {
    let name = html$.CssStyleDeclaration._readCache(propertyName);
    if (typeof name == 'string') return name;
    if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
      name = propertyName;
    } else {
      name = dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName);
    }
    html$.CssStyleDeclaration._writeCache(propertyName, name);
    return name;
  }
  static _readCache(key) {
    return html$.CssStyleDeclaration._propertyCache[key];
  }
  static _writeCache(key, value) {
    html$.CssStyleDeclaration._propertyCache[key] = value;
  }
  static _camelCase(hyphenated) {
    let replacedMs = hyphenated.replace(/^-ms-/, "ms-");
    return replacedMs.replace(/-([\da-z])/ig, (_, letter) => letter.toUpperCase());
  }
  [_setPropertyHelper](propertyName, value, priority) {
    if (priority === void 0) priority = null;
    if (value == null) value = '';
    if (priority == null) priority = '';
    this.setProperty(propertyName, value, priority);
  }
  static get supportsTransitions() {
    return html$.document[dartx.body][dartx.style][dartx.supportsProperty]('transition');
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.cssText]() {
    return this.cssText;
  }
  set [dartx.cssText](value) {
    this.cssText = value;
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.parentRule]() {
    return this.parentRule;
  }
  [dartx.getPropertyPriority](...args) {
    return this.getPropertyPriority.apply(this, args);
  }
  [_getPropertyValue](...args) {
    return this.getPropertyValue.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.removeProperty](...args) {
    return this.removeProperty.apply(this, args);
  }
  get [dartx.background]() {
    return this[_background];
  }
  set [dartx.background](value) {
    this[_background] = value == null ? '' : value;
  }
  get [_background]() {
    return this.background;
  }
  set [_background](value) {
    this.background = value;
  }
  get [dartx.backgroundAttachment]() {
    return this[_backgroundAttachment];
  }
  set [dartx.backgroundAttachment](value) {
    this[_backgroundAttachment] = value == null ? '' : value;
  }
  get [_backgroundAttachment]() {
    return this.backgroundAttachment;
  }
  set [_backgroundAttachment](value) {
    this.backgroundAttachment = value;
  }
  get [dartx.backgroundColor]() {
    return this[_backgroundColor];
  }
  set [dartx.backgroundColor](value) {
    this[_backgroundColor] = value == null ? '' : value;
  }
  get [_backgroundColor]() {
    return this.backgroundColor;
  }
  set [_backgroundColor](value) {
    this.backgroundColor = value;
  }
  get [dartx.backgroundImage]() {
    return this[_backgroundImage];
  }
  set [dartx.backgroundImage](value) {
    this[_backgroundImage] = value == null ? '' : value;
  }
  get [_backgroundImage]() {
    return this.backgroundImage;
  }
  set [_backgroundImage](value) {
    this.backgroundImage = value;
  }
  get [dartx.backgroundPosition]() {
    return this[_backgroundPosition];
  }
  set [dartx.backgroundPosition](value) {
    this[_backgroundPosition] = value == null ? '' : value;
  }
  get [_backgroundPosition]() {
    return this.backgroundPosition;
  }
  set [_backgroundPosition](value) {
    this.backgroundPosition = value;
  }
  get [dartx.backgroundRepeat]() {
    return this[_backgroundRepeat];
  }
  set [dartx.backgroundRepeat](value) {
    this[_backgroundRepeat] = value == null ? '' : value;
  }
  get [_backgroundRepeat]() {
    return this.backgroundRepeat;
  }
  set [_backgroundRepeat](value) {
    this.backgroundRepeat = value;
  }
  get [dartx.border]() {
    return this[_border];
  }
  set [dartx.border](value) {
    this[_border] = value == null ? '' : value;
  }
  get [_border]() {
    return this.border;
  }
  set [_border](value) {
    this.border = value;
  }
  get [dartx.borderBottom]() {
    return this[_borderBottom];
  }
  set [dartx.borderBottom](value) {
    this[_borderBottom] = value == null ? '' : value;
  }
  get [_borderBottom]() {
    return this.borderBottom;
  }
  set [_borderBottom](value) {
    this.borderBottom = value;
  }
  get [dartx.borderBottomColor]() {
    return this[_borderBottomColor];
  }
  set [dartx.borderBottomColor](value) {
    this[_borderBottomColor] = value == null ? '' : value;
  }
  get [_borderBottomColor]() {
    return this.borderBottomColor;
  }
  set [_borderBottomColor](value) {
    this.borderBottomColor = value;
  }
  get [dartx.borderBottomStyle]() {
    return this[_borderBottomStyle];
  }
  set [dartx.borderBottomStyle](value) {
    this[_borderBottomStyle] = value == null ? '' : value;
  }
  get [_borderBottomStyle]() {
    return this.borderBottomStyle;
  }
  set [_borderBottomStyle](value) {
    this.borderBottomStyle = value;
  }
  get [dartx.borderBottomWidth]() {
    return this[_borderBottomWidth];
  }
  set [dartx.borderBottomWidth](value) {
    this[_borderBottomWidth] = value == null ? '' : value;
  }
  get [_borderBottomWidth]() {
    return this.borderBottomWidth;
  }
  set [_borderBottomWidth](value) {
    this.borderBottomWidth = value;
  }
  get [dartx.borderCollapse]() {
    return this[_borderCollapse];
  }
  set [dartx.borderCollapse](value) {
    this[_borderCollapse] = value == null ? '' : value;
  }
  get [_borderCollapse]() {
    return this.borderCollapse;
  }
  set [_borderCollapse](value) {
    this.borderCollapse = value;
  }
  get [dartx.borderColor]() {
    return this[_borderColor];
  }
  set [dartx.borderColor](value) {
    this[_borderColor] = value == null ? '' : value;
  }
  get [_borderColor]() {
    return this.borderColor;
  }
  set [_borderColor](value) {
    this.borderColor = value;
  }
  get [dartx.borderLeft]() {
    return this[_borderLeft];
  }
  set [dartx.borderLeft](value) {
    this[_borderLeft] = value == null ? '' : value;
  }
  get [_borderLeft]() {
    return this.borderLeft;
  }
  set [_borderLeft](value) {
    this.borderLeft = value;
  }
  get [dartx.borderLeftColor]() {
    return this[_borderLeftColor];
  }
  set [dartx.borderLeftColor](value) {
    this[_borderLeftColor] = value == null ? '' : value;
  }
  get [_borderLeftColor]() {
    return this.borderLeftColor;
  }
  set [_borderLeftColor](value) {
    this.borderLeftColor = value;
  }
  get [dartx.borderLeftStyle]() {
    return this[_borderLeftStyle];
  }
  set [dartx.borderLeftStyle](value) {
    this[_borderLeftStyle] = value == null ? '' : value;
  }
  get [_borderLeftStyle]() {
    return this.borderLeftStyle;
  }
  set [_borderLeftStyle](value) {
    this.borderLeftStyle = value;
  }
  get [dartx.borderLeftWidth]() {
    return this[_borderLeftWidth];
  }
  set [dartx.borderLeftWidth](value) {
    this[_borderLeftWidth] = value == null ? '' : value;
  }
  get [_borderLeftWidth]() {
    return this.borderLeftWidth;
  }
  set [_borderLeftWidth](value) {
    this.borderLeftWidth = value;
  }
  get [dartx.borderRight]() {
    return this[_borderRight];
  }
  set [dartx.borderRight](value) {
    this[_borderRight] = value == null ? '' : value;
  }
  get [_borderRight]() {
    return this.borderRight;
  }
  set [_borderRight](value) {
    this.borderRight = value;
  }
  get [dartx.borderRightColor]() {
    return this[_borderRightColor];
  }
  set [dartx.borderRightColor](value) {
    this[_borderRightColor] = value == null ? '' : value;
  }
  get [_borderRightColor]() {
    return this.borderRightColor;
  }
  set [_borderRightColor](value) {
    this.borderRightColor = value;
  }
  get [dartx.borderRightStyle]() {
    return this[_borderRightStyle];
  }
  set [dartx.borderRightStyle](value) {
    this[_borderRightStyle] = value == null ? '' : value;
  }
  get [_borderRightStyle]() {
    return this.borderRightStyle;
  }
  set [_borderRightStyle](value) {
    this.borderRightStyle = value;
  }
  get [dartx.borderRightWidth]() {
    return this[_borderRightWidth];
  }
  set [dartx.borderRightWidth](value) {
    this[_borderRightWidth] = value == null ? '' : value;
  }
  get [_borderRightWidth]() {
    return this.borderRightWidth;
  }
  set [_borderRightWidth](value) {
    this.borderRightWidth = value;
  }
  get [dartx.borderSpacing]() {
    return this[_borderSpacing];
  }
  set [dartx.borderSpacing](value) {
    this[_borderSpacing] = value == null ? '' : value;
  }
  get [_borderSpacing]() {
    return this.borderSpacing;
  }
  set [_borderSpacing](value) {
    this.borderSpacing = value;
  }
  get [dartx.borderStyle]() {
    return this[_borderStyle];
  }
  set [dartx.borderStyle](value) {
    this[_borderStyle] = value == null ? '' : value;
  }
  get [_borderStyle]() {
    return this.borderStyle;
  }
  set [_borderStyle](value) {
    this.borderStyle = value;
  }
  get [dartx.borderTop]() {
    return this[_borderTop];
  }
  set [dartx.borderTop](value) {
    this[_borderTop] = value == null ? '' : value;
  }
  get [_borderTop]() {
    return this.borderTop;
  }
  set [_borderTop](value) {
    this.borderTop = value;
  }
  get [dartx.borderTopColor]() {
    return this[_borderTopColor];
  }
  set [dartx.borderTopColor](value) {
    this[_borderTopColor] = value == null ? '' : value;
  }
  get [_borderTopColor]() {
    return this.borderTopColor;
  }
  set [_borderTopColor](value) {
    this.borderTopColor = value;
  }
  get [dartx.borderTopStyle]() {
    return this[_borderTopStyle];
  }
  set [dartx.borderTopStyle](value) {
    this[_borderTopStyle] = value == null ? '' : value;
  }
  get [_borderTopStyle]() {
    return this.borderTopStyle;
  }
  set [_borderTopStyle](value) {
    this.borderTopStyle = value;
  }
  get [dartx.borderTopWidth]() {
    return this[_borderTopWidth];
  }
  set [dartx.borderTopWidth](value) {
    this[_borderTopWidth] = value == null ? '' : value;
  }
  get [_borderTopWidth]() {
    return this.borderTopWidth;
  }
  set [_borderTopWidth](value) {
    this.borderTopWidth = value;
  }
  get [dartx.borderWidth]() {
    return this[_borderWidth];
  }
  set [dartx.borderWidth](value) {
    this[_borderWidth] = value == null ? '' : value;
  }
  get [_borderWidth]() {
    return this.borderWidth;
  }
  set [_borderWidth](value) {
    this.borderWidth = value;
  }
  get [dartx.bottom]() {
    return this[_bottom];
  }
  set [dartx.bottom](value) {
    this[_bottom] = value == null ? '' : value;
  }
  get [_bottom]() {
    return this.bottom;
  }
  set [_bottom](value) {
    this.bottom = value;
  }
  get [dartx.captionSide]() {
    return this[_captionSide];
  }
  set [dartx.captionSide](value) {
    this[_captionSide] = value == null ? '' : value;
  }
  get [_captionSide]() {
    return this.captionSide;
  }
  set [_captionSide](value) {
    this.captionSide = value;
  }
  get [dartx.clear]() {
    return this[_clear$1];
  }
  set [dartx.clear](value) {
    this[_clear$1] = value == null ? '' : value;
  }
  get [_clear$1]() {
    return this.clear;
  }
  set [_clear$1](value) {
    this.clear = value;
  }
  get [dartx.clip]() {
    return this[_clip];
  }
  set [dartx.clip](value) {
    this[_clip] = value == null ? '' : value;
  }
  get [_clip]() {
    return this.clip;
  }
  set [_clip](value) {
    this.clip = value;
  }
  get [dartx.color]() {
    return this[_color];
  }
  set [dartx.color](value) {
    this[_color] = value == null ? '' : value;
  }
  get [_color]() {
    return this.color;
  }
  set [_color](value) {
    this.color = value;
  }
  get [dartx.content]() {
    return this[_content];
  }
  set [dartx.content](value) {
    this[_content] = value == null ? '' : value;
  }
  get [_content]() {
    return this.content;
  }
  set [_content](value) {
    this.content = value;
  }
  get [dartx.cursor]() {
    return this[_cursor];
  }
  set [dartx.cursor](value) {
    this[_cursor] = value == null ? '' : value;
  }
  get [_cursor]() {
    return this.cursor;
  }
  set [_cursor](value) {
    this.cursor = value;
  }
  get [dartx.direction]() {
    return this[_direction];
  }
  set [dartx.direction](value) {
    this[_direction] = value == null ? '' : value;
  }
  get [_direction]() {
    return this.direction;
  }
  set [_direction](value) {
    this.direction = value;
  }
  get [dartx.display]() {
    return this[_display];
  }
  set [dartx.display](value) {
    this[_display] = value == null ? '' : value;
  }
  get [_display]() {
    return this.display;
  }
  set [_display](value) {
    this.display = value;
  }
  get [dartx.emptyCells]() {
    return this[_emptyCells];
  }
  set [dartx.emptyCells](value) {
    this[_emptyCells] = value == null ? '' : value;
  }
  get [_emptyCells]() {
    return this.emptyCells;
  }
  set [_emptyCells](value) {
    this.emptyCells = value;
  }
  get [dartx.font]() {
    return this[_font];
  }
  set [dartx.font](value) {
    this[_font] = value == null ? '' : value;
  }
  get [_font]() {
    return this.font;
  }
  set [_font](value) {
    this.font = value;
  }
  get [dartx.fontFamily]() {
    return this[_fontFamily];
  }
  set [dartx.fontFamily](value) {
    this[_fontFamily] = value == null ? '' : value;
  }
  get [_fontFamily]() {
    return this.fontFamily;
  }
  set [_fontFamily](value) {
    this.fontFamily = value;
  }
  get [dartx.fontSize]() {
    return this[_fontSize];
  }
  set [dartx.fontSize](value) {
    this[_fontSize] = value == null ? '' : value;
  }
  get [_fontSize]() {
    return this.fontSize;
  }
  set [_fontSize](value) {
    this.fontSize = value;
  }
  get [dartx.fontStyle]() {
    return this[_fontStyle];
  }
  set [dartx.fontStyle](value) {
    this[_fontStyle] = value == null ? '' : value;
  }
  get [_fontStyle]() {
    return this.fontStyle;
  }
  set [_fontStyle](value) {
    this.fontStyle = value;
  }
  get [dartx.fontVariant]() {
    return this[_fontVariant];
  }
  set [dartx.fontVariant](value) {
    this[_fontVariant] = value == null ? '' : value;
  }
  get [_fontVariant]() {
    return this.fontVariant;
  }
  set [_fontVariant](value) {
    this.fontVariant = value;
  }
  get [dartx.fontWeight]() {
    return this[_fontWeight];
  }
  set [dartx.fontWeight](value) {
    this[_fontWeight] = value == null ? '' : value;
  }
  get [_fontWeight]() {
    return this.fontWeight;
  }
  set [_fontWeight](value) {
    this.fontWeight = value;
  }
  get [dartx.height]() {
    return this[_height$];
  }
  set [dartx.height](value) {
    this[_height$] = value == null ? '' : value;
  }
  get [_height$]() {
    return this.height;
  }
  set [_height$](value) {
    this.height = value;
  }
  get [dartx.left]() {
    return this[_left];
  }
  set [dartx.left](value) {
    this[_left] = value == null ? '' : value;
  }
  get [_left]() {
    return this.left;
  }
  set [_left](value) {
    this.left = value;
  }
  get [dartx.letterSpacing]() {
    return this[_letterSpacing];
  }
  set [dartx.letterSpacing](value) {
    this[_letterSpacing] = value == null ? '' : value;
  }
  get [_letterSpacing]() {
    return this.letterSpacing;
  }
  set [_letterSpacing](value) {
    this.letterSpacing = value;
  }
  get [dartx.lineHeight]() {
    return this[_lineHeight];
  }
  set [dartx.lineHeight](value) {
    this[_lineHeight] = value == null ? '' : value;
  }
  get [_lineHeight]() {
    return this.lineHeight;
  }
  set [_lineHeight](value) {
    this.lineHeight = value;
  }
  get [dartx.listStyle]() {
    return this[_listStyle];
  }
  set [dartx.listStyle](value) {
    this[_listStyle] = value == null ? '' : value;
  }
  get [_listStyle]() {
    return this.listStyle;
  }
  set [_listStyle](value) {
    this.listStyle = value;
  }
  get [dartx.listStyleImage]() {
    return this[_listStyleImage];
  }
  set [dartx.listStyleImage](value) {
    this[_listStyleImage] = value == null ? '' : value;
  }
  get [_listStyleImage]() {
    return this.listStyleImage;
  }
  set [_listStyleImage](value) {
    this.listStyleImage = value;
  }
  get [dartx.listStylePosition]() {
    return this[_listStylePosition];
  }
  set [dartx.listStylePosition](value) {
    this[_listStylePosition] = value == null ? '' : value;
  }
  get [_listStylePosition]() {
    return this.listStylePosition;
  }
  set [_listStylePosition](value) {
    this.listStylePosition = value;
  }
  get [dartx.listStyleType]() {
    return this[_listStyleType];
  }
  set [dartx.listStyleType](value) {
    this[_listStyleType] = value == null ? '' : value;
  }
  get [_listStyleType]() {
    return this.listStyleType;
  }
  set [_listStyleType](value) {
    this.listStyleType = value;
  }
  get [dartx.margin]() {
    return this[_margin];
  }
  set [dartx.margin](value) {
    this[_margin] = value == null ? '' : value;
  }
  get [_margin]() {
    return this.margin;
  }
  set [_margin](value) {
    this.margin = value;
  }
  get [dartx.marginBottom]() {
    return this[_marginBottom];
  }
  set [dartx.marginBottom](value) {
    this[_marginBottom] = value == null ? '' : value;
  }
  get [_marginBottom]() {
    return this.marginBottom;
  }
  set [_marginBottom](value) {
    this.marginBottom = value;
  }
  get [dartx.marginLeft]() {
    return this[_marginLeft];
  }
  set [dartx.marginLeft](value) {
    this[_marginLeft] = value == null ? '' : value;
  }
  get [_marginLeft]() {
    return this.marginLeft;
  }
  set [_marginLeft](value) {
    this.marginLeft = value;
  }
  get [dartx.marginRight]() {
    return this[_marginRight];
  }
  set [dartx.marginRight](value) {
    this[_marginRight] = value == null ? '' : value;
  }
  get [_marginRight]() {
    return this.marginRight;
  }
  set [_marginRight](value) {
    this.marginRight = value;
  }
  get [dartx.marginTop]() {
    return this[_marginTop];
  }
  set [dartx.marginTop](value) {
    this[_marginTop] = value == null ? '' : value;
  }
  get [_marginTop]() {
    return this.marginTop;
  }
  set [_marginTop](value) {
    this.marginTop = value;
  }
  get [dartx.maxHeight]() {
    return this[_maxHeight];
  }
  set [dartx.maxHeight](value) {
    this[_maxHeight] = value == null ? '' : value;
  }
  get [_maxHeight]() {
    return this.maxHeight;
  }
  set [_maxHeight](value) {
    this.maxHeight = value;
  }
  get [dartx.maxWidth]() {
    return this[_maxWidth];
  }
  set [dartx.maxWidth](value) {
    this[_maxWidth] = value == null ? '' : value;
  }
  get [_maxWidth]() {
    return this.maxWidth;
  }
  set [_maxWidth](value) {
    this.maxWidth = value;
  }
  get [dartx.minHeight]() {
    return this[_minHeight];
  }
  set [dartx.minHeight](value) {
    this[_minHeight] = value == null ? '' : value;
  }
  get [_minHeight]() {
    return this.minHeight;
  }
  set [_minHeight](value) {
    this.minHeight = value;
  }
  get [dartx.minWidth]() {
    return this[_minWidth];
  }
  set [dartx.minWidth](value) {
    this[_minWidth] = value == null ? '' : value;
  }
  get [_minWidth]() {
    return this.minWidth;
  }
  set [_minWidth](value) {
    this.minWidth = value;
  }
  get [dartx.outline]() {
    return this[_outline];
  }
  set [dartx.outline](value) {
    this[_outline] = value == null ? '' : value;
  }
  get [_outline]() {
    return this.outline;
  }
  set [_outline](value) {
    this.outline = value;
  }
  get [dartx.outlineColor]() {
    return this[_outlineColor];
  }
  set [dartx.outlineColor](value) {
    this[_outlineColor] = value == null ? '' : value;
  }
  get [_outlineColor]() {
    return this.outlineColor;
  }
  set [_outlineColor](value) {
    this.outlineColor = value;
  }
  get [dartx.outlineStyle]() {
    return this[_outlineStyle];
  }
  set [dartx.outlineStyle](value) {
    this[_outlineStyle] = value == null ? '' : value;
  }
  get [_outlineStyle]() {
    return this.outlineStyle;
  }
  set [_outlineStyle](value) {
    this.outlineStyle = value;
  }
  get [dartx.outlineWidth]() {
    return this[_outlineWidth];
  }
  set [dartx.outlineWidth](value) {
    this[_outlineWidth] = value == null ? '' : value;
  }
  get [_outlineWidth]() {
    return this.outlineWidth;
  }
  set [_outlineWidth](value) {
    this.outlineWidth = value;
  }
  get [dartx.overflow]() {
    return this[_overflow];
  }
  set [dartx.overflow](value) {
    this[_overflow] = value == null ? '' : value;
  }
  get [_overflow]() {
    return this.overflow;
  }
  set [_overflow](value) {
    this.overflow = value;
  }
  get [dartx.padding]() {
    return this[_padding];
  }
  set [dartx.padding](value) {
    this[_padding] = value == null ? '' : value;
  }
  get [_padding]() {
    return this.padding;
  }
  set [_padding](value) {
    this.padding = value;
  }
  get [dartx.paddingBottom]() {
    return this[_paddingBottom];
  }
  set [dartx.paddingBottom](value) {
    this[_paddingBottom] = value == null ? '' : value;
  }
  get [_paddingBottom]() {
    return this.paddingBottom;
  }
  set [_paddingBottom](value) {
    this.paddingBottom = value;
  }
  get [dartx.paddingLeft]() {
    return this[_paddingLeft];
  }
  set [dartx.paddingLeft](value) {
    this[_paddingLeft] = value == null ? '' : value;
  }
  get [_paddingLeft]() {
    return this.paddingLeft;
  }
  set [_paddingLeft](value) {
    this.paddingLeft = value;
  }
  get [dartx.paddingRight]() {
    return this[_paddingRight];
  }
  set [dartx.paddingRight](value) {
    this[_paddingRight] = value == null ? '' : value;
  }
  get [_paddingRight]() {
    return this.paddingRight;
  }
  set [_paddingRight](value) {
    this.paddingRight = value;
  }
  get [dartx.paddingTop]() {
    return this[_paddingTop];
  }
  set [dartx.paddingTop](value) {
    this[_paddingTop] = value == null ? '' : value;
  }
  get [_paddingTop]() {
    return this.paddingTop;
  }
  set [_paddingTop](value) {
    this.paddingTop = value;
  }
  get [dartx.pageBreakAfter]() {
    return this[_pageBreakAfter];
  }
  set [dartx.pageBreakAfter](value) {
    this[_pageBreakAfter] = value == null ? '' : value;
  }
  get [_pageBreakAfter]() {
    return this.pageBreakAfter;
  }
  set [_pageBreakAfter](value) {
    this.pageBreakAfter = value;
  }
  get [dartx.pageBreakBefore]() {
    return this[_pageBreakBefore];
  }
  set [dartx.pageBreakBefore](value) {
    this[_pageBreakBefore] = value == null ? '' : value;
  }
  get [_pageBreakBefore]() {
    return this.pageBreakBefore;
  }
  set [_pageBreakBefore](value) {
    this.pageBreakBefore = value;
  }
  get [dartx.pageBreakInside]() {
    return this[_pageBreakInside];
  }
  set [dartx.pageBreakInside](value) {
    this[_pageBreakInside] = value == null ? '' : value;
  }
  get [_pageBreakInside]() {
    return this.pageBreakInside;
  }
  set [_pageBreakInside](value) {
    this.pageBreakInside = value;
  }
  get [dartx.position]() {
    return this[_position$1];
  }
  set [dartx.position](value) {
    this[_position$1] = value == null ? '' : value;
  }
  get [_position$1]() {
    return this.position;
  }
  set [_position$1](value) {
    this.position = value;
  }
  get [dartx.quotes]() {
    return this[_quotes];
  }
  set [dartx.quotes](value) {
    this[_quotes] = value == null ? '' : value;
  }
  get [_quotes]() {
    return this.quotes;
  }
  set [_quotes](value) {
    this.quotes = value;
  }
  get [dartx.right]() {
    return this[_right];
  }
  set [dartx.right](value) {
    this[_right] = value == null ? '' : value;
  }
  get [_right]() {
    return this.right;
  }
  set [_right](value) {
    this.right = value;
  }
  get [dartx.tableLayout]() {
    return this[_tableLayout];
  }
  set [dartx.tableLayout](value) {
    this[_tableLayout] = value == null ? '' : value;
  }
  get [_tableLayout]() {
    return this.tableLayout;
  }
  set [_tableLayout](value) {
    this.tableLayout = value;
  }
  get [dartx.textAlign]() {
    return this[_textAlign];
  }
  set [dartx.textAlign](value) {
    this[_textAlign] = value == null ? '' : value;
  }
  get [_textAlign]() {
    return this.textAlign;
  }
  set [_textAlign](value) {
    this.textAlign = value;
  }
  get [dartx.textDecoration]() {
    return this[_textDecoration];
  }
  set [dartx.textDecoration](value) {
    this[_textDecoration] = value == null ? '' : value;
  }
  get [_textDecoration]() {
    return this.textDecoration;
  }
  set [_textDecoration](value) {
    this.textDecoration = value;
  }
  get [dartx.textIndent]() {
    return this[_textIndent];
  }
  set [dartx.textIndent](value) {
    this[_textIndent] = value == null ? '' : value;
  }
  get [_textIndent]() {
    return this.textIndent;
  }
  set [_textIndent](value) {
    this.textIndent = value;
  }
  get [dartx.textTransform]() {
    return this[_textTransform];
  }
  set [dartx.textTransform](value) {
    this[_textTransform] = value == null ? '' : value;
  }
  get [_textTransform]() {
    return this.textTransform;
  }
  set [_textTransform](value) {
    this.textTransform = value;
  }
  get [dartx.top]() {
    return this[_top];
  }
  set [dartx.top](value) {
    this[_top] = value == null ? '' : value;
  }
  get [_top]() {
    return this.top;
  }
  set [_top](value) {
    this.top = value;
  }
  get [dartx.unicodeBidi]() {
    return this[_unicodeBidi];
  }
  set [dartx.unicodeBidi](value) {
    this[_unicodeBidi] = value == null ? '' : value;
  }
  get [_unicodeBidi]() {
    return this.unicodeBidi;
  }
  set [_unicodeBidi](value) {
    this.unicodeBidi = value;
  }
  get [dartx.verticalAlign]() {
    return this[_verticalAlign];
  }
  set [dartx.verticalAlign](value) {
    this[_verticalAlign] = value == null ? '' : value;
  }
  get [_verticalAlign]() {
    return this.verticalAlign;
  }
  set [_verticalAlign](value) {
    this.verticalAlign = value;
  }
  get [dartx.visibility]() {
    return this[_visibility];
  }
  set [dartx.visibility](value) {
    this[_visibility] = value == null ? '' : value;
  }
  get [_visibility]() {
    return this.visibility;
  }
  set [_visibility](value) {
    this.visibility = value;
  }
  get [dartx.whiteSpace]() {
    return this[_whiteSpace];
  }
  set [dartx.whiteSpace](value) {
    this[_whiteSpace] = value == null ? '' : value;
  }
  get [_whiteSpace]() {
    return this.whiteSpace;
  }
  set [_whiteSpace](value) {
    this.whiteSpace = value;
  }
  get [dartx.width]() {
    return this[_width$];
  }
  set [dartx.width](value) {
    this[_width$] = value == null ? '' : value;
  }
  get [_width$]() {
    return this.width;
  }
  set [_width$](value) {
    this.width = value;
  }
  get [dartx.wordSpacing]() {
    return this[_wordSpacing];
  }
  set [dartx.wordSpacing](value) {
    this[_wordSpacing] = value == null ? '' : value;
  }
  get [_wordSpacing]() {
    return this.wordSpacing;
  }
  set [_wordSpacing](value) {
    this.wordSpacing = value;
  }
  get [dartx.zIndex]() {
    return this[_zIndex];
  }
  set [dartx.zIndex](value) {
    this[_zIndex] = value == null ? '' : value;
  }
  get [_zIndex]() {
    return this.zIndex;
  }
  set [_zIndex](value) {
    this.zIndex = value;
  }
};
dart.setSignature(html$.CssStyleDeclaration, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.CssStyleDeclaration, []),
    css: dart.definiteFunctionType(html$.CssStyleDeclaration, [core.String]),
    _: dart.definiteFunctionType(html$.CssStyleDeclaration, [])
  }),
  fields: () => ({
    [dartx.cssText]: core.String,
    [dartx.length]: core.int,
    [dartx.parentRule]: html$.CssRule,
    [_background]: core.String,
    [_backgroundAttachment]: core.String,
    [_backgroundColor]: core.String,
    [_backgroundImage]: core.String,
    [_backgroundPosition]: core.String,
    [_backgroundRepeat]: core.String,
    [_border]: core.String,
    [_borderBottom]: core.String,
    [_borderBottomColor]: core.String,
    [_borderBottomStyle]: core.String,
    [_borderBottomWidth]: core.String,
    [_borderCollapse]: core.String,
    [_borderColor]: core.String,
    [_borderLeft]: core.String,
    [_borderLeftColor]: core.String,
    [_borderLeftStyle]: core.String,
    [_borderLeftWidth]: core.String,
    [_borderRight]: core.String,
    [_borderRightColor]: core.String,
    [_borderRightStyle]: core.String,
    [_borderRightWidth]: core.String,
    [_borderSpacing]: core.String,
    [_borderStyle]: core.String,
    [_borderTop]: core.String,
    [_borderTopColor]: core.String,
    [_borderTopStyle]: core.String,
    [_borderTopWidth]: core.String,
    [_borderWidth]: core.String,
    [_bottom]: core.String,
    [_captionSide]: core.String,
    [_clear$1]: core.String,
    [_clip]: core.String,
    [_color]: core.String,
    [_content]: core.String,
    [_cursor]: core.String,
    [_direction]: core.String,
    [_display]: core.String,
    [_emptyCells]: core.String,
    [_font]: core.String,
    [_fontFamily]: core.String,
    [_fontSize]: core.String,
    [_fontStyle]: core.String,
    [_fontVariant]: core.String,
    [_fontWeight]: core.String,
    [_height$]: core.String,
    [_left]: core.String,
    [_letterSpacing]: core.String,
    [_lineHeight]: core.String,
    [_listStyle]: core.String,
    [_listStyleImage]: core.String,
    [_listStylePosition]: core.String,
    [_listStyleType]: core.String,
    [_margin]: core.String,
    [_marginBottom]: core.String,
    [_marginLeft]: core.String,
    [_marginRight]: core.String,
    [_marginTop]: core.String,
    [_maxHeight]: core.String,
    [_maxWidth]: core.String,
    [_minHeight]: core.String,
    [_minWidth]: core.String,
    [_outline]: core.String,
    [_outlineColor]: core.String,
    [_outlineStyle]: core.String,
    [_outlineWidth]: core.String,
    [_overflow]: core.String,
    [_padding]: core.String,
    [_paddingBottom]: core.String,
    [_paddingLeft]: core.String,
    [_paddingRight]: core.String,
    [_paddingTop]: core.String,
    [_pageBreakAfter]: core.String,
    [_pageBreakBefore]: core.String,
    [_pageBreakInside]: core.String,
    [_position$1]: core.String,
    [_quotes]: core.String,
    [_right]: core.String,
    [_tableLayout]: core.String,
    [_textAlign]: core.String,
    [_textDecoration]: core.String,
    [_textIndent]: core.String,
    [_textTransform]: core.String,
    [_top]: core.String,
    [_unicodeBidi]: core.String,
    [_verticalAlign]: core.String,
    [_visibility]: core.String,
    [_whiteSpace]: core.String,
    [_width$]: core.String,
    [_wordSpacing]: core.String,
    [_zIndex]: core.String
  }),
  methods: () => ({
    [dartx.getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
    [_getPropertyValueHelper]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
    [_supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.setProperty]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
    [_browserPropertyName]: dart.definiteFunctionType(core.String, [core.String]),
    [_setPropertyHelper]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
    [dartx.getPropertyPriority]: dart.definiteFunctionType(core.String, [core.String]),
    [_getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.removeProperty]: dart.definiteFunctionType(core.String, [core.String])
  }),
  sfields: () => ({_propertyCache: dart.dynamic}),
  sgetters: () => ({supportsTransitions: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _readCache: dart.definiteFunctionType(core.String, [core.String]),
    _writeCache: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    _camelCase: dart.definiteFunctionType(core.String, [core.String])
  }),
  names: ['_readCache', '_writeCache', '_camelCase']
});
dart.defineLazy(html$.CssStyleDeclaration, {
  get _propertyCache() {
    return {};
  }
});
dart.registerExtension(dart.global.CSSStyleDeclaration, html$.CssStyleDeclaration);
dart.registerExtension(dart.global.MSStyleCSSProperties, html$.CssStyleDeclaration);
dart.registerExtension(dart.global.CSS2Properties, html$.CssStyleDeclaration);
const _elementIterable = Symbol('_elementIterable');
const _elementCssStyleDeclarationSetIterable = Symbol('_elementCssStyleDeclarationSetIterable');
const _setAll = Symbol('_setAll');
html$._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends dart.mixin(core.Object, html$.CssStyleDeclarationBase) {
  new(elementIterable) {
    this[_elementIterable] = elementIterable;
    this[_elementCssStyleDeclarationSetIterable] = null;
    this[_elementCssStyleDeclarationSetIterable] = core.List.from(this[_elementIterable])[dartx.map](html$.CssStyleDeclaration)(dart.fn(e => html$.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration()));
  }
  getPropertyValue(propertyName) {
    return this[_elementCssStyleDeclarationSetIterable][dartx.first][dartx.getPropertyValue](propertyName);
  }
  setProperty(propertyName, value, priority) {
    if (priority === void 0) priority = null;
    this[_elementCssStyleDeclarationSetIterable][dartx.forEach](dart.fn(e => e[dartx.setProperty](propertyName, value, priority), CssStyleDeclarationTovoid()));
  }
  [_setAll](propertyName, value) {
    value = value == null ? '' : value;
    for (let element of this[_elementIterable]) {
      element.style[propertyName] = value;
    }
  }
  set background(value) {
    this[_setAll]('background', value);
  }
  get background() {
    return super.background;
  }
  set backgroundAttachment(value) {
    this[_setAll]('backgroundAttachment', value);
  }
  get backgroundAttachment() {
    return super.backgroundAttachment;
  }
  set backgroundColor(value) {
    this[_setAll]('backgroundColor', value);
  }
  get backgroundColor() {
    return super.backgroundColor;
  }
  set backgroundImage(value) {
    this[_setAll]('backgroundImage', value);
  }
  get backgroundImage() {
    return super.backgroundImage;
  }
  set backgroundPosition(value) {
    this[_setAll]('backgroundPosition', value);
  }
  get backgroundPosition() {
    return super.backgroundPosition;
  }
  set backgroundRepeat(value) {
    this[_setAll]('backgroundRepeat', value);
  }
  get backgroundRepeat() {
    return super.backgroundRepeat;
  }
  set border(value) {
    this[_setAll]('border', value);
  }
  get border() {
    return super.border;
  }
  set borderBottom(value) {
    this[_setAll]('borderBottom', value);
  }
  get borderBottom() {
    return super.borderBottom;
  }
  set borderBottomColor(value) {
    this[_setAll]('borderBottomColor', value);
  }
  get borderBottomColor() {
    return super.borderBottomColor;
  }
  set borderBottomStyle(value) {
    this[_setAll]('borderBottomStyle', value);
  }
  get borderBottomStyle() {
    return super.borderBottomStyle;
  }
  set borderBottomWidth(value) {
    this[_setAll]('borderBottomWidth', value);
  }
  get borderBottomWidth() {
    return super.borderBottomWidth;
  }
  set borderCollapse(value) {
    this[_setAll]('borderCollapse', value);
  }
  get borderCollapse() {
    return super.borderCollapse;
  }
  set borderColor(value) {
    this[_setAll]('borderColor', value);
  }
  get borderColor() {
    return super.borderColor;
  }
  set borderLeft(value) {
    this[_setAll]('borderLeft', value);
  }
  get borderLeft() {
    return super.borderLeft;
  }
  set borderLeftColor(value) {
    this[_setAll]('borderLeftColor', value);
  }
  get borderLeftColor() {
    return super.borderLeftColor;
  }
  set borderLeftStyle(value) {
    this[_setAll]('borderLeftStyle', value);
  }
  get borderLeftStyle() {
    return super.borderLeftStyle;
  }
  set borderLeftWidth(value) {
    this[_setAll]('borderLeftWidth', value);
  }
  get borderLeftWidth() {
    return super.borderLeftWidth;
  }
  set borderRight(value) {
    this[_setAll]('borderRight', value);
  }
  get borderRight() {
    return super.borderRight;
  }
  set borderRightColor(value) {
    this[_setAll]('borderRightColor', value);
  }
  get borderRightColor() {
    return super.borderRightColor;
  }
  set borderRightStyle(value) {
    this[_setAll]('borderRightStyle', value);
  }
  get borderRightStyle() {
    return super.borderRightStyle;
  }
  set borderRightWidth(value) {
    this[_setAll]('borderRightWidth', value);
  }
  get borderRightWidth() {
    return super.borderRightWidth;
  }
  set borderSpacing(value) {
    this[_setAll]('borderSpacing', value);
  }
  get borderSpacing() {
    return super.borderSpacing;
  }
  set borderStyle(value) {
    this[_setAll]('borderStyle', value);
  }
  get borderStyle() {
    return super.borderStyle;
  }
  set borderTop(value) {
    this[_setAll]('borderTop', value);
  }
  get borderTop() {
    return super.borderTop;
  }
  set borderTopColor(value) {
    this[_setAll]('borderTopColor', value);
  }
  get borderTopColor() {
    return super.borderTopColor;
  }
  set borderTopStyle(value) {
    this[_setAll]('borderTopStyle', value);
  }
  get borderTopStyle() {
    return super.borderTopStyle;
  }
  set borderTopWidth(value) {
    this[_setAll]('borderTopWidth', value);
  }
  get borderTopWidth() {
    return super.borderTopWidth;
  }
  set borderWidth(value) {
    this[_setAll]('borderWidth', value);
  }
  get borderWidth() {
    return super.borderWidth;
  }
  set bottom(value) {
    this[_setAll]('bottom', value);
  }
  get bottom() {
    return super.bottom;
  }
  set captionSide(value) {
    this[_setAll]('captionSide', value);
  }
  get captionSide() {
    return super.captionSide;
  }
  set clear(value) {
    this[_setAll]('clear', value);
  }
  get clear() {
    return super.clear;
  }
  set clip(value) {
    this[_setAll]('clip', value);
  }
  get clip() {
    return super.clip;
  }
  set color(value) {
    this[_setAll]('color', value);
  }
  get color() {
    return super.color;
  }
  set content(value) {
    this[_setAll]('content', value);
  }
  get content() {
    return super.content;
  }
  set cursor(value) {
    this[_setAll]('cursor', value);
  }
  get cursor() {
    return super.cursor;
  }
  set direction(value) {
    this[_setAll]('direction', value);
  }
  get direction() {
    return super.direction;
  }
  set display(value) {
    this[_setAll]('display', value);
  }
  get display() {
    return super.display;
  }
  set emptyCells(value) {
    this[_setAll]('emptyCells', value);
  }
  get emptyCells() {
    return super.emptyCells;
  }
  set font(value) {
    this[_setAll]('font', value);
  }
  get font() {
    return super.font;
  }
  set fontFamily(value) {
    this[_setAll]('fontFamily', value);
  }
  get fontFamily() {
    return super.fontFamily;
  }
  set fontSize(value) {
    this[_setAll]('fontSize', value);
  }
  get fontSize() {
    return super.fontSize;
  }
  set fontStyle(value) {
    this[_setAll]('fontStyle', value);
  }
  get fontStyle() {
    return super.fontStyle;
  }
  set fontVariant(value) {
    this[_setAll]('fontVariant', value);
  }
  get fontVariant() {
    return super.fontVariant;
  }
  set fontWeight(value) {
    this[_setAll]('fontWeight', value);
  }
  get fontWeight() {
    return super.fontWeight;
  }
  set height(value) {
    this[_setAll]('height', value);
  }
  get height() {
    return super.height;
  }
  set left(value) {
    this[_setAll]('left', value);
  }
  get left() {
    return super.left;
  }
  set letterSpacing(value) {
    this[_setAll]('letterSpacing', value);
  }
  get letterSpacing() {
    return super.letterSpacing;
  }
  set lineHeight(value) {
    this[_setAll]('lineHeight', value);
  }
  get lineHeight() {
    return super.lineHeight;
  }
  set listStyle(value) {
    this[_setAll]('listStyle', value);
  }
  get listStyle() {
    return super.listStyle;
  }
  set listStyleImage(value) {
    this[_setAll]('listStyleImage', value);
  }
  get listStyleImage() {
    return super.listStyleImage;
  }
  set listStylePosition(value) {
    this[_setAll]('listStylePosition', value);
  }
  get listStylePosition() {
    return super.listStylePosition;
  }
  set listStyleType(value) {
    this[_setAll]('listStyleType', value);
  }
  get listStyleType() {
    return super.listStyleType;
  }
  set margin(value) {
    this[_setAll]('margin', value);
  }
  get margin() {
    return super.margin;
  }
  set marginBottom(value) {
    this[_setAll]('marginBottom', value);
  }
  get marginBottom() {
    return super.marginBottom;
  }
  set marginLeft(value) {
    this[_setAll]('marginLeft', value);
  }
  get marginLeft() {
    return super.marginLeft;
  }
  set marginRight(value) {
    this[_setAll]('marginRight', value);
  }
  get marginRight() {
    return super.marginRight;
  }
  set marginTop(value) {
    this[_setAll]('marginTop', value);
  }
  get marginTop() {
    return super.marginTop;
  }
  set maxHeight(value) {
    this[_setAll]('maxHeight', value);
  }
  get maxHeight() {
    return super.maxHeight;
  }
  set maxWidth(value) {
    this[_setAll]('maxWidth', value);
  }
  get maxWidth() {
    return super.maxWidth;
  }
  set minHeight(value) {
    this[_setAll]('minHeight', value);
  }
  get minHeight() {
    return super.minHeight;
  }
  set minWidth(value) {
    this[_setAll]('minWidth', value);
  }
  get minWidth() {
    return super.minWidth;
  }
  set outline(value) {
    this[_setAll]('outline', value);
  }
  get outline() {
    return super.outline;
  }
  set outlineColor(value) {
    this[_setAll]('outlineColor', value);
  }
  get outlineColor() {
    return super.outlineColor;
  }
  set outlineStyle(value) {
    this[_setAll]('outlineStyle', value);
  }
  get outlineStyle() {
    return super.outlineStyle;
  }
  set outlineWidth(value) {
    this[_setAll]('outlineWidth', value);
  }
  get outlineWidth() {
    return super.outlineWidth;
  }
  set overflow(value) {
    this[_setAll]('overflow', value);
  }
  get overflow() {
    return super.overflow;
  }
  set padding(value) {
    this[_setAll]('padding', value);
  }
  get padding() {
    return super.padding;
  }
  set paddingBottom(value) {
    this[_setAll]('paddingBottom', value);
  }
  get paddingBottom() {
    return super.paddingBottom;
  }
  set paddingLeft(value) {
    this[_setAll]('paddingLeft', value);
  }
  get paddingLeft() {
    return super.paddingLeft;
  }
  set paddingRight(value) {
    this[_setAll]('paddingRight', value);
  }
  get paddingRight() {
    return super.paddingRight;
  }
  set paddingTop(value) {
    this[_setAll]('paddingTop', value);
  }
  get paddingTop() {
    return super.paddingTop;
  }
  set pageBreakAfter(value) {
    this[_setAll]('pageBreakAfter', value);
  }
  get pageBreakAfter() {
    return super.pageBreakAfter;
  }
  set pageBreakBefore(value) {
    this[_setAll]('pageBreakBefore', value);
  }
  get pageBreakBefore() {
    return super.pageBreakBefore;
  }
  set pageBreakInside(value) {
    this[_setAll]('pageBreakInside', value);
  }
  get pageBreakInside() {
    return super.pageBreakInside;
  }
  set position(value) {
    this[_setAll]('position', value);
  }
  get position() {
    return super.position;
  }
  set quotes(value) {
    this[_setAll]('quotes', value);
  }
  get quotes() {
    return super.quotes;
  }
  set right(value) {
    this[_setAll]('right', value);
  }
  get right() {
    return super.right;
  }
  set tableLayout(value) {
    this[_setAll]('tableLayout', value);
  }
  get tableLayout() {
    return super.tableLayout;
  }
  set textAlign(value) {
    this[_setAll]('textAlign', value);
  }
  get textAlign() {
    return super.textAlign;
  }
  set textDecoration(value) {
    this[_setAll]('textDecoration', value);
  }
  get textDecoration() {
    return super.textDecoration;
  }
  set textIndent(value) {
    this[_setAll]('textIndent', value);
  }
  get textIndent() {
    return super.textIndent;
  }
  set textTransform(value) {
    this[_setAll]('textTransform', value);
  }
  get textTransform() {
    return super.textTransform;
  }
  set top(value) {
    this[_setAll]('top', value);
  }
  get top() {
    return super.top;
  }
  set unicodeBidi(value) {
    this[_setAll]('unicodeBidi', value);
  }
  get unicodeBidi() {
    return super.unicodeBidi;
  }
  set verticalAlign(value) {
    this[_setAll]('verticalAlign', value);
  }
  get verticalAlign() {
    return super.verticalAlign;
  }
  set visibility(value) {
    this[_setAll]('visibility', value);
  }
  get visibility() {
    return super.visibility;
  }
  set whiteSpace(value) {
    this[_setAll]('whiteSpace', value);
  }
  get whiteSpace() {
    return super.whiteSpace;
  }
  set width(value) {
    this[_setAll]('width', value);
  }
  get width() {
    return super.width;
  }
  set wordSpacing(value) {
    this[_setAll]('wordSpacing', value);
  }
  get wordSpacing() {
    return super.wordSpacing;
  }
  set zIndex(value) {
    this[_setAll]('zIndex', value);
  }
  get zIndex() {
    return super.zIndex;
  }
};
dart.setSignature(html$._CssStyleDeclarationSet, {
  constructors: () => ({new: dart.definiteFunctionType(html$._CssStyleDeclarationSet, [IterableOfElement()])}),
  fields: () => ({
    [_elementIterable]: IterableOfElement(),
    [_elementCssStyleDeclarationSetIterable]: IterableOfCssStyleDeclaration()
  }),
  methods: () => ({
    getPropertyValue: dart.definiteFunctionType(core.String, [core.String]),
    setProperty: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
    [_setAll]: dart.definiteFunctionType(dart.void, [core.String, core.String])
  })
});
dart.defineExtensionMembers(html$._CssStyleDeclarationSet, [
  'getPropertyValue',
  'setProperty',
  'background',
  'backgroundAttachment',
  'backgroundColor',
  'backgroundImage',
  'backgroundPosition',
  'backgroundRepeat',
  'border',
  'borderBottom',
  'borderBottomColor',
  'borderBottomStyle',
  'borderBottomWidth',
  'borderCollapse',
  'borderColor',
  'borderLeft',
  'borderLeftColor',
  'borderLeftStyle',
  'borderLeftWidth',
  'borderRight',
  'borderRightColor',
  'borderRightStyle',
  'borderRightWidth',
  'borderSpacing',
  'borderStyle',
  'borderTop',
  'borderTopColor',
  'borderTopStyle',
  'borderTopWidth',
  'borderWidth',
  'bottom',
  'captionSide',
  'clear',
  'clip',
  'color',
  'content',
  'cursor',
  'direction',
  'display',
  'emptyCells',
  'font',
  'fontFamily',
  'fontSize',
  'fontStyle',
  'fontVariant',
  'fontWeight',
  'height',
  'left',
  'letterSpacing',
  'lineHeight',
  'listStyle',
  'listStyleImage',
  'listStylePosition',
  'listStyleType',
  'margin',
  'marginBottom',
  'marginLeft',
  'marginRight',
  'marginTop',
  'maxHeight',
  'maxWidth',
  'minHeight',
  'minWidth',
  'outline',
  'outlineColor',
  'outlineStyle',
  'outlineWidth',
  'overflow',
  'padding',
  'paddingBottom',
  'paddingLeft',
  'paddingRight',
  'paddingTop',
  'pageBreakAfter',
  'pageBreakBefore',
  'pageBreakInside',
  'position',
  'quotes',
  'right',
  'tableLayout',
  'textAlign',
  'textDecoration',
  'textIndent',
  'textTransform',
  'top',
  'unicodeBidi',
  'verticalAlign',
  'visibility',
  'whiteSpace',
  'width',
  'wordSpacing',
  'zIndex'
]);
dart.defineExtensionNames([
  'selectorText',
  'style'
]);
html$.CssStyleRule = class CssStyleRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.selectorText]() {
    return this.selectorText;
  }
  set [dartx.selectorText](value) {
    this.selectorText = value;
  }
  get [dartx.style]() {
    return this.style;
  }
};
dart.setSignature(html$.CssStyleRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleRule, [])}),
  fields: () => ({
    [dartx.selectorText]: core.String,
    [dartx.style]: html$.CssStyleDeclaration
  })
});
dart.registerExtension(dart.global.CSSStyleRule, html$.CssStyleRule);
dart.defineExtensionNames([
  'disabled',
  'href',
  'media',
  'ownerNode',
  'parentStyleSheet',
  'title',
  'type'
]);
html$.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.href]() {
    return this.href;
  }
  get [dartx.media]() {
    return this.media;
  }
  get [dartx.ownerNode]() {
    return this.ownerNode;
  }
  get [dartx.parentStyleSheet]() {
    return this.parentStyleSheet;
  }
  get [dartx.title]() {
    return this.title;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.StyleSheet, {
  constructors: () => ({_: dart.definiteFunctionType(html$.StyleSheet, [])}),
  fields: () => ({
    [dartx.disabled]: core.bool,
    [dartx.href]: core.String,
    [dartx.media]: html$.MediaList,
    [dartx.ownerNode]: html$.Node,
    [dartx.parentStyleSheet]: html$.StyleSheet,
    [dartx.title]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.StyleSheet, html$.StyleSheet);
dart.defineExtensionNames([
  'addRule',
  'deleteRule',
  'insertRule',
  'removeRule',
  'cssRules',
  'ownerRule',
  'rules'
]);
html$.CssStyleSheet = class CssStyleSheet extends html$.StyleSheet {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.cssRules]() {
    return this.cssRules;
  }
  get [dartx.ownerRule]() {
    return this.ownerRule;
  }
  get [dartx.rules]() {
    return this.rules;
  }
  [dartx.addRule](...args) {
    return this.addRule.apply(this, args);
  }
  [dartx.deleteRule](...args) {
    return this.deleteRule.apply(this, args);
  }
  [dartx.insertRule](...args) {
    return this.insertRule.apply(this, args);
  }
  [dartx.removeRule](...args) {
    return this.removeRule.apply(this, args);
  }
};
dart.setSignature(html$.CssStyleSheet, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleSheet, [])}),
  fields: () => ({
    [dartx.cssRules]: ListOfCssRule(),
    [dartx.ownerRule]: html$.CssRule,
    [dartx.rules]: ListOfCssRule()
  }),
  methods: () => ({
    [dartx.addRule]: dart.definiteFunctionType(core.int, [core.String, core.String], [core.int]),
    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String], [core.int]),
    [dartx.removeRule]: dart.definiteFunctionType(dart.void, [core.int])
  })
});
dart.registerExtension(dart.global.CSSStyleSheet, html$.CssStyleSheet);
dart.defineExtensionNames([
  'deleteRule',
  'insertRule',
  'conditionText',
  'cssRules'
]);
html$.CssSupportsRule = class CssSupportsRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.conditionText]() {
    return this.conditionText;
  }
  get [dartx.cssRules]() {
    return this.cssRules;
  }
  [dartx.deleteRule](...args) {
    return this.deleteRule.apply(this, args);
  }
  [dartx.insertRule](...args) {
    return this.insertRule.apply(this, args);
  }
};
dart.setSignature(html$.CssSupportsRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssSupportsRule, [])}),
  fields: () => ({
    [dartx.conditionText]: core.String,
    [dartx.cssRules]: ListOfCssRule()
  }),
  methods: () => ({
    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
  })
});
dart.registerExtension(dart.global.CSSSupportsRule, html$.CssSupportsRule);
dart.defineExtensionNames([
  'style'
]);
html$.CssViewportRule = class CssViewportRule extends html$.CssRule {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.style]() {
    return this.style;
  }
};
dart.setSignature(html$.CssViewportRule, {
  constructors: () => ({_: dart.definiteFunctionType(html$.CssViewportRule, [])}),
  fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
});
dart.registerExtension(dart.global.CSSViewportRule, html$.CssViewportRule);
const _dartDetail = Symbol('_dartDetail');
const _initCustomEvent = Symbol('_initCustomEvent');
const _detail = Symbol('_detail');
const _get__detail = Symbol('_get__detail');
dart.defineExtensionNames([
  'detail'
]);
html$.CustomEvent = class CustomEvent extends html$.Event {
  get [_dartDetail]() {
    return this._dartDetail;
  }
  set [_dartDetail](value) {
    this._dartDetail = value;
  }
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let detail = opts && 'detail' in opts ? opts.detail : null;
    let e = html$.CustomEvent._check(html$.document[_createEvent]('CustomEvent'));
    e[_dartDetail] = detail;
    if (core.List.is(detail) || core.Map.is(detail) || typeof detail == 'string' || typeof detail == 'number') {
      try {
        detail = html_common.convertDartToNative_SerializedScriptValue(detail);
        e[_initCustomEvent](type, canBubble, cancelable, detail);
      } catch (_) {
        e[_initCustomEvent](type, canBubble, cancelable, null);
      }

    } else {
      e[_initCustomEvent](type, canBubble, cancelable, null);
    }
    return e;
  }
  get [dartx.detail]() {
    if (this[_dartDetail] != null) {
      return this[_dartDetail];
    }
    return this[_detail];
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.CustomEvent._create_1(type, eventInitDict_1);
    }
    return html$.CustomEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.CustomEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.CustomEvent(type);
  }
  get [_detail]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get__detail]);
  }
  get [_get__detail]() {
    return this.detail;
  }
  [_initCustomEvent](...args) {
    return this.initCustomEvent.apply(this, args);
  }
};
dart.setSignature(html$.CustomEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.CustomEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, detail: core.Object}),
    _: dart.definiteFunctionType(html$.CustomEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [_dartDetail]: dart.dynamic,
    [_get__detail]: dart.dynamic
  }),
  getters: () => ({
    [dartx.detail]: dart.definiteFunctionType(dart.dynamic, []),
    [_detail]: dart.definiteFunctionType(dart.dynamic, [])
  }),
  methods: () => ({[_initCustomEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.CustomEvent, html$.CustomEvent);
html$.DListElement = class DListElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.DListElement._check(html$.document[dartx.createElement]("dl"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.DListElement, 'created');
dart.setSignature(html$.DListElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DListElement, []),
    new: dart.definiteFunctionType(html$.DListElement, []),
    created: dart.definiteFunctionType(html$.DListElement, [])
  })
});
dart.registerExtension(dart.global.HTMLDListElement, html$.DListElement);
dart.defineExtensionNames([
  'options'
]);
html$.DataListElement = class DataListElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.DataListElement._check(html$.document[dartx.createElement]("datalist"));
  }
  created() {
    this[dartx.options] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('datalist');
  }
  get [dartx.options]() {
    return this.options;
  }
};
dart.defineNamedConstructor(html$.DataListElement, 'created');
dart.setSignature(html$.DataListElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DataListElement, []),
    new: dart.definiteFunctionType(html$.DataListElement, []),
    created: dart.definiteFunctionType(html$.DataListElement, [])
  }),
  fields: () => ({[dartx.options]: ListOfNode()}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLDataListElement, html$.DataListElement);
dart.defineExtensionNames([
  'clearData',
  'getData',
  'setData',
  'setDragImage',
  'dropEffect',
  'effectAllowed',
  'files',
  'items',
  'types'
]);
html$.DataTransfer = class DataTransfer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.dropEffect]() {
    return this.dropEffect;
  }
  set [dartx.dropEffect](value) {
    this.dropEffect = value;
  }
  get [dartx.effectAllowed]() {
    return this.effectAllowed;
  }
  set [dartx.effectAllowed](value) {
    this.effectAllowed = value;
  }
  get [dartx.files]() {
    return this.files;
  }
  get [dartx.items]() {
    return this.items;
  }
  get [dartx.types]() {
    return this.types;
  }
  [dartx.clearData](...args) {
    return this.clearData.apply(this, args);
  }
  [dartx.getData](...args) {
    return this.getData.apply(this, args);
  }
  [dartx.setData](...args) {
    return this.setData.apply(this, args);
  }
  [dartx.setDragImage](...args) {
    return this.setDragImage.apply(this, args);
  }
};
dart.setSignature(html$.DataTransfer, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransfer, [])}),
  fields: () => ({
    [dartx.dropEffect]: core.String,
    [dartx.effectAllowed]: core.String,
    [dartx.files]: ListOfFile(),
    [dartx.items]: html$.DataTransferItemList,
    [dartx.types]: ListOfString()
  }),
  methods: () => ({
    [dartx.clearData]: dart.definiteFunctionType(dart.void, [], [core.String]),
    [dartx.getData]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.setData]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.setDragImage]: dart.definiteFunctionType(dart.void, [html$.Element, core.int, core.int])
  })
});
dart.registerExtension(dart.global.DataTransfer, html$.DataTransfer);
const _getAsString = Symbol('_getAsString');
dart.defineExtensionNames([
  'getAsFile',
  'getAsString',
  'getAsEntry',
  'kind',
  'type'
]);
html$.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.kind]() {
    return this.kind;
  }
  get [dartx.type]() {
    return this.type;
  }
  [dartx.getAsFile](...args) {
    return this.getAsFile.apply(this, args);
  }
  [_getAsString](...args) {
    return this.getAsString.apply(this, args);
  }
  [dartx.getAsString]() {
    let completer = CompleterOfString().new();
    this[_getAsString](dart.fn(value => {
      completer.complete(value);
    }, StringToNull()));
    return completer.future;
  }
  [dartx.getAsEntry](...args) {
    return this.webkitGetAsEntry.apply(this, args);
  }
};
dart.setSignature(html$.DataTransferItem, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItem, [])}),
  fields: () => ({
    [dartx.kind]: core.String,
    [dartx.type]: core.String
  }),
  methods: () => ({
    [dartx.getAsFile]: dart.definiteFunctionType(html$.Blob, []),
    [_getAsString]: dart.definiteFunctionType(dart.void, [html$._StringCallback]),
    [dartx.getAsString]: dart.definiteFunctionType(async.Future$(core.String), []),
    [dartx.getAsEntry]: dart.definiteFunctionType(html$.Entry, [])
  })
});
dart.registerExtension(dart.global.DataTransferItem, html$.DataTransferItem);
dart.defineExtensionNames([
  'add',
  'addData',
  'addFile',
  'clear',
  'item',
  'remove',
  '_get',
  'length'
]);
html$.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx.add](...args) {
    return this.add.apply(this, args);
  }
  [dartx.addData](...args) {
    return this.add.apply(this, args);
  }
  [dartx.addFile](...args) {
    return this.add.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.remove](...args) {
    return this.remove.apply(this, args);
  }
  [dartx._get](index) {
    return this[index];
  }
};
dart.setSignature(html$.DataTransferItemList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItemList, [])}),
  fields: () => ({[dartx.length]: core.int}),
  methods: () => ({
    [dartx.add]: dart.definiteFunctionType(html$.DataTransferItem, [dart.dynamic], [core.String]),
    [dartx.addData]: dart.definiteFunctionType(html$.DataTransferItem, [core.String, core.String]),
    [dartx.addFile]: dart.definiteFunctionType(html$.DataTransferItem, [html$.File]),
    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
    [dartx.item]: dart.definiteFunctionType(html$.DataTransferItem, [core.int]),
    [dartx.remove]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx._get]: dart.definiteFunctionType(html$.DataTransferItem, [core.int])
  })
});
dart.registerExtension(dart.global.DataTransferItemList, html$.DataTransferItemList);
html$.DatabaseCallback = dart.typedef('DatabaseCallback', () => dart.functionType(dart.void, [web_sql.SqlDatabase]));
dart.defineExtensionNames([
  'postMessage',
  'onMessage'
]);
html$.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html$.WorkerGlobalScope {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.DedicatedWorkerGlobalScope, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DedicatedWorkerGlobalScope, [])}),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.DedicatedWorkerGlobalScope, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.DedicatedWorkerGlobalScope, html$.DedicatedWorkerGlobalScope);
dart.defineExtensionNames([
  'session'
]);
html$.DefaultSessionStartEvent = class DefaultSessionStartEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.DefaultSessionStartEvent._create_1(type, eventInitDict_1);
    }
    return html$.DefaultSessionStartEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.DefaultSessionStartEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.DefaultSessionStartEvent(type);
  }
  get [dartx.session]() {
    return this.session;
  }
};
dart.setSignature(html$.DefaultSessionStartEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DefaultSessionStartEvent, []),
    new: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.session]: html$.PresentationSession}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.DefaultSessionStartEvent, html$.DefaultSessionStartEvent);
dart.defineExtensionNames([
  'queryUsageAndQuota',
  'requestQuota'
]);
html$.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.queryUsageAndQuota](...args) {
    return this.queryUsageAndQuota.apply(this, args);
  }
  [dartx.requestQuota](...args) {
    return this.requestQuota.apply(this, args);
  }
};
dart.setSignature(html$.DeprecatedStorageInfo, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageInfo, [])}),
  methods: () => ({
    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageUsageCallback, html$.StorageErrorCallback]),
    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
  }),
  sfields: () => ({
    PERSISTENT: core.int,
    TEMPORARY: core.int
  })
});
html$.DeprecatedStorageInfo.PERSISTENT = 1;
html$.DeprecatedStorageInfo.TEMPORARY = 0;
dart.registerExtension(dart.global.DeprecatedStorageInfo, html$.DeprecatedStorageInfo);
dart.defineExtensionNames([
  'queryUsageAndQuota',
  'requestQuota'
]);
html$.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.queryUsageAndQuota](...args) {
    return this.queryUsageAndQuota.apply(this, args);
  }
  [dartx.requestQuota](...args) {
    return this.requestQuota.apply(this, args);
  }
};
dart.setSignature(html$.DeprecatedStorageQuota, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageQuota, [])}),
  methods: () => ({
    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [html$.StorageUsageCallback], [html$.StorageErrorCallback]),
    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
  })
});
dart.registerExtension(dart.global.DeprecatedStorageQuota, html$.DeprecatedStorageQuota);
dart.defineExtensionNames([
  'open'
]);
html$.DetailsElement = class DetailsElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.DetailsElement._check(html$.document[dartx.createElement]("details"));
  }
  created() {
    this[dartx.open] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('details');
  }
  get [dartx.open]() {
    return this.open;
  }
  set [dartx.open](value) {
    this.open = value;
  }
};
dart.defineNamedConstructor(html$.DetailsElement, 'created');
dart.setSignature(html$.DetailsElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DetailsElement, []),
    new: dart.definiteFunctionType(html$.DetailsElement, []),
    created: dart.definiteFunctionType(html$.DetailsElement, [])
  }),
  fields: () => ({[dartx.open]: core.bool}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLDetailsElement, html$.DetailsElement);
dart.defineExtensionNames([
  'x',
  'y',
  'z'
]);
html$.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.z]() {
    return this.z;
  }
};
dart.setSignature(html$.DeviceAcceleration, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceAcceleration, [])}),
  fields: () => ({
    [dartx.x]: core.double,
    [dartx.y]: core.double,
    [dartx.z]: core.double
  })
});
dart.registerExtension(dart.global.DeviceAcceleration, html$.DeviceAcceleration);
dart.defineExtensionNames([
  'value'
]);
html$.DeviceLightEvent = class DeviceLightEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.DeviceLightEvent._create_1(type, eventInitDict_1);
    }
    return html$.DeviceLightEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.DeviceLightEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.DeviceLightEvent(type);
  }
  get [dartx.value]() {
    return this.value;
  }
};
dart.setSignature(html$.DeviceLightEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DeviceLightEvent, []),
    new: dart.definiteFunctionType(html$.DeviceLightEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.value]: core.double}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.DeviceLightEvent, html$.DeviceLightEvent);
dart.defineExtensionNames([
  'initDeviceMotionEvent',
  'acceleration',
  'accelerationIncludingGravity',
  'interval',
  'rotationRate'
]);
html$.DeviceMotionEvent = class DeviceMotionEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.acceleration]() {
    return this.acceleration;
  }
  get [dartx.accelerationIncludingGravity]() {
    return this.accelerationIncludingGravity;
  }
  get [dartx.interval]() {
    return this.interval;
  }
  get [dartx.rotationRate]() {
    return this.rotationRate;
  }
  [dartx.initDeviceMotionEvent](...args) {
    return this.initDeviceMotionEvent.apply(this, args);
  }
};
dart.setSignature(html$.DeviceMotionEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceMotionEvent, [])}),
  fields: () => ({
    [dartx.acceleration]: html$.DeviceAcceleration,
    [dartx.accelerationIncludingGravity]: html$.DeviceAcceleration,
    [dartx.interval]: core.double,
    [dartx.rotationRate]: html$.DeviceRotationRate
  }),
  methods: () => ({[dartx.initDeviceMotionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.DeviceAcceleration, html$.DeviceAcceleration, html$.DeviceRotationRate, core.num])})
});
dart.registerExtension(dart.global.DeviceMotionEvent, html$.DeviceMotionEvent);
const _initDeviceOrientationEvent = Symbol('_initDeviceOrientationEvent');
dart.defineExtensionNames([
  'absolute',
  'alpha',
  'beta',
  'gamma'
]);
html$.DeviceOrientationEvent = class DeviceOrientationEvent extends html$.Event {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let alpha = opts && 'alpha' in opts ? opts.alpha : 0;
    let beta = opts && 'beta' in opts ? opts.beta : 0;
    let gamma = opts && 'gamma' in opts ? opts.gamma : 0;
    let absolute = opts && 'absolute' in opts ? opts.absolute : false;
    let e = html$.DeviceOrientationEvent._check(html$.document[_createEvent]("DeviceOrientationEvent"));
    e[_initDeviceOrientationEvent](type, canBubble, cancelable, alpha, beta, gamma, absolute);
    return e;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.absolute]() {
    return this.absolute;
  }
  get [dartx.alpha]() {
    return this.alpha;
  }
  get [dartx.beta]() {
    return this.beta;
  }
  get [dartx.gamma]() {
    return this.gamma;
  }
  [_initDeviceOrientationEvent](...args) {
    return this.initDeviceOrientationEvent.apply(this, args);
  }
};
dart.setSignature(html$.DeviceOrientationEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.DeviceOrientationEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, alpha: core.num, beta: core.num, gamma: core.num, absolute: core.bool}),
    _: dart.definiteFunctionType(html$.DeviceOrientationEvent, [])
  }),
  fields: () => ({
    [dartx.absolute]: core.bool,
    [dartx.alpha]: core.double,
    [dartx.beta]: core.double,
    [dartx.gamma]: core.double
  }),
  methods: () => ({[_initDeviceOrientationEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.num, core.num, core.num, core.bool])})
});
dart.registerExtension(dart.global.DeviceOrientationEvent, html$.DeviceOrientationEvent);
dart.defineExtensionNames([
  'alpha',
  'beta',
  'gamma'
]);
html$.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.alpha]() {
    return this.alpha;
  }
  get [dartx.beta]() {
    return this.beta;
  }
  get [dartx.gamma]() {
    return this.gamma;
  }
};
dart.setSignature(html$.DeviceRotationRate, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceRotationRate, [])}),
  fields: () => ({
    [dartx.alpha]: core.double,
    [dartx.beta]: core.double,
    [dartx.gamma]: core.double
  })
});
dart.registerExtension(dart.global.DeviceRotationRate, html$.DeviceRotationRate);
dart.defineExtensionNames([
  'close',
  'show',
  'showModal',
  'open',
  'returnValue'
]);
html$.DialogElement = class DialogElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.open] = null;
    this[dartx.returnValue] = null;
    super.created();
  }
  get [dartx.open]() {
    return this.open;
  }
  set [dartx.open](value) {
    this.open = value;
  }
  get [dartx.returnValue]() {
    return this.returnValue;
  }
  set [dartx.returnValue](value) {
    this.returnValue = value;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.show](...args) {
    return this.show.apply(this, args);
  }
  [dartx.showModal](...args) {
    return this.showModal.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.DialogElement, 'created');
dart.setSignature(html$.DialogElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DialogElement, []),
    created: dart.definiteFunctionType(html$.DialogElement, [])
  }),
  fields: () => ({
    [dartx.open]: core.bool,
    [dartx.returnValue]: core.String
  }),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.show]: dart.definiteFunctionType(dart.void, []),
    [dartx.showModal]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.HTMLDialogElement, html$.DialogElement);
const _getDirectory = Symbol('_getDirectory');
const _getFile = Symbol('_getFile');
const __getDirectory_1 = Symbol('__getDirectory_1');
const __getDirectory_2 = Symbol('__getDirectory_2');
const __getDirectory_3 = Symbol('__getDirectory_3');
const __getDirectory_4 = Symbol('__getDirectory_4');
const __getDirectory = Symbol('__getDirectory');
const __getFile_1 = Symbol('__getFile_1');
const __getFile_2 = Symbol('__getFile_2');
const __getFile_3 = Symbol('__getFile_3');
const __getFile_4 = Symbol('__getFile_4');
const __getFile = Symbol('__getFile');
const _removeRecursively = Symbol('_removeRecursively');
const _copyTo = Symbol('_copyTo');
const _getMetadata = Symbol('_getMetadata');
const _getParent = Symbol('_getParent');
const _moveTo = Symbol('_moveTo');
const _remove$ = Symbol('_remove');
dart.defineExtensionNames([
  'copyTo',
  'getMetadata',
  'getParent',
  'moveTo',
  'remove',
  'toUrl',
  'filesystem',
  'fullPath',
  'isDirectory',
  'isFile',
  'name'
]);
html$.Entry = class Entry extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.filesystem]() {
    return this.filesystem;
  }
  get [dartx.fullPath]() {
    return this.fullPath;
  }
  get [dartx.isDirectory]() {
    return this.isDirectory;
  }
  get [dartx.isFile]() {
    return this.isFile;
  }
  get [dartx.name]() {
    return this.name;
  }
  [_copyTo](...args) {
    return this.copyTo.apply(this, args);
  }
  [dartx.copyTo](parent, opts) {
    let name = opts && 'name' in opts ? opts.name : null;
    let completer = CompleterOfEntry().new();
    this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
        completer.complete(value);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    return completer.future;
  }
  [_getMetadata](...args) {
    return this.getMetadata.apply(this, args);
  }
  [dartx.getMetadata]() {
    let completer = CompleterOfMetadata().new();
    this[_getMetadata](dart.fn(value => {
      completer.complete(value);
    }, MetadataToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [_getParent](...args) {
    return this.getParent.apply(this, args);
  }
  [dartx.getParent]() {
    let completer = CompleterOfEntry().new();
    this[_getParent](dart.fn(value => {
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [_moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [dartx.moveTo](parent, opts) {
    let name = opts && 'name' in opts ? opts.name : null;
    let completer = CompleterOfEntry().new();
    this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
        completer.complete(value);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    return completer.future;
  }
  [_remove$](...args) {
    return this.remove.apply(this, args);
  }
  [dartx.remove]() {
    let completer = async.Completer.new();
    this[_remove$](dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [dartx.toUrl](...args) {
    return this.toURL.apply(this, args);
  }
};
dart.setSignature(html$.Entry, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Entry, [])}),
  fields: () => ({
    [dartx.filesystem]: html$.FileSystem,
    [dartx.fullPath]: core.String,
    [dartx.isDirectory]: core.bool,
    [dartx.isFile]: core.bool,
    [dartx.name]: core.String
  }),
  methods: () => ({
    [_copyTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
    [dartx.copyTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
    [_getMetadata]: dart.definiteFunctionType(dart.void, [html$.MetadataCallback], [html$._ErrorCallback]),
    [dartx.getMetadata]: dart.definiteFunctionType(async.Future$(html$.Metadata), []),
    [_getParent]: dart.definiteFunctionType(dart.void, [], [html$._EntryCallback, html$._ErrorCallback]),
    [dartx.getParent]: dart.definiteFunctionType(async.Future$(html$.Entry), []),
    [_moveTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
    [dartx.moveTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
    [_remove$]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
    [dartx.remove]: dart.definiteFunctionType(async.Future, []),
    [dartx.toUrl]: dart.definiteFunctionType(core.String, [])
  })
});
dart.registerExtension(dart.global.Entry, html$.Entry);
dart.defineExtensionNames([
  'createDirectory',
  'getDirectory',
  'createFile',
  'getFile',
  'createReader',
  'removeRecursively'
]);
html$.DirectoryEntry = class DirectoryEntry extends html$.Entry {
  [dartx.createDirectory](path, opts) {
    let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
    return this[_getDirectory](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
  }
  [dartx.getDirectory](path) {
    return this[_getDirectory](path);
  }
  [dartx.createFile](path, opts) {
    let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
    return this[_getFile](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
  }
  [dartx.getFile](path) {
    return this[_getFile](path);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.createReader](...args) {
    return this.createReader.apply(this, args);
  }
  [__getDirectory](path, opts) {
    let options = opts && 'options' in opts ? opts.options : null;
    let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
    if (errorCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getDirectory_1](path, options_1, successCallback, errorCallback);
      return;
    }
    if (successCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getDirectory_2](path, options_1, successCallback);
      return;
    }
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getDirectory_3](path, options_1);
      return;
    }
    this[__getDirectory_4](path);
    return;
  }
  [__getDirectory_1](...args) {
    return this.getDirectory.apply(this, args);
  }
  [__getDirectory_2](...args) {
    return this.getDirectory.apply(this, args);
  }
  [__getDirectory_3](...args) {
    return this.getDirectory.apply(this, args);
  }
  [__getDirectory_4](...args) {
    return this.getDirectory.apply(this, args);
  }
  [_getDirectory](path, opts) {
    let options = opts && 'options' in opts ? opts.options : null;
    let completer = CompleterOfEntry().new();
    this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
        completer.complete(value);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    return completer.future;
  }
  [__getFile](path, opts) {
    let options = opts && 'options' in opts ? opts.options : null;
    let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
    if (errorCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getFile_1](path, options_1, successCallback, errorCallback);
      return;
    }
    if (successCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getFile_2](path, options_1, successCallback);
      return;
    }
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getFile_3](path, options_1);
      return;
    }
    this[__getFile_4](path);
    return;
  }
  [__getFile_1](...args) {
    return this.getFile.apply(this, args);
  }
  [__getFile_2](...args) {
    return this.getFile.apply(this, args);
  }
  [__getFile_3](...args) {
    return this.getFile.apply(this, args);
  }
  [__getFile_4](...args) {
    return this.getFile.apply(this, args);
  }
  [_getFile](path, opts) {
    let options = opts && 'options' in opts ? opts.options : null;
    let completer = CompleterOfEntry().new();
    this[__getFile](path, {options: options, successCallback: dart.fn(value => {
        completer.complete(value);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    return completer.future;
  }
  [_removeRecursively](...args) {
    return this.removeRecursively.apply(this, args);
  }
  [dartx.removeRecursively]() {
    let completer = async.Completer.new();
    this[_removeRecursively](dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
};
dart.setSignature(html$.DirectoryEntry, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryEntry, [])}),
  methods: () => ({
    [dartx.createDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
    [dartx.getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
    [dartx.createFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
    [dartx.getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
    [dartx.createReader]: dart.definiteFunctionType(html$.DirectoryReader, []),
    [__getDirectory]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
    [__getDirectory_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
    [__getDirectory_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
    [__getDirectory_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    [__getDirectory_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
    [__getFile]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
    [__getFile_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
    [__getFile_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
    [__getFile_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    [__getFile_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
    [_removeRecursively]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
    [dartx.removeRecursively]: dart.definiteFunctionType(async.Future, [])
  })
});
dart.registerExtension(dart.global.DirectoryEntry, html$.DirectoryEntry);
const _readEntries = Symbol('_readEntries');
dart.defineExtensionNames([
  'readEntries'
]);
html$.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [_readEntries](...args) {
    return this.readEntries.apply(this, args);
  }
  [dartx.readEntries]() {
    let completer = CompleterOfListOfEntry().new();
    this[_readEntries](dart.fn(value => {
      completer.complete(value);
    }, ListOfEntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
};
dart.setSignature(html$.DirectoryReader, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryReader, [])}),
  methods: () => ({
    [_readEntries]: dart.definiteFunctionType(dart.void, [html$._EntriesCallback], [html$._ErrorCallback]),
    [dartx.readEntries]: dart.definiteFunctionType(async.Future$(core.List$(html$.Entry)), [])
  })
});
dart.registerExtension(dart.global.DirectoryReader, html$.DirectoryReader);
html$.DivElement = class DivElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.DivElement._check(html$.document[dartx.createElement]("div"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.DivElement, 'created');
dart.setSignature(html$.DivElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DivElement, []),
    new: dart.definiteFunctionType(html$.DivElement, []),
    created: dart.definiteFunctionType(html$.DivElement, [])
  })
});
dart.registerExtension(dart.global.HTMLDivElement, html$.DivElement);
const _body = Symbol('_body');
const _get_window = Symbol('_get_window');
const _head$0 = Symbol('_head');
const _lastModified = Symbol('_lastModified');
const _preferredStylesheetSet = Symbol('_preferredStylesheetSet');
const _referrer = Symbol('_referrer');
const _selectedStylesheetSet = Symbol('_selectedStylesheetSet');
const _styleSheets = Symbol('_styleSheets');
const _title = Symbol('_title');
const _visibilityState = Symbol('_visibilityState');
const _webkitFullscreenElement = Symbol('_webkitFullscreenElement');
const _webkitFullscreenEnabled = Symbol('_webkitFullscreenEnabled');
const _webkitHidden = Symbol('_webkitHidden');
const _webkitVisibilityState = Symbol('_webkitVisibilityState');
const _caretRangeFromPoint = Symbol('_caretRangeFromPoint');
const _createElement = Symbol('_createElement');
const _createElementNS = Symbol('_createElementNS');
const _createTouch_1 = Symbol('_createTouch_1');
const _createTouch = Symbol('_createTouch');
const _createTouchList = Symbol('_createTouchList');
const _elementFromPoint = Symbol('_elementFromPoint');
const _getCssCanvasContext = Symbol('_getCssCanvasContext');
const _webkitExitFullscreen = Symbol('_webkitExitFullscreen');
const _createElement_2 = Symbol('_createElement_2');
const _createElementNS_2 = Symbol('_createElementNS_2');
const _createNodeIterator = Symbol('_createNodeIterator');
const _createTreeWalker = Symbol('_createTreeWalker');
dart.defineExtensionNames([
  'window',
  'adoptNode',
  'createDocumentFragment',
  'createRange',
  'elementsFromPoint',
  'execCommand',
  'exitFullscreen',
  'exitPointerLock',
  'getElementsByClassName',
  'getElementsByName',
  'getElementsByTagName',
  'importNode',
  'queryCommandEnabled',
  'queryCommandIndeterm',
  'queryCommandState',
  'queryCommandSupported',
  'queryCommandValue',
  'transformDocumentToTreeView',
  'getElementById',
  'querySelector',
  'onAbort',
  'onBeforeCopy',
  'onBeforeCut',
  'onBeforePaste',
  'onBlur',
  'onCanPlay',
  'onCanPlayThrough',
  'onChange',
  'onClick',
  'onContextMenu',
  'onCopy',
  'onCut',
  'onDoubleClick',
  'onDrag',
  'onDragEnd',
  'onDragEnter',
  'onDragLeave',
  'onDragOver',
  'onDragStart',
  'onDrop',
  'onDurationChange',
  'onEmptied',
  'onEnded',
  'onError',
  'onFocus',
  'onInput',
  'onInvalid',
  'onKeyDown',
  'onKeyPress',
  'onKeyUp',
  'onLoad',
  'onLoadedData',
  'onLoadedMetadata',
  'onMouseDown',
  'onMouseEnter',
  'onMouseLeave',
  'onMouseMove',
  'onMouseOut',
  'onMouseOver',
  'onMouseUp',
  'onMouseWheel',
  'onPaste',
  'onPause',
  'onPlay',
  'onPlaying',
  'onPointerLockChange',
  'onPointerLockError',
  'onRateChange',
  'onReadyStateChange',
  'onReset',
  'onResize',
  'onScroll',
  'onSearch',
  'onSecurityPolicyViolation',
  'onSeeked',
  'onSeeking',
  'onSelect',
  'onSelectionChange',
  'onSelectStart',
  'onStalled',
  'onSubmit',
  'onSuspend',
  'onTimeUpdate',
  'onTouchCancel',
  'onTouchEnd',
  'onTouchMove',
  'onTouchStart',
  'onVolumeChange',
  'onWaiting',
  'onFullscreenChange',
  'onFullscreenError',
  'querySelectorAll',
  'query',
  'queryAll',
  'supportsRegisterElement',
  'supportsRegister',
  'createElement',
  'createElementNS',
  'visibilityState',
  'activeElement',
  'contentType',
  'cookie',
  'currentScript',
  'documentElement',
  'domain',
  'fonts',
  'fullscreenElement',
  'fullscreenEnabled',
  'hidden',
  'implementation',
  'origin',
  'pointerLockElement',
  'readyState',
  'rootElement',
  'scrollingElement',
  'timeline'
]);
html$.Document = class Document extends html$.Node {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.activeElement]() {
    return this.activeElement;
  }
  get [_body]() {
    return this.body;
  }
  set [_body](value) {
    this.body = value;
  }
  get [dartx.contentType]() {
    return this.contentType;
  }
  get [dartx.cookie]() {
    return this.cookie;
  }
  set [dartx.cookie](value) {
    this.cookie = value;
  }
  get [dartx.currentScript]() {
    return this.currentScript;
  }
  get [dartx.window]() {
    return html$._convertNativeToDart_Window(this[_get_window]);
  }
  get [_get_window]() {
    return this.defaultView;
  }
  get [dartx.documentElement]() {
    return this.documentElement;
  }
  get [dartx.domain]() {
    return this.domain;
  }
  get [dartx.fonts]() {
    return this.fonts;
  }
  get [dartx.fullscreenElement]() {
    return this.fullscreenElement;
  }
  get [dartx.fullscreenEnabled]() {
    return this.fullscreenEnabled;
  }
  get [_head$0]() {
    return this.head;
  }
  get [dartx.hidden]() {
    return this.hidden;
  }
  get [dartx.implementation]() {
    return this.implementation;
  }
  get [_lastModified]() {
    return this.lastModified;
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.pointerLockElement]() {
    return this.pointerLockElement;
  }
  get [_preferredStylesheetSet]() {
    return this.preferredStylesheetSet;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [_referrer]() {
    return this.referrer;
  }
  get [dartx.rootElement]() {
    return this.rootElement;
  }
  get [dartx.scrollingElement]() {
    return this.scrollingElement;
  }
  get [_selectedStylesheetSet]() {
    return this.selectedStylesheetSet;
  }
  set [_selectedStylesheetSet](value) {
    this.selectedStylesheetSet = value;
  }
  get [_styleSheets]() {
    return this.styleSheets;
  }
  get [dartx.timeline]() {
    return this.timeline;
  }
  get [_title]() {
    return this.title;
  }
  set [_title](value) {
    this.title = value;
  }
  get [_visibilityState]() {
    return this.visibilityState;
  }
  get [_webkitFullscreenElement]() {
    return this.webkitFullscreenElement;
  }
  get [_webkitFullscreenEnabled]() {
    return this.webkitFullscreenEnabled;
  }
  get [_webkitHidden]() {
    return this.webkitHidden;
  }
  get [_webkitVisibilityState]() {
    return this.webkitVisibilityState;
  }
  [dartx.adoptNode](...args) {
    return this.adoptNode.apply(this, args);
  }
  [_caretRangeFromPoint](...args) {
    return this.caretRangeFromPoint.apply(this, args);
  }
  [dartx.createDocumentFragment](...args) {
    return this.createDocumentFragment.apply(this, args);
  }
  [_createElement](...args) {
    return this.createElement.apply(this, args);
  }
  [_createElementNS](...args) {
    return this.createElementNS.apply(this, args);
  }
  [_createEvent](...args) {
    return this.createEvent.apply(this, args);
  }
  [dartx.createRange](...args) {
    return this.createRange.apply(this, args);
  }
  [_createTextNode](...args) {
    return this.createTextNode.apply(this, args);
  }
  [_createTouch](window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) {
    let target_1 = html$._convertDartToNative_EventTarget(target);
    return this[_createTouch_1](window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
  }
  [_createTouch_1](...args) {
    return this.createTouch.apply(this, args);
  }
  [_createTouchList](...args) {
    return this.createTouchList.apply(this, args);
  }
  [_elementFromPoint](...args) {
    return this.elementFromPoint.apply(this, args);
  }
  [dartx.elementsFromPoint](...args) {
    return this.elementsFromPoint.apply(this, args);
  }
  [dartx.execCommand](...args) {
    return this.execCommand.apply(this, args);
  }
  [dartx.exitFullscreen](...args) {
    return this.exitFullscreen.apply(this, args);
  }
  [dartx.exitPointerLock](...args) {
    return this.exitPointerLock.apply(this, args);
  }
  [_getCssCanvasContext](...args) {
    return this.getCSSCanvasContext.apply(this, args);
  }
  [dartx.getElementsByClassName](...args) {
    return this.getElementsByClassName.apply(this, args);
  }
  [dartx.getElementsByName](...args) {
    return this.getElementsByName.apply(this, args);
  }
  [dartx.getElementsByTagName](...args) {
    return this.getElementsByTagName.apply(this, args);
  }
  [dartx.importNode](...args) {
    return this.importNode.apply(this, args);
  }
  [dartx.queryCommandEnabled](...args) {
    return this.queryCommandEnabled.apply(this, args);
  }
  [dartx.queryCommandIndeterm](...args) {
    return this.queryCommandIndeterm.apply(this, args);
  }
  [dartx.queryCommandState](...args) {
    return this.queryCommandState.apply(this, args);
  }
  [dartx.queryCommandSupported](...args) {
    return this.queryCommandSupported.apply(this, args);
  }
  [dartx.queryCommandValue](...args) {
    return this.queryCommandValue.apply(this, args);
  }
  [dartx.transformDocumentToTreeView](...args) {
    return this.transformDocumentToTreeView.apply(this, args);
  }
  [_webkitExitFullscreen](...args) {
    return this.webkitExitFullscreen.apply(this, args);
  }
  [dartx.getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
  get [_childElementCount]() {
    return this.childElementCount;
  }
  get [_children]() {
    return this.children;
  }
  get [_firstElementChild]() {
    return this.firstElementChild;
  }
  get [_lastElementChild]() {
    return this.lastElementChild;
  }
  [dartx.querySelector](...args) {
    return this.querySelector.apply(this, args);
  }
  [_querySelectorAll](...args) {
    return this.querySelectorAll.apply(this, args);
  }
  get [dartx.onAbort]() {
    return html$.Element.abortEvent.forTarget(this);
  }
  get [dartx.onBeforeCopy]() {
    return html$.Element.beforeCopyEvent.forTarget(this);
  }
  get [dartx.onBeforeCut]() {
    return html$.Element.beforeCutEvent.forTarget(this);
  }
  get [dartx.onBeforePaste]() {
    return html$.Element.beforePasteEvent.forTarget(this);
  }
  get [dartx.onBlur]() {
    return html$.Element.blurEvent.forTarget(this);
  }
  get [dartx.onCanPlay]() {
    return html$.Element.canPlayEvent.forTarget(this);
  }
  get [dartx.onCanPlayThrough]() {
    return html$.Element.canPlayThroughEvent.forTarget(this);
  }
  get [dartx.onChange]() {
    return html$.Element.changeEvent.forTarget(this);
  }
  get [dartx.onClick]() {
    return html$.Element.clickEvent.forTarget(this);
  }
  get [dartx.onContextMenu]() {
    return html$.Element.contextMenuEvent.forTarget(this);
  }
  get [dartx.onCopy]() {
    return html$.Element.copyEvent.forTarget(this);
  }
  get [dartx.onCut]() {
    return html$.Element.cutEvent.forTarget(this);
  }
  get [dartx.onDoubleClick]() {
    return html$.Element.doubleClickEvent.forTarget(this);
  }
  get [dartx.onDrag]() {
    return html$.Element.dragEvent.forTarget(this);
  }
  get [dartx.onDragEnd]() {
    return html$.Element.dragEndEvent.forTarget(this);
  }
  get [dartx.onDragEnter]() {
    return html$.Element.dragEnterEvent.forTarget(this);
  }
  get [dartx.onDragLeave]() {
    return html$.Element.dragLeaveEvent.forTarget(this);
  }
  get [dartx.onDragOver]() {
    return html$.Element.dragOverEvent.forTarget(this);
  }
  get [dartx.onDragStart]() {
    return html$.Element.dragStartEvent.forTarget(this);
  }
  get [dartx.onDrop]() {
    return html$.Element.dropEvent.forTarget(this);
  }
  get [dartx.onDurationChange]() {
    return html$.Element.durationChangeEvent.forTarget(this);
  }
  get [dartx.onEmptied]() {
    return html$.Element.emptiedEvent.forTarget(this);
  }
  get [dartx.onEnded]() {
    return html$.Element.endedEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.Element.errorEvent.forTarget(this);
  }
  get [dartx.onFocus]() {
    return html$.Element.focusEvent.forTarget(this);
  }
  get [dartx.onInput]() {
    return html$.Element.inputEvent.forTarget(this);
  }
  get [dartx.onInvalid]() {
    return html$.Element.invalidEvent.forTarget(this);
  }
  get [dartx.onKeyDown]() {
    return html$.Element.keyDownEvent.forTarget(this);
  }
  get [dartx.onKeyPress]() {
    return html$.Element.keyPressEvent.forTarget(this);
  }
  get [dartx.onKeyUp]() {
    return html$.Element.keyUpEvent.forTarget(this);
  }
  get [dartx.onLoad]() {
    return html$.Element.loadEvent.forTarget(this);
  }
  get [dartx.onLoadedData]() {
    return html$.Element.loadedDataEvent.forTarget(this);
  }
  get [dartx.onLoadedMetadata]() {
    return html$.Element.loadedMetadataEvent.forTarget(this);
  }
  get [dartx.onMouseDown]() {
    return html$.Element.mouseDownEvent.forTarget(this);
  }
  get [dartx.onMouseEnter]() {
    return html$.Element.mouseEnterEvent.forTarget(this);
  }
  get [dartx.onMouseLeave]() {
    return html$.Element.mouseLeaveEvent.forTarget(this);
  }
  get [dartx.onMouseMove]() {
    return html$.Element.mouseMoveEvent.forTarget(this);
  }
  get [dartx.onMouseOut]() {
    return html$.Element.mouseOutEvent.forTarget(this);
  }
  get [dartx.onMouseOver]() {
    return html$.Element.mouseOverEvent.forTarget(this);
  }
  get [dartx.onMouseUp]() {
    return html$.Element.mouseUpEvent.forTarget(this);
  }
  get [dartx.onMouseWheel]() {
    return html$.Element.mouseWheelEvent.forTarget(this);
  }
  get [dartx.onPaste]() {
    return html$.Element.pasteEvent.forTarget(this);
  }
  get [dartx.onPause]() {
    return html$.Element.pauseEvent.forTarget(this);
  }
  get [dartx.onPlay]() {
    return html$.Element.playEvent.forTarget(this);
  }
  get [dartx.onPlaying]() {
    return html$.Element.playingEvent.forTarget(this);
  }
  get [dartx.onPointerLockChange]() {
    return html$.Document.pointerLockChangeEvent.forTarget(this);
  }
  get [dartx.onPointerLockError]() {
    return html$.Document.pointerLockErrorEvent.forTarget(this);
  }
  get [dartx.onRateChange]() {
    return html$.Element.rateChangeEvent.forTarget(this);
  }
  get [dartx.onReadyStateChange]() {
    return html$.Document.readyStateChangeEvent.forTarget(this);
  }
  get [dartx.onReset]() {
    return html$.Element.resetEvent.forTarget(this);
  }
  get [dartx.onResize]() {
    return html$.Element.resizeEvent.forTarget(this);
  }
  get [dartx.onScroll]() {
    return html$.Element.scrollEvent.forTarget(this);
  }
  get [dartx.onSearch]() {
    return html$.Element.searchEvent.forTarget(this);
  }
  get [dartx.onSecurityPolicyViolation]() {
    return html$.Document.securityPolicyViolationEvent.forTarget(this);
  }
  get [dartx.onSeeked]() {
    return html$.Element.seekedEvent.forTarget(this);
  }
  get [dartx.onSeeking]() {
    return html$.Element.seekingEvent.forTarget(this);
  }
  get [dartx.onSelect]() {
    return html$.Element.selectEvent.forTarget(this);
  }
  get [dartx.onSelectionChange]() {
    return html$.Document.selectionChangeEvent.forTarget(this);
  }
  get [dartx.onSelectStart]() {
    return html$.Element.selectStartEvent.forTarget(this);
  }
  get [dartx.onStalled]() {
    return html$.Element.stalledEvent.forTarget(this);
  }
  get [dartx.onSubmit]() {
    return html$.Element.submitEvent.forTarget(this);
  }
  get [dartx.onSuspend]() {
    return html$.Element.suspendEvent.forTarget(this);
  }
  get [dartx.onTimeUpdate]() {
    return html$.Element.timeUpdateEvent.forTarget(this);
  }
  get [dartx.onTouchCancel]() {
    return html$.Element.touchCancelEvent.forTarget(this);
  }
  get [dartx.onTouchEnd]() {
    return html$.Element.touchEndEvent.forTarget(this);
  }
  get [dartx.onTouchMove]() {
    return html$.Element.touchMoveEvent.forTarget(this);
  }
  get [dartx.onTouchStart]() {
    return html$.Element.touchStartEvent.forTarget(this);
  }
  get [dartx.onVolumeChange]() {
    return html$.Element.volumeChangeEvent.forTarget(this);
  }
  get [dartx.onWaiting]() {
    return html$.Element.waitingEvent.forTarget(this);
  }
  get [dartx.onFullscreenChange]() {
    return html$.Element.fullscreenChangeEvent.forTarget(this);
  }
  get [dartx.onFullscreenError]() {
    return html$.Element.fullscreenErrorEvent.forTarget(this);
  }
  [dartx.querySelectorAll](T) {
    return selectors => {
      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
    };
  }
  [dartx.query](relativeSelectors) {
    return this[dartx.querySelector](relativeSelectors);
  }
  [dartx.queryAll](T) {
    return relativeSelectors => {
      return this[dartx.querySelectorAll](T)(relativeSelectors);
    };
  }
  get [dartx.supportsRegisterElement]() {
    return "registerElement" in this;
  }
  get [dartx.supportsRegister]() {
    return this[dartx.supportsRegisterElement];
  }
  [dartx.createElement](tagName, typeExtension) {
    if (typeExtension === void 0) typeExtension = null;
    return html$.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
  }
  [_createElement_2](tagName) {
    return this.createElement(tagName);
  }
  [_createElementNS_2](namespaceURI, qualifiedName) {
    return this.createElementNS(namespaceURI, qualifiedName);
  }
  [dartx.createElementNS](namespaceURI, qualifiedName, typeExtension) {
    if (typeExtension === void 0) typeExtension = null;
    return html$.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
  }
  [_createNodeIterator](root, whatToShow, filter) {
    if (whatToShow === void 0) whatToShow = null;
    if (filter === void 0) filter = null;
    return this.createNodeIterator(root, whatToShow, filter, false);
  }
  [_createTreeWalker](root, whatToShow, filter) {
    if (whatToShow === void 0) whatToShow = null;
    if (filter === void 0) filter = null;
    return this.createTreeWalker(root, whatToShow, filter, false);
  }
  get [dartx.visibilityState]() {
    return this.visibilityState || this.mozVisibilityState || this.msVisibilityState || this.webkitVisibilityState;
  }
};
dart.setSignature(html$.Document, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Document, [])}),
  fields: () => ({
    [dartx.activeElement]: html$.Element,
    [_body]: html$.HtmlElement,
    [dartx.contentType]: core.String,
    [dartx.cookie]: core.String,
    [dartx.currentScript]: html$.ScriptElement,
    [_get_window]: dart.dynamic,
    [dartx.documentElement]: html$.Element,
    [dartx.domain]: core.String,
    [dartx.fonts]: html$.FontFaceSet,
    [dartx.fullscreenElement]: html$.Element,
    [dartx.fullscreenEnabled]: core.bool,
    [_head$0]: html$.HeadElement,
    [dartx.hidden]: core.bool,
    [dartx.implementation]: html$.DomImplementation,
    [_lastModified]: core.String,
    [dartx.origin]: core.String,
    [dartx.pointerLockElement]: html$.Element,
    [_preferredStylesheetSet]: core.String,
    [dartx.readyState]: core.String,
    [_referrer]: core.String,
    [dartx.rootElement]: svg$.SvgSvgElement,
    [dartx.scrollingElement]: html$.Element,
    [_selectedStylesheetSet]: core.String,
    [_styleSheets]: ListOfStyleSheet(),
    [dartx.timeline]: html$.AnimationTimeline,
    [_title]: core.String,
    [_visibilityState]: core.String,
    [_webkitFullscreenElement]: html$.Element,
    [_webkitFullscreenEnabled]: core.bool,
    [_webkitHidden]: core.bool,
    [_webkitVisibilityState]: core.String,
    [_childElementCount]: core.int,
    [_children]: ListOfNode(),
    [_firstElementChild]: html$.Element,
    [_lastElementChild]: html$.Element
  }),
  getters: () => ({
    [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onBeforeCopy]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onBeforeCut]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onBeforePaste]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onCopy]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
    [dartx.onCut]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
    [dartx.onPaste]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPointerLockChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPointerLockError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSecurityPolicyViolation]: dart.definiteFunctionType(async.Stream$(html$.SecurityPolicyViolationEvent), []),
    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSelectionChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSelectStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onFullscreenChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onFullscreenError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.supportsRegisterElement]: dart.definiteFunctionType(core.bool, []),
    [dartx.supportsRegister]: dart.definiteFunctionType(core.bool, []),
    [dartx.visibilityState]: dart.definiteFunctionType(core.String, [])
  }),
  methods: () => ({
    [dartx.adoptNode]: dart.definiteFunctionType(html$.Node, [html$.Node]),
    [_caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
    [dartx.createDocumentFragment]: dart.definiteFunctionType(html$.DocumentFragment, []),
    [_createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
    [_createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
    [_createEvent]: dart.definiteFunctionType(html$.Event, [core.String]),
    [dartx.createRange]: dart.definiteFunctionType(html$.Range, []),
    [_createTextNode]: dart.definiteFunctionType(html$.Text, [core.String]),
    [_createTouch]: dart.definiteFunctionType(html$.Touch, [html$.Window, html$.EventTarget, core.int, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
    [_createTouch_1]: dart.definiteFunctionType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [_createTouchList]: dart.definiteFunctionType(html$.TouchList, [html$.Touch]),
    [_elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
    [dartx.execCommand]: dart.definiteFunctionType(core.bool, [core.String], [core.bool, core.String]),
    [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, []),
    [dartx.exitPointerLock]: dart.definiteFunctionType(dart.void, []),
    [_getCssCanvasContext]: dart.definiteFunctionType(core.Object, [core.String, core.String, core.int, core.int]),
    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
    [dartx.getElementsByName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
    [dartx.getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
    [dartx.importNode]: dart.definiteFunctionType(html$.Node, [html$.Node], [core.bool]),
    [dartx.queryCommandEnabled]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.queryCommandIndeterm]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.queryCommandState]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.queryCommandSupported]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.queryCommandValue]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.transformDocumentToTreeView]: dart.definiteFunctionType(dart.void, [core.String]),
    [_webkitExitFullscreen]: dart.definiteFunctionType(dart.void, []),
    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
    [dartx.createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
    [_createElement_2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
    [_createElementNS_2]: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    [dartx.createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
    [_createNodeIterator]: dart.definiteFunctionType(html$.NodeIterator, [html$.Node], [core.int, html$.NodeFilter]),
    [_createTreeWalker]: dart.definiteFunctionType(html$.TreeWalker, [html$.Node], [core.int, html$.NodeFilter])
  }),
  sfields: () => ({
    pointerLockChangeEvent: EventStreamProviderOfEvent(),
    pointerLockErrorEvent: EventStreamProviderOfEvent(),
    readyStateChangeEvent: EventStreamProviderOfEvent(),
    securityPolicyViolationEvent: EventStreamProviderOfSecurityPolicyViolationEvent(),
    selectionChangeEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(html$.Document, {
  get pointerLockChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pointerlockchange'));
  },
  get pointerLockErrorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pointerlockerror'));
  },
  get readyStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('readystatechange'));
  },
  get securityPolicyViolationEvent() {
    return dart.const(new (EventStreamProviderOfSecurityPolicyViolationEvent())('securitypolicyviolation'));
  },
  get selectionChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('selectionchange'));
  }
});
dart.registerExtension(dart.global.Document, html$.Document);
const _docChildren = Symbol('_docChildren');
dart.defineExtensionNames([
  'children',
  'children',
  'querySelectorAll',
  'innerHtml',
  'innerHtml',
  'setInnerHtml',
  'appendText',
  'appendHtml',
  'query',
  'queryAll',
  'getElementById',
  'querySelector'
]);
html$.DocumentFragment = class DocumentFragment extends html$.Node {
  static new() {
    return html$.document[dartx.createDocumentFragment]();
  }
  static html(html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    return html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
  }
  static svg(svgContent, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    return svg$.SvgSvgElement.new()[dartx.createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
  }
  get [_children]() {
    return dart.throw(new core.UnimplementedError('Use _docChildren instead'));
  }
  get [_docChildren]() {
    return this._docChildren;
  }
  set [_docChildren](value) {
    this._docChildren = value;
  }
  get [dartx.children]() {
    if (this[_docChildren] == null) {
      this[_docChildren] = new html_common.FilteredElementList(this);
    }
    return this[_docChildren];
  }
  set [dartx.children](value) {
    let copy = value[dartx.toList]();
    let children = this[dartx.children];
    children[dartx.clear]();
    children[dartx.addAll](copy);
  }
  [dartx.querySelectorAll](T) {
    return selectors => {
      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
    };
  }
  get [dartx.innerHtml]() {
    let e = html$.Element.tag("div");
    e[dartx.append](this[dartx.clone](true));
    return e[dartx.innerHtml];
  }
  set [dartx.innerHtml](value) {
    this[dartx.setInnerHtml](value);
  }
  [dartx.setInnerHtml](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[dartx.nodes][dartx.clear]();
    this[dartx.append](html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
  }
  [dartx.appendText](text) {
    this[dartx.append](html$.Text.new(text));
  }
  [dartx.appendHtml](text, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let NodeTreeSanitizer = opts && 'NodeTreeSanitizer' in opts ? opts.NodeTreeSanitizer : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[dartx.append](html$.DocumentFragment.html(text, {validator: validator, treeSanitizer: html$.NodeTreeSanitizer._check(treeSanitizer)}));
  }
  [dartx.query](relativeSelectors) {
    return this[dartx.querySelector](relativeSelectors);
  }
  [dartx.queryAll](T) {
    return relativeSelectors => {
      return this[dartx.querySelectorAll](T)(relativeSelectors);
    };
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
  get [_childElementCount]() {
    return this.childElementCount;
  }
  get [_firstElementChild]() {
    return this.firstElementChild;
  }
  get [_lastElementChild]() {
    return this.lastElementChild;
  }
  [dartx.querySelector](...args) {
    return this.querySelector.apply(this, args);
  }
  [_querySelectorAll](...args) {
    return this.querySelectorAll.apply(this, args);
  }
};
html$.DocumentFragment[dart.implements] = () => [html$.NonElementParentNode, html$.ParentNode];
dart.setSignature(html$.DocumentFragment, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.DocumentFragment, []),
    html: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    svg: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    _: dart.definiteFunctionType(html$.DocumentFragment, [])
  }),
  fields: () => ({
    [_docChildren]: ListOfElement(),
    [_childElementCount]: core.int,
    [_firstElementChild]: html$.Element,
    [_lastElementChild]: html$.Element
  }),
  getters: () => ({
    [_children]: dart.definiteFunctionType(html$.HtmlCollection, []),
    [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
    [dartx.innerHtml]: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({
    [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
    [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String])
  }),
  methods: () => ({
    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, NodeTreeSanitizer: dart.dynamic, treeSanitizer: dart.dynamic}),
    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
  })
});
dart.registerExtension(dart.global.DocumentFragment, html$.DocumentFragment);
dart.defineExtensionNames([
  'message',
  'name'
]);
html$.DomError = class DomError extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(name, message) {
    if (message === void 0) message = null;
    if (message != null) {
      return html$.DomError._create_1(name, message);
    }
    return html$.DomError._create_2(name);
  }
  static _create_1(name, message) {
    return new DOMError(name, message);
  }
  static _create_2(name) {
    return new DOMError(name);
  }
  get [dartx.message]() {
    return this.message;
  }
  get [dartx.name]() {
    return this.name;
  }
};
dart.setSignature(html$.DomError, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DomError, []),
    new: dart.definiteFunctionType(html$.DomError, [core.String], [core.String])
  }),
  fields: () => ({
    [dartx.message]: core.String,
    [dartx.name]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.DomError, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.DomError, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.DOMError, html$.DomError);
dart.defineExtensionNames([
  'name',
  'toString',
  'message'
]);
html$.DomException = class DomException extends _interceptors.Interceptor {
  get [dartx.name]() {
    let errorName = this.name;
    if (dart.test(html_common.Device.isWebKit) && errorName == 'SECURITY_ERR') return 'SecurityError';
    if (dart.test(html_common.Device.isWebKit) && errorName == 'SYNTAX_ERR') return 'SyntaxError';
    return errorName;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.message]() {
    return this.message;
  }
  [dartx.toString]() {
    return String(this);
  }
};
dart.setSignature(html$.DomException, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomException, [])}),
  fields: () => ({[dartx.message]: core.String}),
  getters: () => ({[dartx.name]: dart.definiteFunctionType(core.String, [])}),
  sfields: () => ({
    INDEX_SIZE: core.String,
    HIERARCHY_REQUEST: core.String,
    WRONG_DOCUMENT: core.String,
    INVALID_CHARACTER: core.String,
    NO_MODIFICATION_ALLOWED: core.String,
    NOT_FOUND: core.String,
    NOT_SUPPORTED: core.String,
    INVALID_STATE: core.String,
    SYNTAX: core.String,
    INVALID_MODIFICATION: core.String,
    NAMESPACE: core.String,
    INVALID_ACCESS: core.String,
    TYPE_MISMATCH: core.String,
    SECURITY: core.String,
    NETWORK: core.String,
    ABORT: core.String,
    URL_MISMATCH: core.String,
    QUOTA_EXCEEDED: core.String,
    TIMEOUT: core.String,
    INVALID_NODE_TYPE: core.String,
    DATA_CLONE: core.String
  })
});
html$.DomException.INDEX_SIZE = 'IndexSizeError';
html$.DomException.HIERARCHY_REQUEST = 'HierarchyRequestError';
html$.DomException.WRONG_DOCUMENT = 'WrongDocumentError';
html$.DomException.INVALID_CHARACTER = 'InvalidCharacterError';
html$.DomException.NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
html$.DomException.NOT_FOUND = 'NotFoundError';
html$.DomException.NOT_SUPPORTED = 'NotSupportedError';
html$.DomException.INVALID_STATE = 'InvalidStateError';
html$.DomException.SYNTAX = 'SyntaxError';
html$.DomException.INVALID_MODIFICATION = 'InvalidModificationError';
html$.DomException.NAMESPACE = 'NamespaceError';
html$.DomException.INVALID_ACCESS = 'InvalidAccessError';
html$.DomException.TYPE_MISMATCH = 'TypeMismatchError';
html$.DomException.SECURITY = 'SecurityError';
html$.DomException.NETWORK = 'NetworkError';
html$.DomException.ABORT = 'AbortError';
html$.DomException.URL_MISMATCH = 'URLMismatchError';
html$.DomException.QUOTA_EXCEEDED = 'QuotaExceededError';
html$.DomException.TIMEOUT = 'TimeoutError';
html$.DomException.INVALID_NODE_TYPE = 'InvalidNodeTypeError';
html$.DomException.DATA_CLONE = 'DataCloneError';
dart.registerExtension(dart.global.DOMException, html$.DomException);
dart.defineExtensionNames([
  'createDocument',
  'createDocumentType',
  'createHtmlDocument',
  'hasFeature'
]);
html$.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.createDocument](...args) {
    return this.createDocument.apply(this, args);
  }
  [dartx.createDocumentType](...args) {
    return this.createDocumentType.apply(this, args);
  }
  [dartx.createHtmlDocument](...args) {
    return this.createHTMLDocument.apply(this, args);
  }
  [dartx.hasFeature](...args) {
    return this.hasFeature.apply(this, args);
  }
};
dart.setSignature(html$.DomImplementation, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomImplementation, [])}),
  methods: () => ({
    [dartx.createDocument]: dart.definiteFunctionType(html$.XmlDocument, [core.String, core.String, html$._DocumentType]),
    [dartx.createDocumentType]: dart.definiteFunctionType(html$._DocumentType, [core.String, core.String, core.String]),
    [dartx.createHtmlDocument]: dart.definiteFunctionType(html$.HtmlDocument, [core.String]),
    [dartx.hasFeature]: dart.definiteFunctionType(core.bool, [])
  })
});
dart.registerExtension(dart.global.DOMImplementation, html$.DomImplementation);
dart.defineExtensionNames([
  'next'
]);
html$.DomIterator = class DomIterator extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.next](...args) {
    return this.next.apply(this, args);
  }
};
dart.setSignature(html$.DomIterator, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomIterator, [])}),
  methods: () => ({[dartx.next]: dart.definiteFunctionType(core.Object, [], [core.Object])})
});
dart.registerExtension(dart.global.Iterator, html$.DomIterator);
dart.defineExtensionNames([
  'a',
  'b',
  'c',
  'd',
  'e',
  'f',
  'is2D',
  'isIdentity',
  'm11',
  'm12',
  'm13',
  'm14',
  'm21',
  'm22',
  'm23',
  'm24',
  'm31',
  'm32',
  'm33',
  'm34',
  'm41',
  'm42',
  'm43',
  'm44',
  'multiply',
  'scale',
  'scale3d',
  'scaleNonUniform',
  'toFloat32Array',
  'toFloat64Array',
  'translate'
]);
html$.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.a]() {
    return this.a;
  }
  get [dartx.b]() {
    return this.b;
  }
  get [dartx.c]() {
    return this.c;
  }
  get [dartx.d]() {
    return this.d;
  }
  get [dartx.e]() {
    return this.e;
  }
  get [dartx.f]() {
    return this.f;
  }
  get [dartx.is2D]() {
    return this.is2D;
  }
  get [dartx.isIdentity]() {
    return this.isIdentity;
  }
  get [dartx.m11]() {
    return this.m11;
  }
  get [dartx.m12]() {
    return this.m12;
  }
  get [dartx.m13]() {
    return this.m13;
  }
  get [dartx.m14]() {
    return this.m14;
  }
  get [dartx.m21]() {
    return this.m21;
  }
  get [dartx.m22]() {
    return this.m22;
  }
  get [dartx.m23]() {
    return this.m23;
  }
  get [dartx.m24]() {
    return this.m24;
  }
  get [dartx.m31]() {
    return this.m31;
  }
  get [dartx.m32]() {
    return this.m32;
  }
  get [dartx.m33]() {
    return this.m33;
  }
  get [dartx.m34]() {
    return this.m34;
  }
  get [dartx.m41]() {
    return this.m41;
  }
  get [dartx.m42]() {
    return this.m42;
  }
  get [dartx.m43]() {
    return this.m43;
  }
  get [dartx.m44]() {
    return this.m44;
  }
  [dartx.multiply](...args) {
    return this.multiply.apply(this, args);
  }
  [dartx.scale](...args) {
    return this.scale.apply(this, args);
  }
  [dartx.scale3d](...args) {
    return this.scale3d.apply(this, args);
  }
  [dartx.scaleNonUniform](...args) {
    return this.scaleNonUniform.apply(this, args);
  }
  [dartx.toFloat32Array](...args) {
    return this.toFloat32Array.apply(this, args);
  }
  [dartx.toFloat64Array](...args) {
    return this.toFloat64Array.apply(this, args);
  }
  [dartx.translate](...args) {
    return this.translate.apply(this, args);
  }
};
dart.setSignature(html$.DomMatrixReadOnly, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomMatrixReadOnly, [])}),
  getters: () => ({
    [dartx.a]: dart.definiteFunctionType(core.num, []),
    [dartx.b]: dart.definiteFunctionType(core.num, []),
    [dartx.c]: dart.definiteFunctionType(core.num, []),
    [dartx.d]: dart.definiteFunctionType(core.num, []),
    [dartx.e]: dart.definiteFunctionType(core.num, []),
    [dartx.f]: dart.definiteFunctionType(core.num, []),
    [dartx.is2D]: dart.definiteFunctionType(core.bool, []),
    [dartx.isIdentity]: dart.definiteFunctionType(core.bool, []),
    [dartx.m11]: dart.definiteFunctionType(core.num, []),
    [dartx.m12]: dart.definiteFunctionType(core.num, []),
    [dartx.m13]: dart.definiteFunctionType(core.num, []),
    [dartx.m14]: dart.definiteFunctionType(core.num, []),
    [dartx.m21]: dart.definiteFunctionType(core.num, []),
    [dartx.m22]: dart.definiteFunctionType(core.num, []),
    [dartx.m23]: dart.definiteFunctionType(core.num, []),
    [dartx.m24]: dart.definiteFunctionType(core.num, []),
    [dartx.m31]: dart.definiteFunctionType(core.num, []),
    [dartx.m32]: dart.definiteFunctionType(core.num, []),
    [dartx.m33]: dart.definiteFunctionType(core.num, []),
    [dartx.m34]: dart.definiteFunctionType(core.num, []),
    [dartx.m41]: dart.definiteFunctionType(core.num, []),
    [dartx.m42]: dart.definiteFunctionType(core.num, []),
    [dartx.m43]: dart.definiteFunctionType(core.num, []),
    [dartx.m44]: dart.definiteFunctionType(core.num, [])
  }),
  methods: () => ({
    [dartx.multiply]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
    [dartx.scale]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
    [dartx.scale3d]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
    [dartx.scaleNonUniform]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
    [dartx.toFloat32Array]: dart.definiteFunctionType(typed_data.Float32List, []),
    [dartx.toFloat64Array]: dart.definiteFunctionType(typed_data.Float64List, []),
    [dartx.translate]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
  })
});
dart.registerExtension(dart.global.DOMMatrixReadOnly, html$.DomMatrixReadOnly);
dart.defineExtensionNames([
  'a',
  'a',
  'b',
  'b',
  'c',
  'c',
  'd',
  'd',
  'e',
  'e',
  'f',
  'f',
  'm11',
  'm11',
  'm12',
  'm12',
  'm13',
  'm13',
  'm14',
  'm14',
  'm21',
  'm21',
  'm22',
  'm22',
  'm23',
  'm23',
  'm24',
  'm24',
  'm31',
  'm31',
  'm32',
  'm32',
  'm33',
  'm33',
  'm34',
  'm34',
  'm41',
  'm41',
  'm42',
  'm42',
  'm43',
  'm43',
  'm44',
  'm44',
  'multiplySelf',
  'preMultiplySelf',
  'scale3dSelf',
  'scaleNonUniformSelf',
  'scaleSelf',
  'translateSelf'
]);
html$.DomMatrix = class DomMatrix extends html$.DomMatrixReadOnly {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(other) {
    if (other === void 0) other = null;
    if (other == null) {
      return html$.DomMatrix._create_1();
    }
    if (html$.DomMatrixReadOnly.is(other) || other == null) {
      return html$.DomMatrix._create_2(other);
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  static _create_1() {
    return new DOMMatrix();
  }
  static _create_2(other) {
    return new DOMMatrix(other);
  }
  get [dartx.a]() {
    return this.a;
  }
  set [dartx.a](value) {
    this.a = value;
  }
  get [dartx.b]() {
    return this.b;
  }
  set [dartx.b](value) {
    this.b = value;
  }
  get [dartx.c]() {
    return this.c;
  }
  set [dartx.c](value) {
    this.c = value;
  }
  get [dartx.d]() {
    return this.d;
  }
  set [dartx.d](value) {
    this.d = value;
  }
  get [dartx.e]() {
    return this.e;
  }
  set [dartx.e](value) {
    this.e = value;
  }
  get [dartx.f]() {
    return this.f;
  }
  set [dartx.f](value) {
    this.f = value;
  }
  get [dartx.m11]() {
    return this.m11;
  }
  set [dartx.m11](value) {
    this.m11 = value;
  }
  get [dartx.m12]() {
    return this.m12;
  }
  set [dartx.m12](value) {
    this.m12 = value;
  }
  get [dartx.m13]() {
    return this.m13;
  }
  set [dartx.m13](value) {
    this.m13 = value;
  }
  get [dartx.m14]() {
    return this.m14;
  }
  set [dartx.m14](value) {
    this.m14 = value;
  }
  get [dartx.m21]() {
    return this.m21;
  }
  set [dartx.m21](value) {
    this.m21 = value;
  }
  get [dartx.m22]() {
    return this.m22;
  }
  set [dartx.m22](value) {
    this.m22 = value;
  }
  get [dartx.m23]() {
    return this.m23;
  }
  set [dartx.m23](value) {
    this.m23 = value;
  }
  get [dartx.m24]() {
    return this.m24;
  }
  set [dartx.m24](value) {
    this.m24 = value;
  }
  get [dartx.m31]() {
    return this.m31;
  }
  set [dartx.m31](value) {
    this.m31 = value;
  }
  get [dartx.m32]() {
    return this.m32;
  }
  set [dartx.m32](value) {
    this.m32 = value;
  }
  get [dartx.m33]() {
    return this.m33;
  }
  set [dartx.m33](value) {
    this.m33 = value;
  }
  get [dartx.m34]() {
    return this.m34;
  }
  set [dartx.m34](value) {
    this.m34 = value;
  }
  get [dartx.m41]() {
    return this.m41;
  }
  set [dartx.m41](value) {
    this.m41 = value;
  }
  get [dartx.m42]() {
    return this.m42;
  }
  set [dartx.m42](value) {
    this.m42 = value;
  }
  get [dartx.m43]() {
    return this.m43;
  }
  set [dartx.m43](value) {
    this.m43 = value;
  }
  get [dartx.m44]() {
    return this.m44;
  }
  set [dartx.m44](value) {
    this.m44 = value;
  }
  [dartx.multiplySelf](...args) {
    return this.multiplySelf.apply(this, args);
  }
  [dartx.preMultiplySelf](...args) {
    return this.preMultiplySelf.apply(this, args);
  }
  [dartx.scale3dSelf](...args) {
    return this.scale3dSelf.apply(this, args);
  }
  [dartx.scaleNonUniformSelf](...args) {
    return this.scaleNonUniformSelf.apply(this, args);
  }
  [dartx.scaleSelf](...args) {
    return this.scaleSelf.apply(this, args);
  }
  [dartx.translateSelf](...args) {
    return this.translateSelf.apply(this, args);
  }
};
dart.setSignature(html$.DomMatrix, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DomMatrix, []),
    new: dart.definiteFunctionType(html$.DomMatrix, [], [html$.DomMatrixReadOnly])
  }),
  setters: () => ({
    [dartx.a]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.b]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.c]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.d]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.e]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.f]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m11]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m12]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m13]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m14]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m21]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m22]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m23]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m24]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m31]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m32]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m33]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m34]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m41]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m42]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m43]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.m44]: dart.definiteFunctionType(dart.void, [core.num])
  }),
  methods: () => ({
    [dartx.multiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
    [dartx.preMultiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
    [dartx.scale3dSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
    [dartx.scaleNonUniformSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
    [dartx.scaleSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
    [dartx.translateSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.DomMatrix, []),
    _create_2: dart.definiteFunctionType(html$.DomMatrix, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.DOMMatrix, html$.DomMatrix);
dart.defineExtensionNames([
  'parseFromString'
]);
html$.DomParser = class DomParser extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.DomParser._create_1();
  }
  static _create_1() {
    return new DOMParser();
  }
  [dartx.parseFromString](...args) {
    return this.parseFromString.apply(this, args);
  }
};
dart.setSignature(html$.DomParser, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DomParser, []),
    new: dart.definiteFunctionType(html$.DomParser, [])
  }),
  methods: () => ({[dartx.parseFromString]: dart.definiteFunctionType(html$.Document, [core.String, core.String])}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomParser, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.DOMParser, html$.DomParser);
dart.defineExtensionNames([
  'w',
  'x',
  'y',
  'z'
]);
html$.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(x, y, z, w) {
    return html$.DomPointReadOnly._create_1(x, y, z, w);
  }
  static _create_1(x, y, z, w) {
    return new DOMPointReadOnly(x, y, z, w);
  }
  get [dartx.w]() {
    return this.w;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.z]() {
    return this.z;
  }
};
dart.setSignature(html$.DomPointReadOnly, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DomPointReadOnly, []),
    new: dart.definiteFunctionType(html$.DomPointReadOnly, [core.num, core.num, core.num, core.num])
  }),
  getters: () => ({
    [dartx.w]: dart.definiteFunctionType(core.num, []),
    [dartx.x]: dart.definiteFunctionType(core.num, []),
    [dartx.y]: dart.definiteFunctionType(core.num, []),
    [dartx.z]: dart.definiteFunctionType(core.num, [])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomPointReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.DOMPointReadOnly, html$.DomPointReadOnly);
dart.defineExtensionNames([
  'w',
  'w',
  'x',
  'x',
  'y',
  'y',
  'z',
  'z'
]);
html$.DomPoint = class DomPoint extends html$.DomPointReadOnly {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(point_OR_x, y, z, w) {
    if (point_OR_x === void 0) point_OR_x = null;
    if (y === void 0) y = null;
    if (z === void 0) z = null;
    if (w === void 0) w = null;
    if ((core.Map.is(point_OR_x) || point_OR_x == null) && y == null && z == null && w == null) {
      let point_1 = html_common.convertDartToNative_Dictionary(core.Map._check(point_OR_x));
      return html$.DomPoint._create_1(point_1);
    }
    if (point_OR_x == null && y == null && z == null && w == null) {
      return html$.DomPoint._create_2();
    }
    if ((typeof point_OR_x == 'number' || point_OR_x == null) && y == null && z == null && w == null) {
      return html$.DomPoint._create_3(point_OR_x);
    }
    if ((typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && z == null && w == null) {
      return html$.DomPoint._create_4(point_OR_x, y);
    }
    if ((typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && w == null) {
      return html$.DomPoint._create_5(point_OR_x, y, z);
    }
    if ((typeof w == 'number' || w == null) && (typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null)) {
      return html$.DomPoint._create_6(point_OR_x, y, z, w);
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  static _create_1(point_OR_x) {
    return new DOMPoint(point_OR_x);
  }
  static _create_2() {
    return new DOMPoint();
  }
  static _create_3(point_OR_x) {
    return new DOMPoint(point_OR_x);
  }
  static _create_4(point_OR_x, y) {
    return new DOMPoint(point_OR_x, y);
  }
  static _create_5(point_OR_x, y, z) {
    return new DOMPoint(point_OR_x, y, z);
  }
  static _create_6(point_OR_x, y, z, w) {
    return new DOMPoint(point_OR_x, y, z, w);
  }
  static get supported() {
    return !!window.DOMPoint || !!window.WebKitPoint;
  }
  get [dartx.w]() {
    return this.w;
  }
  set [dartx.w](value) {
    this.w = value;
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  get [dartx.z]() {
    return this.z;
  }
  set [dartx.z](value) {
    this.z = value;
  }
};
dart.setSignature(html$.DomPoint, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DomPoint, []),
    new: dart.definiteFunctionType(html$.DomPoint, [], [dart.dynamic, core.num, core.num, core.num])
  }),
  setters: () => ({
    [dartx.w]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.y]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.z]: dart.definiteFunctionType(dart.void, [core.num])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.DomPoint, []),
    _create_3: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
    _create_4: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic]),
    _create_5: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_6: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6']
});
dart.registerExtension(dart.global.DOMPoint, html$.DomPoint);
dart.defineExtensionNames([
  'toString',
  '==',
  'hashCode',
  'intersection',
  'intersects',
  'boundingBox',
  'containsRectangle',
  'containsPoint',
  'topLeft',
  'topRight',
  'bottomRight',
  'bottomLeft',
  'bottom',
  'height',
  'left',
  'right',
  'top',
  'width',
  'x',
  'y'
]);
html$.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
  [dartx.toString]() {
    return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
  }
  [dartx['==']](other) {
    if (!RectangleOfnum().is(other)) return false;
    return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
  }
  get [dartx.hashCode]() {
    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
  }
  [dartx.intersection](other) {
    let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
    let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
    if (dart.notNull(x0) <= dart.notNull(x1)) {
      let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
      let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      if (dart.notNull(y0) <= dart.notNull(y1)) {
        return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
      }
    }
    return null;
  }
  [dartx.intersects](other) {
    return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
  }
  [dartx.boundingBox](other) {
    let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
    let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
    let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
    let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
    return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
  }
  [dartx.containsRectangle](another) {
    return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
  }
  [dartx.containsPoint](another) {
    return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
  }
  get [dartx.topLeft]() {
    return new (PointOfnum())(this[dartx.left], this[dartx.top]);
  }
  get [dartx.topRight]() {
    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
  }
  get [dartx.bottomRight]() {
    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
  }
  get [dartx.bottomLeft]() {
    return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(x, y, width, height) {
    return html$.DomRectReadOnly._create_1(x, y, width, height);
  }
  static _create_1(x, y, width, height) {
    return new DOMRectReadOnly(x, y, width, height);
  }
  get [dartx.bottom]() {
    return this.bottom;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.left]() {
    return this.left;
  }
  get [dartx.right]() {
    return this.right;
  }
  get [dartx.top]() {
    return this.top;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
html$.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
dart.setSignature(html$.DomRectReadOnly, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.DomRectReadOnly, []),
    new: dart.definiteFunctionType(html$.DomRectReadOnly, [core.num, core.num, core.num, core.num])
  }),
  getters: () => ({
    [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.bottom]: dart.definiteFunctionType(core.num, []),
    [dartx.height]: dart.definiteFunctionType(core.num, []),
    [dartx.left]: dart.definiteFunctionType(core.num, []),
    [dartx.right]: dart.definiteFunctionType(core.num, []),
    [dartx.top]: dart.definiteFunctionType(core.num, []),
    [dartx.width]: dart.definiteFunctionType(core.num, []),
    [dartx.x]: dart.definiteFunctionType(core.num, []),
    [dartx.y]: dart.definiteFunctionType(core.num, [])
  }),
  methods: () => ({
    [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
    [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
    [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
    [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
    [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomRectReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.DOMRectReadOnly, html$.DomRectReadOnly);
dart.defineExtensionNames([
  'add',
  'contains',
  'item',
  'remove',
  'toggle',
  'length'
]);
html$.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx.add](...args) {
    return this.add.apply(this, args);
  }
  [dartx.contains](...args) {
    return this.contains.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.remove](...args) {
    return this.remove.apply(this, args);
  }
  [dartx.toggle](...args) {
    return this.toggle.apply(this, args);
  }
};
dart.setSignature(html$.DomTokenList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomTokenList, [])}),
  fields: () => ({[dartx.length]: core.int}),
  methods: () => ({
    [dartx.add]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.contains]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.remove]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.toggle]: dart.definiteFunctionType(core.bool, [core.String], [core.bool])
  })
});
dart.registerExtension(dart.global.DOMTokenList, html$.DomTokenList);
dart.defineExtensionNames([
  'value'
]);
html$.DomSettableTokenList = class DomSettableTokenList extends html$.DomTokenList {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.setSignature(html$.DomSettableTokenList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomSettableTokenList, [])}),
  fields: () => ({[dartx.value]: core.String})
});
dart.registerExtension(dart.global.DOMSettableTokenList, html$.DomSettableTokenList);
html$.ImmutableListMixin$ = dart.generic(E => {
  let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html$.FixedSizeListIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
  dart.defineExtensionNames([
    'iterator',
    'add',
    'addAll',
    'sort',
    'shuffle',
    'insert',
    'insertAll',
    'setAll',
    'removeAt',
    'removeLast',
    'remove',
    'removeWhere',
    'retainWhere',
    'setRange',
    'removeRange',
    'replaceRange',
    'fillRange'
  ]);
  class ImmutableListMixin extends core.Object {
    get iterator() {
      return new (FixedSizeListIteratorOfE())(this);
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this[dartx.iterator]);
    }
    add(value) {
      E._check(value);
      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError("Cannot sort immutable List."));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError("Cannot shuffle immutable List."));
    }
    insert(index, element) {
      E._check(element);
      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
    }
    insertAll(index, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
    }
    setAll(index, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
    }
    removeAt(pos) {
      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
    }
    removeLast() {
      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
    }
    remove(object) {
      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
    }
    retainWhere(test) {
      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError("Cannot setRange on immutable List."));
    }
    removeRange(start, end) {
      dart.throw(new core.UnsupportedError("Cannot removeRange on immutable List."));
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
    }
  }
  dart.addTypeTests(ImmutableListMixin);
  ImmutableListMixin[dart.implements] = () => [ListOfE()];
  dart.setSignature(ImmutableListMixin, {
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [E]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
      sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
      shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
      removeAt: dart.definiteFunctionType(E, [core.int]),
      removeLast: dart.definiteFunctionType(E, []),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
    })
  });
  dart.defineExtensionMembers(ImmutableListMixin, [
    'add',
    'addAll',
    'sort',
    'shuffle',
    'insert',
    'insertAll',
    'setAll',
    'removeAt',
    'removeLast',
    'remove',
    'removeWhere',
    'retainWhere',
    'setRange',
    'removeRange',
    'replaceRange',
    'fillRange',
    'iterator'
  ]);
  return ImmutableListMixin;
});
html$.ImmutableListMixin = ImmutableListMixin();
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$.DomStringList = class DomStringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.item](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$.DomStringList[dart.implements] = () => [ListOfString()];
dart.setSignature(html$.DomStringList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomStringList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
    [__getter__]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
  })
});
dart.registerExtension(dart.global.DOMStringList, html$.DomStringList);
html$.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.DomStringMap, {
  constructors: () => ({_: dart.definiteFunctionType(html$.DomStringMap, [])})
});
html$.EffectModel = class EffectModel extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.EffectModel, {
  constructors: () => ({_: dart.definiteFunctionType(html$.EffectModel, [])})
});
dart.registerExtension(dart.global.EffectModel, html$.EffectModel);
const _childElements = Symbol('_childElements');
const _element$ = Symbol('_element');
const _filter$0 = Symbol('_filter');
html$._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html$.Element) {
  _wrap(element) {
    this[_childElements] = html$.HtmlCollection._check(element[_children]);
    this[_element$] = element;
  }
  contains(element) {
    return this[_childElements][dartx.contains](element);
  }
  get isEmpty() {
    return this[_element$][_firstElementChild] == null;
  }
  get length() {
    return this[_childElements][dartx.length];
  }
  _get(index) {
    return html$.Element._check(this[_childElements][dartx._get](index));
  }
  _set(index, value) {
    this[_element$][_replaceChild](value, this[_childElements][dartx._get](index));
    return value;
  }
  set length(newLength) {
    dart.throw(new core.UnsupportedError('Cannot resize element lists'));
  }
  add(value) {
    this[_element$][dartx.append](value);
    return value;
  }
  get iterator() {
    return this[dartx.toList]()[dartx.iterator];
  }
  addAll(iterable) {
    if (html$._ChildNodeListLazy.is(iterable)) {
      iterable = ListOfElement().from(iterable);
    }
    for (let element of iterable) {
      this[_element$][dartx.append](element);
    }
  }
  sort(compare) {
    if (compare === void 0) compare = null;
    dart.throw(new core.UnsupportedError('Cannot sort element lists'));
  }
  shuffle(random) {
    if (random === void 0) random = null;
    dart.throw(new core.UnsupportedError('Cannot shuffle element lists'));
  }
  removeWhere(test) {
    this[_filter$0](test, false);
  }
  retainWhere(test) {
    this[_filter$0](test, true);
  }
  [_filter$0](test, retainMatching) {
    let removed = null;
    if (dart.test(retainMatching)) {
      removed = this[_element$][dartx.children][dartx.where](dart.fn(e => !dart.test(test(e)), ElementTobool$()));
    } else {
      removed = this[_element$][dartx.children][dartx.where](test);
    }
    for (let e of core.Iterable._check(removed))
      dart.dsend(e, 'remove');
  }
  setRange(start, end, iterable, skipCount) {
    if (skipCount === void 0) skipCount = 0;
    dart.throw(new core.UnimplementedError());
  }
  replaceRange(start, end, iterable) {
    dart.throw(new core.UnimplementedError());
  }
  fillRange(start, end, fillValue) {
    if (fillValue === void 0) fillValue = null;
    dart.throw(new core.UnimplementedError());
  }
  remove(object) {
    if (html$.Element.is(object)) {
      let element = object;
      if (core.identical(element[dartx.parentNode], this[_element$])) {
        this[_element$][_removeChild](element);
        return true;
      }
    }
    return false;
  }
  insert(index, element) {
    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
      dart.throw(new core.RangeError.range(index, 0, this.length));
    }
    if (index == this.length) {
      this[_element$][dartx.append](element);
    } else {
      this[_element$][dartx.insertBefore](element, this._get(index));
    }
  }
  setAll(index, iterable) {
    dart.throw(new core.UnimplementedError());
  }
  clear() {
    this[_element$][_clearChildren]();
  }
  removeAt(index) {
    let result = this._get(index);
    if (result != null) {
      this[_element$][_removeChild](result);
    }
    return result;
  }
  removeLast() {
    let result = this.last;
    if (result != null) {
      this[_element$][_removeChild](result);
    }
    return result;
  }
  get first() {
    let result = this[_element$][_firstElementChild];
    if (result == null) dart.throw(new core.StateError("No elements"));
    return result;
  }
  get last() {
    let result = this[_element$][_lastElementChild];
    if (result == null) dart.throw(new core.StateError("No elements"));
    return result;
  }
  get single() {
    if (dart.notNull(this.length) > 1) dart.throw(new core.StateError("More than one element"));
    return this.first;
  }
  get rawList() {
    return this[_childElements];
  }
};
dart.addSimpleTypeTests(html$._ChildrenElementList);
dart.defineNamedConstructor(html$._ChildrenElementList, '_wrap');
html$._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
dart.setSignature(html$._ChildrenElementList, {
  constructors: () => ({_wrap: dart.definiteFunctionType(html$._ChildrenElementList, [html$.Element])}),
  fields: () => ({
    [_element$]: html$.Element,
    [_childElements]: html$.HtmlCollection
  }),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
  }),
  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    _get: dart.definiteFunctionType(html$.Element, [core.int]),
    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
    add: dart.definiteFunctionType(html$.Element, [html$.Element]),
    [_filter$0]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool])
  })
});
dart.defineExtensionMembers(html$._ChildrenElementList, [
  'contains',
  '_get',
  '_set',
  'add',
  'addAll',
  'sort',
  'shuffle',
  'removeWhere',
  'retainWhere',
  'setRange',
  'replaceRange',
  'fillRange',
  'remove',
  'insert',
  'setAll',
  'clear',
  'removeAt',
  'removeLast',
  'isEmpty',
  'length',
  'length',
  'iterator',
  'first',
  'last',
  'single'
]);
html$.ElementList$ = dart.generic(T => {
  class ElementList extends collection.ListBase$(T) {}
  return ElementList;
});
html$.ElementList = ElementList();
const _nodeList = Symbol('_nodeList');
const _forElementList = Symbol('_forElementList');
html$._FrozenElementList$ = dart.generic(E => {
  let ElementListOfE = () => (ElementListOfE = dart.constFn(html$.ElementList$(E)))();
  let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
  let EToIterableOfString = () => (EToIterableOfString = dart.constFn(dart.definiteFunctionType(IterableOfString(), [E])))();
  class _FrozenElementList extends collection.ListBase$(E) {
    _wrap(nodeList) {
      this[_nodeList] = nodeList;
    }
    get length() {
      return this[_nodeList][dartx.length];
    }
    _get(index) {
      return html$._downcast(html$.Node, E)(this[_nodeList][dartx._get](index));
    }
    _set(index, value) {
      E._check(value);
      dart.throw(new core.UnsupportedError('Cannot modify list'));
      return value;
    }
    set length(newLength) {
      dart.throw(new core.UnsupportedError('Cannot modify list'));
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError('Cannot sort list'));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError('Cannot shuffle list'));
    }
    get first() {
      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.first]);
    }
    get last() {
      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.last]);
    }
    get single() {
      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.single]);
    }
    get classes() {
      return html$._MultiElementCssClassSet.new(this);
    }
    get style() {
      return new html$._CssStyleDeclarationSet(this);
    }
    set classes(value) {
      this[dartx.forEach](dart.fn(e => e[dartx.classes] = value, EToIterableOfString()));
    }
    get contentEdge() {
      return new html$._ContentCssListRect(this);
    }
    get paddingEdge() {
      return this.first[dartx.paddingEdge];
    }
    get borderEdge() {
      return this.first[dartx.borderEdge];
    }
    get marginEdge() {
      return this.first[dartx.marginEdge];
    }
    get rawList() {
      return this[_nodeList];
    }
    get onAbort() {
      return html$.Element.abortEvent[_forElementList](this);
    }
    get onBeforeCopy() {
      return html$.Element.beforeCopyEvent[_forElementList](this);
    }
    get onBeforeCut() {
      return html$.Element.beforeCutEvent[_forElementList](this);
    }
    get onBeforePaste() {
      return html$.Element.beforePasteEvent[_forElementList](this);
    }
    get onBlur() {
      return html$.Element.blurEvent[_forElementList](this);
    }
    get onCanPlay() {
      return html$.Element.canPlayEvent[_forElementList](this);
    }
    get onCanPlayThrough() {
      return html$.Element.canPlayThroughEvent[_forElementList](this);
    }
    get onChange() {
      return html$.Element.changeEvent[_forElementList](this);
    }
    get onClick() {
      return html$.Element.clickEvent[_forElementList](this);
    }
    get onContextMenu() {
      return html$.Element.contextMenuEvent[_forElementList](this);
    }
    get onCopy() {
      return html$.Element.copyEvent[_forElementList](this);
    }
    get onCut() {
      return html$.Element.cutEvent[_forElementList](this);
    }
    get onDoubleClick() {
      return html$.Element.doubleClickEvent[_forElementList](this);
    }
    get onDrag() {
      return html$.Element.dragEvent[_forElementList](this);
    }
    get onDragEnd() {
      return html$.Element.dragEndEvent[_forElementList](this);
    }
    get onDragEnter() {
      return html$.Element.dragEnterEvent[_forElementList](this);
    }
    get onDragLeave() {
      return html$.Element.dragLeaveEvent[_forElementList](this);
    }
    get onDragOver() {
      return html$.Element.dragOverEvent[_forElementList](this);
    }
    get onDragStart() {
      return html$.Element.dragStartEvent[_forElementList](this);
    }
    get onDrop() {
      return html$.Element.dropEvent[_forElementList](this);
    }
    get onDurationChange() {
      return html$.Element.durationChangeEvent[_forElementList](this);
    }
    get onEmptied() {
      return html$.Element.emptiedEvent[_forElementList](this);
    }
    get onEnded() {
      return html$.Element.endedEvent[_forElementList](this);
    }
    get onError() {
      return html$.Element.errorEvent[_forElementList](this);
    }
    get onFocus() {
      return html$.Element.focusEvent[_forElementList](this);
    }
    get onInput() {
      return html$.Element.inputEvent[_forElementList](this);
    }
    get onInvalid() {
      return html$.Element.invalidEvent[_forElementList](this);
    }
    get onKeyDown() {
      return html$.Element.keyDownEvent[_forElementList](this);
    }
    get onKeyPress() {
      return html$.Element.keyPressEvent[_forElementList](this);
    }
    get onKeyUp() {
      return html$.Element.keyUpEvent[_forElementList](this);
    }
    get onLoad() {
      return html$.Element.loadEvent[_forElementList](this);
    }
    get onLoadedData() {
      return html$.Element.loadedDataEvent[_forElementList](this);
    }
    get onLoadedMetadata() {
      return html$.Element.loadedMetadataEvent[_forElementList](this);
    }
    get onMouseDown() {
      return html$.Element.mouseDownEvent[_forElementList](this);
    }
    get onMouseEnter() {
      return html$.Element.mouseEnterEvent[_forElementList](this);
    }
    get onMouseLeave() {
      return html$.Element.mouseLeaveEvent[_forElementList](this);
    }
    get onMouseMove() {
      return html$.Element.mouseMoveEvent[_forElementList](this);
    }
    get onMouseOut() {
      return html$.Element.mouseOutEvent[_forElementList](this);
    }
    get onMouseOver() {
      return html$.Element.mouseOverEvent[_forElementList](this);
    }
    get onMouseUp() {
      return html$.Element.mouseUpEvent[_forElementList](this);
    }
    get onMouseWheel() {
      return html$.Element.mouseWheelEvent[_forElementList](this);
    }
    get onPaste() {
      return html$.Element.pasteEvent[_forElementList](this);
    }
    get onPause() {
      return html$.Element.pauseEvent[_forElementList](this);
    }
    get onPlay() {
      return html$.Element.playEvent[_forElementList](this);
    }
    get onPlaying() {
      return html$.Element.playingEvent[_forElementList](this);
    }
    get onRateChange() {
      return html$.Element.rateChangeEvent[_forElementList](this);
    }
    get onReset() {
      return html$.Element.resetEvent[_forElementList](this);
    }
    get onResize() {
      return html$.Element.resizeEvent[_forElementList](this);
    }
    get onScroll() {
      return html$.Element.scrollEvent[_forElementList](this);
    }
    get onSearch() {
      return html$.Element.searchEvent[_forElementList](this);
    }
    get onSeeked() {
      return html$.Element.seekedEvent[_forElementList](this);
    }
    get onSeeking() {
      return html$.Element.seekingEvent[_forElementList](this);
    }
    get onSelect() {
      return html$.Element.selectEvent[_forElementList](this);
    }
    get onSelectStart() {
      return html$.Element.selectStartEvent[_forElementList](this);
    }
    get onStalled() {
      return html$.Element.stalledEvent[_forElementList](this);
    }
    get onSubmit() {
      return html$.Element.submitEvent[_forElementList](this);
    }
    get onSuspend() {
      return html$.Element.suspendEvent[_forElementList](this);
    }
    get onTimeUpdate() {
      return html$.Element.timeUpdateEvent[_forElementList](this);
    }
    get onTouchCancel() {
      return html$.Element.touchCancelEvent[_forElementList](this);
    }
    get onTouchEnd() {
      return html$.Element.touchEndEvent[_forElementList](this);
    }
    get onTouchEnter() {
      return html$.Element.touchEnterEvent[_forElementList](this);
    }
    get onTouchLeave() {
      return html$.Element.touchLeaveEvent[_forElementList](this);
    }
    get onTouchMove() {
      return html$.Element.touchMoveEvent[_forElementList](this);
    }
    get onTouchStart() {
      return html$.Element.touchStartEvent[_forElementList](this);
    }
    get onTransitionEnd() {
      return html$.Element.transitionEndEvent[_forElementList](this);
    }
    get onVolumeChange() {
      return html$.Element.volumeChangeEvent[_forElementList](this);
    }
    get onWaiting() {
      return html$.Element.waitingEvent[_forElementList](this);
    }
    get onFullscreenChange() {
      return html$.Element.fullscreenChangeEvent[_forElementList](this);
    }
    get onFullscreenError() {
      return html$.Element.fullscreenErrorEvent[_forElementList](this);
    }
  }
  dart.defineNamedConstructor(_FrozenElementList, '_wrap');
  _FrozenElementList[dart.implements] = () => [ElementListOfE(), html_common.NodeListWrapper];
  dart.setSignature(_FrozenElementList, {
    constructors: () => ({_wrap: dart.definiteFunctionType(html$._FrozenElementList$(E), [ListOfNode()])}),
    fields: () => ({[_nodeList]: ListOfNode()}),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      classes: dart.definiteFunctionType(html$.CssClassSet, []),
      style: dart.definiteFunctionType(html$.CssStyleDeclarationBase, []),
      contentEdge: dart.definiteFunctionType(html$.CssRect, []),
      paddingEdge: dart.definiteFunctionType(html$.CssRect, []),
      borderEdge: dart.definiteFunctionType(html$.CssRect, []),
      marginEdge: dart.definiteFunctionType(html$.CssRect, []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), []),
      onAbort: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onBeforeCopy: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onBeforeCut: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onBeforePaste: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onBlur: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onCanPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onCanPlayThrough: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onClick: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onContextMenu: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onCopy: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      onCut: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      onDoubleClick: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onDrag: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onDragEnd: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onDragEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onDragLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onDragOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onDragStart: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onDrop: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onDurationChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onEmptied: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onEnded: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onFocus: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onInput: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onInvalid: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onKeyDown: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      onKeyPress: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      onKeyUp: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      onLoad: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onLoadedData: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onLoadedMetadata: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onMouseDown: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onMouseEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onMouseLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onMouseMove: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onMouseOut: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onMouseOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onMouseUp: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      onMouseWheel: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
      onPaste: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      onPause: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onPlaying: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onRateChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onReset: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onResize: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onScroll: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onSearch: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onSeeked: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onSeeking: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onSelect: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onSelectStart: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onStalled: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onSubmit: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onSuspend: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onTimeUpdate: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onTouchCancel: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      onTouchEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      onTouchEnter: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      onTouchLeave: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      onTouchMove: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      onTouchStart: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      onTransitionEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
      onVolumeChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onWaiting: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onFullscreenChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      onFullscreenError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
    }),
    setters: () => ({
      length: dart.definiteFunctionType(dart.void, [core.int]),
      classes: dart.definiteFunctionType(dart.void, [IterableOfString()])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(E, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, E])
    })
  });
  dart.defineExtensionMembers(_FrozenElementList, [
    '_get',
    '_set',
    'sort',
    'shuffle',
    'length',
    'length',
    'first',
    'last',
    'single'
  ]);
  return _FrozenElementList;
});
html$._FrozenElementList = _FrozenElementList();
html$._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
  static createElement_tag(tag, typeExtension) {
    if (typeExtension != null) {
      return document.createElement(tag, typeExtension);
    }
    return document.createElement(tag);
  }
};
dart.setSignature(html$._ElementFactoryProvider, {
  statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
  names: ['createElement_tag']
});
const _value$2 = Symbol('_value');
html$.ScrollAlignment = class ScrollAlignment extends core.Object {
  _internal(value) {
    this[_value$2] = value;
  }
  toString() {
    return dart.str`ScrollAlignment.${this[_value$2]}`;
  }
};
dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
dart.setSignature(html$.ScrollAlignment, {
  constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
  fields: () => ({[_value$2]: dart.dynamic}),
  sfields: () => ({
    TOP: html$.ScrollAlignment,
    CENTER: html$.ScrollAlignment,
    BOTTOM: html$.ScrollAlignment
  })
});
dart.defineLazy(html$.ScrollAlignment, {
  get TOP() {
    return dart.const(new html$.ScrollAlignment._internal('TOP'));
  },
  get CENTER() {
    return dart.const(new html$.ScrollAlignment._internal('CENTER'));
  },
  get BOTTOM() {
    return dart.const(new html$.ScrollAlignment._internal('BOTTOM'));
  }
});
const __setter__ = Symbol('__setter__');
dart.defineExtensionNames([
  'height',
  'name',
  'src',
  'type',
  'width'
]);
html$.EmbedElement = class EmbedElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.EmbedElement._check(html$.document[dartx.createElement]("embed"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.name] = null;
    this[dartx.src] = null;
    this[dartx.type] = null;
    this[dartx.width] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('embed');
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.EmbedElement, 'created');
dart.setSignature(html$.EmbedElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.EmbedElement, []),
    new: dart.definiteFunctionType(html$.EmbedElement, []),
    created: dart.definiteFunctionType(html$.EmbedElement, [])
  }),
  fields: () => ({
    [dartx.height]: core.String,
    [dartx.name]: core.String,
    [dartx.src]: core.String,
    [dartx.type]: core.String,
    [dartx.width]: core.String
  }),
  methods: () => ({
    [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLEmbedElement, html$.EmbedElement);
html$._EntriesCallback = dart.typedef('_EntriesCallback', () => dart.functionType(dart.void, [ListOfEntry()]));
html$._EntryCallback = dart.typedef('_EntryCallback', () => dart.functionType(dart.void, [html$.Entry]));
html$._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [html$.FileError]));
dart.defineExtensionNames([
  'colno',
  'error',
  'filename',
  'lineno',
  'message'
]);
html$.ErrorEvent = class ErrorEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ErrorEvent._create_1(type, eventInitDict_1);
    }
    return html$.ErrorEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.ErrorEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.ErrorEvent(type);
  }
  get [dartx.colno]() {
    return this.colno;
  }
  get [dartx.error]() {
    return this.error;
  }
  get [dartx.filename]() {
    return this.filename;
  }
  get [dartx.lineno]() {
    return this.lineno;
  }
  get [dartx.message]() {
    return this.message;
  }
};
dart.setSignature(html$.ErrorEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ErrorEvent, []),
    new: dart.definiteFunctionType(html$.ErrorEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.colno]: core.int,
    [dartx.error]: core.Object,
    [dartx.filename]: core.String,
    [dartx.lineno]: core.int,
    [dartx.message]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.ErrorEvent, html$.ErrorEvent);
dart.defineExtensionNames([
  'close',
  'onError',
  'onMessage',
  'onOpen',
  'readyState',
  'url',
  'withCredentials'
]);
html$.EventSource = class EventSource extends html$.EventTarget {
  static new(url, opts) {
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : false;
    let parsedOptions = dart.map({withCredentials: withCredentials}, core.String, dart.dynamic);
    return html$.EventSource._factoryEventSource(url, parsedOptions);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static _factoryEventSource(url, eventSourceInitDict) {
    if (eventSourceInitDict === void 0) eventSourceInitDict = null;
    if (eventSourceInitDict != null) {
      let eventSourceInitDict_1 = html_common.convertDartToNative_Dictionary(eventSourceInitDict);
      return html$.EventSource._create_1(url, eventSourceInitDict_1);
    }
    return html$.EventSource._create_2(url);
  }
  static _create_1(url, eventSourceInitDict) {
    return new self.EventSource(url, eventSourceInitDict);
  }
  static _create_2(url) {
    return new self.EventSource(url);
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.url]() {
    return this.url;
  }
  get [dartx.withCredentials]() {
    return this.withCredentials;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  get [dartx.onError]() {
    return html$.EventSource.errorEvent.forTarget(this);
  }
  get [dartx.onMessage]() {
    return html$.EventSource.messageEvent.forTarget(this);
  }
  get [dartx.onOpen]() {
    return html$.EventSource.openEvent.forTarget(this);
  }
};
dart.setSignature(html$.EventSource, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.EventSource, [core.String], {withCredentials: dart.dynamic}),
    _: dart.definiteFunctionType(html$.EventSource, [])
  }),
  fields: () => ({
    [dartx.readyState]: core.int,
    [dartx.url]: core.String,
    [dartx.withCredentials]: core.bool
  }),
  getters: () => ({
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
  sfields: () => ({
    errorEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent(),
    openEvent: EventStreamProviderOfEvent(),
    CLOSED: core.int,
    CONNECTING: core.int,
    OPEN: core.int
  }),
  statics: () => ({
    _factoryEventSource: dart.definiteFunctionType(html$.EventSource, [core.String], [core.Map]),
    _create_1: dart.definiteFunctionType(html$.EventSource, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.EventSource, [dart.dynamic])
  }),
  names: ['_factoryEventSource', '_create_1', '_create_2']
});
html$.EventSource.CLOSED = 2;
html$.EventSource.CONNECTING = 0;
html$.EventSource.OPEN = 1;
dart.defineLazy(html$.EventSource, {
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  },
  get openEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('open'));
  }
});
dart.registerExtension(dart.global.EventSource, html$.EventSource);
const _ptr = Symbol('_ptr');
html$.Events = class Events extends core.Object {
  new(ptr) {
    this[_ptr] = ptr;
  }
  _get(type) {
    return new (_EventStreamOfEvent())(this[_ptr], type, false);
  }
};
dart.setSignature(html$.Events, {
  constructors: () => ({new: dart.definiteFunctionType(html$.Events, [html$.EventTarget])}),
  fields: () => ({[_ptr]: html$.EventTarget}),
  methods: () => ({_get: dart.definiteFunctionType(async.Stream, [core.String])})
});
html$.ElementEvents = class ElementEvents extends html$.Events {
  new(ptr) {
    super.new(ptr);
  }
  _get(type) {
    if (dart.test(html$.ElementEvents.webkitEvents[dartx.keys][dartx.contains](type[dartx.toLowerCase]()))) {
      if (dart.test(html_common.Device.isWebKit)) {
        return new (_ElementEventStreamImplOfEvent())(this[_ptr], html$.ElementEvents.webkitEvents[dartx._get](type[dartx.toLowerCase]()), false);
      }
    }
    return new (_ElementEventStreamImplOfEvent())(this[_ptr], type, false);
  }
};
dart.setSignature(html$.ElementEvents, {
  constructors: () => ({new: dart.definiteFunctionType(html$.ElementEvents, [html$.Element])}),
  sfields: () => ({webkitEvents: MapOfString$String()})
});
dart.defineLazy(html$.ElementEvents, {
  get webkitEvents() {
    return dart.map({animationend: 'webkitAnimationEnd', animationiteration: 'webkitAnimationIteration', animationstart: 'webkitAnimationStart', fullscreenchange: 'webkitfullscreenchange', fullscreenerror: 'webkitfullscreenerror', keyadded: 'webkitkeyadded', keyerror: 'webkitkeyerror', keymessage: 'webkitkeymessage', needkey: 'webkitneedkey', pointerlockchange: 'webkitpointerlockchange', pointerlockerror: 'webkitpointerlockerror', resourcetimingbufferfull: 'webkitresourcetimingbufferfull', transitionend: 'webkitTransitionEnd', speechchange: 'webkitSpeechChange'}, core.String, core.String);
  }
});
dart.defineExtensionNames([
  'waitUntil'
]);
html$.ExtendableEvent = class ExtendableEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ExtendableEvent._create_1(type, eventInitDict_1);
    }
    return html$.ExtendableEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.ExtendableEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.ExtendableEvent(type);
  }
  [dartx.waitUntil](...args) {
    return this.waitUntil.apply(this, args);
  }
};
dart.setSignature(html$.ExtendableEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ExtendableEvent, []),
    new: dart.definiteFunctionType(html$.ExtendableEvent, [core.String], [core.Map])
  }),
  methods: () => ({[dartx.waitUntil]: dart.definiteFunctionType(dart.void, [core.Object])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.ExtendableEvent, html$.ExtendableEvent);
dart.defineExtensionNames([
  'protocol',
  'provider'
]);
html$.FederatedCredential = class FederatedCredential extends html$.Credential {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(data) {
    let data_1 = html_common.convertDartToNative_Dictionary(data);
    return html$.FederatedCredential._create_1(data_1);
  }
  static _create_1(data) {
    return new self.FederatedCredential(data);
  }
  get [dartx.protocol]() {
    return this.protocol;
  }
  get [dartx.provider]() {
    return this.provider;
  }
};
dart.setSignature(html$.FederatedCredential, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FederatedCredential, []),
    new: dart.definiteFunctionType(html$.FederatedCredential, [core.Map])
  }),
  fields: () => ({
    [dartx.protocol]: core.String,
    [dartx.provider]: core.String
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.FederatedCredential, [dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.FederatedCredential, html$.FederatedCredential);
dart.defineExtensionNames([
  'respondWith',
  'isReload',
  'request'
]);
html$.FetchEvent = class FetchEvent extends html$.ExtendableEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.FetchEvent._create_1(type, eventInitDict_1);
    }
    return html$.FetchEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.FetchEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.FetchEvent(type);
  }
  get [dartx.isReload]() {
    return this.isReload;
  }
  get [dartx.request]() {
    return this.request;
  }
  [dartx.respondWith](...args) {
    return this.respondWith.apply(this, args);
  }
};
dart.setSignature(html$.FetchEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FetchEvent, []),
    new: dart.definiteFunctionType(html$.FetchEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.isReload]: core.bool,
    [dartx.request]: html$._Request
  }),
  methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(dart.void, [core.Object])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.FetchEvent, html$.FetchEvent);
dart.defineExtensionNames([
  'checkValidity',
  'reportValidity',
  'setCustomValidity',
  'disabled',
  'elements',
  'form',
  'name',
  'type',
  'validationMessage',
  'validity',
  'willValidate'
]);
html$.FieldSetElement = class FieldSetElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.FieldSetElement._check(html$.document[dartx.createElement]("fieldset"));
  }
  created() {
    this[dartx.disabled] = null;
    this[dartx.elements] = null;
    this[dartx.form] = null;
    this[dartx.name] = null;
    this[dartx.type] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.willValidate] = null;
    super.created();
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.elements]() {
    return this.elements;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.FieldSetElement, 'created');
dart.setSignature(html$.FieldSetElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FieldSetElement, []),
    new: dart.definiteFunctionType(html$.FieldSetElement, []),
    created: dart.definiteFunctionType(html$.FieldSetElement, [])
  }),
  fields: () => ({
    [dartx.disabled]: core.bool,
    [dartx.elements]: html$.HtmlFormControlsCollection,
    [dartx.form]: html$.FormElement,
    [dartx.name]: core.String,
    [dartx.type]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.willValidate]: core.bool
  }),
  methods: () => ({
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
  })
});
dart.registerExtension(dart.global.HTMLFieldSetElement, html$.FieldSetElement);
const _get_lastModifiedDate = Symbol('_get_lastModifiedDate');
dart.defineExtensionNames([
  'lastModifiedDate',
  'lastModified',
  'name',
  'relativePath'
]);
html$.File = class File extends html$.Blob {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(fileBits, fileName, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.File._create_1(fileBits, fileName, options_1);
    }
    return html$.File._create_2(fileBits, fileName);
  }
  static _create_1(fileBits, fileName, options) {
    return new self.File(fileBits, fileName, options);
  }
  static _create_2(fileBits, fileName) {
    return new self.File(fileBits, fileName);
  }
  get [dartx.lastModified]() {
    return this.lastModified;
  }
  get [dartx.lastModifiedDate]() {
    return html_common.convertNativeToDart_DateTime(this[_get_lastModifiedDate]);
  }
  get [_get_lastModifiedDate]() {
    return this.lastModifiedDate;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.relativePath]() {
    return this.webkitRelativePath;
  }
};
dart.setSignature(html$.File, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.File, []),
    new: dart.definiteFunctionType(html$.File, [ListOfObject(), core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.lastModified]: core.int,
    [_get_lastModifiedDate]: dart.dynamic,
    [dartx.name]: core.String,
    [dartx.relativePath]: core.String
  }),
  getters: () => ({[dartx.lastModifiedDate]: dart.definiteFunctionType(core.DateTime, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.File, html$.File);
html$._FileCallback = dart.typedef('_FileCallback', () => dart.functionType(dart.void, [html$.File]));
const _createWriter = Symbol('_createWriter');
const _file$ = Symbol('_file');
dart.defineExtensionNames([
  'createWriter',
  'file'
]);
html$.FileEntry = class FileEntry extends html$.Entry {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [_createWriter](...args) {
    return this.createWriter.apply(this, args);
  }
  [dartx.createWriter]() {
    let completer = CompleterOfFileWriter().new();
    this[_createWriter](dart.fn(value => {
      completer.complete(value);
    }, FileWriterToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [_file$](...args) {
    return this.file.apply(this, args);
  }
  [dartx.file]() {
    let completer = CompleterOfFile$().new();
    this[_file$](dart.fn(value => {
      completer.complete(value);
    }, FileToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
};
dart.setSignature(html$.FileEntry, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FileEntry, [])}),
  methods: () => ({
    [_createWriter]: dart.definiteFunctionType(dart.void, [html$._FileWriterCallback], [html$._ErrorCallback]),
    [dartx.createWriter]: dart.definiteFunctionType(async.Future$(html$.FileWriter), []),
    [_file$]: dart.definiteFunctionType(dart.void, [html$._FileCallback], [html$._ErrorCallback]),
    [dartx.file]: dart.definiteFunctionType(async.Future$(html$.File), [])
  })
});
dart.registerExtension(dart.global.FileEntry, html$.FileEntry);
dart.defineExtensionNames([
  'code'
]);
html$.FileError = class FileError extends html$.DomError {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.code]() {
    return this.code;
  }
};
dart.setSignature(html$.FileError, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FileError, [])}),
  fields: () => ({[dartx.code]: core.int}),
  sfields: () => ({
    ABORT_ERR: core.int,
    ENCODING_ERR: core.int,
    INVALID_MODIFICATION_ERR: core.int,
    INVALID_STATE_ERR: core.int,
    NOT_FOUND_ERR: core.int,
    NOT_READABLE_ERR: core.int,
    NO_MODIFICATION_ALLOWED_ERR: core.int,
    PATH_EXISTS_ERR: core.int,
    QUOTA_EXCEEDED_ERR: core.int,
    SECURITY_ERR: core.int,
    SYNTAX_ERR: core.int,
    TYPE_MISMATCH_ERR: core.int
  })
});
html$.FileError.ABORT_ERR = 3;
html$.FileError.ENCODING_ERR = 5;
html$.FileError.INVALID_MODIFICATION_ERR = 9;
html$.FileError.INVALID_STATE_ERR = 7;
html$.FileError.NOT_FOUND_ERR = 1;
html$.FileError.NOT_READABLE_ERR = 4;
html$.FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
html$.FileError.PATH_EXISTS_ERR = 12;
html$.FileError.QUOTA_EXCEEDED_ERR = 10;
html$.FileError.SECURITY_ERR = 2;
html$.FileError.SYNTAX_ERR = 8;
html$.FileError.TYPE_MISMATCH_ERR = 11;
dart.registerExtension(dart.global.FileError, html$.FileError);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$.FileList = class FileList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.File), html$.ImmutableListMixin$(html$.File)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$.FileList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfFile()];
dart.setSignature(html$.FileList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FileList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.File, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.File]),
    [dartx.item]: dart.definiteFunctionType(html$.File, [core.int])
  })
});
dart.registerExtension(dart.global.FileList, html$.FileList);
dart.defineExtensionNames([
  'result',
  'abort',
  'readAsArrayBuffer',
  'readAsDataUrl',
  'readAsText',
  'onAbort',
  'onError',
  'onLoad',
  'onLoadEnd',
  'onLoadStart',
  'onProgress',
  'error',
  'readyState'
]);
html$.FileReader = class FileReader extends html$.EventTarget {
  get [dartx.result]() {
    let res = this.result;
    if (typed_data.ByteBuffer.is(res)) {
      return typed_data.Uint8List.view(res);
    }
    return res;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.FileReader._create_1();
  }
  static _create_1() {
    return new self.FileReader();
  }
  get [dartx.error]() {
    return this.error;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  [dartx.abort](...args) {
    return this.abort.apply(this, args);
  }
  [dartx.readAsArrayBuffer](...args) {
    return this.readAsArrayBuffer.apply(this, args);
  }
  [dartx.readAsDataUrl](...args) {
    return this.readAsDataURL.apply(this, args);
  }
  [dartx.readAsText](...args) {
    return this.readAsText.apply(this, args);
  }
  get [dartx.onAbort]() {
    return html$.FileReader.abortEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.FileReader.errorEvent.forTarget(this);
  }
  get [dartx.onLoad]() {
    return html$.FileReader.loadEvent.forTarget(this);
  }
  get [dartx.onLoadEnd]() {
    return html$.FileReader.loadEndEvent.forTarget(this);
  }
  get [dartx.onLoadStart]() {
    return html$.FileReader.loadStartEvent.forTarget(this);
  }
  get [dartx.onProgress]() {
    return html$.FileReader.progressEvent.forTarget(this);
  }
};
dart.setSignature(html$.FileReader, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FileReader, []),
    new: dart.definiteFunctionType(html$.FileReader, [])
  }),
  fields: () => ({
    [dartx.error]: html$.FileError,
    [dartx.readyState]: core.int
  }),
  getters: () => ({
    [dartx.result]: dart.definiteFunctionType(core.Object, []),
    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
  }),
  methods: () => ({
    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
    [dartx.readAsArrayBuffer]: dart.definiteFunctionType(dart.void, [html$.Blob]),
    [dartx.readAsDataUrl]: dart.definiteFunctionType(dart.void, [html$.Blob]),
    [dartx.readAsText]: dart.definiteFunctionType(dart.void, [html$.Blob], [core.String])
  }),
  sfields: () => ({
    abortEvent: EventStreamProviderOfProgressEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    loadEvent: EventStreamProviderOfProgressEvent(),
    loadEndEvent: EventStreamProviderOfProgressEvent(),
    loadStartEvent: EventStreamProviderOfProgressEvent(),
    progressEvent: EventStreamProviderOfProgressEvent(),
    DONE: core.int,
    EMPTY: core.int,
    LOADING: core.int
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.FileReader, [])}),
  names: ['_create_1']
});
html$.FileReader.DONE = 2;
html$.FileReader.EMPTY = 0;
html$.FileReader.LOADING = 1;
dart.defineLazy(html$.FileReader, {
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get loadEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
  },
  get loadEndEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
  },
  get loadStartEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
  },
  get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
  }
});
dart.registerExtension(dart.global.FileReader, html$.FileReader);
dart.defineExtensionNames([
  'type'
]);
html$.FileStream = class FileStream extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.FileStream, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FileStream, [])}),
  fields: () => ({[dartx.type]: core.String})
});
dart.registerExtension(dart.global.Stream, html$.FileStream);
dart.defineExtensionNames([
  'name',
  'root'
]);
html$.FileSystem = class FileSystem extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!window.webkitRequestFileSystem;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.root]() {
    return this.root;
  }
};
dart.setSignature(html$.FileSystem, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FileSystem, [])}),
  fields: () => ({
    [dartx.name]: core.String,
    [dartx.root]: html$.DirectoryEntry
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.DOMFileSystem, html$.FileSystem);
html$._FileSystemCallback = dart.typedef('_FileSystemCallback', () => dart.functionType(dart.void, [html$.FileSystem]));
dart.defineExtensionNames([
  'abort',
  'seek',
  'truncate',
  'write',
  'onAbort',
  'onError',
  'onProgress',
  'onWrite',
  'onWriteEnd',
  'onWriteStart',
  'error',
  'length',
  'position',
  'readyState'
]);
html$.FileWriter = class FileWriter extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.error]() {
    return this.error;
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.position]() {
    return this.position;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  [dartx.abort](...args) {
    return this.abort.apply(this, args);
  }
  [dartx.seek](...args) {
    return this.seek.apply(this, args);
  }
  [dartx.truncate](...args) {
    return this.truncate.apply(this, args);
  }
  [dartx.write](...args) {
    return this.write.apply(this, args);
  }
  get [dartx.onAbort]() {
    return html$.FileWriter.abortEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.FileWriter.errorEvent.forTarget(this);
  }
  get [dartx.onProgress]() {
    return html$.FileWriter.progressEvent.forTarget(this);
  }
  get [dartx.onWrite]() {
    return html$.FileWriter.writeEvent.forTarget(this);
  }
  get [dartx.onWriteEnd]() {
    return html$.FileWriter.writeEndEvent.forTarget(this);
  }
  get [dartx.onWriteStart]() {
    return html$.FileWriter.writeStartEvent.forTarget(this);
  }
};
dart.setSignature(html$.FileWriter, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FileWriter, [])}),
  fields: () => ({
    [dartx.error]: html$.FileError,
    [dartx.length]: core.int,
    [dartx.position]: core.int,
    [dartx.readyState]: core.int
  }),
  getters: () => ({
    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onWrite]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onWriteEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onWriteStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
  }),
  methods: () => ({
    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
    [dartx.seek]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.truncate]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.write]: dart.definiteFunctionType(dart.void, [html$.Blob])
  }),
  sfields: () => ({
    abortEvent: EventStreamProviderOfProgressEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    progressEvent: EventStreamProviderOfProgressEvent(),
    writeEvent: EventStreamProviderOfProgressEvent(),
    writeEndEvent: EventStreamProviderOfProgressEvent(),
    writeStartEvent: EventStreamProviderOfProgressEvent(),
    DONE: core.int,
    INIT: core.int,
    WRITING: core.int
  })
});
html$.FileWriter.DONE = 2;
html$.FileWriter.INIT = 0;
html$.FileWriter.WRITING = 1;
dart.defineLazy(html$.FileWriter, {
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
  },
  get writeEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('write'));
  },
  get writeEndEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('writeend'));
  },
  get writeStartEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('writestart'));
  }
});
dart.registerExtension(dart.global.FileWriter, html$.FileWriter);
html$._FileWriterCallback = dart.typedef('_FileWriterCallback', () => dart.functionType(dart.void, [html$.FileWriter]));
const _get_relatedTarget = Symbol('_get_relatedTarget');
dart.defineExtensionNames([
  'relatedTarget'
]);
html$.FocusEvent = class FocusEvent extends html$.UIEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.FocusEvent._create_1(type, eventInitDict_1);
    }
    return html$.FocusEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.FocusEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.FocusEvent(type);
  }
  get [dartx.relatedTarget]() {
    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
  }
  get [_get_relatedTarget]() {
    return this.relatedTarget;
  }
};
dart.setSignature(html$.FocusEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FocusEvent, []),
    new: dart.definiteFunctionType(html$.FocusEvent, [core.String], [core.Map])
  }),
  fields: () => ({[_get_relatedTarget]: dart.dynamic}),
  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.FocusEvent, html$.FocusEvent);
dart.defineExtensionNames([
  'load',
  'family',
  'featureSettings',
  'loaded',
  'status',
  'stretch',
  'style',
  'unicodeRange',
  'variant',
  'weight'
]);
html$.FontFace = class FontFace extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(family, source, descriptors) {
    if (descriptors === void 0) descriptors = null;
    if (descriptors != null) {
      let descriptors_1 = html_common.convertDartToNative_Dictionary(descriptors);
      return html$.FontFace._create_1(family, source, descriptors_1);
    }
    return html$.FontFace._create_2(family, source);
  }
  static _create_1(family, source, descriptors) {
    return new self.FontFace(family, source, descriptors);
  }
  static _create_2(family, source) {
    return new self.FontFace(family, source);
  }
  get [dartx.family]() {
    return this.family;
  }
  set [dartx.family](value) {
    this.family = value;
  }
  get [dartx.featureSettings]() {
    return this.featureSettings;
  }
  set [dartx.featureSettings](value) {
    this.featureSettings = value;
  }
  get [dartx.loaded]() {
    return this.loaded;
  }
  get [dartx.status]() {
    return this.status;
  }
  get [dartx.stretch]() {
    return this.stretch;
  }
  set [dartx.stretch](value) {
    this.stretch = value;
  }
  get [dartx.style]() {
    return this.style;
  }
  set [dartx.style](value) {
    this.style = value;
  }
  get [dartx.unicodeRange]() {
    return this.unicodeRange;
  }
  set [dartx.unicodeRange](value) {
    this.unicodeRange = value;
  }
  get [dartx.variant]() {
    return this.variant;
  }
  set [dartx.variant](value) {
    this.variant = value;
  }
  get [dartx.weight]() {
    return this.weight;
  }
  set [dartx.weight](value) {
    this.weight = value;
  }
  [dartx.load](...args) {
    return this.load.apply(this, args);
  }
};
dart.setSignature(html$.FontFace, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FontFace, []),
    new: dart.definiteFunctionType(html$.FontFace, [core.String, core.Object], [core.Map])
  }),
  fields: () => ({
    [dartx.family]: core.String,
    [dartx.featureSettings]: core.String,
    [dartx.loaded]: async.Future,
    [dartx.status]: core.String,
    [dartx.stretch]: core.String,
    [dartx.style]: core.String,
    [dartx.unicodeRange]: core.String,
    [dartx.variant]: core.String,
    [dartx.weight]: core.String
  }),
  methods: () => ({[dartx.load]: dart.definiteFunctionType(async.Future, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.FontFace, html$.FontFace);
dart.defineExtensionNames([
  'add',
  'check',
  'clear',
  'delete',
  'forEach',
  'has',
  'size',
  'status'
]);
html$.FontFaceSet = class FontFaceSet extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.size]() {
    return this.size;
  }
  get [dartx.status]() {
    return this.status;
  }
  [dartx.add](...args) {
    return this.add.apply(this, args);
  }
  [dartx.check](...args) {
    return this.check.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.delete](...args) {
    return this.delete.apply(this, args);
  }
  [dartx.forEach](...args) {
    return this.forEach.apply(this, args);
  }
  [dartx.has](...args) {
    return this.has.apply(this, args);
  }
};
dart.setSignature(html$.FontFaceSet, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSet, [])}),
  fields: () => ({
    [dartx.size]: core.int,
    [dartx.status]: core.String
  }),
  methods: () => ({
    [dartx.add]: dart.definiteFunctionType(dart.void, [html$.FontFace]),
    [dartx.check]: dart.definiteFunctionType(core.bool, [core.String], [core.String]),
    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
    [dartx.delete]: dart.definiteFunctionType(core.bool, [html$.FontFace]),
    [dartx.forEach]: dart.definiteFunctionType(dart.void, [html$.FontFaceSetForEachCallback], [core.Object]),
    [dartx.has]: dart.definiteFunctionType(core.bool, [html$.FontFace])
  })
});
dart.registerExtension(dart.global.FontFaceSet, html$.FontFaceSet);
html$.FontFaceSetForEachCallback = dart.typedef('FontFaceSetForEachCallback', () => dart.functionType(dart.void, [html$.FontFace, html$.FontFace, html$.FontFaceSet]));
dart.defineExtensionNames([
  'fontfaces'
]);
html$.FontFaceSetLoadEvent = class FontFaceSetLoadEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.fontfaces]() {
    return this.fontfaces;
  }
};
dart.setSignature(html$.FontFaceSetLoadEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSetLoadEvent, [])}),
  fields: () => ({[dartx.fontfaces]: ListOfFontFace()})
});
dart.registerExtension(dart.global.FontFaceSetLoadEvent, html$.FontFaceSetLoadEvent);
dart.defineExtensionNames([
  'append',
  'appendBlob',
  'delete',
  'get',
  'getAll',
  'has',
  'set'
]);
html$.FormData = class FormData extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(form) {
    if (form === void 0) form = null;
    if (form != null) {
      return html$.FormData._create_1(form);
    }
    return html$.FormData._create_2();
  }
  static _create_1(form) {
    return new self.FormData(form);
  }
  static _create_2() {
    return new self.FormData();
  }
  static get supported() {
    return !!window.FormData;
  }
  [dartx.append](...args) {
    return this.append.apply(this, args);
  }
  [dartx.appendBlob](...args) {
    return this.append.apply(this, args);
  }
  [dartx.delete](...args) {
    return this.delete.apply(this, args);
  }
  [dartx.get](...args) {
    return this.get.apply(this, args);
  }
  [dartx.getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [dartx.has](...args) {
    return this.has.apply(this, args);
  }
  [dartx.set](...args) {
    return this.set.apply(this, args);
  }
};
dart.setSignature(html$.FormData, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FormData, []),
    new: dart.definiteFunctionType(html$.FormData, [], [html$.FormElement])
  }),
  methods: () => ({
    [dartx.append]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.appendBlob]: dart.definiteFunctionType(dart.void, [core.String, html$.Blob], [core.String]),
    [dartx.delete]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.get]: dart.definiteFunctionType(core.Object, [core.String]),
    [dartx.getAll]: dart.definiteFunctionType(core.List$(core.Object), [core.String]),
    [dartx.has]: dart.definiteFunctionType(core.bool, [core.String]),
    [dartx.set]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic], [core.String])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.FormData, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.FormData, [])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.FormData, html$.FormData);
const _requestAutocomplete_1 = Symbol('_requestAutocomplete_1');
dart.defineExtensionNames([
  'checkValidity',
  'item',
  'reportValidity',
  'requestAutocomplete',
  'reset',
  'submit',
  'acceptCharset',
  'action',
  'autocomplete',
  'encoding',
  'enctype',
  'length',
  'method',
  'name',
  'noValidate',
  'target'
]);
html$.FormElement = class FormElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.FormElement._check(html$.document[dartx.createElement]("form"));
  }
  created() {
    this[dartx.acceptCharset] = null;
    this[dartx.action] = null;
    this[dartx.autocomplete] = null;
    this[dartx.encoding] = null;
    this[dartx.enctype] = null;
    this[dartx.length] = null;
    this[dartx.method] = null;
    this[dartx.name] = null;
    this[dartx.noValidate] = null;
    this[dartx.target] = null;
    super.created();
  }
  get [dartx.acceptCharset]() {
    return this.acceptCharset;
  }
  set [dartx.acceptCharset](value) {
    this.acceptCharset = value;
  }
  get [dartx.action]() {
    return this.action;
  }
  set [dartx.action](value) {
    this.action = value;
  }
  get [dartx.autocomplete]() {
    return this.autocomplete;
  }
  set [dartx.autocomplete](value) {
    this.autocomplete = value;
  }
  get [dartx.encoding]() {
    return this.encoding;
  }
  set [dartx.encoding](value) {
    this.encoding = value;
  }
  get [dartx.enctype]() {
    return this.enctype;
  }
  set [dartx.enctype](value) {
    this.enctype = value;
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.method]() {
    return this.method;
  }
  set [dartx.method](value) {
    this.method = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.noValidate]() {
    return this.noValidate;
  }
  set [dartx.noValidate](value) {
    this.noValidate = value;
  }
  get [dartx.target]() {
    return this.target;
  }
  set [dartx.target](value) {
    this.target = value;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.requestAutocomplete](details) {
    let details_1 = html_common.convertDartToNative_Dictionary(details);
    this[_requestAutocomplete_1](details_1);
    return;
  }
  [_requestAutocomplete_1](...args) {
    return this.requestAutocomplete.apply(this, args);
  }
  [dartx.reset](...args) {
    return this.reset.apply(this, args);
  }
  [dartx.submit](...args) {
    return this.submit.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.FormElement, 'created');
dart.setSignature(html$.FormElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.FormElement, []),
    new: dart.definiteFunctionType(html$.FormElement, []),
    created: dart.definiteFunctionType(html$.FormElement, [])
  }),
  fields: () => ({
    [dartx.acceptCharset]: core.String,
    [dartx.action]: core.String,
    [dartx.autocomplete]: core.String,
    [dartx.encoding]: core.String,
    [dartx.enctype]: core.String,
    [dartx.length]: core.int,
    [dartx.method]: core.String,
    [dartx.name]: core.String,
    [dartx.noValidate]: core.bool,
    [dartx.target]: core.String
  }),
  methods: () => ({
    [__getter__]: dart.definiteFunctionType(core.Object, [core.String]),
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.requestAutocomplete]: dart.definiteFunctionType(dart.void, [core.Map]),
    [_requestAutocomplete_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.reset]: dart.definiteFunctionType(dart.void, []),
    [dartx.submit]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.HTMLFormElement, html$.FormElement);
html$.FrameRequestCallback = dart.typedef('FrameRequestCallback', () => dart.functionType(dart.void, [core.num]));
dart.defineExtensionNames([
  'axes',
  'buttons',
  'connected',
  'id',
  'index',
  'mapping',
  'timestamp'
]);
html$.Gamepad = class Gamepad extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.axes]() {
    return this.axes;
  }
  get [dartx.buttons]() {
    return this.buttons;
  }
  get [dartx.connected]() {
    return this.connected;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.index]() {
    return this.index;
  }
  get [dartx.mapping]() {
    return this.mapping;
  }
  get [dartx.timestamp]() {
    return this.timestamp;
  }
};
dart.setSignature(html$.Gamepad, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Gamepad, [])}),
  fields: () => ({
    [dartx.axes]: ListOfnum(),
    [dartx.buttons]: ListOfGamepadButton(),
    [dartx.connected]: core.bool,
    [dartx.id]: core.String,
    [dartx.index]: core.int,
    [dartx.mapping]: core.String,
    [dartx.timestamp]: core.int
  })
});
dart.registerExtension(dart.global.Gamepad, html$.Gamepad);
dart.defineExtensionNames([
  'pressed',
  'value'
]);
html$.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.pressed]() {
    return this.pressed;
  }
  get [dartx.value]() {
    return this.value;
  }
};
dart.setSignature(html$.GamepadButton, {
  constructors: () => ({_: dart.definiteFunctionType(html$.GamepadButton, [])}),
  fields: () => ({
    [dartx.pressed]: core.bool,
    [dartx.value]: core.double
  })
});
dart.registerExtension(dart.global.GamepadButton, html$.GamepadButton);
dart.defineExtensionNames([
  'gamepad'
]);
html$.GamepadEvent = class GamepadEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.GamepadEvent._create_1(type, eventInitDict_1);
    }
    return html$.GamepadEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.GamepadEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.GamepadEvent(type);
  }
  get [dartx.gamepad]() {
    return this.gamepad;
  }
};
dart.setSignature(html$.GamepadEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.GamepadEvent, []),
    new: dart.definiteFunctionType(html$.GamepadEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.gamepad]: html$.Gamepad}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.GamepadEvent, html$.GamepadEvent);
dart.defineExtensionNames([
  'getRegisteredRegions',
  'registerRegion',
  'unregisterRegion'
]);
html$.Geofencing = class Geofencing extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getRegisteredRegions](...args) {
    return this.getRegisteredRegions.apply(this, args);
  }
  [dartx.registerRegion](...args) {
    return this.registerRegion.apply(this, args);
  }
  [dartx.unregisterRegion](...args) {
    return this.unregisterRegion.apply(this, args);
  }
};
dart.setSignature(html$.Geofencing, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Geofencing, [])}),
  methods: () => ({
    [dartx.getRegisteredRegions]: dart.definiteFunctionType(async.Future, []),
    [dartx.registerRegion]: dart.definiteFunctionType(async.Future, [html$.GeofencingRegion]),
    [dartx.unregisterRegion]: dart.definiteFunctionType(async.Future, [core.String])
  })
});
dart.registerExtension(dart.global.Geofencing, html$.Geofencing);
dart.defineExtensionNames([
  'id',
  'region'
]);
html$.GeofencingEvent = class GeofencingEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.region]() {
    return this.region;
  }
};
dart.setSignature(html$.GeofencingEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingEvent, [])}),
  fields: () => ({
    [dartx.id]: core.String,
    [dartx.region]: html$.GeofencingRegion
  })
});
dart.registerExtension(dart.global.GeofencingEvent, html$.GeofencingEvent);
const _getCurrentPosition = Symbol('_getCurrentPosition');
const _ensurePosition = Symbol('_ensurePosition');
const _watchPosition = Symbol('_watchPosition');
const _clearWatch = Symbol('_clearWatch');
const _getCurrentPosition_1 = Symbol('_getCurrentPosition_1');
const _getCurrentPosition_2 = Symbol('_getCurrentPosition_2');
const _getCurrentPosition_3 = Symbol('_getCurrentPosition_3');
const _watchPosition_1 = Symbol('_watchPosition_1');
const _watchPosition_2 = Symbol('_watchPosition_2');
const _watchPosition_3 = Symbol('_watchPosition_3');
dart.defineExtensionNames([
  'getCurrentPosition',
  'watchPosition'
]);
html$.Geolocation = class Geolocation extends _interceptors.Interceptor {
  [dartx.getCurrentPosition](opts) {
    let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
    let options = dart.map();
    if (enableHighAccuracy != null) {
      options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
    }
    if (timeout != null) {
      options[dartx._set]('timeout', timeout.inMilliseconds);
    }
    if (maximumAge != null) {
      options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
    }
    let completer = CompleterOfGeoposition().new();
    try {
      this[_getCurrentPosition](dart.fn(position => {
        completer.complete(this[_ensurePosition](position));
      }, GeopositionToNull()), dart.fn(error => {
        completer.completeError(error);
      }, PositionErrorToNull()), options);
    } catch (e) {
      let stacktrace = dart.stackTrace(e);
      completer.completeError(e, stacktrace);
    }

    return completer.future;
  }
  [dartx.watchPosition](opts) {
    let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
    let options = dart.map();
    if (enableHighAccuracy != null) {
      options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
    }
    if (timeout != null) {
      options[dartx._set]('timeout', timeout.inMilliseconds);
    }
    if (maximumAge != null) {
      options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
    }
    let watchId = null;
    let controller = null;
    controller = StreamControllerOfGeoposition().new({sync: true, onListen: dart.fn(() => {
        dart.assert(watchId == null);
        watchId = this[_watchPosition](dart.fn(position => {
          controller.add(this[_ensurePosition](position));
        }, GeopositionToNull()), dart.fn(error => {
          controller.addError(error);
        }, PositionErrorToNull()), options);
      }, VoidToNull()), onCancel: dart.fn(() => {
        dart.assert(watchId != null);
        this[_clearWatch](watchId);
      }, VoidToNull())});
    return controller.stream;
  }
  [_ensurePosition](domPosition) {
    try {
      if (html$.Geoposition.is(domPosition)) {
        return domPosition;
      }
    } catch (e) {
    }

    return new html$._GeopositionWrapper(domPosition);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [_clearWatch](...args) {
    return this.clearWatch.apply(this, args);
  }
  [_getCurrentPosition](successCallback, errorCallback, options) {
    if (errorCallback === void 0) errorCallback = null;
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[_getCurrentPosition_1](successCallback, errorCallback, options_1);
      return;
    }
    if (errorCallback != null) {
      this[_getCurrentPosition_2](successCallback, errorCallback);
      return;
    }
    this[_getCurrentPosition_3](successCallback);
    return;
  }
  [_getCurrentPosition_1](...args) {
    return this.getCurrentPosition.apply(this, args);
  }
  [_getCurrentPosition_2](...args) {
    return this.getCurrentPosition.apply(this, args);
  }
  [_getCurrentPosition_3](...args) {
    return this.getCurrentPosition.apply(this, args);
  }
  [_watchPosition](successCallback, errorCallback, options) {
    if (errorCallback === void 0) errorCallback = null;
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_watchPosition_1](successCallback, errorCallback, options_1);
    }
    if (errorCallback != null) {
      return this[_watchPosition_2](successCallback, errorCallback);
    }
    return this[_watchPosition_3](successCallback);
  }
  [_watchPosition_1](...args) {
    return this.watchPosition.apply(this, args);
  }
  [_watchPosition_2](...args) {
    return this.watchPosition.apply(this, args);
  }
  [_watchPosition_3](...args) {
    return this.watchPosition.apply(this, args);
  }
};
dart.setSignature(html$.Geolocation, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Geolocation, [])}),
  methods: () => ({
    [dartx.getCurrentPosition]: dart.definiteFunctionType(async.Future$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
    [dartx.watchPosition]: dart.definiteFunctionType(async.Stream$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
    [_ensurePosition]: dart.definiteFunctionType(html$.Geoposition, [dart.dynamic]),
    [_clearWatch]: dart.definiteFunctionType(dart.void, [core.int]),
    [_getCurrentPosition]: dart.definiteFunctionType(dart.void, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
    [_getCurrentPosition_1]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
    [_getCurrentPosition_2]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback]),
    [_getCurrentPosition_3]: dart.definiteFunctionType(dart.void, [html$._PositionCallback]),
    [_watchPosition]: dart.definiteFunctionType(core.int, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
    [_watchPosition_1]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
    [_watchPosition_2]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback]),
    [_watchPosition_3]: dart.definiteFunctionType(core.int, [html$._PositionCallback])
  })
});
dart.registerExtension(dart.global.Geolocation, html$.Geolocation);
html$._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
  new(ptr) {
    this[_ptr] = ptr;
  }
  get coords() {
    return this[_ptr].coords;
  }
  get timestamp() {
    return this[_ptr].timestamp;
  }
};
html$._GeopositionWrapper[dart.implements] = () => [html$.Geoposition];
dart.setSignature(html$._GeopositionWrapper, {
  constructors: () => ({new: dart.definiteFunctionType(html$._GeopositionWrapper, [dart.dynamic])}),
  fields: () => ({[_ptr]: dart.dynamic}),
  getters: () => ({
    coords: dart.definiteFunctionType(html$.Coordinates, []),
    timestamp: dart.definiteFunctionType(core.int, [])
  })
});
dart.defineExtensionNames([
  'coords',
  'timestamp'
]);
html$.Geoposition = class Geoposition extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.coords]() {
    return this.coords;
  }
  get [dartx.timestamp]() {
    return this.timestamp;
  }
};
dart.setSignature(html$.Geoposition, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Geoposition, [])}),
  fields: () => ({
    [dartx.coords]: html$.Coordinates,
    [dartx.timestamp]: core.int
  })
});
dart.registerExtension(dart.global.Geoposition, html$.Geoposition);
dart.defineExtensionNames([
  'onAbort',
  'onBlur',
  'onCanPlay',
  'onCanPlayThrough',
  'onChange',
  'onClick',
  'onContextMenu',
  'onDoubleClick',
  'onDrag',
  'onDragEnd',
  'onDragEnter',
  'onDragLeave',
  'onDragOver',
  'onDragStart',
  'onDrop',
  'onDurationChange',
  'onEmptied',
  'onEnded',
  'onError',
  'onFocus',
  'onInput',
  'onInvalid',
  'onKeyDown',
  'onKeyPress',
  'onKeyUp',
  'onLoad',
  'onLoadedData',
  'onLoadedMetadata',
  'onMouseDown',
  'onMouseEnter',
  'onMouseLeave',
  'onMouseMove',
  'onMouseOut',
  'onMouseOver',
  'onMouseUp',
  'onMouseWheel',
  'onPause',
  'onPlay',
  'onPlaying',
  'onRateChange',
  'onReset',
  'onResize',
  'onScroll',
  'onSeeked',
  'onSeeking',
  'onSelect',
  'onStalled',
  'onSubmit',
  'onSuspend',
  'onTimeUpdate',
  'onVolumeChange',
  'onWaiting'
]);
html$.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get onAbort() {
    return html$.GlobalEventHandlers.abortEvent.forTarget(this);
  }
  get onBlur() {
    return html$.GlobalEventHandlers.blurEvent.forTarget(this);
  }
  get onCanPlay() {
    return html$.GlobalEventHandlers.canPlayEvent.forTarget(this);
  }
  get onCanPlayThrough() {
    return html$.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
  }
  get onChange() {
    return html$.GlobalEventHandlers.changeEvent.forTarget(this);
  }
  get onClick() {
    return html$.GlobalEventHandlers.clickEvent.forTarget(this);
  }
  get onContextMenu() {
    return html$.GlobalEventHandlers.contextMenuEvent.forTarget(this);
  }
  get onDoubleClick() {
    return html$.GlobalEventHandlers.doubleClickEvent.forTarget(this);
  }
  get onDrag() {
    return html$.GlobalEventHandlers.dragEvent.forTarget(this);
  }
  get onDragEnd() {
    return html$.GlobalEventHandlers.dragEndEvent.forTarget(this);
  }
  get onDragEnter() {
    return html$.GlobalEventHandlers.dragEnterEvent.forTarget(this);
  }
  get onDragLeave() {
    return html$.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
  }
  get onDragOver() {
    return html$.GlobalEventHandlers.dragOverEvent.forTarget(this);
  }
  get onDragStart() {
    return html$.GlobalEventHandlers.dragStartEvent.forTarget(this);
  }
  get onDrop() {
    return html$.GlobalEventHandlers.dropEvent.forTarget(this);
  }
  get onDurationChange() {
    return html$.GlobalEventHandlers.durationChangeEvent.forTarget(this);
  }
  get onEmptied() {
    return html$.GlobalEventHandlers.emptiedEvent.forTarget(this);
  }
  get onEnded() {
    return html$.GlobalEventHandlers.endedEvent.forTarget(this);
  }
  get onError() {
    return html$.GlobalEventHandlers.errorEvent.forTarget(this);
  }
  get onFocus() {
    return html$.GlobalEventHandlers.focusEvent.forTarget(this);
  }
  get onInput() {
    return html$.GlobalEventHandlers.inputEvent.forTarget(this);
  }
  get onInvalid() {
    return html$.GlobalEventHandlers.invalidEvent.forTarget(this);
  }
  get onKeyDown() {
    return html$.GlobalEventHandlers.keyDownEvent.forTarget(this);
  }
  get onKeyPress() {
    return html$.GlobalEventHandlers.keyPressEvent.forTarget(this);
  }
  get onKeyUp() {
    return html$.GlobalEventHandlers.keyUpEvent.forTarget(this);
  }
  get onLoad() {
    return html$.GlobalEventHandlers.loadEvent.forTarget(this);
  }
  get onLoadedData() {
    return html$.GlobalEventHandlers.loadedDataEvent.forTarget(this);
  }
  get onLoadedMetadata() {
    return html$.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
  }
  get onMouseDown() {
    return html$.GlobalEventHandlers.mouseDownEvent.forTarget(this);
  }
  get onMouseEnter() {
    return html$.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
  }
  get onMouseLeave() {
    return html$.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
  }
  get onMouseMove() {
    return html$.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
  }
  get onMouseOut() {
    return html$.GlobalEventHandlers.mouseOutEvent.forTarget(this);
  }
  get onMouseOver() {
    return html$.GlobalEventHandlers.mouseOverEvent.forTarget(this);
  }
  get onMouseUp() {
    return html$.GlobalEventHandlers.mouseUpEvent.forTarget(this);
  }
  get onMouseWheel() {
    return html$.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
  }
  get onPause() {
    return html$.GlobalEventHandlers.pauseEvent.forTarget(this);
  }
  get onPlay() {
    return html$.GlobalEventHandlers.playEvent.forTarget(this);
  }
  get onPlaying() {
    return html$.GlobalEventHandlers.playingEvent.forTarget(this);
  }
  get onRateChange() {
    return html$.GlobalEventHandlers.rateChangeEvent.forTarget(this);
  }
  get onReset() {
    return html$.GlobalEventHandlers.resetEvent.forTarget(this);
  }
  get onResize() {
    return html$.GlobalEventHandlers.resizeEvent.forTarget(this);
  }
  get onScroll() {
    return html$.GlobalEventHandlers.scrollEvent.forTarget(this);
  }
  get onSeeked() {
    return html$.GlobalEventHandlers.seekedEvent.forTarget(this);
  }
  get onSeeking() {
    return html$.GlobalEventHandlers.seekingEvent.forTarget(this);
  }
  get onSelect() {
    return html$.GlobalEventHandlers.selectEvent.forTarget(this);
  }
  get onStalled() {
    return html$.GlobalEventHandlers.stalledEvent.forTarget(this);
  }
  get onSubmit() {
    return html$.GlobalEventHandlers.submitEvent.forTarget(this);
  }
  get onSuspend() {
    return html$.GlobalEventHandlers.suspendEvent.forTarget(this);
  }
  get onTimeUpdate() {
    return html$.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
  }
  get onVolumeChange() {
    return html$.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
  }
  get onWaiting() {
    return html$.GlobalEventHandlers.waitingEvent.forTarget(this);
  }
};
html$.GlobalEventHandlers[dart.implements] = () => [html$.EventTarget];
dart.setSignature(html$.GlobalEventHandlers, {
  constructors: () => ({_: dart.definiteFunctionType(html$.GlobalEventHandlers, [])}),
  getters: () => ({
    onAbort: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onBlur: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onCanPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onCanPlayThrough: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onClick: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onContextMenu: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDoubleClick: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onDrag: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDragEnd: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDragEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDragLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDragOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDragStart: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDrop: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onDurationChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onEmptied: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onEnded: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onError: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onFocus: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onInput: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onInvalid: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onKeyDown: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    onKeyPress: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    onKeyUp: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    onLoad: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onLoadedData: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onLoadedMetadata: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onMouseDown: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onMouseEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onMouseLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onMouseMove: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onMouseOut: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onMouseOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onMouseUp: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    onMouseWheel: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
    onPause: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onPlaying: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onRateChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onReset: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onResize: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onScroll: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onSeeked: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onSeeking: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onSelect: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onStalled: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onSubmit: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onSuspend: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onTimeUpdate: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onVolumeChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onWaiting: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  sfields: () => ({
    abortEvent: EventStreamProviderOfEvent(),
    blurEvent: EventStreamProviderOfEvent(),
    canPlayEvent: EventStreamProviderOfEvent(),
    canPlayThroughEvent: EventStreamProviderOfEvent(),
    changeEvent: EventStreamProviderOfEvent(),
    clickEvent: EventStreamProviderOfMouseEvent(),
    contextMenuEvent: EventStreamProviderOfMouseEvent(),
    doubleClickEvent: EventStreamProviderOfEvent(),
    dragEvent: EventStreamProviderOfMouseEvent(),
    dragEndEvent: EventStreamProviderOfMouseEvent(),
    dragEnterEvent: EventStreamProviderOfMouseEvent(),
    dragLeaveEvent: EventStreamProviderOfMouseEvent(),
    dragOverEvent: EventStreamProviderOfMouseEvent(),
    dragStartEvent: EventStreamProviderOfMouseEvent(),
    dropEvent: EventStreamProviderOfMouseEvent(),
    durationChangeEvent: EventStreamProviderOfEvent(),
    emptiedEvent: EventStreamProviderOfEvent(),
    endedEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    focusEvent: EventStreamProviderOfEvent(),
    inputEvent: EventStreamProviderOfEvent(),
    invalidEvent: EventStreamProviderOfEvent(),
    keyDownEvent: EventStreamProviderOfKeyboardEvent(),
    keyPressEvent: EventStreamProviderOfKeyboardEvent(),
    keyUpEvent: EventStreamProviderOfKeyboardEvent(),
    loadEvent: EventStreamProviderOfEvent(),
    loadedDataEvent: EventStreamProviderOfEvent(),
    loadedMetadataEvent: EventStreamProviderOfEvent(),
    mouseDownEvent: EventStreamProviderOfMouseEvent(),
    mouseEnterEvent: EventStreamProviderOfMouseEvent(),
    mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
    mouseMoveEvent: EventStreamProviderOfMouseEvent(),
    mouseOutEvent: EventStreamProviderOfMouseEvent(),
    mouseOverEvent: EventStreamProviderOfMouseEvent(),
    mouseUpEvent: EventStreamProviderOfMouseEvent(),
    mouseWheelEvent: EventStreamProviderOfWheelEvent(),
    pauseEvent: EventStreamProviderOfEvent(),
    playEvent: EventStreamProviderOfEvent(),
    playingEvent: EventStreamProviderOfEvent(),
    rateChangeEvent: EventStreamProviderOfEvent(),
    resetEvent: EventStreamProviderOfEvent(),
    resizeEvent: EventStreamProviderOfEvent(),
    scrollEvent: EventStreamProviderOfEvent(),
    seekedEvent: EventStreamProviderOfEvent(),
    seekingEvent: EventStreamProviderOfEvent(),
    selectEvent: EventStreamProviderOfEvent(),
    stalledEvent: EventStreamProviderOfEvent(),
    submitEvent: EventStreamProviderOfEvent(),
    suspendEvent: EventStreamProviderOfEvent(),
    timeUpdateEvent: EventStreamProviderOfEvent(),
    volumeChangeEvent: EventStreamProviderOfEvent(),
    waitingEvent: EventStreamProviderOfEvent()
  })
});
dart.defineExtensionMembers(html$.GlobalEventHandlers, [
  'onAbort',
  'onBlur',
  'onCanPlay',
  'onCanPlayThrough',
  'onChange',
  'onClick',
  'onContextMenu',
  'onDoubleClick',
  'onDrag',
  'onDragEnd',
  'onDragEnter',
  'onDragLeave',
  'onDragOver',
  'onDragStart',
  'onDrop',
  'onDurationChange',
  'onEmptied',
  'onEnded',
  'onError',
  'onFocus',
  'onInput',
  'onInvalid',
  'onKeyDown',
  'onKeyPress',
  'onKeyUp',
  'onLoad',
  'onLoadedData',
  'onLoadedMetadata',
  'onMouseDown',
  'onMouseEnter',
  'onMouseLeave',
  'onMouseMove',
  'onMouseOut',
  'onMouseOver',
  'onMouseUp',
  'onMouseWheel',
  'onPause',
  'onPlay',
  'onPlaying',
  'onRateChange',
  'onReset',
  'onResize',
  'onScroll',
  'onSeeked',
  'onSeeking',
  'onSelect',
  'onStalled',
  'onSubmit',
  'onSuspend',
  'onTimeUpdate',
  'onVolumeChange',
  'onWaiting'
]);
dart.defineLazy(html$.GlobalEventHandlers, {
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('abort'));
  },
  get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('blur'));
  },
  get canPlayEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('canplay'));
  },
  get canPlayThroughEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
  },
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  },
  get clickEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
  },
  get contextMenuEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
  },
  get doubleClickEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
  },
  get dragEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
  },
  get dragEndEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
  },
  get dragEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
  },
  get dragLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
  },
  get dragOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
  },
  get dragStartEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
  },
  get dropEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
  },
  get durationChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
  },
  get emptiedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('emptied'));
  },
  get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ended'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('focus'));
  },
  get inputEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('input'));
  },
  get invalidEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('invalid'));
  },
  get keyDownEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
  },
  get keyPressEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
  },
  get keyUpEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
  },
  get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('load'));
  },
  get loadedDataEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
  },
  get loadedMetadataEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
  },
  get mouseDownEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
  },
  get mouseEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
  },
  get mouseLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
  },
  get mouseMoveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
  },
  get mouseOutEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
  },
  get mouseOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
  },
  get mouseUpEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
  },
  get mouseWheelEvent() {
    return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
  },
  get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pause'));
  },
  get playEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('play'));
  },
  get playingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('playing'));
  },
  get rateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
  },
  get resetEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('reset'));
  },
  get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('resize'));
  },
  get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
  },
  get seekedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('seeked'));
  },
  get seekingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('seeking'));
  },
  get selectEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('select'));
  },
  get stalledEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('stalled'));
  },
  get submitEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('submit'));
  },
  get suspendEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('suspend'));
  },
  get timeUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
  },
  get volumeChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
  },
  get waitingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('waiting'));
  }
});
dart.defineExtensionNames([
  'color'
]);
html$.HRElement = class HRElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.HRElement._check(html$.document[dartx.createElement]("hr"));
  }
  created() {
    this[dartx.color] = null;
    super.created();
  }
  get [dartx.color]() {
    return this.color;
  }
  set [dartx.color](value) {
    this.color = value;
  }
};
dart.defineNamedConstructor(html$.HRElement, 'created');
dart.setSignature(html$.HRElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.HRElement, []),
    new: dart.definiteFunctionType(html$.HRElement, []),
    created: dart.definiteFunctionType(html$.HRElement, [])
  }),
  fields: () => ({[dartx.color]: core.String})
});
dart.registerExtension(dart.global.HTMLHRElement, html$.HRElement);
const _initHashChangeEvent = Symbol('_initHashChangeEvent');
dart.defineExtensionNames([
  'newUrl',
  'oldUrl'
]);
html$.HashChangeEvent = class HashChangeEvent extends html$.Event {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let oldUrl = opts && 'oldUrl' in opts ? opts.oldUrl : null;
    let newUrl = opts && 'newUrl' in opts ? opts.newUrl : null;
    let options = dart.map({canBubble: canBubble, cancelable: cancelable, oldURL: oldUrl, newURL: newUrl}, core.String, core.Object);
    return new self.HashChangeEvent(type, html_common.convertDartToNative_Dictionary(options));
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.HashChangeEvent._create_1(type, eventInitDict_1);
    }
    return html$.HashChangeEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.HashChangeEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.HashChangeEvent(type);
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported('HashChangeEvent');
  }
  get [dartx.newUrl]() {
    return this.newURL;
  }
  get [dartx.oldUrl]() {
    return this.oldURL;
  }
  [_initHashChangeEvent](...args) {
    return this.initHashChangeEvent.apply(this, args);
  }
};
dart.setSignature(html$.HashChangeEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, oldUrl: core.String, newUrl: core.String}),
    _: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.newUrl]: core.String,
    [dartx.oldUrl]: core.String
  }),
  methods: () => ({[_initHashChangeEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.HashChangeEvent, html$.HashChangeEvent);
html$.HeadElement = class HeadElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.HeadElement._check(html$.document[dartx.createElement]("head"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.HeadElement, 'created');
dart.setSignature(html$.HeadElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.HeadElement, []),
    new: dart.definiteFunctionType(html$.HeadElement, []),
    created: dart.definiteFunctionType(html$.HeadElement, [])
  })
});
dart.registerExtension(dart.global.HTMLHeadElement, html$.HeadElement);
html$.Headers = class Headers extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(input) {
    if (input === void 0) input = null;
    if (input == null) {
      return html$.Headers._create_1();
    }
    if (html$.Headers.is(input)) {
      return html$.Headers._create_2(input);
    }
    if (core.Map.is(input)) {
      let input_1 = html_common.convertDartToNative_Dictionary(input);
      return html$.Headers._create_3(input_1);
    }
    if (ListOfObject().is(input)) {
      return html$.Headers._create_4(input);
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  static _create_1() {
    return new self.Headers();
  }
  static _create_2(input) {
    return new self.Headers(input);
  }
  static _create_3(input) {
    return new self.Headers(input);
  }
  static _create_4(input) {
    return new self.Headers(input);
  }
};
dart.setSignature(html$.Headers, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.Headers, []),
    new: dart.definiteFunctionType(html$.Headers, [], [dart.dynamic])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.Headers, []),
    _create_2: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
    _create_4: dart.definiteFunctionType(html$.Headers, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_3', '_create_4']
});
dart.registerExtension(dart.global.Headers, html$.Headers);
html$.HeadingElement = class HeadingElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static h1() {
    return html$.HeadingElement._check(html$.document[dartx.createElement]("h1"));
  }
  static h2() {
    return html$.HeadingElement._check(html$.document[dartx.createElement]("h2"));
  }
  static h3() {
    return html$.HeadingElement._check(html$.document[dartx.createElement]("h3"));
  }
  static h4() {
    return html$.HeadingElement._check(html$.document[dartx.createElement]("h4"));
  }
  static h5() {
    return html$.HeadingElement._check(html$.document[dartx.createElement]("h5"));
  }
  static h6() {
    return html$.HeadingElement._check(html$.document[dartx.createElement]("h6"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.HeadingElement, 'created');
dart.setSignature(html$.HeadingElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.HeadingElement, []),
    h1: dart.definiteFunctionType(html$.HeadingElement, []),
    h2: dart.definiteFunctionType(html$.HeadingElement, []),
    h3: dart.definiteFunctionType(html$.HeadingElement, []),
    h4: dart.definiteFunctionType(html$.HeadingElement, []),
    h5: dart.definiteFunctionType(html$.HeadingElement, []),
    h6: dart.definiteFunctionType(html$.HeadingElement, []),
    created: dart.definiteFunctionType(html$.HeadingElement, [])
  })
});
dart.registerExtension(dart.global.HTMLHeadingElement, html$.HeadingElement);
const _get_options = Symbol('_get_options');
const _get_state = Symbol('_get_state');
const _pushState_1 = Symbol('_pushState_1');
const _pushState_2 = Symbol('_pushState_2');
const _replaceState_1 = Symbol('_replaceState_1');
const _replaceState_2 = Symbol('_replaceState_2');
dart.defineExtensionNames([
  'options',
  'state',
  'back',
  'forward',
  'go',
  'pushState',
  'replaceState',
  'length'
]);
html$.History = class History extends _interceptors.Interceptor {
  static get supportsState() {
    return !!window.history.pushState;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.options]() {
    return html_common.convertNativeToDart_Dictionary(this[_get_options]);
  }
  get [_get_options]() {
    return this.options;
  }
  get [dartx.state]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
  }
  get [_get_state]() {
    return this.state;
  }
  [dartx.back](...args) {
    return this.back.apply(this, args);
  }
  [dartx.forward](...args) {
    return this.forward.apply(this, args);
  }
  [dartx.go](...args) {
    return this.go.apply(this, args);
  }
  [dartx.pushState](data, title, url, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
      let options_2 = html_common.convertDartToNative_Dictionary(options);
      this[_pushState_1](data_1, title, url, options_2);
      return;
    }
    let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
    this[_pushState_2](data_1, title, url);
    return;
  }
  [_pushState_1](...args) {
    return this.pushState.apply(this, args);
  }
  [_pushState_2](...args) {
    return this.pushState.apply(this, args);
  }
  [dartx.replaceState](data, title, url, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
      let options_2 = html_common.convertDartToNative_Dictionary(options);
      this[_replaceState_1](data_1, title, url, options_2);
      return;
    }
    let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
    this[_replaceState_2](data_1, title, url);
    return;
  }
  [_replaceState_1](...args) {
    return this.replaceState.apply(this, args);
  }
  [_replaceState_2](...args) {
    return this.replaceState.apply(this, args);
  }
};
html$.History[dart.implements] = () => [html$.HistoryBase];
dart.setSignature(html$.History, {
  constructors: () => ({_: dart.definiteFunctionType(html$.History, [])}),
  fields: () => ({
    [dartx.length]: core.int,
    [_get_options]: dart.dynamic,
    [_get_state]: dart.dynamic
  }),
  getters: () => ({
    [dartx.options]: dart.definiteFunctionType(core.Map, []),
    [dartx.state]: dart.definiteFunctionType(dart.dynamic, [])
  }),
  methods: () => ({
    [dartx.back]: dart.definiteFunctionType(dart.void, []),
    [dartx.forward]: dart.definiteFunctionType(dart.void, []),
    [dartx.go]: dart.definiteFunctionType(dart.void, [], [core.int]),
    [dartx.pushState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
    [_pushState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [_pushState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
    [dartx.replaceState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
    [_replaceState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [_replaceState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  sgetters: () => ({supportsState: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.History, html$.History);
dart.defineExtensionNames([
  'deviceId',
  'deviceName',
  'hardwareUnitId'
]);
html$.VRDevice = class VRDevice extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.deviceId]() {
    return this.deviceId;
  }
  get [dartx.deviceName]() {
    return this.deviceName;
  }
  get [dartx.hardwareUnitId]() {
    return this.hardwareUnitId;
  }
};
dart.setSignature(html$.VRDevice, {
  constructors: () => ({_: dart.definiteFunctionType(html$.VRDevice, [])}),
  fields: () => ({
    [dartx.deviceId]: core.String,
    [dartx.deviceName]: core.String,
    [dartx.hardwareUnitId]: core.String
  })
});
dart.registerExtension(dart.global.VRDevice, html$.VRDevice);
dart.defineExtensionNames([
  'getEyeParameters',
  'setFieldOfView'
]);
html$.HmdvrDevice = class HmdvrDevice extends html$.VRDevice {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getEyeParameters](...args) {
    return this.getEyeParameters.apply(this, args);
  }
  [dartx.setFieldOfView](...args) {
    return this.setFieldOfView.apply(this, args);
  }
};
dart.setSignature(html$.HmdvrDevice, {
  constructors: () => ({_: dart.definiteFunctionType(html$.HmdvrDevice, [])}),
  methods: () => ({
    [dartx.getEyeParameters]: dart.definiteFunctionType(html$.VREyeParameters, [core.String]),
    [dartx.setFieldOfView]: dart.definiteFunctionType(dart.void, [], [html$.VRFieldOfView, html$.VRFieldOfView])
  })
});
dart.registerExtension(dart.global.HMDVRDevice, html$.HmdvrDevice);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item',
  'namedItem'
]);
html$.HtmlCollection = class HtmlCollection extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
html$.HtmlCollection[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
dart.setSignature(html$.HtmlCollection, {
  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlCollection, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
    [dartx.item]: dart.definiteFunctionType(html$.Node, [core.int]),
    [dartx.namedItem]: dart.definiteFunctionType(core.Object, [core.String])
  })
});
dart.registerExtension(dart.global.HTMLCollection, html$.HtmlCollection);
dart.defineExtensionNames([
  'caretRangeFromPoint',
  'elementFromPoint',
  'getCssCanvasContext',
  'head',
  'lastModified',
  'preferredStylesheetSet',
  'referrer',
  'selectedStylesheetSet',
  'selectedStylesheetSet',
  'styleSheets',
  'title',
  'title',
  'exitFullscreen',
  'registerElement',
  'register',
  'onVisibilityChange',
  'createElementUpgrader',
  'body'
]);
html$.HtmlDocument = class HtmlDocument extends html$.Document {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.body]() {
    return this.body;
  }
  set [dartx.body](value) {
    this.body = value;
  }
  [dartx.caretRangeFromPoint](x, y) {
    return this[_caretRangeFromPoint](x, y);
  }
  [dartx.elementFromPoint](x, y) {
    return this[_elementFromPoint](x, y);
  }
  static get supportsCssCanvasContext() {
    return !!document.getCSSCanvasContext;
  }
  [dartx.getCssCanvasContext](contextId, name, width, height) {
    return html$.CanvasRenderingContext._check(this[_getCssCanvasContext](contextId, name, width, height));
  }
  get [dartx.head]() {
    return this[_head$0];
  }
  get [dartx.lastModified]() {
    return this[_lastModified];
  }
  get [dartx.preferredStylesheetSet]() {
    return this[_preferredStylesheetSet];
  }
  get [dartx.referrer]() {
    return this[_referrer];
  }
  get [dartx.selectedStylesheetSet]() {
    return this[_selectedStylesheetSet];
  }
  set [dartx.selectedStylesheetSet](value) {
    this[_selectedStylesheetSet] = value;
  }
  get [dartx.styleSheets]() {
    return this[_styleSheets];
  }
  get [dartx.title]() {
    return this[_title];
  }
  set [dartx.title](value) {
    this[_title] = value;
  }
  [dartx.exitFullscreen]() {
    this[_webkitExitFullscreen]();
  }
  [dartx.registerElement](tag, customElementClass, opts) {
    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
    html$._registerCustomElement(window, this, tag, customElementClass, extendsTag);
  }
  [dartx.register](tag, customElementClass, opts) {
    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
    return this[dartx.registerElement](tag, customElementClass, {extendsTag: extendsTag});
  }
  static _determineVisibilityChangeEventType(e) {
    if (typeof e.hidden !== "undefined") {
      return 'visibilitychange';
    } else if (typeof e.mozHidden !== "undefined") {
      return 'mozvisibilitychange';
    } else if (typeof e.msHidden !== "undefined") {
      return 'msvisibilitychange';
    } else if (typeof e.webkitHidden !== "undefined") {
      return 'webkitvisibilitychange';
    }
    return 'visibilitychange';
  }
  get [dartx.onVisibilityChange]() {
    return html$.HtmlDocument.visibilityChangeEvent.forTarget(this);
  }
  [dartx.createElementUpgrader](type, opts) {
    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
    return new html$._JSElementUpgrader(this, type, extendsTag);
  }
};
dart.setSignature(html$.HtmlDocument, {
  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlDocument, [])}),
  fields: () => ({[dartx.body]: html$.BodyElement}),
  getters: () => ({
    [dartx.head]: dart.definiteFunctionType(html$.HeadElement, []),
    [dartx.lastModified]: dart.definiteFunctionType(core.String, []),
    [dartx.preferredStylesheetSet]: dart.definiteFunctionType(core.String, []),
    [dartx.referrer]: dart.definiteFunctionType(core.String, []),
    [dartx.selectedStylesheetSet]: dart.definiteFunctionType(core.String, []),
    [dartx.styleSheets]: dart.definiteFunctionType(core.List$(html$.StyleSheet), []),
    [dartx.title]: dart.definiteFunctionType(core.String, []),
    [dartx.onVisibilityChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  setters: () => ({
    [dartx.selectedStylesheetSet]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.title]: dart.definiteFunctionType(dart.void, [core.String])
  }),
  methods: () => ({
    [dartx.caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
    [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
    [dartx.getCssCanvasContext]: dart.definiteFunctionType(html$.CanvasRenderingContext, [core.String, core.String, core.int, core.int]),
    [dartx.registerElement]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
    [dartx.register]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
    [dartx.createElementUpgrader]: dart.definiteFunctionType(html$.ElementUpgrader, [core.Type], {extendsTag: core.String})
  }),
  sfields: () => ({visibilityChangeEvent: EventStreamProviderOfEvent()}),
  sgetters: () => ({supportsCssCanvasContext: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({_determineVisibilityChangeEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])}),
  names: ['_determineVisibilityChangeEventType']
});
dart.defineLazy(html$.HtmlDocument, {
  get visibilityChangeEvent() {
    return dart.const(new (_CustomEventStreamProviderOfEvent())(html$.HtmlDocument._determineVisibilityChangeEventType));
  }
});
dart.registerExtension(dart.global.HTMLDocument, html$.HtmlDocument);
dart.defineExtensionNames([
  'item',
  'namedItem'
]);
html$.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html$.HtmlCollection {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
dart.setSignature(html$.HtmlFormControlsCollection, {
  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlFormControlsCollection, [])})
});
dart.registerExtension(dart.global.HTMLFormControlsCollection, html$.HtmlFormControlsCollection);
html$.HtmlHtmlElement = class HtmlHtmlElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.HtmlHtmlElement._check(html$.document[dartx.createElement]("html"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.HtmlHtmlElement, 'created');
dart.setSignature(html$.HtmlHtmlElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
    new: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
    created: dart.definiteFunctionType(html$.HtmlHtmlElement, [])
  })
});
dart.registerExtension(dart.global.HTMLHtmlElement, html$.HtmlHtmlElement);
const _item = Symbol('_item');
html$.HtmlOptionsCollection = class HtmlOptionsCollection extends html$.HtmlCollection {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [_item](...args) {
    return this.item.apply(this, args);
  }
};
dart.setSignature(html$.HtmlOptionsCollection, {
  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlOptionsCollection, [])}),
  methods: () => ({[_item]: dart.definiteFunctionType(html$.Node, [core.int])})
});
dart.registerExtension(dart.global.HTMLOptionsCollection, html$.HtmlOptionsCollection);
const _get_response = Symbol('_get_response');
dart.defineExtensionNames([
  'onAbort',
  'onError',
  'onLoad',
  'onLoadEnd',
  'onLoadStart',
  'onProgress',
  'onTimeout'
]);
html$.HttpRequestEventTarget = class HttpRequestEventTarget extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.onAbort]() {
    return html$.HttpRequestEventTarget.abortEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.HttpRequestEventTarget.errorEvent.forTarget(this);
  }
  get [dartx.onLoad]() {
    return html$.HttpRequestEventTarget.loadEvent.forTarget(this);
  }
  get [dartx.onLoadEnd]() {
    return html$.HttpRequestEventTarget.loadEndEvent.forTarget(this);
  }
  get [dartx.onLoadStart]() {
    return html$.HttpRequestEventTarget.loadStartEvent.forTarget(this);
  }
  get [dartx.onProgress]() {
    return html$.HttpRequestEventTarget.progressEvent.forTarget(this);
  }
  get [dartx.onTimeout]() {
    return html$.HttpRequestEventTarget.timeoutEvent.forTarget(this);
  }
};
dart.setSignature(html$.HttpRequestEventTarget, {
  constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestEventTarget, [])}),
  getters: () => ({
    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
    [dartx.onTimeout]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
  }),
  sfields: () => ({
    abortEvent: EventStreamProviderOfProgressEvent(),
    errorEvent: EventStreamProviderOfProgressEvent(),
    loadEvent: EventStreamProviderOfProgressEvent(),
    loadEndEvent: EventStreamProviderOfProgressEvent(),
    loadStartEvent: EventStreamProviderOfProgressEvent(),
    progressEvent: EventStreamProviderOfProgressEvent(),
    timeoutEvent: EventStreamProviderOfProgressEvent()
  })
});
dart.defineLazy(html$.HttpRequestEventTarget, {
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('error'));
  },
  get loadEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
  },
  get loadEndEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
  },
  get loadStartEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
  },
  get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
  },
  get timeoutEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('timeout'));
  }
});
dart.registerExtension(dart.global.XMLHttpRequestEventTarget, html$.HttpRequestEventTarget);
dart.defineExtensionNames([
  'responseHeaders',
  'open',
  'response',
  'abort',
  'getAllResponseHeaders',
  'getResponseHeader',
  'overrideMimeType',
  'send',
  'setRequestHeader',
  'onReadyStateChange',
  'readyState',
  'responseText',
  'responseType',
  'responseUrl',
  'responseXml',
  'status',
  'statusText',
  'timeout',
  'upload',
  'withCredentials'
]);
html$.HttpRequest = class HttpRequest extends html$.HttpRequestEventTarget {
  static getString(url, opts) {
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
    return html$.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
  }
  static postFormData(url, data, opts) {
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
    let responseType = opts && 'responseType' in opts ? opts.responseType : null;
    let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
    let parts = [];
    data[dartx.forEach](dart.fn((key, value) => {
      parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
    }, StringAndStringToNull()));
    let formData = parts[dartx.join]('&');
    if (requestHeaders == null) {
      requestHeaders = dart.map({}, core.String, core.String);
    }
    requestHeaders[dartx.putIfAbsent]('Content-Type', dart.fn(() => 'application/x-www-form-urlencoded; charset=UTF-8', VoidToString$()));
    return html$.HttpRequest.request(url, {method: 'POST', withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
  }
  static request(url, opts) {
    let method = opts && 'method' in opts ? opts.method : null;
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
    let responseType = opts && 'responseType' in opts ? opts.responseType : null;
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
    let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
    let sendData = opts && 'sendData' in opts ? opts.sendData : null;
    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
    let completer = CompleterOfHttpRequest().new();
    let xhr = html$.HttpRequest.new();
    if (method == null) {
      method = 'GET';
    }
    xhr[dartx.open](method, url, {async: true});
    if (withCredentials != null) {
      xhr[dartx.withCredentials] = withCredentials;
    }
    if (responseType != null) {
      xhr[dartx.responseType] = responseType;
    }
    if (mimeType != null) {
      xhr[dartx.overrideMimeType](mimeType);
    }
    if (requestHeaders != null) {
      requestHeaders[dartx.forEach](dart.fn((header, value) => {
        xhr[dartx.setRequestHeader](header, value);
      }, StringAndStringToNull()));
    }
    if (onProgress != null) {
      xhr[dartx.onProgress].listen(onProgress);
    }
    xhr[dartx.onLoad].listen(dart.fn(e => {
      let accepted = dart.notNull(xhr[dartx.status]) >= 200 && dart.notNull(xhr[dartx.status]) < 300;
      let fileUri = xhr[dartx.status] == 0;
      let notModified = xhr[dartx.status] == 304;
      let unknownRedirect = dart.notNull(xhr[dartx.status]) > 307 && dart.notNull(xhr[dartx.status]) < 400;
      if (accepted || fileUri || notModified || unknownRedirect) {
        completer.complete(xhr);
      } else {
        completer.completeError(e);
      }
    }, ProgressEventToNull()));
    xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
    if (sendData != null) {
      xhr[dartx.send](sendData);
    } else {
      xhr[dartx.send]();
    }
    return completer.future;
  }
  static get supportsProgressEvent() {
    let xhr = html$.HttpRequest.new();
    return "onprogress" in xhr;
  }
  static get supportsCrossOrigin() {
    let xhr = html$.HttpRequest.new();
    return "withCredentials" in xhr;
  }
  static get supportsLoadEndEvent() {
    let xhr = html$.HttpRequest.new();
    return "onloadend" in xhr;
  }
  static get supportsOverrideMimeType() {
    let xhr = html$.HttpRequest.new();
    return "overrideMimeType" in xhr;
  }
  static requestCrossOrigin(url, opts) {
    let method = opts && 'method' in opts ? opts.method : null;
    let sendData = opts && 'sendData' in opts ? opts.sendData : null;
    if (dart.test(html$.HttpRequest.supportsCrossOrigin)) {
      return html$.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
    }
    let completer = CompleterOfString().new();
    if (method == null) {
      method = 'GET';
    }
    let xhr = new XDomainRequest();
    xhr.open(method, url);
    xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
      let response = xhr.responseText;
      completer.complete(response);
    }, dynamicToNull$()), 1);
    xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
      completer.completeError(e);
    }, dynamicToNull$()), 1);
    xhr.onprogress = {};
    xhr.ontimeout = {};
    xhr.timeout = Number.MAX_VALUE;
    if (sendData != null) {
      xhr.send(sendData);
    } else {
      xhr.send();
    }
    return completer.future;
  }
  get [dartx.responseHeaders]() {
    let headers = dart.map({}, core.String, core.String);
    let headersString = this[dartx.getAllResponseHeaders]();
    if (headersString == null) {
      return headers;
    }
    let headersList = headersString[dartx.split]('\r\n');
    for (let header of headersList) {
      if (dart.test(header[dartx.isEmpty])) {
        continue;
      }
      let splitIdx = header[dartx.indexOf](': ');
      if (splitIdx == -1) {
        continue;
      }
      let key = header[dartx.substring](0, splitIdx)[dartx.toLowerCase]();
      let value = header[dartx.substring](dart.notNull(splitIdx) + 2);
      if (dart.test(headers[dartx.containsKey](key))) {
        headers[dartx._set](key, dart.str`${headers[dartx._get](key)}, ${value}`);
      } else {
        headers[dartx._set](key, value);
      }
    }
    return headers;
  }
  [dartx.open](...args) {
    return this.open.apply(this, args);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.HttpRequest._create_1();
  }
  static _create_1() {
    return new XMLHttpRequest();
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.response]() {
    return html$._convertNativeToDart_XHR_Response(this[_get_response]);
  }
  get [_get_response]() {
    return this.response;
  }
  get [dartx.responseText]() {
    return this.responseText;
  }
  get [dartx.responseType]() {
    return this.responseType;
  }
  set [dartx.responseType](value) {
    this.responseType = value;
  }
  get [dartx.responseUrl]() {
    return this.responseURL;
  }
  get [dartx.responseXml]() {
    return this.responseXML;
  }
  get [dartx.status]() {
    return this.status;
  }
  get [dartx.statusText]() {
    return this.statusText;
  }
  get [dartx.timeout]() {
    return this.timeout;
  }
  set [dartx.timeout](value) {
    this.timeout = value;
  }
  get [dartx.upload]() {
    return this.upload;
  }
  get [dartx.withCredentials]() {
    return this.withCredentials;
  }
  set [dartx.withCredentials](value) {
    this.withCredentials = value;
  }
  [dartx.abort](...args) {
    return this.abort.apply(this, args);
  }
  [dartx.getAllResponseHeaders](...args) {
    return this.getAllResponseHeaders.apply(this, args);
  }
  [dartx.getResponseHeader](...args) {
    return this.getResponseHeader.apply(this, args);
  }
  [dartx.overrideMimeType](...args) {
    return this.overrideMimeType.apply(this, args);
  }
  [dartx.send](...args) {
    return this.send.apply(this, args);
  }
  [dartx.setRequestHeader](...args) {
    return this.setRequestHeader.apply(this, args);
  }
  get [dartx.onReadyStateChange]() {
    return html$.HttpRequest.readyStateChangeEvent.forTarget(this);
  }
};
dart.setSignature(html$.HttpRequest, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.HttpRequest, []),
    new: dart.definiteFunctionType(html$.HttpRequest, [])
  }),
  fields: () => ({
    [dartx.readyState]: core.int,
    [_get_response]: dart.dynamic,
    [dartx.responseText]: core.String,
    [dartx.responseType]: core.String,
    [dartx.responseUrl]: core.String,
    [dartx.responseXml]: html$.Document,
    [dartx.status]: core.int,
    [dartx.statusText]: core.String,
    [dartx.timeout]: core.int,
    [dartx.upload]: html$.HttpRequestUpload,
    [dartx.withCredentials]: core.bool
  }),
  getters: () => ({
    [dartx.responseHeaders]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    [dartx.response]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
  }),
  methods: () => ({
    [dartx.open]: dart.definiteFunctionType(dart.void, [core.String, core.String], {async: core.bool, user: core.String, password: core.String}),
    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
    [dartx.getAllResponseHeaders]: dart.definiteFunctionType(core.String, []),
    [dartx.getResponseHeader]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.overrideMimeType]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.send]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
    [dartx.setRequestHeader]: dart.definiteFunctionType(dart.void, [core.String, core.String])
  }),
  sfields: () => ({
    readyStateChangeEvent: EventStreamProviderOfProgressEvent(),
    DONE: core.int,
    HEADERS_RECEIVED: core.int,
    LOADING: core.int,
    OPENED: core.int,
    UNSENT: core.int
  }),
  sgetters: () => ({
    supportsProgressEvent: dart.definiteFunctionType(core.bool, []),
    supportsCrossOrigin: dart.definiteFunctionType(core.bool, []),
    supportsLoadEndEvent: dart.definiteFunctionType(core.bool, []),
    supportsOverrideMimeType: dart.definiteFunctionType(core.bool, [])
  }),
  statics: () => ({
    getString: dart.definiteFunctionType(async.Future$(core.String), [core.String], {withCredentials: core.bool, onProgress: ProgressEventTovoid()}),
    postFormData: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String, MapOfString$String()], {withCredentials: core.bool, responseType: core.String, requestHeaders: MapOfString$String(), onProgress: ProgressEventTovoid()}),
    request: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String], {method: core.String, withCredentials: core.bool, responseType: core.String, mimeType: core.String, requestHeaders: MapOfString$String(), sendData: dart.dynamic, onProgress: ProgressEventTovoid()}),
    requestCrossOrigin: dart.definiteFunctionType(async.Future$(core.String), [core.String], {method: core.String, sendData: core.String}),
    _create_1: dart.definiteFunctionType(html$.HttpRequest, [])
  }),
  names: ['getString', 'postFormData', 'request', 'requestCrossOrigin', '_create_1']
});
html$.HttpRequest.DONE = 4;
html$.HttpRequest.HEADERS_RECEIVED = 2;
html$.HttpRequest.LOADING = 3;
html$.HttpRequest.OPENED = 1;
html$.HttpRequest.UNSENT = 0;
dart.defineLazy(html$.HttpRequest, {
  get readyStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent())('readystatechange'));
  }
});
dart.registerExtension(dart.global.XMLHttpRequest, html$.HttpRequest);
html$.HttpRequestUpload = class HttpRequestUpload extends html$.HttpRequestEventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.HttpRequestUpload, {
  constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestUpload, [])})
});
dart.registerExtension(dart.global.XMLHttpRequestUpload, html$.HttpRequestUpload);
const _get_contentWindow = Symbol('_get_contentWindow');
dart.defineExtensionNames([
  'contentWindow',
  'allowFullscreen',
  'height',
  'name',
  'sandbox',
  'src',
  'srcdoc',
  'width'
]);
html$.IFrameElement = class IFrameElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.IFrameElement._check(html$.document[dartx.createElement]("iframe"));
  }
  created() {
    this[dartx.allowFullscreen] = null;
    this[_get_contentWindow] = null;
    this[dartx.height] = null;
    this[dartx.name] = null;
    this[dartx.sandbox] = null;
    this[dartx.src] = null;
    this[dartx.srcdoc] = null;
    this[dartx.width] = null;
    super.created();
  }
  get [dartx.allowFullscreen]() {
    return this.allowFullscreen;
  }
  set [dartx.allowFullscreen](value) {
    this.allowFullscreen = value;
  }
  get [dartx.contentWindow]() {
    return html$._convertNativeToDart_Window(this[_get_contentWindow]);
  }
  get [_get_contentWindow]() {
    return this.contentWindow;
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.sandbox]() {
    return this.sandbox;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.srcdoc]() {
    return this.srcdoc;
  }
  set [dartx.srcdoc](value) {
    this.srcdoc = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
};
dart.defineNamedConstructor(html$.IFrameElement, 'created');
dart.setSignature(html$.IFrameElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.IFrameElement, []),
    new: dart.definiteFunctionType(html$.IFrameElement, []),
    created: dart.definiteFunctionType(html$.IFrameElement, [])
  }),
  fields: () => ({
    [dartx.allowFullscreen]: core.bool,
    [_get_contentWindow]: dart.dynamic,
    [dartx.height]: core.String,
    [dartx.name]: core.String,
    [dartx.sandbox]: html$.DomSettableTokenList,
    [dartx.src]: core.String,
    [dartx.srcdoc]: core.String,
    [dartx.width]: core.String
  }),
  getters: () => ({[dartx.contentWindow]: dart.definiteFunctionType(html$.WindowBase, [])})
});
dart.registerExtension(dart.global.HTMLIFrameElement, html$.IFrameElement);
dart.defineExtensionNames([
  'height',
  'width'
]);
html$.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.width]() {
    return this.width;
  }
};
dart.setSignature(html$.ImageBitmap, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ImageBitmap, [])}),
  fields: () => ({
    [dartx.height]: core.int,
    [dartx.width]: core.int
  })
});
dart.registerExtension(dart.global.ImageBitmap, html$.ImageBitmap);
dart.defineExtensionNames([
  'data',
  'height',
  'width'
]);
html$.ImageData = class ImageData extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(data_OR_sw, sh_OR_sw, sh) {
    if (sh === void 0) sh = null;
    if (typeof sh_OR_sw == 'number' && typeof data_OR_sw == 'number' && sh == null) {
      return html$.ImageData._create_1(data_OR_sw, sh_OR_sw);
    }
    if (typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw) && sh == null) {
      return html$.ImageData._create_2(data_OR_sw, sh_OR_sw);
    }
    if (typeof sh == 'number' && typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw)) {
      return html$.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  static _create_1(data_OR_sw, sh_OR_sw) {
    return new self.ImageData(data_OR_sw, sh_OR_sw);
  }
  static _create_2(data_OR_sw, sh_OR_sw) {
    return new self.ImageData(data_OR_sw, sh_OR_sw);
  }
  static _create_3(data_OR_sw, sh_OR_sw, sh) {
    return new self.ImageData(data_OR_sw, sh_OR_sw, sh);
  }
  get [dartx.data]() {
    return this.data;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.width]() {
    return this.width;
  }
};
dart.setSignature(html$.ImageData, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ImageData, []),
    new: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, core.int], [core.int])
  }),
  fields: () => ({
    [dartx.data]: typed_data.Uint8ClampedList,
    [dartx.height]: core.int,
    [dartx.width]: core.int
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_3']
});
dart.registerExtension(dart.global.ImageData, html$.ImageData);
dart.defineExtensionNames([
  'alt',
  'complete',
  'crossOrigin',
  'currentSrc',
  'height',
  'isMap',
  'naturalHeight',
  'naturalWidth',
  'sizes',
  'src',
  'srcset',
  'useMap',
  'width'
]);
html$.ImageElement = class ImageElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(opts) {
    let src = opts && 'src' in opts ? opts.src : null;
    let width = opts && 'width' in opts ? opts.width : null;
    let height = opts && 'height' in opts ? opts.height : null;
    let e = html$.ImageElement._check(html$.document[dartx.createElement]("img"));
    if (src != null) e[dartx.src] = src;
    if (width != null) e[dartx.width] = width;
    if (height != null) e[dartx.height] = height;
    return e;
  }
  created() {
    this[dartx.alt] = null;
    this[dartx.complete] = null;
    this[dartx.crossOrigin] = null;
    this[dartx.currentSrc] = null;
    this[dartx.height] = null;
    this[dartx.isMap] = null;
    this[dartx.naturalHeight] = null;
    this[dartx.naturalWidth] = null;
    this[dartx.sizes] = null;
    this[dartx.src] = null;
    this[dartx.srcset] = null;
    this[dartx.useMap] = null;
    this[dartx.width] = null;
    super.created();
  }
  get [dartx.alt]() {
    return this.alt;
  }
  set [dartx.alt](value) {
    this.alt = value;
  }
  get [dartx.complete]() {
    return this.complete;
  }
  get [dartx.crossOrigin]() {
    return this.crossOrigin;
  }
  set [dartx.crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [dartx.currentSrc]() {
    return this.currentSrc;
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.isMap]() {
    return this.isMap;
  }
  set [dartx.isMap](value) {
    this.isMap = value;
  }
  get [dartx.naturalHeight]() {
    return this.naturalHeight;
  }
  get [dartx.naturalWidth]() {
    return this.naturalWidth;
  }
  get [dartx.sizes]() {
    return this.sizes;
  }
  set [dartx.sizes](value) {
    this.sizes = value;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.srcset]() {
    return this.srcset;
  }
  set [dartx.srcset](value) {
    this.srcset = value;
  }
  get [dartx.useMap]() {
    return this.useMap;
  }
  set [dartx.useMap](value) {
    this.useMap = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
};
dart.defineNamedConstructor(html$.ImageElement, 'created');
html$.ImageElement[dart.implements] = () => [html$.CanvasImageSource];
dart.setSignature(html$.ImageElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ImageElement, []),
    new: dart.definiteFunctionType(html$.ImageElement, [], {src: core.String, width: core.int, height: core.int}),
    created: dart.definiteFunctionType(html$.ImageElement, [])
  }),
  fields: () => ({
    [dartx.alt]: core.String,
    [dartx.complete]: core.bool,
    [dartx.crossOrigin]: core.String,
    [dartx.currentSrc]: core.String,
    [dartx.height]: core.int,
    [dartx.isMap]: core.bool,
    [dartx.naturalHeight]: core.int,
    [dartx.naturalWidth]: core.int,
    [dartx.sizes]: core.String,
    [dartx.src]: core.String,
    [dartx.srcset]: core.String,
    [dartx.useMap]: core.String,
    [dartx.width]: core.int
  })
});
dart.registerExtension(dart.global.HTMLImageElement, html$.ImageElement);
dart.defineExtensionNames([
  'inspect'
]);
html$.InjectedScriptHost = class InjectedScriptHost extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.inspect](...args) {
    return this.inspect.apply(this, args);
  }
};
dart.setSignature(html$.InjectedScriptHost, {
  constructors: () => ({_: dart.definiteFunctionType(html$.InjectedScriptHost, [])}),
  methods: () => ({[dartx.inspect]: dart.definiteFunctionType(dart.void, [core.Object, core.Object])})
});
dart.registerExtension(dart.global.InjectedScriptHost, html$.InjectedScriptHost);
dart.defineExtensionNames([
  'firesTouchEvents'
]);
html$.InputDevice = class InputDevice extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(deviceInitDict) {
    if (deviceInitDict === void 0) deviceInitDict = null;
    if (deviceInitDict != null) {
      let deviceInitDict_1 = html_common.convertDartToNative_Dictionary(deviceInitDict);
      return html$.InputDevice._create_1(deviceInitDict_1);
    }
    return html$.InputDevice._create_2();
  }
  static _create_1(deviceInitDict) {
    return new self.InputDevice(deviceInitDict);
  }
  static _create_2() {
    return new self.InputDevice();
  }
  get [dartx.firesTouchEvents]() {
    return this.firesTouchEvents;
  }
};
dart.setSignature(html$.InputDevice, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.InputDevice, []),
    new: dart.definiteFunctionType(html$.InputDevice, [], [core.Map])
  }),
  fields: () => ({[dartx.firesTouchEvents]: core.bool}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.InputDevice, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.InputDevice, [])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.InputDevice, html$.InputDevice);
const _get_valueAsDate = Symbol('_get_valueAsDate');
const _set_valueAsDate = Symbol('_set_valueAsDate');
dart.defineExtensionNames([
  'valueAsDate',
  'valueAsDate',
  'checkValidity',
  'reportValidity',
  'select',
  'setCustomValidity',
  'setRangeText',
  'setSelectionRange',
  'stepDown',
  'stepUp',
  'accept',
  'alt',
  'autocapitalize',
  'autocomplete',
  'autofocus',
  'capture',
  'checked',
  'defaultChecked',
  'defaultValue',
  'dirName',
  'disabled',
  'files',
  'form',
  'formAction',
  'formEnctype',
  'formMethod',
  'formNoValidate',
  'formTarget',
  'height',
  'incremental',
  'indeterminate',
  'inputMode',
  'labels',
  'list',
  'max',
  'maxLength',
  'min',
  'minLength',
  'multiple',
  'name',
  'pattern',
  'placeholder',
  'readOnly',
  'required',
  'selectionDirection',
  'selectionEnd',
  'selectionStart',
  'size',
  'src',
  'step',
  'type',
  'validationMessage',
  'validity',
  'value',
  'valueAsNumber',
  'entries',
  'directory',
  'width',
  'willValidate'
]);
html$.InputElement = class InputElement extends html$.HtmlElement {
  static new(opts) {
    let type = opts && 'type' in opts ? opts.type : null;
    let e = html$.InputElement._check(html$.document[dartx.createElement]("input"));
    if (type != null) {
      try {
        e[dartx.type] = type;
      } catch (_) {
      }

    }
    return e;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.accept] = null;
    this[dartx.alt] = null;
    this[dartx.autocapitalize] = null;
    this[dartx.autocomplete] = null;
    this[dartx.autofocus] = null;
    this[dartx.capture] = null;
    this[dartx.checked] = null;
    this[dartx.defaultChecked] = null;
    this[dartx.defaultValue] = null;
    this[dartx.dirName] = null;
    this[dartx.disabled] = null;
    this[dartx.files] = null;
    this[dartx.form] = null;
    this[dartx.formAction] = null;
    this[dartx.formEnctype] = null;
    this[dartx.formMethod] = null;
    this[dartx.formNoValidate] = null;
    this[dartx.formTarget] = null;
    this[dartx.height] = null;
    this[dartx.incremental] = null;
    this[dartx.indeterminate] = null;
    this[dartx.inputMode] = null;
    this[dartx.labels] = null;
    this[dartx.list] = null;
    this[dartx.max] = null;
    this[dartx.maxLength] = null;
    this[dartx.min] = null;
    this[dartx.minLength] = null;
    this[dartx.multiple] = null;
    this[dartx.name] = null;
    this[dartx.pattern] = null;
    this[dartx.placeholder] = null;
    this[dartx.readOnly] = null;
    this[dartx.required] = null;
    this[dartx.selectionDirection] = null;
    this[dartx.selectionEnd] = null;
    this[dartx.selectionStart] = null;
    this[dartx.size] = null;
    this[dartx.src] = null;
    this[dartx.step] = null;
    this[dartx.type] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.value] = null;
    this[_get_valueAsDate] = null;
    this[dartx.valueAsNumber] = null;
    this[dartx.entries] = null;
    this[dartx.directory] = null;
    this[dartx.width] = null;
    this[dartx.willValidate] = null;
    super.created();
  }
  get [dartx.accept]() {
    return this.accept;
  }
  set [dartx.accept](value) {
    this.accept = value;
  }
  get [dartx.alt]() {
    return this.alt;
  }
  set [dartx.alt](value) {
    this.alt = value;
  }
  get [dartx.autocapitalize]() {
    return this.autocapitalize;
  }
  set [dartx.autocapitalize](value) {
    this.autocapitalize = value;
  }
  get [dartx.autocomplete]() {
    return this.autocomplete;
  }
  set [dartx.autocomplete](value) {
    this.autocomplete = value;
  }
  get [dartx.autofocus]() {
    return this.autofocus;
  }
  set [dartx.autofocus](value) {
    this.autofocus = value;
  }
  get [dartx.capture]() {
    return this.capture;
  }
  set [dartx.capture](value) {
    this.capture = value;
  }
  get [dartx.checked]() {
    return this.checked;
  }
  set [dartx.checked](value) {
    this.checked = value;
  }
  get [dartx.defaultChecked]() {
    return this.defaultChecked;
  }
  set [dartx.defaultChecked](value) {
    this.defaultChecked = value;
  }
  get [dartx.defaultValue]() {
    return this.defaultValue;
  }
  set [dartx.defaultValue](value) {
    this.defaultValue = value;
  }
  get [dartx.dirName]() {
    return this.dirName;
  }
  set [dartx.dirName](value) {
    this.dirName = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.files]() {
    return this.files;
  }
  set [dartx.files](value) {
    this.files = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.formAction]() {
    return this.formAction;
  }
  set [dartx.formAction](value) {
    this.formAction = value;
  }
  get [dartx.formEnctype]() {
    return this.formEnctype;
  }
  set [dartx.formEnctype](value) {
    this.formEnctype = value;
  }
  get [dartx.formMethod]() {
    return this.formMethod;
  }
  set [dartx.formMethod](value) {
    this.formMethod = value;
  }
  get [dartx.formNoValidate]() {
    return this.formNoValidate;
  }
  set [dartx.formNoValidate](value) {
    this.formNoValidate = value;
  }
  get [dartx.formTarget]() {
    return this.formTarget;
  }
  set [dartx.formTarget](value) {
    this.formTarget = value;
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.incremental]() {
    return this.incremental;
  }
  set [dartx.incremental](value) {
    this.incremental = value;
  }
  get [dartx.indeterminate]() {
    return this.indeterminate;
  }
  set [dartx.indeterminate](value) {
    this.indeterminate = value;
  }
  get [dartx.inputMode]() {
    return this.inputMode;
  }
  set [dartx.inputMode](value) {
    this.inputMode = value;
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.list]() {
    return this.list;
  }
  get [dartx.max]() {
    return this.max;
  }
  set [dartx.max](value) {
    this.max = value;
  }
  get [dartx.maxLength]() {
    return this.maxLength;
  }
  set [dartx.maxLength](value) {
    this.maxLength = value;
  }
  get [dartx.min]() {
    return this.min;
  }
  set [dartx.min](value) {
    this.min = value;
  }
  get [dartx.minLength]() {
    return this.minLength;
  }
  set [dartx.minLength](value) {
    this.minLength = value;
  }
  get [dartx.multiple]() {
    return this.multiple;
  }
  set [dartx.multiple](value) {
    this.multiple = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.pattern]() {
    return this.pattern;
  }
  set [dartx.pattern](value) {
    this.pattern = value;
  }
  get [dartx.placeholder]() {
    return this.placeholder;
  }
  set [dartx.placeholder](value) {
    this.placeholder = value;
  }
  get [dartx.readOnly]() {
    return this.readOnly;
  }
  set [dartx.readOnly](value) {
    this.readOnly = value;
  }
  get [dartx.required]() {
    return this.required;
  }
  set [dartx.required](value) {
    this.required = value;
  }
  get [dartx.selectionDirection]() {
    return this.selectionDirection;
  }
  set [dartx.selectionDirection](value) {
    this.selectionDirection = value;
  }
  get [dartx.selectionEnd]() {
    return this.selectionEnd;
  }
  set [dartx.selectionEnd](value) {
    this.selectionEnd = value;
  }
  get [dartx.selectionStart]() {
    return this.selectionStart;
  }
  set [dartx.selectionStart](value) {
    this.selectionStart = value;
  }
  get [dartx.size]() {
    return this.size;
  }
  set [dartx.size](value) {
    this.size = value;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.step]() {
    return this.step;
  }
  set [dartx.step](value) {
    this.step = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  get [dartx.valueAsDate]() {
    return html_common.convertNativeToDart_DateTime(this[_get_valueAsDate]);
  }
  get [_get_valueAsDate]() {
    return this.valueAsDate;
  }
  set [dartx.valueAsDate](value) {
    this[_set_valueAsDate] = html_common.convertDartToNative_DateTime(value);
  }
  set [_set_valueAsDate](value) {
    this.valueAsDate = value;
  }
  get [dartx.valueAsNumber]() {
    return this.valueAsNumber;
  }
  set [dartx.valueAsNumber](value) {
    this.valueAsNumber = value;
  }
  get [dartx.entries]() {
    return this.webkitEntries;
  }
  get [dartx.directory]() {
    return this.webkitdirectory;
  }
  set [dartx.directory](value) {
    this.webkitdirectory = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.select](...args) {
    return this.select.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
  [dartx.setRangeText](...args) {
    return this.setRangeText.apply(this, args);
  }
  [dartx.setSelectionRange](...args) {
    return this.setSelectionRange.apply(this, args);
  }
  [dartx.stepDown](...args) {
    return this.stepDown.apply(this, args);
  }
  [dartx.stepUp](...args) {
    return this.stepUp.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.InputElement, 'created');
html$.InputElement[dart.implements] = () => [html$.HiddenInputElement, html$.SearchInputElement, html$.TextInputElement, html$.UrlInputElement, html$.TelephoneInputElement, html$.EmailInputElement, html$.PasswordInputElement, html$.DateInputElement, html$.MonthInputElement, html$.WeekInputElement, html$.TimeInputElement, html$.LocalDateTimeInputElement, html$.NumberInputElement, html$.RangeInputElement, html$.CheckboxInputElement, html$.RadioButtonInputElement, html$.FileUploadInputElement, html$.SubmitButtonInputElement, html$.ImageButtonInputElement, html$.ResetButtonInputElement, html$.ButtonInputElement];
dart.setSignature(html$.InputElement, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.InputElement, [], {type: core.String}),
    _: dart.definiteFunctionType(html$.InputElement, []),
    created: dart.definiteFunctionType(html$.InputElement, [])
  }),
  fields: () => ({
    [dartx.accept]: core.String,
    [dartx.alt]: core.String,
    [dartx.autocapitalize]: core.String,
    [dartx.autocomplete]: core.String,
    [dartx.autofocus]: core.bool,
    [dartx.capture]: core.bool,
    [dartx.checked]: core.bool,
    [dartx.defaultChecked]: core.bool,
    [dartx.defaultValue]: core.String,
    [dartx.dirName]: core.String,
    [dartx.disabled]: core.bool,
    [dartx.files]: ListOfFile(),
    [dartx.form]: html$.FormElement,
    [dartx.formAction]: core.String,
    [dartx.formEnctype]: core.String,
    [dartx.formMethod]: core.String,
    [dartx.formNoValidate]: core.bool,
    [dartx.formTarget]: core.String,
    [dartx.height]: core.int,
    [dartx.incremental]: core.bool,
    [dartx.indeterminate]: core.bool,
    [dartx.inputMode]: core.String,
    [dartx.labels]: ListOfNode(),
    [dartx.list]: html$.HtmlElement,
    [dartx.max]: core.String,
    [dartx.maxLength]: core.int,
    [dartx.min]: core.String,
    [dartx.minLength]: core.int,
    [dartx.multiple]: core.bool,
    [dartx.name]: core.String,
    [dartx.pattern]: core.String,
    [dartx.placeholder]: core.String,
    [dartx.readOnly]: core.bool,
    [dartx.required]: core.bool,
    [dartx.selectionDirection]: core.String,
    [dartx.selectionEnd]: core.int,
    [dartx.selectionStart]: core.int,
    [dartx.size]: core.int,
    [dartx.src]: core.String,
    [dartx.step]: core.String,
    [dartx.type]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.value]: core.String,
    [_get_valueAsDate]: dart.dynamic,
    [dartx.valueAsNumber]: core.num,
    [dartx.entries]: ListOfEntry(),
    [dartx.directory]: core.bool,
    [dartx.width]: core.int,
    [dartx.willValidate]: core.bool
  }),
  getters: () => ({[dartx.valueAsDate]: dart.definiteFunctionType(core.DateTime, [])}),
  setters: () => ({
    [dartx.valueAsDate]: dart.definiteFunctionType(dart.void, [core.DateTime]),
    [_set_valueAsDate]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  methods: () => ({
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.select]: dart.definiteFunctionType(dart.void, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
    [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String]),
    [dartx.stepDown]: dart.definiteFunctionType(dart.void, [], [core.int]),
    [dartx.stepUp]: dart.definiteFunctionType(dart.void, [], [core.int])
  })
});
dart.registerExtension(dart.global.HTMLInputElement, html$.InputElement);
dart.defineExtensionNames([
  'autofocus',
  'disabled',
  'incremental',
  'indeterminate',
  'name',
  'value'
]);
html$.InputElementBase = class InputElementBase extends core.Object {
  new() {
    this[autofocus] = null;
    this[disabled] = null;
    this[incremental] = null;
    this[indeterminate] = null;
    this[name] = null;
    this[value$] = null;
  }
  get autofocus() {
    return this[autofocus];
  }
  set autofocus(value) {
    this[autofocus] = value;
  }
  get disabled() {
    return this[disabled];
  }
  set disabled(value) {
    this[disabled] = value;
  }
  get incremental() {
    return this[incremental];
  }
  set incremental(value) {
    this[incremental] = value;
  }
  get indeterminate() {
    return this[indeterminate];
  }
  set indeterminate(value) {
    this[indeterminate] = value;
  }
  get name() {
    return this[name];
  }
  set name(value) {
    this[name] = value;
  }
  get value() {
    return this[value$];
  }
  set value(value) {
    this[value$] = value;
  }
};
const autofocus = Symbol(html$.InputElementBase.name + "." + 'autofocus'.toString());
const disabled = Symbol(html$.InputElementBase.name + "." + 'disabled'.toString());
const incremental = Symbol(html$.InputElementBase.name + "." + 'incremental'.toString());
const indeterminate = Symbol(html$.InputElementBase.name + "." + 'indeterminate'.toString());
const name = Symbol(html$.InputElementBase.name + "." + 'name'.toString());
const value$ = Symbol(html$.InputElementBase.name + "." + 'value'.toString());
html$.InputElementBase[dart.implements] = () => [html$.Element];
dart.setSignature(html$.InputElementBase, {
  fields: () => ({
    autofocus: core.bool,
    disabled: core.bool,
    incremental: core.bool,
    indeterminate: core.bool,
    name: core.String,
    value: core.String
  })
});
dart.defineExtensionMembers(html$.InputElementBase, [
  'autofocus',
  'autofocus',
  'disabled',
  'disabled',
  'incremental',
  'incremental',
  'indeterminate',
  'indeterminate',
  'name',
  'name',
  'value',
  'value'
]);
html$.HiddenInputElement = class HiddenInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'hidden'});
  }
};
html$.HiddenInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.HiddenInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.HiddenInputElement, [])})
});
dart.defineExtensionNames([
  'autocomplete',
  'maxLength',
  'pattern',
  'placeholder',
  'readOnly',
  'required',
  'size',
  'selectionDirection',
  'selectionEnd',
  'selectionStart'
]);
html$.TextInputElementBase = class TextInputElementBase extends core.Object {
  new() {
    this[autocomplete] = null;
    this[maxLength] = null;
    this[pattern] = null;
    this[placeholder] = null;
    this[readOnly] = null;
    this[required] = null;
    this[size] = null;
    this[selectionDirection] = null;
    this[selectionEnd] = null;
    this[selectionStart] = null;
  }
  get autocomplete() {
    return this[autocomplete];
  }
  set autocomplete(value) {
    this[autocomplete] = value;
  }
  get maxLength() {
    return this[maxLength];
  }
  set maxLength(value) {
    this[maxLength] = value;
  }
  get pattern() {
    return this[pattern];
  }
  set pattern(value) {
    this[pattern] = value;
  }
  get placeholder() {
    return this[placeholder];
  }
  set placeholder(value) {
    this[placeholder] = value;
  }
  get readOnly() {
    return this[readOnly];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  get size() {
    return this[size];
  }
  set size(value) {
    this[size] = value;
  }
  get selectionDirection() {
    return this[selectionDirection];
  }
  set selectionDirection(value) {
    this[selectionDirection] = value;
  }
  get selectionEnd() {
    return this[selectionEnd];
  }
  set selectionEnd(value) {
    this[selectionEnd] = value;
  }
  get selectionStart() {
    return this[selectionStart];
  }
  set selectionStart(value) {
    this[selectionStart] = value;
  }
};
const autocomplete = Symbol(html$.TextInputElementBase.name + "." + 'autocomplete'.toString());
const maxLength = Symbol(html$.TextInputElementBase.name + "." + 'maxLength'.toString());
const pattern = Symbol(html$.TextInputElementBase.name + "." + 'pattern'.toString());
const placeholder = Symbol(html$.TextInputElementBase.name + "." + 'placeholder'.toString());
const readOnly = Symbol(html$.TextInputElementBase.name + "." + 'readOnly'.toString());
const required = Symbol(html$.TextInputElementBase.name + "." + 'required'.toString());
const size = Symbol(html$.TextInputElementBase.name + "." + 'size'.toString());
const selectionDirection = Symbol(html$.TextInputElementBase.name + "." + 'selectionDirection'.toString());
const selectionEnd = Symbol(html$.TextInputElementBase.name + "." + 'selectionEnd'.toString());
const selectionStart = Symbol(html$.TextInputElementBase.name + "." + 'selectionStart'.toString());
html$.TextInputElementBase[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.TextInputElementBase, {
  fields: () => ({
    autocomplete: core.String,
    maxLength: core.int,
    pattern: core.String,
    placeholder: core.String,
    readOnly: core.bool,
    required: core.bool,
    size: core.int,
    selectionDirection: core.String,
    selectionEnd: core.int,
    selectionStart: core.int
  })
});
dart.defineExtensionMembers(html$.TextInputElementBase, [
  'autocomplete',
  'autocomplete',
  'maxLength',
  'maxLength',
  'pattern',
  'pattern',
  'placeholder',
  'placeholder',
  'readOnly',
  'readOnly',
  'required',
  'required',
  'size',
  'size',
  'selectionDirection',
  'selectionDirection',
  'selectionEnd',
  'selectionEnd',
  'selectionStart',
  'selectionStart'
]);
dart.defineExtensionNames([
  'dirName'
]);
html$.SearchInputElement = class SearchInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'search'});
  }
  get dirName() {
    return this[dirName];
  }
  set dirName(value) {
    this[dirName] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'search'})[dartx.type] == 'search';
  }
};
const dirName = Symbol(html$.SearchInputElement.name + "." + 'dirName'.toString());
html$.SearchInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setSignature(html$.SearchInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.SearchInputElement, [])}),
  fields: () => ({dirName: core.String}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.SearchInputElement, ['dirName', 'dirName']);
dart.defineExtensionNames([
  'dirName'
]);
html$.TextInputElement = class TextInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'text'});
  }
  get dirName() {
    return this[dirName$];
  }
  set dirName(value) {
    this[dirName$] = value;
  }
};
const dirName$ = Symbol(html$.TextInputElement.name + "." + 'dirName'.toString());
html$.TextInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setSignature(html$.TextInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.TextInputElement, [])}),
  fields: () => ({dirName: core.String})
});
dart.defineExtensionMembers(html$.TextInputElement, ['dirName', 'dirName']);
html$.UrlInputElement = class UrlInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'url'});
  }
  static get supported() {
    return html$.InputElement.new({type: 'url'})[dartx.type] == 'url';
  }
};
html$.UrlInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setSignature(html$.UrlInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.UrlInputElement, [])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
html$.TelephoneInputElement = class TelephoneInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'tel'});
  }
  static get supported() {
    return html$.InputElement.new({type: 'tel'})[dartx.type] == 'tel';
  }
};
html$.TelephoneInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setSignature(html$.TelephoneInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.TelephoneInputElement, [])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionNames([
  'autocomplete',
  'autofocus',
  'maxLength',
  'multiple',
  'pattern',
  'placeholder',
  'readOnly',
  'required',
  'size'
]);
html$.EmailInputElement = class EmailInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'email'});
  }
  get autocomplete() {
    return this[autocomplete$];
  }
  set autocomplete(value) {
    this[autocomplete$] = value;
  }
  get autofocus() {
    return this[autofocus$];
  }
  set autofocus(value) {
    this[autofocus$] = value;
  }
  get maxLength() {
    return this[maxLength$];
  }
  set maxLength(value) {
    this[maxLength$] = value;
  }
  get multiple() {
    return this[multiple];
  }
  set multiple(value) {
    this[multiple] = value;
  }
  get pattern() {
    return this[pattern$];
  }
  set pattern(value) {
    this[pattern$] = value;
  }
  get placeholder() {
    return this[placeholder$];
  }
  set placeholder(value) {
    this[placeholder$] = value;
  }
  get readOnly() {
    return this[readOnly$];
  }
  set readOnly(value) {
    this[readOnly$] = value;
  }
  get required() {
    return this[required$];
  }
  set required(value) {
    this[required$] = value;
  }
  get size() {
    return this[size$];
  }
  set size(value) {
    this[size$] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'email'})[dartx.type] == 'email';
  }
};
const autocomplete$ = Symbol(html$.EmailInputElement.name + "." + 'autocomplete'.toString());
const autofocus$ = Symbol(html$.EmailInputElement.name + "." + 'autofocus'.toString());
const maxLength$ = Symbol(html$.EmailInputElement.name + "." + 'maxLength'.toString());
const multiple = Symbol(html$.EmailInputElement.name + "." + 'multiple'.toString());
const pattern$ = Symbol(html$.EmailInputElement.name + "." + 'pattern'.toString());
const placeholder$ = Symbol(html$.EmailInputElement.name + "." + 'placeholder'.toString());
const readOnly$ = Symbol(html$.EmailInputElement.name + "." + 'readOnly'.toString());
const required$ = Symbol(html$.EmailInputElement.name + "." + 'required'.toString());
const size$ = Symbol(html$.EmailInputElement.name + "." + 'size'.toString());
html$.EmailInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setSignature(html$.EmailInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.EmailInputElement, [])}),
  fields: () => ({
    autocomplete: core.String,
    autofocus: core.bool,
    maxLength: core.int,
    multiple: core.bool,
    pattern: core.String,
    placeholder: core.String,
    readOnly: core.bool,
    required: core.bool,
    size: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.EmailInputElement, [
  'autocomplete',
  'autocomplete',
  'autofocus',
  'autofocus',
  'maxLength',
  'maxLength',
  'multiple',
  'multiple',
  'pattern',
  'pattern',
  'placeholder',
  'placeholder',
  'readOnly',
  'readOnly',
  'required',
  'required',
  'size',
  'size'
]);
html$.PasswordInputElement = class PasswordInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'password'});
  }
};
html$.PasswordInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setSignature(html$.PasswordInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.PasswordInputElement, [])})
});
dart.defineExtensionNames([
  'max',
  'min',
  'step',
  'valueAsNumber'
]);
html$.RangeInputElementBase = class RangeInputElementBase extends core.Object {
  new() {
    this[max] = null;
    this[min] = null;
    this[step] = null;
    this[valueAsNumber] = null;
  }
  get max() {
    return this[max];
  }
  set max(value) {
    this[max] = value;
  }
  get min() {
    return this[min];
  }
  set min(value) {
    this[min] = value;
  }
  get step() {
    return this[step];
  }
  set step(value) {
    this[step] = value;
  }
  get valueAsNumber() {
    return this[valueAsNumber];
  }
  set valueAsNumber(value) {
    this[valueAsNumber] = value;
  }
};
const max = Symbol(html$.RangeInputElementBase.name + "." + 'max'.toString());
const min = Symbol(html$.RangeInputElementBase.name + "." + 'min'.toString());
const step = Symbol(html$.RangeInputElementBase.name + "." + 'step'.toString());
const valueAsNumber = Symbol(html$.RangeInputElementBase.name + "." + 'valueAsNumber'.toString());
html$.RangeInputElementBase[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.RangeInputElementBase, {
  fields: () => ({
    max: core.String,
    min: core.String,
    step: core.String,
    valueAsNumber: core.num
  })
});
dart.defineExtensionMembers(html$.RangeInputElementBase, [
  'max',
  'max',
  'min',
  'min',
  'step',
  'step',
  'valueAsNumber',
  'valueAsNumber'
]);
dart.defineExtensionNames([
  'valueAsDate',
  'readOnly',
  'required'
]);
html$.DateInputElement = class DateInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'date'});
  }
  get valueAsDate() {
    return this[valueAsDate];
  }
  set valueAsDate(value) {
    this[valueAsDate] = value;
  }
  get readOnly() {
    return this[readOnly$0];
  }
  set readOnly(value) {
    this[readOnly$0] = value;
  }
  get required() {
    return this[required$0];
  }
  set required(value) {
    this[required$0] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'date'})[dartx.type] == 'date';
  }
};
const valueAsDate = Symbol(html$.DateInputElement.name + "." + 'valueAsDate'.toString());
const readOnly$0 = Symbol(html$.DateInputElement.name + "." + 'readOnly'.toString());
const required$0 = Symbol(html$.DateInputElement.name + "." + 'required'.toString());
html$.DateInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setSignature(html$.DateInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.DateInputElement, [])}),
  fields: () => ({
    valueAsDate: core.DateTime,
    readOnly: core.bool,
    required: core.bool
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.DateInputElement, [
  'valueAsDate',
  'valueAsDate',
  'readOnly',
  'readOnly',
  'required',
  'required'
]);
dart.defineExtensionNames([
  'valueAsDate',
  'readOnly',
  'required'
]);
html$.MonthInputElement = class MonthInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'month'});
  }
  get valueAsDate() {
    return this[valueAsDate$];
  }
  set valueAsDate(value) {
    this[valueAsDate$] = value;
  }
  get readOnly() {
    return this[readOnly$1];
  }
  set readOnly(value) {
    this[readOnly$1] = value;
  }
  get required() {
    return this[required$1];
  }
  set required(value) {
    this[required$1] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'month'})[dartx.type] == 'month';
  }
};
const valueAsDate$ = Symbol(html$.MonthInputElement.name + "." + 'valueAsDate'.toString());
const readOnly$1 = Symbol(html$.MonthInputElement.name + "." + 'readOnly'.toString());
const required$1 = Symbol(html$.MonthInputElement.name + "." + 'required'.toString());
html$.MonthInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setSignature(html$.MonthInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.MonthInputElement, [])}),
  fields: () => ({
    valueAsDate: core.DateTime,
    readOnly: core.bool,
    required: core.bool
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.MonthInputElement, [
  'valueAsDate',
  'valueAsDate',
  'readOnly',
  'readOnly',
  'required',
  'required'
]);
dart.defineExtensionNames([
  'valueAsDate',
  'readOnly',
  'required'
]);
html$.WeekInputElement = class WeekInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'week'});
  }
  get valueAsDate() {
    return this[valueAsDate$0];
  }
  set valueAsDate(value) {
    this[valueAsDate$0] = value;
  }
  get readOnly() {
    return this[readOnly$2];
  }
  set readOnly(value) {
    this[readOnly$2] = value;
  }
  get required() {
    return this[required$2];
  }
  set required(value) {
    this[required$2] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'week'})[dartx.type] == 'week';
  }
};
const valueAsDate$0 = Symbol(html$.WeekInputElement.name + "." + 'valueAsDate'.toString());
const readOnly$2 = Symbol(html$.WeekInputElement.name + "." + 'readOnly'.toString());
const required$2 = Symbol(html$.WeekInputElement.name + "." + 'required'.toString());
html$.WeekInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setSignature(html$.WeekInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.WeekInputElement, [])}),
  fields: () => ({
    valueAsDate: core.DateTime,
    readOnly: core.bool,
    required: core.bool
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.WeekInputElement, [
  'valueAsDate',
  'valueAsDate',
  'readOnly',
  'readOnly',
  'required',
  'required'
]);
dart.defineExtensionNames([
  'valueAsDate',
  'readOnly',
  'required'
]);
html$.TimeInputElement = class TimeInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'time'});
  }
  get valueAsDate() {
    return this[valueAsDate$1];
  }
  set valueAsDate(value) {
    this[valueAsDate$1] = value;
  }
  get readOnly() {
    return this[readOnly$3];
  }
  set readOnly(value) {
    this[readOnly$3] = value;
  }
  get required() {
    return this[required$3];
  }
  set required(value) {
    this[required$3] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'time'})[dartx.type] == 'time';
  }
};
const valueAsDate$1 = Symbol(html$.TimeInputElement.name + "." + 'valueAsDate'.toString());
const readOnly$3 = Symbol(html$.TimeInputElement.name + "." + 'readOnly'.toString());
const required$3 = Symbol(html$.TimeInputElement.name + "." + 'required'.toString());
html$.TimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setSignature(html$.TimeInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.TimeInputElement, [])}),
  fields: () => ({
    valueAsDate: core.DateTime,
    readOnly: core.bool,
    required: core.bool
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.TimeInputElement, [
  'valueAsDate',
  'valueAsDate',
  'readOnly',
  'readOnly',
  'required',
  'required'
]);
dart.defineExtensionNames([
  'readOnly',
  'required'
]);
html$.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'datetime-local'});
  }
  get readOnly() {
    return this[readOnly$4];
  }
  set readOnly(value) {
    this[readOnly$4] = value;
  }
  get required() {
    return this[required$4];
  }
  set required(value) {
    this[required$4] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
  }
};
const readOnly$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
const required$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'required'.toString());
html$.LocalDateTimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setSignature(html$.LocalDateTimeInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.LocalDateTimeInputElement, [])}),
  fields: () => ({
    readOnly: core.bool,
    required: core.bool
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.LocalDateTimeInputElement, ['readOnly', 'readOnly', 'required', 'required']);
dart.defineExtensionNames([
  'placeholder',
  'readOnly',
  'required'
]);
html$.NumberInputElement = class NumberInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'number'});
  }
  get placeholder() {
    return this[placeholder$0];
  }
  set placeholder(value) {
    this[placeholder$0] = value;
  }
  get readOnly() {
    return this[readOnly$5];
  }
  set readOnly(value) {
    this[readOnly$5] = value;
  }
  get required() {
    return this[required$5];
  }
  set required(value) {
    this[required$5] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: 'number'})[dartx.type] == 'number';
  }
};
const placeholder$0 = Symbol(html$.NumberInputElement.name + "." + 'placeholder'.toString());
const readOnly$5 = Symbol(html$.NumberInputElement.name + "." + 'readOnly'.toString());
const required$5 = Symbol(html$.NumberInputElement.name + "." + 'required'.toString());
html$.NumberInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setSignature(html$.NumberInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.NumberInputElement, [])}),
  fields: () => ({
    placeholder: core.String,
    readOnly: core.bool,
    required: core.bool
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionMembers(html$.NumberInputElement, [
  'placeholder',
  'placeholder',
  'readOnly',
  'readOnly',
  'required',
  'required'
]);
html$.RangeInputElement = class RangeInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'range'});
  }
  static get supported() {
    return html$.InputElement.new({type: 'range'})[dartx.type] == 'range';
  }
};
html$.RangeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setSignature(html$.RangeInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.RangeInputElement, [])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineExtensionNames([
  'checked',
  'required'
]);
html$.CheckboxInputElement = class CheckboxInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'checkbox'});
  }
  get checked() {
    return this[checked];
  }
  set checked(value) {
    this[checked] = value;
  }
  get required() {
    return this[required$6];
  }
  set required(value) {
    this[required$6] = value;
  }
};
const checked = Symbol(html$.CheckboxInputElement.name + "." + 'checked'.toString());
const required$6 = Symbol(html$.CheckboxInputElement.name + "." + 'required'.toString());
html$.CheckboxInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.CheckboxInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.CheckboxInputElement, [])}),
  fields: () => ({
    checked: core.bool,
    required: core.bool
  })
});
dart.defineExtensionMembers(html$.CheckboxInputElement, ['checked', 'checked', 'required', 'required']);
dart.defineExtensionNames([
  'checked',
  'required'
]);
html$.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'radio'});
  }
  get checked() {
    return this[checked$];
  }
  set checked(value) {
    this[checked$] = value;
  }
  get required() {
    return this[required$7];
  }
  set required(value) {
    this[required$7] = value;
  }
};
const checked$ = Symbol(html$.RadioButtonInputElement.name + "." + 'checked'.toString());
const required$7 = Symbol(html$.RadioButtonInputElement.name + "." + 'required'.toString());
html$.RadioButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.RadioButtonInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.RadioButtonInputElement, [])}),
  fields: () => ({
    checked: core.bool,
    required: core.bool
  })
});
dart.defineExtensionMembers(html$.RadioButtonInputElement, ['checked', 'checked', 'required', 'required']);
dart.defineExtensionNames([
  'accept',
  'multiple',
  'required',
  'files'
]);
html$.FileUploadInputElement = class FileUploadInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'file'});
  }
  get accept() {
    return this[accept];
  }
  set accept(value) {
    this[accept] = value;
  }
  get multiple() {
    return this[multiple$];
  }
  set multiple(value) {
    this[multiple$] = value;
  }
  get required() {
    return this[required$8];
  }
  set required(value) {
    this[required$8] = value;
  }
  get files() {
    return this[files];
  }
  set files(value) {
    this[files] = value;
  }
};
const accept = Symbol(html$.FileUploadInputElement.name + "." + 'accept'.toString());
const multiple$ = Symbol(html$.FileUploadInputElement.name + "." + 'multiple'.toString());
const required$8 = Symbol(html$.FileUploadInputElement.name + "." + 'required'.toString());
const files = Symbol(html$.FileUploadInputElement.name + "." + 'files'.toString());
html$.FileUploadInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.FileUploadInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.FileUploadInputElement, [])}),
  fields: () => ({
    accept: core.String,
    multiple: core.bool,
    required: core.bool,
    files: ListOfFile()
  })
});
dart.defineExtensionMembers(html$.FileUploadInputElement, [
  'accept',
  'accept',
  'multiple',
  'multiple',
  'required',
  'required',
  'files',
  'files'
]);
dart.defineExtensionNames([
  'formAction',
  'formEnctype',
  'formMethod',
  'formNoValidate',
  'formTarget'
]);
html$.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'submit'});
  }
  get formAction() {
    return this[formAction];
  }
  set formAction(value) {
    this[formAction] = value;
  }
  get formEnctype() {
    return this[formEnctype];
  }
  set formEnctype(value) {
    this[formEnctype] = value;
  }
  get formMethod() {
    return this[formMethod];
  }
  set formMethod(value) {
    this[formMethod] = value;
  }
  get formNoValidate() {
    return this[formNoValidate];
  }
  set formNoValidate(value) {
    this[formNoValidate] = value;
  }
  get formTarget() {
    return this[formTarget];
  }
  set formTarget(value) {
    this[formTarget] = value;
  }
};
const formAction = Symbol(html$.SubmitButtonInputElement.name + "." + 'formAction'.toString());
const formEnctype = Symbol(html$.SubmitButtonInputElement.name + "." + 'formEnctype'.toString());
const formMethod = Symbol(html$.SubmitButtonInputElement.name + "." + 'formMethod'.toString());
const formNoValidate = Symbol(html$.SubmitButtonInputElement.name + "." + 'formNoValidate'.toString());
const formTarget = Symbol(html$.SubmitButtonInputElement.name + "." + 'formTarget'.toString());
html$.SubmitButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.SubmitButtonInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.SubmitButtonInputElement, [])}),
  fields: () => ({
    formAction: core.String,
    formEnctype: core.String,
    formMethod: core.String,
    formNoValidate: core.bool,
    formTarget: core.String
  })
});
dart.defineExtensionMembers(html$.SubmitButtonInputElement, [
  'formAction',
  'formAction',
  'formEnctype',
  'formEnctype',
  'formMethod',
  'formMethod',
  'formNoValidate',
  'formNoValidate',
  'formTarget',
  'formTarget'
]);
dart.defineExtensionNames([
  'alt',
  'formAction',
  'formEnctype',
  'formMethod',
  'formNoValidate',
  'formTarget',
  'height',
  'src',
  'width'
]);
html$.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'image'});
  }
  get alt() {
    return this[alt];
  }
  set alt(value) {
    this[alt] = value;
  }
  get formAction() {
    return this[formAction$];
  }
  set formAction(value) {
    this[formAction$] = value;
  }
  get formEnctype() {
    return this[formEnctype$];
  }
  set formEnctype(value) {
    this[formEnctype$] = value;
  }
  get formMethod() {
    return this[formMethod$];
  }
  set formMethod(value) {
    this[formMethod$] = value;
  }
  get formNoValidate() {
    return this[formNoValidate$];
  }
  set formNoValidate(value) {
    this[formNoValidate$] = value;
  }
  get formTarget() {
    return this[formTarget$];
  }
  set formTarget(value) {
    this[formTarget$] = value;
  }
  get height() {
    return this[height];
  }
  set height(value) {
    this[height] = value;
  }
  get src() {
    return this[src];
  }
  set src(value) {
    this[src] = value;
  }
  get width() {
    return this[width];
  }
  set width(value) {
    this[width] = value;
  }
};
const alt = Symbol(html$.ImageButtonInputElement.name + "." + 'alt'.toString());
const formAction$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formAction'.toString());
const formEnctype$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formEnctype'.toString());
const formMethod$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formMethod'.toString());
const formNoValidate$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formNoValidate'.toString());
const formTarget$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formTarget'.toString());
const height = Symbol(html$.ImageButtonInputElement.name + "." + 'height'.toString());
const src = Symbol(html$.ImageButtonInputElement.name + "." + 'src'.toString());
const width = Symbol(html$.ImageButtonInputElement.name + "." + 'width'.toString());
html$.ImageButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.ImageButtonInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.ImageButtonInputElement, [])}),
  fields: () => ({
    alt: core.String,
    formAction: core.String,
    formEnctype: core.String,
    formMethod: core.String,
    formNoValidate: core.bool,
    formTarget: core.String,
    height: core.int,
    src: core.String,
    width: core.int
  })
});
dart.defineExtensionMembers(html$.ImageButtonInputElement, [
  'alt',
  'alt',
  'formAction',
  'formAction',
  'formEnctype',
  'formEnctype',
  'formMethod',
  'formMethod',
  'formNoValidate',
  'formNoValidate',
  'formTarget',
  'formTarget',
  'height',
  'height',
  'src',
  'src',
  'width',
  'width'
]);
html$.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'reset'});
  }
};
html$.ResetButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.ResetButtonInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.ResetButtonInputElement, [])})
});
html$.ButtonInputElement = class ButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: 'button'});
  }
};
html$.ButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setSignature(html$.ButtonInputElement, {
  constructors: () => ({new: dart.definiteFunctionType(html$.ButtonInputElement, [])})
});
const _initKeyboardEvent = Symbol('_initKeyboardEvent');
const _keyIdentifier = Symbol('_keyIdentifier');
dart.defineExtensionNames([
  'keyCode',
  'charCode',
  'which',
  'getModifierState',
  'altKey',
  'code',
  'ctrlKey',
  'key',
  'keyLocation',
  'location',
  'metaKey',
  'repeat',
  'shiftKey'
]);
html$.KeyboardEvent = class KeyboardEvent extends html$.UIEvent {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.KeyboardEvent._check(html$.document[_createEvent]("KeyboardEvent"));
    e[_initKeyboardEvent](type, canBubble, cancelable, view, "", keyLocation, ctrlKey, altKey, shiftKey, metaKey);
    return e;
  }
  [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
    if (typeof this.initKeyEvent == "function") {
      this.initKeyEvent(type, canBubble, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, 0, 0);
    } else {
      this.initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
    }
  }
  get [dartx.keyCode]() {
    return this[_keyCode];
  }
  get [dartx.charCode]() {
    return this[_charCode];
  }
  get [dartx.which]() {
    return this[_which];
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.KeyboardEvent._create_1(type, eventInitDict_1);
    }
    return html$.KeyboardEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.KeyboardEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.KeyboardEvent(type);
  }
  get [dartx.altKey]() {
    return this.altKey;
  }
  get [dartx.code]() {
    return this.code;
  }
  get [dartx.ctrlKey]() {
    return this.ctrlKey;
  }
  get [dartx.key]() {
    return this.key;
  }
  get [_keyIdentifier]() {
    return this.keyIdentifier;
  }
  get [dartx.keyLocation]() {
    return this.keyLocation;
  }
  get [dartx.location]() {
    return this.location;
  }
  get [dartx.metaKey]() {
    return this.metaKey;
  }
  get [dartx.repeat]() {
    return this.repeat;
  }
  get [dartx.shiftKey]() {
    return this.shiftKey;
  }
  [dartx.getModifierState](...args) {
    return this.getModifierState.apply(this, args);
  }
};
dart.setSignature(html$.KeyboardEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
    _: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.altKey]: core.bool,
    [dartx.code]: core.String,
    [dartx.ctrlKey]: core.bool,
    [dartx.key]: core.String,
    [_keyIdentifier]: core.String,
    [dartx.keyLocation]: core.int,
    [dartx.location]: core.int,
    [dartx.metaKey]: core.bool,
    [dartx.repeat]: core.bool,
    [dartx.shiftKey]: core.bool
  }),
  getters: () => ({
    [dartx.keyCode]: dart.definiteFunctionType(core.int, []),
    [dartx.charCode]: dart.definiteFunctionType(core.int, []),
    [dartx.which]: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
    [dartx.getModifierState]: dart.definiteFunctionType(core.bool, [core.String])
  }),
  sfields: () => ({
    DOM_KEY_LOCATION_LEFT: core.int,
    DOM_KEY_LOCATION_NUMPAD: core.int,
    DOM_KEY_LOCATION_RIGHT: core.int,
    DOM_KEY_LOCATION_STANDARD: core.int
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
html$.KeyboardEvent.DOM_KEY_LOCATION_LEFT = 1;
html$.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD = 3;
html$.KeyboardEvent.DOM_KEY_LOCATION_RIGHT = 2;
html$.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0;
dart.registerExtension(dart.global.KeyboardEvent, html$.KeyboardEvent);
html$.KeyframeEffect = class KeyframeEffect extends html$.AnimationEffectReadOnly {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(target, keyframes, timing) {
    if (timing === void 0) timing = null;
    if (ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null) && timing == null) {
      return html$.KeyframeEffect._create_1(target, keyframes);
    }
    if (typeof timing == 'number' && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
      return html$.KeyframeEffect._create_2(target, keyframes, timing);
    }
    if (core.Map.is(timing) && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
      let timing_1 = html_common.convertDartToNative_Dictionary(timing);
      return html$.KeyframeEffect._create_3(target, keyframes, timing_1);
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  static _create_1(target, keyframes) {
    return new self.KeyframeEffect(target, keyframes);
  }
  static _create_2(target, keyframes, timing) {
    return new self.KeyframeEffect(target, keyframes, timing);
  }
  static _create_3(target, keyframes, timing) {
    return new self.KeyframeEffect(target, keyframes, timing);
  }
};
dart.setSignature(html$.KeyframeEffect, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.KeyframeEffect, []),
    new: dart.definiteFunctionType(html$.KeyframeEffect, [html$.Element, ListOfMap()], [dart.dynamic])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_3']
});
dart.registerExtension(dart.global.KeyframeEffect, html$.KeyframeEffect);
dart.defineExtensionNames([
  'checkValidity',
  'reportValidity',
  'setCustomValidity',
  'autofocus',
  'challenge',
  'disabled',
  'form',
  'keytype',
  'labels',
  'name',
  'type',
  'validationMessage',
  'validity',
  'willValidate'
]);
html$.KeygenElement = class KeygenElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.KeygenElement._check(html$.document[dartx.createElement]("keygen"));
  }
  created() {
    this[dartx.autofocus] = null;
    this[dartx.challenge] = null;
    this[dartx.disabled] = null;
    this[dartx.form] = null;
    this[dartx.keytype] = null;
    this[dartx.labels] = null;
    this[dartx.name] = null;
    this[dartx.type] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.willValidate] = null;
    super.created();
  }
  static get supported() {
    return dart.test(html$.Element.isTagSupported('keygen')) && html$.KeygenElement.is(html$.Element.tag('keygen'));
  }
  get [dartx.autofocus]() {
    return this.autofocus;
  }
  set [dartx.autofocus](value) {
    this.autofocus = value;
  }
  get [dartx.challenge]() {
    return this.challenge;
  }
  set [dartx.challenge](value) {
    this.challenge = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.keytype]() {
    return this.keytype;
  }
  set [dartx.keytype](value) {
    this.keytype = value;
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.KeygenElement, 'created');
dart.setSignature(html$.KeygenElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.KeygenElement, []),
    new: dart.definiteFunctionType(html$.KeygenElement, []),
    created: dart.definiteFunctionType(html$.KeygenElement, [])
  }),
  fields: () => ({
    [dartx.autofocus]: core.bool,
    [dartx.challenge]: core.String,
    [dartx.disabled]: core.bool,
    [dartx.form]: html$.FormElement,
    [dartx.keytype]: core.String,
    [dartx.labels]: ListOfNode(),
    [dartx.name]: core.String,
    [dartx.type]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.willValidate]: core.bool
  }),
  methods: () => ({
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLKeygenElement, html$.KeygenElement);
dart.defineExtensionNames([
  'value'
]);
html$.LIElement = class LIElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.LIElement._check(html$.document[dartx.createElement]("li"));
  }
  created() {
    this[dartx.value] = null;
    super.created();
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.defineNamedConstructor(html$.LIElement, 'created');
dart.setSignature(html$.LIElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.LIElement, []),
    new: dart.definiteFunctionType(html$.LIElement, []),
    created: dart.definiteFunctionType(html$.LIElement, [])
  }),
  fields: () => ({[dartx.value]: core.int})
});
dart.registerExtension(dart.global.HTMLLIElement, html$.LIElement);
dart.defineExtensionNames([
  'control',
  'form',
  'htmlFor'
]);
html$.LabelElement = class LabelElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.LabelElement._check(html$.document[dartx.createElement]("label"));
  }
  created() {
    this[dartx.control] = null;
    this[dartx.form] = null;
    this[dartx.htmlFor] = null;
    super.created();
  }
  get [dartx.control]() {
    return this.control;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.htmlFor]() {
    return this.htmlFor;
  }
  set [dartx.htmlFor](value) {
    this.htmlFor = value;
  }
};
dart.defineNamedConstructor(html$.LabelElement, 'created');
dart.setSignature(html$.LabelElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.LabelElement, []),
    new: dart.definiteFunctionType(html$.LabelElement, []),
    created: dart.definiteFunctionType(html$.LabelElement, [])
  }),
  fields: () => ({
    [dartx.control]: html$.HtmlElement,
    [dartx.form]: html$.FormElement,
    [dartx.htmlFor]: core.String
  })
});
dart.registerExtension(dart.global.HTMLLabelElement, html$.LabelElement);
dart.defineExtensionNames([
  'form'
]);
html$.LegendElement = class LegendElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.LegendElement._check(html$.document[dartx.createElement]("legend"));
  }
  created() {
    this[dartx.form] = null;
    super.created();
  }
  get [dartx.form]() {
    return this.form;
  }
};
dart.defineNamedConstructor(html$.LegendElement, 'created');
dart.setSignature(html$.LegendElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.LegendElement, []),
    new: dart.definiteFunctionType(html$.LegendElement, []),
    created: dart.definiteFunctionType(html$.LegendElement, [])
  }),
  fields: () => ({[dartx.form]: html$.FormElement})
});
dart.registerExtension(dart.global.HTMLLegendElement, html$.LegendElement);
dart.defineExtensionNames([
  'supportsImport',
  'crossOrigin',
  'disabled',
  'href',
  'hreflang',
  'import',
  'integrity',
  'media',
  'rel',
  'sheet',
  'sizes',
  'type'
]);
html$.LinkElement = class LinkElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.LinkElement._check(html$.document[dartx.createElement]("link"));
  }
  created() {
    this[dartx.crossOrigin] = null;
    this[dartx.disabled] = null;
    this[dartx.href] = null;
    this[dartx.hreflang] = null;
    this[dartx.import] = null;
    this[dartx.integrity] = null;
    this[dartx.media] = null;
    this[dartx.rel] = null;
    this[dartx.sheet] = null;
    this[dartx.sizes] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.crossOrigin]() {
    return this.crossOrigin;
  }
  set [dartx.crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.href]() {
    return this.href;
  }
  set [dartx.href](value) {
    this.href = value;
  }
  get [dartx.hreflang]() {
    return this.hreflang;
  }
  set [dartx.hreflang](value) {
    this.hreflang = value;
  }
  get [dartx.import]() {
    return this.import;
  }
  get [dartx.integrity]() {
    return this.integrity;
  }
  set [dartx.integrity](value) {
    this.integrity = value;
  }
  get [dartx.media]() {
    return this.media;
  }
  set [dartx.media](value) {
    this.media = value;
  }
  get [dartx.rel]() {
    return this.rel;
  }
  set [dartx.rel](value) {
    this.rel = value;
  }
  get [dartx.sheet]() {
    return this.sheet;
  }
  get [dartx.sizes]() {
    return this.sizes;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  get [dartx.supportsImport]() {
    return "import" in this;
  }
};
dart.defineNamedConstructor(html$.LinkElement, 'created');
dart.setSignature(html$.LinkElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.LinkElement, []),
    new: dart.definiteFunctionType(html$.LinkElement, []),
    created: dart.definiteFunctionType(html$.LinkElement, [])
  }),
  fields: () => ({
    [dartx.crossOrigin]: core.String,
    [dartx.disabled]: core.bool,
    [dartx.href]: core.String,
    [dartx.hreflang]: core.String,
    [dartx.import]: html$.Document,
    [dartx.integrity]: core.String,
    [dartx.media]: core.String,
    [dartx.rel]: core.String,
    [dartx.sheet]: html$.StyleSheet,
    [dartx.sizes]: html$.DomSettableTokenList,
    [dartx.type]: core.String
  }),
  getters: () => ({[dartx.supportsImport]: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLLinkElement, html$.LinkElement);
dart.defineExtensionNames([
  'assign',
  'reload',
  'replace',
  'origin',
  'toString',
  'ancestorOrigins',
  'hash',
  'host',
  'hostname',
  'href',
  'pathname',
  'port',
  'protocol',
  'search'
]);
html$.Location = class Location extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.ancestorOrigins]() {
    return this.ancestorOrigins;
  }
  get [dartx.hash]() {
    return this.hash;
  }
  set [dartx.hash](value) {
    this.hash = value;
  }
  get [dartx.host]() {
    return this.host;
  }
  set [dartx.host](value) {
    this.host = value;
  }
  get [dartx.hostname]() {
    return this.hostname;
  }
  set [dartx.hostname](value) {
    this.hostname = value;
  }
  get [dartx.href]() {
    return this.href;
  }
  set [dartx.href](value) {
    this.href = value;
  }
  get [dartx.pathname]() {
    return this.pathname;
  }
  set [dartx.pathname](value) {
    this.pathname = value;
  }
  get [dartx.port]() {
    return this.port;
  }
  set [dartx.port](value) {
    this.port = value;
  }
  get [dartx.protocol]() {
    return this.protocol;
  }
  set [dartx.protocol](value) {
    this.protocol = value;
  }
  get [dartx.search]() {
    return this.search;
  }
  set [dartx.search](value) {
    this.search = value;
  }
  [dartx.assign](...args) {
    return this.assign.apply(this, args);
  }
  [dartx.reload](...args) {
    return this.reload.apply(this, args);
  }
  [dartx.replace](...args) {
    return this.replace.apply(this, args);
  }
  get [dartx.origin]() {
    if ("origin" in this) {
      return this.origin;
    }
    return dart.str`${this[dartx.protocol]}//${this[dartx.host]}`;
  }
  [dartx.toString]() {
    return String(this);
  }
};
html$.Location[dart.implements] = () => [html$.LocationBase];
dart.setSignature(html$.Location, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Location, [])}),
  fields: () => ({
    [dartx.ancestorOrigins]: ListOfString(),
    [dartx.hash]: core.String,
    [dartx.host]: core.String,
    [dartx.hostname]: core.String,
    [dartx.href]: core.String,
    [dartx.pathname]: core.String,
    [dartx.port]: core.String,
    [dartx.protocol]: core.String,
    [dartx.search]: core.String
  }),
  getters: () => ({[dartx.origin]: dart.definiteFunctionType(core.String, [])}),
  methods: () => ({
    [dartx.assign]: dart.definiteFunctionType(dart.void, [], [core.String]),
    [dartx.reload]: dart.definiteFunctionType(dart.void, []),
    [dartx.replace]: dart.definiteFunctionType(dart.void, [core.String])
  })
});
dart.registerExtension(dart.global.Location, html$.Location);
dart.defineExtensionNames([
  'areas',
  'name'
]);
html$.MapElement = class MapElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.MapElement._check(html$.document[dartx.createElement]("map"));
  }
  created() {
    this[dartx.areas] = null;
    this[dartx.name] = null;
    super.created();
  }
  get [dartx.areas]() {
    return this.areas;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
};
dart.defineNamedConstructor(html$.MapElement, 'created');
dart.setSignature(html$.MapElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MapElement, []),
    new: dart.definiteFunctionType(html$.MapElement, []),
    created: dart.definiteFunctionType(html$.MapElement, [])
  }),
  fields: () => ({
    [dartx.areas]: ListOfNode(),
    [dartx.name]: core.String
  })
});
dart.registerExtension(dart.global.HTMLMapElement, html$.MapElement);
dart.defineExtensionNames([
  'pause',
  'play',
  'unpause',
  'buffered',
  'currentTime',
  'defaultPlaybackRate',
  'duration',
  'muted',
  'paused',
  'playbackRate',
  'playbackState',
  'played',
  'seekable',
  'volume'
]);
html$.MediaController = class MediaController extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.MediaController._create_1();
  }
  static _create_1() {
    return new self.MediaController();
  }
  get [dartx.buffered]() {
    return this.buffered;
  }
  get [dartx.currentTime]() {
    return this.currentTime;
  }
  set [dartx.currentTime](value) {
    this.currentTime = value;
  }
  get [dartx.defaultPlaybackRate]() {
    return this.defaultPlaybackRate;
  }
  set [dartx.defaultPlaybackRate](value) {
    this.defaultPlaybackRate = value;
  }
  get [dartx.duration]() {
    return this.duration;
  }
  get [dartx.muted]() {
    return this.muted;
  }
  set [dartx.muted](value) {
    this.muted = value;
  }
  get [dartx.paused]() {
    return this.paused;
  }
  get [dartx.playbackRate]() {
    return this.playbackRate;
  }
  set [dartx.playbackRate](value) {
    this.playbackRate = value;
  }
  get [dartx.playbackState]() {
    return this.playbackState;
  }
  get [dartx.played]() {
    return this.played;
  }
  get [dartx.seekable]() {
    return this.seekable;
  }
  get [dartx.volume]() {
    return this.volume;
  }
  set [dartx.volume](value) {
    this.volume = value;
  }
  [dartx.pause](...args) {
    return this.pause.apply(this, args);
  }
  [dartx.play](...args) {
    return this.play.apply(this, args);
  }
  [dartx.unpause](...args) {
    return this.unpause.apply(this, args);
  }
};
dart.setSignature(html$.MediaController, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaController, []),
    new: dart.definiteFunctionType(html$.MediaController, [])
  }),
  fields: () => ({
    [dartx.buffered]: html$.TimeRanges,
    [dartx.currentTime]: core.num,
    [dartx.defaultPlaybackRate]: core.num,
    [dartx.duration]: core.double,
    [dartx.muted]: core.bool,
    [dartx.paused]: core.bool,
    [dartx.playbackRate]: core.num,
    [dartx.playbackState]: core.String,
    [dartx.played]: html$.TimeRanges,
    [dartx.seekable]: html$.TimeRanges,
    [dartx.volume]: core.num
  }),
  methods: () => ({
    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
    [dartx.play]: dart.definiteFunctionType(dart.void, []),
    [dartx.unpause]: dart.definiteFunctionType(dart.void, [])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaController, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.MediaController, html$.MediaController);
dart.defineExtensionNames([
  'deviceId',
  'groupId',
  'kind',
  'label'
]);
html$.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.deviceId]() {
    return this.deviceId;
  }
  get [dartx.groupId]() {
    return this.groupId;
  }
  get [dartx.kind]() {
    return this.kind;
  }
  get [dartx.label]() {
    return this.label;
  }
};
dart.setSignature(html$.MediaDeviceInfo, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaDeviceInfo, [])}),
  fields: () => ({
    [dartx.deviceId]: core.String,
    [dartx.groupId]: core.String,
    [dartx.kind]: core.String,
    [dartx.label]: core.String
  })
});
dart.registerExtension(dart.global.MediaDeviceInfo, html$.MediaDeviceInfo);
const _getUserMedia_1 = Symbol('_getUserMedia_1');
dart.defineExtensionNames([
  'enumerateDevices',
  'getUserMedia'
]);
html$.MediaDevices = class MediaDevices extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.enumerateDevices](...args) {
    return this.enumerateDevices.apply(this, args);
  }
  [dartx.getUserMedia](options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    return this[_getUserMedia_1](options_1);
  }
  [_getUserMedia_1](...args) {
    return this.getUserMedia.apply(this, args);
  }
};
dart.setSignature(html$.MediaDevices, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaDevices, [])}),
  methods: () => ({
    [dartx.enumerateDevices]: dart.definiteFunctionType(async.Future, []),
    [dartx.getUserMedia]: dart.definiteFunctionType(async.Future, [core.Map]),
    [_getUserMedia_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.MediaDevices, html$.MediaDevices);
dart.defineExtensionNames([
  'initData',
  'initDataType'
]);
html$.MediaEncryptedEvent = class MediaEncryptedEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaEncryptedEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaEncryptedEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.MediaEncryptedEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.MediaEncryptedEvent(type);
  }
  get [dartx.initData]() {
    return this.initData;
  }
  get [dartx.initDataType]() {
    return this.initDataType;
  }
};
dart.setSignature(html$.MediaEncryptedEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaEncryptedEvent, []),
    new: dart.definiteFunctionType(html$.MediaEncryptedEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.initData]: typed_data.ByteBuffer,
    [dartx.initDataType]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MediaEncryptedEvent, html$.MediaEncryptedEvent);
dart.defineExtensionNames([
  'code'
]);
html$.MediaError = class MediaError extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.code]() {
    return this.code;
  }
};
dart.setSignature(html$.MediaError, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaError, [])}),
  fields: () => ({[dartx.code]: core.int}),
  sfields: () => ({
    MEDIA_ERR_ABORTED: core.int,
    MEDIA_ERR_DECODE: core.int,
    MEDIA_ERR_NETWORK: core.int,
    MEDIA_ERR_SRC_NOT_SUPPORTED: core.int
  })
});
html$.MediaError.MEDIA_ERR_ABORTED = 1;
html$.MediaError.MEDIA_ERR_DECODE = 3;
html$.MediaError.MEDIA_ERR_NETWORK = 2;
html$.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
dart.registerExtension(dart.global.MediaError, html$.MediaError);
dart.defineExtensionNames([
  'code',
  'systemCode'
]);
html$.MediaKeyError = class MediaKeyError extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.code]() {
    return this.code;
  }
  get [dartx.systemCode]() {
    return this.systemCode;
  }
};
dart.setSignature(html$.MediaKeyError, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyError, [])}),
  fields: () => ({
    [dartx.code]: core.int,
    [dartx.systemCode]: core.int
  }),
  sfields: () => ({
    MEDIA_KEYERR_CLIENT: core.int,
    MEDIA_KEYERR_DOMAIN: core.int,
    MEDIA_KEYERR_HARDWARECHANGE: core.int,
    MEDIA_KEYERR_OUTPUT: core.int,
    MEDIA_KEYERR_SERVICE: core.int,
    MEDIA_KEYERR_UNKNOWN: core.int
  })
});
html$.MediaKeyError.MEDIA_KEYERR_CLIENT = 2;
html$.MediaKeyError.MEDIA_KEYERR_DOMAIN = 6;
html$.MediaKeyError.MEDIA_KEYERR_HARDWARECHANGE = 5;
html$.MediaKeyError.MEDIA_KEYERR_OUTPUT = 4;
html$.MediaKeyError.MEDIA_KEYERR_SERVICE = 3;
html$.MediaKeyError.MEDIA_KEYERR_UNKNOWN = 1;
dart.registerExtension(dart.global.MediaKeyError, html$.MediaKeyError);
dart.defineExtensionNames([
  'defaultUrl',
  'errorCode',
  'initData',
  'keySystem',
  'message',
  'sessionId',
  'systemCode'
]);
html$.MediaKeyEvent = class MediaKeyEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaKeyEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaKeyEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.MediaKeyEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.MediaKeyEvent(type);
  }
  get [dartx.defaultUrl]() {
    return this.defaultURL;
  }
  get [dartx.errorCode]() {
    return this.errorCode;
  }
  get [dartx.initData]() {
    return this.initData;
  }
  get [dartx.keySystem]() {
    return this.keySystem;
  }
  get [dartx.message]() {
    return this.message;
  }
  get [dartx.sessionId]() {
    return this.sessionId;
  }
  get [dartx.systemCode]() {
    return this.systemCode;
  }
};
dart.setSignature(html$.MediaKeyEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaKeyEvent, []),
    new: dart.definiteFunctionType(html$.MediaKeyEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.defaultUrl]: core.String,
    [dartx.errorCode]: html$.MediaKeyError,
    [dartx.initData]: typed_data.Uint8List,
    [dartx.keySystem]: core.String,
    [dartx.message]: typed_data.Uint8List,
    [dartx.sessionId]: core.String,
    [dartx.systemCode]: core.int
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MediaKeyEvent, html$.MediaKeyEvent);
dart.defineExtensionNames([
  'message',
  'messageType'
]);
html$.MediaKeyMessageEvent = class MediaKeyMessageEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaKeyMessageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.MediaKeyMessageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.MediaKeyMessageEvent(type);
  }
  get [dartx.message]() {
    return this.message;
  }
  get [dartx.messageType]() {
    return this.messageType;
  }
};
dart.setSignature(html$.MediaKeyMessageEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaKeyMessageEvent, []),
    new: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.message]: typed_data.ByteBuffer,
    [dartx.messageType]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MediaKeyMessageEvent, html$.MediaKeyMessageEvent);
const _update$ = Symbol('_update');
dart.defineExtensionNames([
  'close',
  'generateRequest',
  'load',
  'remove',
  'closed',
  'expiration',
  'keyStatuses',
  'sessionId'
]);
html$.MediaKeySession = class MediaKeySession extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.closed]() {
    return this.closed;
  }
  get [dartx.expiration]() {
    return this.expiration;
  }
  get [dartx.keyStatuses]() {
    return this.keyStatuses;
  }
  get [dartx.sessionId]() {
    return this.sessionId;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.generateRequest](...args) {
    return this.generateRequest.apply(this, args);
  }
  [dartx.load](...args) {
    return this.load.apply(this, args);
  }
  [dartx.remove](...args) {
    return this.remove.apply(this, args);
  }
  [_update$](...args) {
    return this.update.apply(this, args);
  }
};
dart.setSignature(html$.MediaKeySession, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySession, [])}),
  fields: () => ({
    [dartx.closed]: async.Future,
    [dartx.expiration]: core.double,
    [dartx.keyStatuses]: html$.MediaKeyStatusMap,
    [dartx.sessionId]: core.String
  }),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(async.Future, []),
    [dartx.generateRequest]: dart.definiteFunctionType(async.Future, [core.String, dart.dynamic]),
    [dartx.load]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.remove]: dart.definiteFunctionType(async.Future, []),
    [_update$]: dart.definiteFunctionType(async.Future, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.MediaKeySession, html$.MediaKeySession);
dart.defineExtensionNames([
  'size'
]);
html$.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.size]() {
    return this.size;
  }
};
dart.setSignature(html$.MediaKeyStatusMap, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyStatusMap, [])}),
  fields: () => ({[dartx.size]: core.int})
});
dart.registerExtension(dart.global.MediaKeyStatusMap, html$.MediaKeyStatusMap);
const _getConfiguration_1 = Symbol('_getConfiguration_1');
dart.defineExtensionNames([
  'createMediaKeys',
  'getConfiguration',
  'keySystem'
]);
html$.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.keySystem]() {
    return this.keySystem;
  }
  [dartx.createMediaKeys](...args) {
    return this.createMediaKeys.apply(this, args);
  }
  [dartx.getConfiguration]() {
    return html_common.convertNativeToDart_Dictionary(this[_getConfiguration_1]());
  }
  [_getConfiguration_1](...args) {
    return this.getConfiguration.apply(this, args);
  }
};
dart.setSignature(html$.MediaKeySystemAccess, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySystemAccess, [])}),
  fields: () => ({[dartx.keySystem]: core.String}),
  methods: () => ({
    [dartx.createMediaKeys]: dart.definiteFunctionType(async.Future, []),
    [dartx.getConfiguration]: dart.definiteFunctionType(core.Map, []),
    [_getConfiguration_1]: dart.definiteFunctionType(dart.dynamic, [])
  })
});
dart.registerExtension(dart.global.MediaKeySystemAccess, html$.MediaKeySystemAccess);
const _createSession = Symbol('_createSession');
dart.defineExtensionNames([
  'setServerCertificate'
]);
html$.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [_createSession](...args) {
    return this.createSession.apply(this, args);
  }
  [dartx.setServerCertificate](...args) {
    return this.setServerCertificate.apply(this, args);
  }
};
dart.setSignature(html$.MediaKeys, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeys, [])}),
  methods: () => ({
    [_createSession]: dart.definiteFunctionType(html$.MediaKeySession, [], [core.String]),
    [dartx.setServerCertificate]: dart.definiteFunctionType(async.Future, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.MediaKeys, html$.MediaKeys);
dart.defineExtensionNames([
  'appendMedium',
  'deleteMedium',
  'item',
  'length',
  'mediaText'
]);
html$.MediaList = class MediaList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.mediaText]() {
    return this.mediaText;
  }
  set [dartx.mediaText](value) {
    this.mediaText = value;
  }
  [dartx.appendMedium](...args) {
    return this.appendMedium.apply(this, args);
  }
  [dartx.deleteMedium](...args) {
    return this.deleteMedium.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
dart.setSignature(html$.MediaList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaList, [])}),
  fields: () => ({
    [dartx.length]: core.int,
    [dartx.mediaText]: core.String
  }),
  methods: () => ({
    [dartx.appendMedium]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.deleteMedium]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
  })
});
dart.registerExtension(dart.global.MediaList, html$.MediaList);
dart.defineExtensionNames([
  'addListener',
  'removeListener',
  'onChange',
  'matches',
  'media'
]);
html$.MediaQueryList = class MediaQueryList extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.matches]() {
    return this.matches;
  }
  get [dartx.media]() {
    return this.media;
  }
  [dartx.addListener](...args) {
    return this.addListener.apply(this, args);
  }
  [dartx.removeListener](...args) {
    return this.removeListener.apply(this, args);
  }
  get [dartx.onChange]() {
    return html$.MediaQueryList.changeEvent.forTarget(this);
  }
};
dart.setSignature(html$.MediaQueryList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaQueryList, [])}),
  fields: () => ({
    [dartx.matches]: core.bool,
    [dartx.media]: core.String
  }),
  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.addListener]: dart.definiteFunctionType(dart.void, [html$.EventListener]),
    [dartx.removeListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])
  }),
  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.MediaQueryList, {
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  }
});
dart.registerExtension(dart.global.MediaQueryList, html$.MediaQueryList);
dart.defineExtensionNames([
  'matches',
  'media'
]);
html$.MediaQueryListEvent = class MediaQueryListEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaQueryListEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaQueryListEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.MediaQueryListEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.MediaQueryListEvent(type);
  }
  get [dartx.matches]() {
    return this.matches;
  }
  get [dartx.media]() {
    return this.media;
  }
};
dart.setSignature(html$.MediaQueryListEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaQueryListEvent, []),
    new: dart.definiteFunctionType(html$.MediaQueryListEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.matches]: core.bool,
    [dartx.media]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MediaQueryListEvent, html$.MediaQueryListEvent);
dart.defineExtensionNames([
  'activate',
  'deactivate'
]);
html$.MediaSession = class MediaSession extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.MediaSession._create_1();
  }
  static _create_1() {
    return new self.MediaSession();
  }
  [dartx.activate](...args) {
    return this.activate.apply(this, args);
  }
  [dartx.deactivate](...args) {
    return this.deactivate.apply(this, args);
  }
};
dart.setSignature(html$.MediaSession, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaSession, []),
    new: dart.definiteFunctionType(html$.MediaSession, [])
  }),
  methods: () => ({
    [dartx.activate]: dart.definiteFunctionType(dart.void, []),
    [dartx.deactivate]: dart.definiteFunctionType(dart.void, [])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaSession, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.MediaSession, html$.MediaSession);
dart.defineExtensionNames([
  'addSourceBuffer',
  'endOfStream',
  'removeSourceBuffer',
  'activeSourceBuffers',
  'duration',
  'readyState',
  'sourceBuffers'
]);
html$.MediaSource = class MediaSource extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.MediaSource._create_1();
  }
  static _create_1() {
    return new self.MediaSource();
  }
  static get supported() {
    return !!window.MediaSource;
  }
  get [dartx.activeSourceBuffers]() {
    return this.activeSourceBuffers;
  }
  get [dartx.duration]() {
    return this.duration;
  }
  set [dartx.duration](value) {
    this.duration = value;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.sourceBuffers]() {
    return this.sourceBuffers;
  }
  [dartx.addSourceBuffer](...args) {
    return this.addSourceBuffer.apply(this, args);
  }
  [dartx.endOfStream](...args) {
    return this.endOfStream.apply(this, args);
  }
  [dartx.removeSourceBuffer](...args) {
    return this.removeSourceBuffer.apply(this, args);
  }
};
dart.setSignature(html$.MediaSource, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaSource, []),
    new: dart.definiteFunctionType(html$.MediaSource, [])
  }),
  fields: () => ({
    [dartx.activeSourceBuffers]: html$.SourceBufferList,
    [dartx.duration]: core.num,
    [dartx.readyState]: core.String,
    [dartx.sourceBuffers]: html$.SourceBufferList
  }),
  methods: () => ({
    [dartx.addSourceBuffer]: dart.definiteFunctionType(html$.SourceBuffer, [core.String]),
    [dartx.endOfStream]: dart.definiteFunctionType(dart.void, [], [core.String]),
    [dartx.removeSourceBuffer]: dart.definiteFunctionType(dart.void, [html$.SourceBuffer])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MediaSource, []),
    isTypeSupported: dart.definiteFunctionType(core.bool, [core.String])
  }),
  names: ['_create_1', 'isTypeSupported']
});
dart.registerExtension(dart.global.MediaSource, html$.MediaSource);
dart.defineExtensionNames([
  'addTrack',
  'clone',
  'getAudioTracks',
  'getTrackById',
  'getTracks',
  'getVideoTracks',
  'removeTrack',
  'stop',
  'onAddTrack',
  'onEnded',
  'onRemoveTrack',
  'active',
  'ended',
  'id',
  'label'
]);
html$.MediaStream = class MediaStream extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(stream_OR_tracks) {
    if (stream_OR_tracks === void 0) stream_OR_tracks = null;
    if (stream_OR_tracks == null) {
      return html$.MediaStream._create_1();
    }
    if (html$.MediaStream.is(stream_OR_tracks) || stream_OR_tracks == null) {
      return html$.MediaStream._create_2(stream_OR_tracks);
    }
    if (ListOfMediaStreamTrack().is(stream_OR_tracks) || stream_OR_tracks == null) {
      return html$.MediaStream._create_3(stream_OR_tracks);
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  static _create_1() {
    return new self.MediaStream();
  }
  static _create_2(stream_OR_tracks) {
    return new self.MediaStream(stream_OR_tracks);
  }
  static _create_3(stream_OR_tracks) {
    return new self.MediaStream(stream_OR_tracks);
  }
  get [dartx.active]() {
    return this.active;
  }
  get [dartx.ended]() {
    return this.ended;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.label]() {
    return this.label;
  }
  [dartx.addTrack](...args) {
    return this.addTrack.apply(this, args);
  }
  [dartx.clone](...args) {
    return this.clone.apply(this, args);
  }
  [dartx.getAudioTracks](...args) {
    return this.getAudioTracks.apply(this, args);
  }
  [dartx.getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  [dartx.getTracks](...args) {
    return this.getTracks.apply(this, args);
  }
  [dartx.getVideoTracks](...args) {
    return this.getVideoTracks.apply(this, args);
  }
  [dartx.removeTrack](...args) {
    return this.removeTrack.apply(this, args);
  }
  [dartx.stop](...args) {
    return this.stop.apply(this, args);
  }
  get [dartx.onAddTrack]() {
    return html$.MediaStream.addTrackEvent.forTarget(this);
  }
  get [dartx.onEnded]() {
    return html$.MediaStream.endedEvent.forTarget(this);
  }
  get [dartx.onRemoveTrack]() {
    return html$.MediaStream.removeTrackEvent.forTarget(this);
  }
  static get supported() {
    return !!(html$.window[dartx.navigator].getUserMedia || html$.window[dartx.navigator].webkitGetUserMedia || html$.window[dartx.navigator].mozGetUserMedia || html$.window[dartx.navigator].msGetUserMedia);
  }
};
dart.setSignature(html$.MediaStream, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaStream, []),
    new: dart.definiteFunctionType(html$.MediaStream, [], [dart.dynamic])
  }),
  fields: () => ({
    [dartx.active]: core.bool,
    [dartx.ended]: core.bool,
    [dartx.id]: core.String,
    [dartx.label]: core.String
  }),
  getters: () => ({
    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onRemoveTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.addTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
    [dartx.clone]: dart.definiteFunctionType(html$.MediaStream, []),
    [dartx.getAudioTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
    [dartx.getTrackById]: dart.definiteFunctionType(html$.MediaStreamTrack, [core.String]),
    [dartx.getTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
    [dartx.getVideoTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
    [dartx.removeTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
    [dartx.stop]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    addTrackEvent: EventStreamProviderOfEvent(),
    endedEvent: EventStreamProviderOfEvent(),
    removeTrackEvent: EventStreamProviderOfEvent()
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MediaStream, []),
    _create_2: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_3']
});
dart.defineLazy(html$.MediaStream, {
  get addTrackEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('addtrack'));
  },
  get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ended'));
  },
  get removeTrackEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('removetrack'));
  }
});
dart.registerExtension(dart.global.MediaStream, html$.MediaStream);
dart.defineExtensionNames([
  'stream'
]);
html$.MediaStreamEvent = class MediaStreamEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaStreamEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaStreamEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.MediaStreamEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.MediaStreamEvent(type);
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported('MediaStreamEvent');
  }
  get [dartx.stream]() {
    return this.stream;
  }
};
dart.setSignature(html$.MediaStreamEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MediaStreamEvent, []),
    new: dart.definiteFunctionType(html$.MediaStreamEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.stream]: html$.MediaStream}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MediaStreamEvent, html$.MediaStreamEvent);
dart.defineExtensionNames([
  'clone',
  'stop',
  'onEnded',
  'onMute',
  'onUnmute',
  'enabled',
  'id',
  'kind',
  'label',
  'muted',
  'readyState'
]);
html$.MediaStreamTrack = class MediaStreamTrack extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.enabled]() {
    return this.enabled;
  }
  set [dartx.enabled](value) {
    this.enabled = value;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.kind]() {
    return this.kind;
  }
  get [dartx.label]() {
    return this.label;
  }
  get [dartx.muted]() {
    return this.muted;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  [dartx.clone](...args) {
    return this.clone.apply(this, args);
  }
  static getSources() {
    let completer = CompleterOfListOfSourceInfo().new();
    html$.MediaStreamTrack._getSources(dart.fn(value => {
      completer.complete(value);
    }, ListOfSourceInfoToNull()));
    return completer.future;
  }
  [dartx.stop](...args) {
    return this.stop.apply(this, args);
  }
  get [dartx.onEnded]() {
    return html$.MediaStreamTrack.endedEvent.forTarget(this);
  }
  get [dartx.onMute]() {
    return html$.MediaStreamTrack.muteEvent.forTarget(this);
  }
  get [dartx.onUnmute]() {
    return html$.MediaStreamTrack.unmuteEvent.forTarget(this);
  }
};
dart.setSignature(html$.MediaStreamTrack, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrack, [])}),
  fields: () => ({
    [dartx.enabled]: core.bool,
    [dartx.id]: core.String,
    [dartx.kind]: core.String,
    [dartx.label]: core.String,
    [dartx.muted]: core.bool,
    [dartx.readyState]: core.String
  }),
  getters: () => ({
    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMute]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onUnmute]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.clone]: dart.definiteFunctionType(html$.MediaStreamTrack, []),
    [dartx.stop]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    endedEvent: EventStreamProviderOfEvent(),
    muteEvent: EventStreamProviderOfEvent(),
    unmuteEvent: EventStreamProviderOfEvent()
  }),
  statics: () => ({
    _getSources: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrackSourcesCallback]),
    getSources: dart.definiteFunctionType(async.Future$(core.List$(html$.SourceInfo)), [])
  }),
  names: ['_getSources', 'getSources']
});
dart.defineLazy(html$.MediaStreamTrack, {
  get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ended'));
  },
  get muteEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('mute'));
  },
  get unmuteEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('unmute'));
  }
});
dart.registerExtension(dart.global.MediaStreamTrack, html$.MediaStreamTrack);
dart.defineExtensionNames([
  'track'
]);
html$.MediaStreamTrackEvent = class MediaStreamTrackEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported('MediaStreamTrackEvent');
  }
  get [dartx.track]() {
    return this.track;
  }
};
dart.setSignature(html$.MediaStreamTrackEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrackEvent, [])}),
  fields: () => ({[dartx.track]: html$.MediaStreamTrack}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.MediaStreamTrackEvent, html$.MediaStreamTrackEvent);
html$.MediaStreamTrackSourcesCallback = dart.typedef('MediaStreamTrackSourcesCallback', () => dart.functionType(dart.void, [ListOfSourceInfo()]));
dart.defineExtensionNames([
  'jsHeapSizeLimit',
  'totalJSHeapSize',
  'usedJSHeapSize'
]);
html$.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.jsHeapSizeLimit]() {
    return this.jsHeapSizeLimit;
  }
  get [dartx.totalJSHeapSize]() {
    return this.totalJSHeapSize;
  }
  get [dartx.usedJSHeapSize]() {
    return this.usedJSHeapSize;
  }
};
dart.setSignature(html$.MemoryInfo, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MemoryInfo, [])}),
  fields: () => ({
    [dartx.jsHeapSizeLimit]: core.int,
    [dartx.totalJSHeapSize]: core.int,
    [dartx.usedJSHeapSize]: core.int
  })
});
dart.registerExtension(dart.global.MemoryInfo, html$.MemoryInfo);
dart.defineExtensionNames([
  'label',
  'type'
]);
html$.MenuElement = class MenuElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.MenuElement._check(html$.document[dartx.createElement]("menu"));
  }
  created() {
    this[dartx.label] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.label]() {
    return this.label;
  }
  set [dartx.label](value) {
    this.label = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.defineNamedConstructor(html$.MenuElement, 'created');
dart.setSignature(html$.MenuElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MenuElement, []),
    new: dart.definiteFunctionType(html$.MenuElement, []),
    created: dart.definiteFunctionType(html$.MenuElement, [])
  }),
  fields: () => ({
    [dartx.label]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.HTMLMenuElement, html$.MenuElement);
dart.defineExtensionNames([
  'checked',
  'defaultValue',
  'disabled',
  'icon',
  'label',
  'radiogroup',
  'type'
]);
html$.MenuItemElement = class MenuItemElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.checked] = null;
    this[dartx.defaultValue] = null;
    this[dartx.disabled] = null;
    this[dartx.icon] = null;
    this[dartx.label] = null;
    this[dartx.radiogroup] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.checked]() {
    return this.checked;
  }
  set [dartx.checked](value) {
    this.checked = value;
  }
  get [dartx.defaultValue]() {
    return this.default;
  }
  set [dartx.defaultValue](value) {
    this.default = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.icon]() {
    return this.icon;
  }
  set [dartx.icon](value) {
    this.icon = value;
  }
  get [dartx.label]() {
    return this.label;
  }
  set [dartx.label](value) {
    this.label = value;
  }
  get [dartx.radiogroup]() {
    return this.radiogroup;
  }
  set [dartx.radiogroup](value) {
    this.radiogroup = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.defineNamedConstructor(html$.MenuItemElement, 'created');
dart.setSignature(html$.MenuItemElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MenuItemElement, []),
    created: dart.definiteFunctionType(html$.MenuItemElement, [])
  }),
  fields: () => ({
    [dartx.checked]: core.bool,
    [dartx.defaultValue]: core.bool,
    [dartx.disabled]: core.bool,
    [dartx.icon]: core.String,
    [dartx.label]: core.String,
    [dartx.radiogroup]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.HTMLMenuItemElement, html$.MenuItemElement);
dart.defineExtensionNames([
  'port1',
  'port2'
]);
html$.MessageChannel = class MessageChannel extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.port1]() {
    return this.port1;
  }
  get [dartx.port2]() {
    return this.port2;
  }
};
dart.setSignature(html$.MessageChannel, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MessageChannel, [])}),
  fields: () => ({
    [dartx.port1]: html$.MessagePort,
    [dartx.port2]: html$.MessagePort
  })
});
dart.registerExtension(dart.global.MessageChannel, html$.MessageChannel);
const _initMessageEvent = Symbol('_initMessageEvent');
const _get_data = Symbol('_get_data');
const _get_source = Symbol('_get_source');
dart.defineExtensionNames([
  'data',
  'source',
  'lastEventId',
  'origin'
]);
html$.MessageEvent = class MessageEvent extends html$.Event {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let data = opts && 'data' in opts ? opts.data : null;
    let origin = opts && 'origin' in opts ? opts.origin : null;
    let lastEventId = opts && 'lastEventId' in opts ? opts.lastEventId : null;
    let source = opts && 'source' in opts ? opts.source : null;
    let messagePorts = opts && 'messagePorts' in opts ? opts.messagePorts : null;
    if (source == null) {
      source = html$.window;
    }
    if (!dart.test(html_common.Device.isIE)) {
      return new self.MessageEvent(type, {bubbles: canBubble, cancelable: cancelable, data: data, origin: origin, lastEventId: lastEventId, source: source, ports: messagePorts});
    }
    let event = html$.MessageEvent._check(html$.document[_createEvent]("MessageEvent"));
    event[_initMessageEvent](type, canBubble, cancelable, data, origin, lastEventId, source, messagePorts);
    return event;
  }
  get [dartx.data]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
  }
  get [_get_data]() {
    return this.data;
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MessageEvent._create_1(type, eventInitDict_1);
    }
    return html$.MessageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.MessageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.MessageEvent(type);
  }
  get [dartx.lastEventId]() {
    return this.lastEventId;
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.source]() {
    return html$._convertNativeToDart_EventTarget(this[_get_source]);
  }
  get [_get_source]() {
    return this.source;
  }
  [_initMessageEvent](...args) {
    return this.initMessageEvent.apply(this, args);
  }
};
dart.setSignature(html$.MessageEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.MessageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, data: core.Object, origin: core.String, lastEventId: core.String, source: html$.Window, messagePorts: ListOfMessagePort()}),
    _: dart.definiteFunctionType(html$.MessageEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [_get_data]: dart.dynamic,
    [dartx.lastEventId]: core.String,
    [dartx.origin]: core.String,
    [_get_source]: dart.dynamic
  }),
  getters: () => ({
    [dartx.data]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.source]: dart.definiteFunctionType(html$.EventTarget, [])
  }),
  methods: () => ({[_initMessageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html$.Window, ListOfMessagePort()])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MessageEvent, html$.MessageEvent);
dart.defineExtensionNames([
  'close',
  'postMessage',
  'start',
  'onMessage'
]);
html$.MessagePort = class MessagePort extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [dartx.start](...args) {
    return this.start.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.MessagePort.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.MessagePort, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MessagePort, [])}),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.start]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.MessagePort, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.MessagePort, html$.MessagePort);
dart.defineExtensionNames([
  'content',
  'httpEquiv',
  'name'
]);
html$.MetaElement = class MetaElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.MetaElement._check(html$.document[dartx.createElement]("meta"));
  }
  created() {
    this[dartx.content] = null;
    this[dartx.httpEquiv] = null;
    this[dartx.name] = null;
    super.created();
  }
  get [dartx.content]() {
    return this.content;
  }
  set [dartx.content](value) {
    this.content = value;
  }
  get [dartx.httpEquiv]() {
    return this.httpEquiv;
  }
  set [dartx.httpEquiv](value) {
    this.httpEquiv = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
};
dart.defineNamedConstructor(html$.MetaElement, 'created');
dart.setSignature(html$.MetaElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MetaElement, []),
    new: dart.definiteFunctionType(html$.MetaElement, []),
    created: dart.definiteFunctionType(html$.MetaElement, [])
  }),
  fields: () => ({
    [dartx.content]: core.String,
    [dartx.httpEquiv]: core.String,
    [dartx.name]: core.String
  })
});
dart.registerExtension(dart.global.HTMLMetaElement, html$.MetaElement);
const _get_modificationTime = Symbol('_get_modificationTime');
dart.defineExtensionNames([
  'modificationTime',
  'size'
]);
html$.Metadata = class Metadata extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.modificationTime]() {
    return html_common.convertNativeToDart_DateTime(this[_get_modificationTime]);
  }
  get [_get_modificationTime]() {
    return this.modificationTime;
  }
  get [dartx.size]() {
    return this.size;
  }
};
dart.setSignature(html$.Metadata, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Metadata, [])}),
  fields: () => ({
    [_get_modificationTime]: dart.dynamic,
    [dartx.size]: core.int
  }),
  getters: () => ({[dartx.modificationTime]: dart.definiteFunctionType(core.DateTime, [])})
});
dart.registerExtension(dart.global.Metadata, html$.Metadata);
html$.MetadataCallback = dart.typedef('MetadataCallback', () => dart.functionType(dart.void, [html$.Metadata]));
dart.defineExtensionNames([
  'high',
  'labels',
  'low',
  'max',
  'min',
  'optimum',
  'value'
]);
html$.MeterElement = class MeterElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.MeterElement._check(html$.document[dartx.createElement]("meter"));
  }
  created() {
    this[dartx.high] = null;
    this[dartx.labels] = null;
    this[dartx.low] = null;
    this[dartx.max] = null;
    this[dartx.min] = null;
    this[dartx.optimum] = null;
    this[dartx.value] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('meter');
  }
  get [dartx.high]() {
    return this.high;
  }
  set [dartx.high](value) {
    this.high = value;
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.low]() {
    return this.low;
  }
  set [dartx.low](value) {
    this.low = value;
  }
  get [dartx.max]() {
    return this.max;
  }
  set [dartx.max](value) {
    this.max = value;
  }
  get [dartx.min]() {
    return this.min;
  }
  set [dartx.min](value) {
    this.min = value;
  }
  get [dartx.optimum]() {
    return this.optimum;
  }
  set [dartx.optimum](value) {
    this.optimum = value;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.defineNamedConstructor(html$.MeterElement, 'created');
dart.setSignature(html$.MeterElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MeterElement, []),
    new: dart.definiteFunctionType(html$.MeterElement, []),
    created: dart.definiteFunctionType(html$.MeterElement, [])
  }),
  fields: () => ({
    [dartx.high]: core.num,
    [dartx.labels]: ListOfNode(),
    [dartx.low]: core.num,
    [dartx.max]: core.num,
    [dartx.min]: core.num,
    [dartx.optimum]: core.num,
    [dartx.value]: core.num
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLMeterElement, html$.MeterElement);
dart.defineExtensionNames([
  'inputs',
  'outputs',
  'sysexEnabled'
]);
html$.MidiAccess = class MidiAccess extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.inputs]() {
    return this.inputs;
  }
  get [dartx.outputs]() {
    return this.outputs;
  }
  get [dartx.sysexEnabled]() {
    return this.sysexEnabled;
  }
};
dart.setSignature(html$.MidiAccess, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MidiAccess, [])}),
  fields: () => ({
    [dartx.inputs]: html$.MidiInputMap,
    [dartx.outputs]: html$.MidiOutputMap,
    [dartx.sysexEnabled]: core.bool
  })
});
dart.registerExtension(dart.global.MIDIAccess, html$.MidiAccess);
dart.defineExtensionNames([
  'port'
]);
html$.MidiConnectionEvent = class MidiConnectionEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MidiConnectionEvent._create_1(type, eventInitDict_1);
    }
    return html$.MidiConnectionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MIDIConnectionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MIDIConnectionEvent(type);
  }
  get [dartx.port]() {
    return this.port;
  }
};
dart.setSignature(html$.MidiConnectionEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MidiConnectionEvent, []),
    new: dart.definiteFunctionType(html$.MidiConnectionEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.port]: html$.MidiPort}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MIDIConnectionEvent, html$.MidiConnectionEvent);
dart.defineExtensionNames([
  'close',
  'open',
  'connection',
  'id',
  'manufacturer',
  'name',
  'state',
  'type',
  'version'
]);
html$.MidiPort = class MidiPort extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.connection]() {
    return this.connection;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.manufacturer]() {
    return this.manufacturer;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.state]() {
    return this.state;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.version]() {
    return this.version;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.open](...args) {
    return this.open.apply(this, args);
  }
};
dart.setSignature(html$.MidiPort, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MidiPort, [])}),
  fields: () => ({
    [dartx.connection]: core.String,
    [dartx.id]: core.String,
    [dartx.manufacturer]: core.String,
    [dartx.name]: core.String,
    [dartx.state]: core.String,
    [dartx.type]: core.String,
    [dartx.version]: core.String
  }),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(async.Future, []),
    [dartx.open]: dart.definiteFunctionType(async.Future, [])
  })
});
dart.registerExtension(dart.global.MIDIPort, html$.MidiPort);
dart.defineExtensionNames([
  'onMidiMessage'
]);
html$.MidiInput = class MidiInput extends html$.MidiPort {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.onMidiMessage]() {
    return html$.MidiInput.midiMessageEvent.forTarget(this);
  }
};
dart.setSignature(html$.MidiInput, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MidiInput, [])}),
  getters: () => ({[dartx.onMidiMessage]: dart.definiteFunctionType(async.Stream$(html$.MidiMessageEvent), [])}),
  sfields: () => ({midiMessageEvent: EventStreamProviderOfMidiMessageEvent()})
});
dart.defineLazy(html$.MidiInput, {
  get midiMessageEvent() {
    return dart.const(new (EventStreamProviderOfMidiMessageEvent())('midimessage'));
  }
});
dart.registerExtension(dart.global.MIDIInput, html$.MidiInput);
dart.defineExtensionNames([
  'size'
]);
html$.MidiInputMap = class MidiInputMap extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.size]() {
    return this.size;
  }
};
dart.setSignature(html$.MidiInputMap, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MidiInputMap, [])}),
  fields: () => ({[dartx.size]: core.int})
});
dart.registerExtension(dart.global.MIDIInputMap, html$.MidiInputMap);
dart.defineExtensionNames([
  'data',
  'receivedTime'
]);
html$.MidiMessageEvent = class MidiMessageEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MidiMessageEvent._create_1(type, eventInitDict_1);
    }
    return html$.MidiMessageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MIDIMessageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MIDIMessageEvent(type);
  }
  get [dartx.data]() {
    return this.data;
  }
  get [dartx.receivedTime]() {
    return this.receivedTime;
  }
};
dart.setSignature(html$.MidiMessageEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.MidiMessageEvent, []),
    new: dart.definiteFunctionType(html$.MidiMessageEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.data]: typed_data.Uint8List,
    [dartx.receivedTime]: core.double
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MIDIMessageEvent, html$.MidiMessageEvent);
dart.defineExtensionNames([
  'send'
]);
html$.MidiOutput = class MidiOutput extends html$.MidiPort {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.send](...args) {
    return this.send.apply(this, args);
  }
};
dart.setSignature(html$.MidiOutput, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutput, [])}),
  methods: () => ({[dartx.send]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List], [core.num])})
});
dart.registerExtension(dart.global.MIDIOutput, html$.MidiOutput);
dart.defineExtensionNames([
  'size'
]);
html$.MidiOutputMap = class MidiOutputMap extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.size]() {
    return this.size;
  }
};
dart.setSignature(html$.MidiOutputMap, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutputMap, [])}),
  fields: () => ({[dartx.size]: core.int})
});
dart.registerExtension(dart.global.MIDIOutputMap, html$.MidiOutputMap);
dart.defineExtensionNames([
  'description',
  'enabledPlugin',
  'suffixes',
  'type'
]);
html$.MimeType = class MimeType extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.description]() {
    return this.description;
  }
  get [dartx.enabledPlugin]() {
    return this.enabledPlugin;
  }
  get [dartx.suffixes]() {
    return this.suffixes;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.MimeType, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MimeType, [])}),
  fields: () => ({
    [dartx.description]: core.String,
    [dartx.enabledPlugin]: html$.Plugin,
    [dartx.suffixes]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.MimeType, html$.MimeType);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item',
  'namedItem'
]);
html$.MimeTypeArray = class MimeTypeArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.MimeType), html$.ImmutableListMixin$(html$.MimeType)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
html$.MimeTypeArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfMimeType()];
dart.setSignature(html$.MimeTypeArray, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MimeTypeArray, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.MimeType, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.MimeType]),
    [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
    [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
  })
});
dart.registerExtension(dart.global.MimeTypeArray, html$.MimeTypeArray);
dart.defineExtensionNames([
  'cite',
  'dateTime'
]);
html$.ModElement = class ModElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.cite] = null;
    this[dartx.dateTime] = null;
    super.created();
  }
  get [dartx.cite]() {
    return this.cite;
  }
  set [dartx.cite](value) {
    this.cite = value;
  }
  get [dartx.dateTime]() {
    return this.dateTime;
  }
  set [dartx.dateTime](value) {
    this.dateTime = value;
  }
};
dart.defineNamedConstructor(html$.ModElement, 'created');
dart.setSignature(html$.ModElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ModElement, []),
    created: dart.definiteFunctionType(html$.ModElement, [])
  }),
  fields: () => ({
    [dartx.cite]: core.String,
    [dartx.dateTime]: core.String
  })
});
dart.registerExtension(dart.global.HTMLModElement, html$.ModElement);
const _initMouseEvent = Symbol('_initMouseEvent');
const _clientX = Symbol('_clientX');
const _clientY = Symbol('_clientY');
const _layerX = Symbol('_layerX');
const _layerY = Symbol('_layerY');
const _movementX = Symbol('_movementX');
const _movementY = Symbol('_movementY');
const _pageX = Symbol('_pageX');
const _pageY = Symbol('_pageY');
const _screenX = Symbol('_screenX');
const _screenY = Symbol('_screenY');
const _webkitMovementX = Symbol('_webkitMovementX');
const _webkitMovementY = Symbol('_webkitMovementY');
const _initMouseEvent_1 = Symbol('_initMouseEvent_1');
dart.defineExtensionNames([
  'relatedTarget',
  'client',
  'movement',
  'offset',
  'screen',
  'layer',
  'page',
  'altKey',
  'button',
  'buttons',
  'ctrlKey',
  'dataTransfer',
  'fromElement',
  'metaKey',
  'region',
  'shiftKey',
  'toElement'
]);
html$.MouseEvent = class MouseEvent extends html$.UIEvent {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let detail = opts && 'detail' in opts ? opts.detail : 0;
    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
    let button = opts && 'button' in opts ? opts.button : 0;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
    if (view == null) {
      view = html$.window;
    }
    let event = html$.MouseEvent._check(html$.document[_createEvent]('MouseEvent'));
    event[_initMouseEvent](type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
    return event;
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MouseEvent._create_1(type, eventInitDict_1);
    }
    return html$.MouseEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.MouseEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.MouseEvent(type);
  }
  get [dartx.altKey]() {
    return this.altKey;
  }
  get [dartx.button]() {
    return this.button;
  }
  get [dartx.buttons]() {
    return this.buttons;
  }
  get [_clientX]() {
    return this.clientX;
  }
  get [_clientY]() {
    return this.clientY;
  }
  get [dartx.ctrlKey]() {
    return this.ctrlKey;
  }
  get [dartx.dataTransfer]() {
    return this.dataTransfer;
  }
  get [dartx.fromElement]() {
    return this.fromElement;
  }
  get [_layerX]() {
    return this.layerX;
  }
  get [_layerY]() {
    return this.layerY;
  }
  get [dartx.metaKey]() {
    return this.metaKey;
  }
  get [_movementX]() {
    return this.movementX;
  }
  get [_movementY]() {
    return this.movementY;
  }
  get [_pageX]() {
    return this.pageX;
  }
  get [_pageY]() {
    return this.pageY;
  }
  get [dartx.region]() {
    return this.region;
  }
  get [dartx.relatedTarget]() {
    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
  }
  get [_get_relatedTarget]() {
    return this.relatedTarget;
  }
  get [_screenX]() {
    return this.screenX;
  }
  get [_screenY]() {
    return this.screenY;
  }
  get [dartx.shiftKey]() {
    return this.shiftKey;
  }
  get [dartx.toElement]() {
    return this.toElement;
  }
  get [_webkitMovementX]() {
    return this.webkitMovementX;
  }
  get [_webkitMovementY]() {
    return this.webkitMovementY;
  }
  [_initMouseEvent](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
    let relatedTarget_1 = html$._convertDartToNative_EventTarget(relatedTarget);
    this[_initMouseEvent_1](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
    return;
  }
  [_initMouseEvent_1](...args) {
    return this.initMouseEvent.apply(this, args);
  }
  get [dartx.client]() {
    return new (PointOfnum())(this[_clientX], this[_clientY]);
  }
  get [dartx.movement]() {
    return new (PointOfnum())(this[_webkitMovementX], this[_webkitMovementY]);
  }
  get [dartx.offset]() {
    if (!!this.offsetX) {
      let x = this.offsetX;
      let y = this.offsetY;
      return new (PointOfnum())(x, y);
    } else {
      if (!html$.Element.is(this[dartx.target])) {
        dart.throw(new core.UnsupportedError('offsetX is only supported on elements'));
      }
      let target = html$.Element._check(this[dartx.target]);
      let point = this[dartx.client]['-'](target[dartx.getBoundingClientRect]()[dartx.topLeft]);
      return new (PointOfnum())(point.x[dartx.toInt](), point.y[dartx.toInt]());
    }
  }
  get [dartx.screen]() {
    return new (PointOfnum())(this[_screenX], this[_screenY]);
  }
  get [dartx.layer]() {
    return new (PointOfnum())(this[_layerX], this[_layerY]);
  }
  get [dartx.page]() {
    return new (PointOfnum())(this[_pageX], this[_pageY]);
  }
};
dart.setSignature(html$.MouseEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.MouseEvent, [core.String], {view: html$.Window, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
    _: dart.definiteFunctionType(html$.MouseEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.altKey]: core.bool,
    [dartx.button]: core.int,
    [dartx.buttons]: core.int,
    [_clientX]: core.int,
    [_clientY]: core.int,
    [dartx.ctrlKey]: core.bool,
    [dartx.dataTransfer]: html$.DataTransfer,
    [dartx.fromElement]: html$.Node,
    [_layerX]: core.int,
    [_layerY]: core.int,
    [dartx.metaKey]: core.bool,
    [_movementX]: core.int,
    [_movementY]: core.int,
    [_pageX]: core.int,
    [_pageY]: core.int,
    [dartx.region]: core.String,
    [_get_relatedTarget]: dart.dynamic,
    [_screenX]: core.int,
    [_screenY]: core.int,
    [dartx.shiftKey]: core.bool,
    [dartx.toElement]: html$.Node,
    [_webkitMovementX]: core.int,
    [_webkitMovementY]: core.int
  }),
  getters: () => ({
    [dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, []),
    [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.movement]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.offset]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.layer]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), [])
  }),
  methods: () => ({
    [_initMouseEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget]),
    [_initMouseEvent_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.MouseEvent, html$.MouseEvent);
dart.registerExtension(dart.global.DragEvent, html$.MouseEvent);
html$.MutationCallback = dart.typedef('MutationCallback', () => dart.functionType(dart.void, [ListOfMutationRecord(), html$.MutationObserver]));
const _observe_1 = Symbol('_observe_1');
const _observe = Symbol('_observe');
const _call = Symbol('_call');
dart.defineExtensionNames([
  'disconnect',
  'takeRecords',
  'observe'
]);
html$.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
  [dartx.disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [_observe](target, options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    this[_observe_1](target, options_1);
    return;
  }
  [_observe_1](...args) {
    return this.observe.apply(this, args);
  }
  [dartx.takeRecords](...args) {
    return this.takeRecords.apply(this, args);
  }
  static get supported() {
    return !!(window.MutationObserver || window.WebKitMutationObserver);
  }
  [dartx.observe](target, opts) {
    let childList = opts && 'childList' in opts ? opts.childList : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let characterData = opts && 'characterData' in opts ? opts.characterData : null;
    let subtree = opts && 'subtree' in opts ? opts.subtree : null;
    let attributeOldValue = opts && 'attributeOldValue' in opts ? opts.attributeOldValue : null;
    let characterDataOldValue = opts && 'characterDataOldValue' in opts ? opts.characterDataOldValue : null;
    let attributeFilter = opts && 'attributeFilter' in opts ? opts.attributeFilter : null;
    let parsedOptions = html$.MutationObserver._createDict();
    function override(key, value) {
      if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
    }
    dart.fn(override, dynamicAnddynamicToNull());
    override('childList', childList);
    override('attributes', attributes);
    override('characterData', characterData);
    override('subtree', subtree);
    override('attributeOldValue', attributeOldValue);
    override('characterDataOldValue', characterDataOldValue);
    if (attributeFilter != null) {
      override('attributeFilter', html$.MutationObserver._fixupList(attributeFilter));
    }
    this[_call](target, parsedOptions);
  }
  static _createDict() {
    return {};
  }
  static _add(m, key, value) {
    m[key] = value;
  }
  static _fixupList(list) {
    return list;
  }
  [_call](...args) {
    return this.observe.apply(this, args);
  }
  static new(callback) {
    0;
    return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void())(html$._wrapBinaryZone(ListOfMutationRecord(), html$.MutationObserver, dart.void)(callback), 2));
  }
};
dart.setSignature(html$.MutationObserver, {
  constructors: () => ({new: dart.definiteFunctionType(html$.MutationObserver, [html$.MutationCallback])}),
  methods: () => ({
    [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
    [_observe]: dart.definiteFunctionType(dart.void, [html$.Node, core.Map]),
    [_observe_1]: dart.definiteFunctionType(dart.void, [html$.Node, dart.dynamic]),
    [dartx.takeRecords]: dart.definiteFunctionType(core.List$(html$.MutationRecord), []),
    [dartx.observe]: dart.definiteFunctionType(dart.void, [html$.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: ListOfString()}),
    [_call]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
  }),
  sfields: () => ({_boolKeys: MapOfString$bool()}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _createDict: dart.definiteFunctionType(dart.dynamic, []),
    _add: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
    _fixupList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
  }),
  names: ['_createDict', '_add', '_fixupList']
});
html$.MutationObserver._boolKeys = dart.const(dart.map({childList: true, attributes: true, characterData: true, subtree: true, attributeOldValue: true, characterDataOldValue: true}, core.String, core.bool));
dart.registerExtension(dart.global.MutationObserver, html$.MutationObserver);
dart.registerExtension(dart.global.WebKitMutationObserver, html$.MutationObserver);
dart.defineExtensionNames([
  'addedNodes',
  'attributeName',
  'attributeNamespace',
  'nextSibling',
  'oldValue',
  'previousSibling',
  'removedNodes',
  'target',
  'type'
]);
html$.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.addedNodes]() {
    return this.addedNodes;
  }
  get [dartx.attributeName]() {
    return this.attributeName;
  }
  get [dartx.attributeNamespace]() {
    return this.attributeNamespace;
  }
  get [dartx.nextSibling]() {
    return this.nextSibling;
  }
  get [dartx.oldValue]() {
    return this.oldValue;
  }
  get [dartx.previousSibling]() {
    return this.previousSibling;
  }
  get [dartx.removedNodes]() {
    return this.removedNodes;
  }
  get [dartx.target]() {
    return this.target;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.MutationRecord, {
  constructors: () => ({_: dart.definiteFunctionType(html$.MutationRecord, [])}),
  fields: () => ({
    [dartx.addedNodes]: ListOfNode(),
    [dartx.attributeName]: core.String,
    [dartx.attributeNamespace]: core.String,
    [dartx.nextSibling]: html$.Node,
    [dartx.oldValue]: core.String,
    [dartx.previousSibling]: html$.Node,
    [dartx.removedNodes]: ListOfNode(),
    [dartx.target]: html$.Node,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.MutationRecord, html$.MutationRecord);
const _ensureGetUserMedia = Symbol('_ensureGetUserMedia');
const _getUserMedia = Symbol('_getUserMedia');
const _requestMidiAccess_1 = Symbol('_requestMidiAccess_1');
const _requestMidiAccess_2 = Symbol('_requestMidiAccess_2');
dart.defineExtensionNames([
  'language',
  'getUserMedia',
  'getBattery',
  'getGamepads',
  'getVRDevices',
  'registerProtocolHandler',
  'requestMidiAccess',
  'requestMediaKeySystemAccess',
  'sendBeacon',
  'getStorageUpdates',
  'bluetooth',
  'connection',
  'credentials',
  'doNotTrack',
  'geolocation',
  'maxTouchPoints',
  'mediaDevices',
  'mimeTypes',
  'permissions',
  'presentation',
  'productSub',
  'serviceWorker',
  'services',
  'storageQuota',
  'vendor',
  'vendorSub',
  'persistentStorage',
  'temporaryStorage',
  'hardwareConcurrency',
  'appCodeName',
  'appName',
  'appVersion',
  'dartEnabled',
  'platform',
  'product',
  'userAgent',
  'languages',
  'onLine',
  'cookieEnabled'
]);
html$.Navigator = class Navigator extends _interceptors.Interceptor {
  get [dartx.language]() {
    return this.language || this.userLanguage;
  }
  [dartx.getUserMedia](opts) {
    let audio = opts && 'audio' in opts ? opts.audio : false;
    let video = opts && 'video' in opts ? opts.video : false;
    let completer = CompleterOfMediaStream().new();
    let options = dart.map({audio: audio, video: video}, core.String, dart.dynamic);
    this[_ensureGetUserMedia]();
    this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
      completer.complete(stream);
    }, MediaStreamToNull()), dart.fn(error => {
      completer.completeError(error);
    }, NavigatorUserMediaErrorToNull()));
    return completer.future;
  }
  [_ensureGetUserMedia]() {
    if (!this.getUserMedia) {
      this.getUserMedia = this.getUserMedia || this.webkitGetUserMedia || this.mozGetUserMedia || this.msGetUserMedia;
    }
  }
  [_getUserMedia](...args) {
    return this.getUserMedia.apply(this, args);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.bluetooth]() {
    return this.bluetooth;
  }
  get [dartx.connection]() {
    return this.connection;
  }
  get [dartx.credentials]() {
    return this.credentials;
  }
  get [dartx.doNotTrack]() {
    return this.doNotTrack;
  }
  get [dartx.geolocation]() {
    return this.geolocation;
  }
  get [dartx.maxTouchPoints]() {
    return this.maxTouchPoints;
  }
  get [dartx.mediaDevices]() {
    return this.mediaDevices;
  }
  get [dartx.mimeTypes]() {
    return this.mimeTypes;
  }
  get [dartx.permissions]() {
    return this.permissions;
  }
  get [dartx.presentation]() {
    return this.presentation;
  }
  get [dartx.productSub]() {
    return this.productSub;
  }
  get [dartx.serviceWorker]() {
    return this.serviceWorker;
  }
  get [dartx.services]() {
    return this.services;
  }
  get [dartx.storageQuota]() {
    return this.storageQuota;
  }
  get [dartx.vendor]() {
    return this.vendor;
  }
  get [dartx.vendorSub]() {
    return this.vendorSub;
  }
  get [dartx.persistentStorage]() {
    return this.webkitPersistentStorage;
  }
  get [dartx.temporaryStorage]() {
    return this.webkitTemporaryStorage;
  }
  [dartx.getBattery](...args) {
    return this.getBattery.apply(this, args);
  }
  [dartx.getGamepads](...args) {
    return this.getGamepads.apply(this, args);
  }
  [dartx.getVRDevices](...args) {
    return this.getVRDevices.apply(this, args);
  }
  [dartx.registerProtocolHandler](...args) {
    return this.registerProtocolHandler.apply(this, args);
  }
  [dartx.requestMidiAccess](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_requestMidiAccess_1](options_1);
    }
    return this[_requestMidiAccess_2]();
  }
  [_requestMidiAccess_1](...args) {
    return this.requestMIDIAccess.apply(this, args);
  }
  [_requestMidiAccess_2](...args) {
    return this.requestMIDIAccess.apply(this, args);
  }
  [dartx.requestMediaKeySystemAccess](...args) {
    return this.requestMediaKeySystemAccess.apply(this, args);
  }
  [dartx.sendBeacon](...args) {
    return this.sendBeacon.apply(this, args);
  }
  get [dartx.hardwareConcurrency]() {
    return this.hardwareConcurrency;
  }
  get [dartx.appCodeName]() {
    return this.appCodeName;
  }
  get [dartx.appName]() {
    return this.appName;
  }
  get [dartx.appVersion]() {
    return this.appVersion;
  }
  get [dartx.dartEnabled]() {
    return this.dartEnabled;
  }
  get [dartx.platform]() {
    return this.platform;
  }
  get [dartx.product]() {
    return this.product;
  }
  get [dartx.userAgent]() {
    return this.userAgent;
  }
  get [dartx.languages]() {
    return this.languages;
  }
  get [dartx.onLine]() {
    return this.onLine;
  }
  get [dartx.cookieEnabled]() {
    return this.cookieEnabled;
  }
  [dartx.getStorageUpdates](...args) {
    return this.getStorageUpdates.apply(this, args);
  }
};
html$.Navigator[dart.implements] = () => [html$.NavigatorStorageUtils, html$.NavigatorCpu, html$.NavigatorLanguage, html$.NavigatorOnLine, html$.NavigatorID];
dart.setSignature(html$.Navigator, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Navigator, [])}),
  fields: () => ({
    [dartx.bluetooth]: html$.Bluetooth,
    [dartx.connection]: html$.NetworkInformation,
    [dartx.credentials]: html$.CredentialsContainer,
    [dartx.doNotTrack]: core.String,
    [dartx.geolocation]: html$.Geolocation,
    [dartx.maxTouchPoints]: core.int,
    [dartx.mediaDevices]: html$.MediaDevices,
    [dartx.mimeTypes]: html$.MimeTypeArray,
    [dartx.permissions]: html$.Permissions,
    [dartx.presentation]: html$.Presentation,
    [dartx.productSub]: core.String,
    [dartx.serviceWorker]: html$.ServiceWorkerContainer,
    [dartx.services]: html$.ServicePortCollection,
    [dartx.storageQuota]: html$.StorageQuota,
    [dartx.vendor]: core.String,
    [dartx.vendorSub]: core.String,
    [dartx.persistentStorage]: html$.DeprecatedStorageQuota,
    [dartx.temporaryStorage]: html$.DeprecatedStorageQuota,
    [dartx.hardwareConcurrency]: core.int,
    [dartx.appCodeName]: core.String,
    [dartx.appName]: core.String,
    [dartx.appVersion]: core.String,
    [dartx.dartEnabled]: core.bool,
    [dartx.platform]: core.String,
    [dartx.product]: core.String,
    [dartx.userAgent]: core.String,
    [dartx.languages]: ListOfString(),
    [dartx.onLine]: core.bool,
    [dartx.cookieEnabled]: core.bool
  }),
  getters: () => ({[dartx.language]: dart.definiteFunctionType(core.String, [])}),
  methods: () => ({
    [dartx.getUserMedia]: dart.definiteFunctionType(async.Future$(html$.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
    [_ensureGetUserMedia]: dart.definiteFunctionType(dart.dynamic, []),
    [_getUserMedia]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$._NavigatorUserMediaSuccessCallback, html$._NavigatorUserMediaErrorCallback]),
    [dartx.getBattery]: dart.definiteFunctionType(async.Future, []),
    [dartx.getGamepads]: dart.definiteFunctionType(core.List$(html$.Gamepad), []),
    [dartx.getVRDevices]: dart.definiteFunctionType(async.Future, []),
    [dartx.registerProtocolHandler]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
    [dartx.requestMidiAccess]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_requestMidiAccess_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_requestMidiAccess_2]: dart.definiteFunctionType(async.Future, []),
    [dartx.requestMediaKeySystemAccess]: dart.definiteFunctionType(async.Future, [core.String, ListOfMap()]),
    [dartx.sendBeacon]: dart.definiteFunctionType(core.bool, [core.String, core.Object]),
    [dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.Navigator, html$.Navigator);
dart.defineExtensionNames([
  'hardwareConcurrency'
]);
html$.NavigatorCpu = class NavigatorCpu extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get hardwareConcurrency() {
    return this[hardwareConcurrency];
  }
  set hardwareConcurrency(value) {
    super.hardwareConcurrency = value;
  }
};
const hardwareConcurrency = Symbol(html$.NavigatorCpu.name + "." + 'hardwareConcurrency'.toString());
dart.setSignature(html$.NavigatorCpu, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorCpu, [])}),
  fields: () => ({hardwareConcurrency: core.int})
});
dart.defineExtensionMembers(html$.NavigatorCpu, ['hardwareConcurrency']);
dart.defineExtensionNames([
  'appCodeName',
  'appName',
  'appVersion',
  'dartEnabled',
  'platform',
  'product',
  'userAgent'
]);
html$.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get appCodeName() {
    return this[appCodeName];
  }
  set appCodeName(value) {
    super.appCodeName = value;
  }
  get appName() {
    return this[appName];
  }
  set appName(value) {
    super.appName = value;
  }
  get appVersion() {
    return this[appVersion];
  }
  set appVersion(value) {
    super.appVersion = value;
  }
  get dartEnabled() {
    return this[dartEnabled];
  }
  set dartEnabled(value) {
    super.dartEnabled = value;
  }
  get platform() {
    return this[platform];
  }
  set platform(value) {
    super.platform = value;
  }
  get product() {
    return this[product];
  }
  set product(value) {
    super.product = value;
  }
  get userAgent() {
    return this[userAgent];
  }
  set userAgent(value) {
    super.userAgent = value;
  }
};
const appCodeName = Symbol(html$.NavigatorID.name + "." + 'appCodeName'.toString());
const appName = Symbol(html$.NavigatorID.name + "." + 'appName'.toString());
const appVersion = Symbol(html$.NavigatorID.name + "." + 'appVersion'.toString());
const dartEnabled = Symbol(html$.NavigatorID.name + "." + 'dartEnabled'.toString());
const platform = Symbol(html$.NavigatorID.name + "." + 'platform'.toString());
const product = Symbol(html$.NavigatorID.name + "." + 'product'.toString());
const userAgent = Symbol(html$.NavigatorID.name + "." + 'userAgent'.toString());
dart.setSignature(html$.NavigatorID, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorID, [])}),
  fields: () => ({
    appCodeName: core.String,
    appName: core.String,
    appVersion: core.String,
    dartEnabled: core.bool,
    platform: core.String,
    product: core.String,
    userAgent: core.String
  })
});
dart.defineExtensionMembers(html$.NavigatorID, [
  'appCodeName',
  'appName',
  'appVersion',
  'dartEnabled',
  'platform',
  'product',
  'userAgent'
]);
dart.defineExtensionNames([
  'language',
  'languages'
]);
html$.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get language() {
    return this[language];
  }
  set language(value) {
    super.language = value;
  }
  get languages() {
    return this[languages];
  }
  set languages(value) {
    super.languages = value;
  }
};
const language = Symbol(html$.NavigatorLanguage.name + "." + 'language'.toString());
const languages = Symbol(html$.NavigatorLanguage.name + "." + 'languages'.toString());
dart.setSignature(html$.NavigatorLanguage, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorLanguage, [])}),
  fields: () => ({
    language: core.String,
    languages: ListOfString()
  })
});
dart.defineExtensionMembers(html$.NavigatorLanguage, ['language', 'languages']);
dart.defineExtensionNames([
  'onLine'
]);
html$.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get onLine() {
    return this[onLine];
  }
  set onLine(value) {
    super.onLine = value;
  }
};
const onLine = Symbol(html$.NavigatorOnLine.name + "." + 'onLine'.toString());
dart.setSignature(html$.NavigatorOnLine, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorOnLine, [])}),
  fields: () => ({onLine: core.bool})
});
dart.defineExtensionMembers(html$.NavigatorOnLine, ['onLine']);
dart.defineExtensionNames([
  'getStorageUpdates',
  'cookieEnabled'
]);
html$.NavigatorStorageUtils = class NavigatorStorageUtils extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.cookieEnabled]() {
    return this.cookieEnabled;
  }
  [dartx.getStorageUpdates](...args) {
    return this.getStorageUpdates.apply(this, args);
  }
};
dart.setSignature(html$.NavigatorStorageUtils, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorStorageUtils, [])}),
  fields: () => ({[dartx.cookieEnabled]: core.bool}),
  methods: () => ({[dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])})
});
dart.registerExtension(dart.global.NavigatorStorageUtils, html$.NavigatorStorageUtils);
dart.defineExtensionNames([
  'constraintName',
  'message',
  'name'
]);
html$.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.constraintName]() {
    return this.constraintName;
  }
  get [dartx.message]() {
    return this.message;
  }
  get [dartx.name]() {
    return this.name;
  }
};
dart.setSignature(html$.NavigatorUserMediaError, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorUserMediaError, [])}),
  fields: () => ({
    [dartx.constraintName]: core.String,
    [dartx.message]: core.String,
    [dartx.name]: core.String
  })
});
dart.registerExtension(dart.global.NavigatorUserMediaError, html$.NavigatorUserMediaError);
html$._NavigatorUserMediaErrorCallback = dart.typedef('_NavigatorUserMediaErrorCallback', () => dart.functionType(dart.void, [html$.NavigatorUserMediaError]));
html$._NavigatorUserMediaSuccessCallback = dart.typedef('_NavigatorUserMediaSuccessCallback', () => dart.functionType(dart.void, [html$.MediaStream]));
dart.defineExtensionNames([
  'type'
]);
html$.NetworkInformation = class NetworkInformation extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.NetworkInformation, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NetworkInformation, [])}),
  fields: () => ({[dartx.type]: core.String})
});
dart.registerExtension(dart.global.NetworkInformation, html$.NetworkInformation);
html$._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html$.Node) {
  new(this$) {
    this[_this] = this$;
  }
  get first() {
    let result = this[_this].firstChild;
    if (result == null) dart.throw(new core.StateError("No elements"));
    return result;
  }
  get last() {
    let result = this[_this].lastChild;
    if (result == null) dart.throw(new core.StateError("No elements"));
    return result;
  }
  get single() {
    let l = this.length;
    if (l == 0) dart.throw(new core.StateError("No elements"));
    if (dart.notNull(l) > 1) dart.throw(new core.StateError("More than one element"));
    return this[_this].firstChild;
  }
  add(value) {
    this[_this][dartx.append](value);
  }
  addAll(iterable) {
    if (html$._ChildNodeListLazy.is(iterable)) {
      let otherList = iterable;
      if (!core.identical(otherList[_this], this[_this])) {
        for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
          this[_this][dartx.append](otherList[_this][dartx.firstChild]);
        }
      }
      return;
    }
    for (let node of iterable) {
      this[_this][dartx.append](node);
    }
  }
  insert(index, node) {
    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
      dart.throw(new core.RangeError.range(index, 0, this.length));
    }
    if (index == this.length) {
      this[_this][dartx.append](node);
    } else {
      this[_this][dartx.insertBefore](node, this._get(index));
    }
  }
  insertAll(index, iterable) {
    if (index == this.length) {
      this.addAll(iterable);
    } else {
      let item = this._get(index);
      this[_this][dartx.insertAllBefore](iterable, item);
    }
  }
  setAll(index, iterable) {
    dart.throw(new core.UnsupportedError("Cannot setAll on Node list"));
  }
  removeLast() {
    let result = this.last;
    if (result != null) {
      this[_this][_removeChild](result);
    }
    return result;
  }
  removeAt(index) {
    let result = this._get(index);
    if (result != null) {
      this[_this][_removeChild](result);
    }
    return result;
  }
  remove(object) {
    if (!html$.Node.is(object)) return false;
    let node = html$.Node._check(object);
    if (!core.identical(this[_this], node[dartx.parentNode])) return false;
    this[_this][_removeChild](node);
    return true;
  }
  [_filter$0](test, removeMatching) {
    let child = this[_this][dartx.firstChild];
    while (child != null) {
      let nextChild = child[dartx.nextNode];
      if (test(child) == removeMatching) {
        this[_this][_removeChild](child);
      }
      child = nextChild;
    }
  }
  removeWhere(test) {
    this[_filter$0](test, true);
  }
  retainWhere(test) {
    this[_filter$0](test, false);
  }
  clear() {
    this[_this][_clearChildren]();
  }
  _set(index, value) {
    this[_this][_replaceChild](value, this._get(index));
    return value;
  }
  get iterator() {
    return this[_this][dartx.childNodes][dartx.iterator];
  }
  sort(compare) {
    if (compare === void 0) compare = null;
    dart.throw(new core.UnsupportedError("Cannot sort Node list"));
  }
  shuffle(random) {
    if (random === void 0) random = null;
    dart.throw(new core.UnsupportedError("Cannot shuffle Node list"));
  }
  setRange(start, end, iterable, skipCount) {
    if (skipCount === void 0) skipCount = 0;
    dart.throw(new core.UnsupportedError("Cannot setRange on Node list"));
  }
  fillRange(start, end, fill) {
    if (fill === void 0) fill = null;
    dart.throw(new core.UnsupportedError("Cannot fillRange on Node list"));
  }
  get length() {
    return this[_this][dartx.childNodes][dartx.length];
  }
  set length(value) {
    dart.throw(new core.UnsupportedError("Cannot set length on immutable List."));
  }
  _get(index) {
    return this[_this][dartx.childNodes][dartx._get](index);
  }
  get rawList() {
    return this[_this][dartx.childNodes];
  }
};
dart.addSimpleTypeTests(html$._ChildNodeListLazy);
html$._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
dart.setSignature(html$._ChildNodeListLazy, {
  constructors: () => ({new: dart.definiteFunctionType(html$._ChildNodeListLazy, [html$.Node])}),
  fields: () => ({[_this]: html$.Node}),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
  }),
  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [_filter$0]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
    _get: dart.definiteFunctionType(html$.Node, [core.int])
  })
});
dart.defineExtensionMembers(html$._ChildNodeListLazy, [
  'add',
  'addAll',
  'insert',
  'insertAll',
  'setAll',
  'removeLast',
  'removeAt',
  'remove',
  'removeWhere',
  'retainWhere',
  'clear',
  '_set',
  'sort',
  'shuffle',
  'setRange',
  'fillRange',
  '_get',
  'first',
  'last',
  'single',
  'iterator',
  'length',
  'length'
]);
html$.NodeFilter = class NodeFilter extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.NodeFilter, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NodeFilter, [])}),
  sfields: () => ({
    FILTER_ACCEPT: core.int,
    FILTER_REJECT: core.int,
    FILTER_SKIP: core.int,
    SHOW_ALL: core.int,
    SHOW_COMMENT: core.int,
    SHOW_DOCUMENT: core.int,
    SHOW_DOCUMENT_FRAGMENT: core.int,
    SHOW_DOCUMENT_TYPE: core.int,
    SHOW_ELEMENT: core.int,
    SHOW_PROCESSING_INSTRUCTION: core.int,
    SHOW_TEXT: core.int
  })
});
html$.NodeFilter.FILTER_ACCEPT = 1;
html$.NodeFilter.FILTER_REJECT = 2;
html$.NodeFilter.FILTER_SKIP = 3;
html$.NodeFilter.SHOW_ALL = 4294967295;
html$.NodeFilter.SHOW_COMMENT = 128;
html$.NodeFilter.SHOW_DOCUMENT = 256;
html$.NodeFilter.SHOW_DOCUMENT_FRAGMENT = 1024;
html$.NodeFilter.SHOW_DOCUMENT_TYPE = 512;
html$.NodeFilter.SHOW_ELEMENT = 1;
html$.NodeFilter.SHOW_PROCESSING_INSTRUCTION = 64;
html$.NodeFilter.SHOW_TEXT = 4;
dart.registerExtension(dart.global.NodeFilter, html$.NodeFilter);
dart.defineExtensionNames([
  'detach',
  'nextNode',
  'previousNode',
  'pointerBeforeReferenceNode',
  'referenceNode',
  'root',
  'whatToShow'
]);
html$.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
  static new(root, whatToShow) {
    return html$.document[_createNodeIterator](root, whatToShow, null);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.pointerBeforeReferenceNode]() {
    return this.pointerBeforeReferenceNode;
  }
  get [dartx.referenceNode]() {
    return this.referenceNode;
  }
  get [dartx.root]() {
    return this.root;
  }
  get [dartx.whatToShow]() {
    return this.whatToShow;
  }
  [dartx.detach](...args) {
    return this.detach.apply(this, args);
  }
  [dartx.nextNode](...args) {
    return this.nextNode.apply(this, args);
  }
  [dartx.previousNode](...args) {
    return this.previousNode.apply(this, args);
  }
};
dart.setSignature(html$.NodeIterator, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.NodeIterator, [html$.Node, core.int]),
    _: dart.definiteFunctionType(html$.NodeIterator, [])
  }),
  fields: () => ({
    [dartx.pointerBeforeReferenceNode]: core.bool,
    [dartx.referenceNode]: html$.Node,
    [dartx.root]: html$.Node,
    [dartx.whatToShow]: core.int
  }),
  methods: () => ({
    [dartx.detach]: dart.definiteFunctionType(dart.void, []),
    [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
    [dartx.previousNode]: dart.definiteFunctionType(html$.Node, [])
  })
});
dart.registerExtension(dart.global.NodeIterator, html$.NodeIterator);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt'
]);
html$.NodeList = class NodeList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [_item](...args) {
    return this.item.apply(this, args);
  }
};
html$.NodeList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
dart.setSignature(html$.NodeList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NodeList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
    [_item]: dart.definiteFunctionType(html$.Node, [core.int])
  })
});
dart.registerExtension(dart.global.NodeList, html$.NodeList);
dart.registerExtension(dart.global.RadioNodeList, html$.NodeList);
dart.defineExtensionNames([
  'nextElementSibling',
  'previousElementSibling'
]);
html$.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.nextElementSibling]() {
    return this.nextElementSibling;
  }
  get [dartx.previousElementSibling]() {
    return this.previousElementSibling;
  }
};
dart.setSignature(html$.NonDocumentTypeChildNode, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NonDocumentTypeChildNode, [])}),
  fields: () => ({
    [dartx.nextElementSibling]: html$.Element,
    [dartx.previousElementSibling]: html$.Element
  })
});
dart.registerExtension(dart.global.NonDocumentTypeChildNode, html$.NonDocumentTypeChildNode);
dart.defineExtensionNames([
  'getElementById'
]);
html$.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
};
dart.setSignature(html$.NonElementParentNode, {
  constructors: () => ({_: dart.definiteFunctionType(html$.NonElementParentNode, [])}),
  methods: () => ({[dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String])})
});
dart.registerExtension(dart.global.NonElementParentNode, html$.NonElementParentNode);
dart.defineExtensionNames([
  'close',
  'onClick',
  'onClose',
  'onError',
  'onShow',
  'body',
  'data',
  'dir',
  'icon',
  'lang',
  'permission',
  'silent',
  'tag',
  'title',
  'vibrate'
]);
html$.Notification = class Notification extends html$.EventTarget {
  static new(title, opts) {
    let dir = opts && 'dir' in opts ? opts.dir : null;
    let body = opts && 'body' in opts ? opts.body : null;
    let lang = opts && 'lang' in opts ? opts.lang : null;
    let tag = opts && 'tag' in opts ? opts.tag : null;
    let icon = opts && 'icon' in opts ? opts.icon : null;
    let parsedOptions = dart.map();
    if (dir != null) parsedOptions[dartx._set]('dir', dir);
    if (body != null) parsedOptions[dartx._set]('body', body);
    if (lang != null) parsedOptions[dartx._set]('lang', lang);
    if (tag != null) parsedOptions[dartx._set]('tag', tag);
    if (icon != null) parsedOptions[dartx._set]('icon', icon);
    return html$.Notification._factoryNotification(title, parsedOptions);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static _factoryNotification(title, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.Notification._create_1(title, options_1);
    }
    return html$.Notification._create_2(title);
  }
  static _create_1(title, options) {
    return new self.Notification(title, options);
  }
  static _create_2(title) {
    return new self.Notification(title);
  }
  static get supported() {
    return !!window.Notification;
  }
  get [dartx.body]() {
    return this.body;
  }
  get [dartx.data]() {
    return this.data;
  }
  get [dartx.dir]() {
    return this.dir;
  }
  get [dartx.icon]() {
    return this.icon;
  }
  get [dartx.lang]() {
    return this.lang;
  }
  get [dartx.permission]() {
    return this.permission;
  }
  get [dartx.silent]() {
    return this.silent;
  }
  get [dartx.tag]() {
    return this.tag;
  }
  get [dartx.title]() {
    return this.title;
  }
  get [dartx.vibrate]() {
    return this.vibrate;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  static requestPermission() {
    let completer = CompleterOfString().new();
    html$.Notification._requestPermission(dart.fn(value => {
      completer.complete(value);
    }, StringToNull()));
    return completer.future;
  }
  get [dartx.onClick]() {
    return html$.Notification.clickEvent.forTarget(this);
  }
  get [dartx.onClose]() {
    return html$.Notification.closeEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.Notification.errorEvent.forTarget(this);
  }
  get [dartx.onShow]() {
    return html$.Notification.showEvent.forTarget(this);
  }
};
dart.setSignature(html$.Notification, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.Notification, [core.String], {dir: core.String, body: core.String, lang: core.String, tag: core.String, icon: core.String}),
    _: dart.definiteFunctionType(html$.Notification, [])
  }),
  fields: () => ({
    [dartx.body]: core.String,
    [dartx.data]: core.Object,
    [dartx.dir]: core.String,
    [dartx.icon]: core.String,
    [dartx.lang]: core.String,
    [dartx.permission]: core.String,
    [dartx.silent]: core.bool,
    [dartx.tag]: core.String,
    [dartx.title]: core.String,
    [dartx.vibrate]: ListOfint()
  }),
  getters: () => ({
    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onShow]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
  sfields: () => ({
    clickEvent: EventStreamProviderOfEvent(),
    closeEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    showEvent: EventStreamProviderOfEvent()
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _factoryNotification: dart.definiteFunctionType(html$.Notification, [core.String], [core.Map]),
    _create_1: dart.definiteFunctionType(html$.Notification, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.Notification, [dart.dynamic]),
    _requestPermission: dart.definiteFunctionType(dart.void, [], [html$._NotificationPermissionCallback]),
    requestPermission: dart.definiteFunctionType(async.Future$(core.String), [])
  }),
  names: ['_factoryNotification', '_create_1', '_create_2', '_requestPermission', 'requestPermission']
});
dart.defineLazy(html$.Notification, {
  get clickEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('click'));
  },
  get closeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('close'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get showEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('show'));
  }
});
dart.registerExtension(dart.global.Notification, html$.Notification);
dart.defineExtensionNames([
  'notification'
]);
html$.NotificationEvent = class NotificationEvent extends html$.ExtendableEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.NotificationEvent._create_1(type, eventInitDict_1);
    }
    return html$.NotificationEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.NotificationEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.NotificationEvent(type);
  }
  get [dartx.notification]() {
    return this.notification;
  }
};
dart.setSignature(html$.NotificationEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.NotificationEvent, []),
    new: dart.definiteFunctionType(html$.NotificationEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.notification]: html$.Notification}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.NotificationEvent, html$.NotificationEvent);
html$._NotificationPermissionCallback = dart.typedef('_NotificationPermissionCallback', () => dart.functionType(dart.void, [core.String]));
dart.defineExtensionNames([
  'reversed',
  'start',
  'type'
]);
html$.OListElement = class OListElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.OListElement._check(html$.document[dartx.createElement]("ol"));
  }
  created() {
    this[dartx.reversed] = null;
    this[dartx.start] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.reversed]() {
    return this.reversed;
  }
  set [dartx.reversed](value) {
    this.reversed = value;
  }
  get [dartx.start]() {
    return this.start;
  }
  set [dartx.start](value) {
    this.start = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.defineNamedConstructor(html$.OListElement, 'created');
dart.setSignature(html$.OListElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.OListElement, []),
    new: dart.definiteFunctionType(html$.OListElement, []),
    created: dart.definiteFunctionType(html$.OListElement, [])
  }),
  fields: () => ({
    [dartx.reversed]: core.bool,
    [dartx.start]: core.int,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.HTMLOListElement, html$.OListElement);
dart.defineExtensionNames([
  'checkValidity',
  'reportValidity',
  'setCustomValidity',
  'data',
  'form',
  'height',
  'name',
  'type',
  'useMap',
  'validationMessage',
  'validity',
  'width',
  'willValidate'
]);
html$.ObjectElement = class ObjectElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ObjectElement._check(html$.document[dartx.createElement]("object"));
  }
  created() {
    this[dartx.data] = null;
    this[dartx.form] = null;
    this[dartx.height] = null;
    this[dartx.name] = null;
    this[dartx.type] = null;
    this[dartx.useMap] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.width] = null;
    this[dartx.willValidate] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('object');
  }
  get [dartx.data]() {
    return this.data;
  }
  set [dartx.data](value) {
    this.data = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  get [dartx.useMap]() {
    return this.useMap;
  }
  set [dartx.useMap](value) {
    this.useMap = value;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.ObjectElement, 'created');
dart.setSignature(html$.ObjectElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ObjectElement, []),
    new: dart.definiteFunctionType(html$.ObjectElement, []),
    created: dart.definiteFunctionType(html$.ObjectElement, [])
  }),
  fields: () => ({
    [dartx.data]: core.String,
    [dartx.form]: html$.FormElement,
    [dartx.height]: core.String,
    [dartx.name]: core.String,
    [dartx.type]: core.String,
    [dartx.useMap]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.width]: core.String,
    [dartx.willValidate]: core.bool
  }),
  methods: () => ({
    [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLObjectElement, html$.ObjectElement);
dart.defineExtensionNames([
  'disabled',
  'label'
]);
html$.OptGroupElement = class OptGroupElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.OptGroupElement._check(html$.document[dartx.createElement]("optgroup"));
  }
  created() {
    this[dartx.disabled] = null;
    this[dartx.label] = null;
    super.created();
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.label]() {
    return this.label;
  }
  set [dartx.label](value) {
    this.label = value;
  }
};
dart.defineNamedConstructor(html$.OptGroupElement, 'created');
dart.setSignature(html$.OptGroupElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.OptGroupElement, []),
    new: dart.definiteFunctionType(html$.OptGroupElement, []),
    created: dart.definiteFunctionType(html$.OptGroupElement, [])
  }),
  fields: () => ({
    [dartx.disabled]: core.bool,
    [dartx.label]: core.String
  })
});
dart.registerExtension(dart.global.HTMLOptGroupElement, html$.OptGroupElement);
dart.defineExtensionNames([
  'defaultSelected',
  'disabled',
  'form',
  'index',
  'label',
  'selected',
  'value'
]);
html$.OptionElement = class OptionElement extends html$.HtmlElement {
  static new(opts) {
    let data = opts && 'data' in opts ? opts.data : '';
    let value = opts && 'value' in opts ? opts.value : '';
    let selected = opts && 'selected' in opts ? opts.selected : false;
    return html$.OptionElement._(data, value, null, selected);
  }
  static _(data, value, defaultSelected, selected) {
    if (data === void 0) data = null;
    if (value === void 0) value = null;
    if (defaultSelected === void 0) defaultSelected = null;
    if (selected === void 0) selected = null;
    if (selected != null) {
      return html$.OptionElement._create_1(data, value, defaultSelected, selected);
    }
    if (defaultSelected != null) {
      return html$.OptionElement._create_2(data, value, defaultSelected);
    }
    if (value != null) {
      return html$.OptionElement._create_3(data, value);
    }
    if (data != null) {
      return html$.OptionElement._create_4(data);
    }
    return html$.OptionElement._create_5();
  }
  static _create_1(data, value, defaultSelected, selected) {
    return new Option(data, value, defaultSelected, selected);
  }
  static _create_2(data, value, defaultSelected) {
    return new Option(data, value, defaultSelected);
  }
  static _create_3(data, value) {
    return new Option(data, value);
  }
  static _create_4(data) {
    return new Option(data);
  }
  static _create_5() {
    return new Option();
  }
  created() {
    this[dartx.defaultSelected] = null;
    this[dartx.disabled] = null;
    this[dartx.form] = null;
    this[dartx.index] = null;
    this[dartx.label] = null;
    this[dartx.selected] = null;
    this[dartx.value] = null;
    super.created();
  }
  get [dartx.defaultSelected]() {
    return this.defaultSelected;
  }
  set [dartx.defaultSelected](value) {
    this.defaultSelected = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.index]() {
    return this.index;
  }
  get [dartx.label]() {
    return this.label;
  }
  set [dartx.label](value) {
    this.label = value;
  }
  get [dartx.selected]() {
    return this.selected;
  }
  set [dartx.selected](value) {
    this.selected = value;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.defineNamedConstructor(html$.OptionElement, 'created');
dart.setSignature(html$.OptionElement, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.OptionElement, [], {data: core.String, value: core.String, selected: core.bool}),
    _: dart.definiteFunctionType(html$.OptionElement, [], [core.String, core.String, core.bool, core.bool]),
    created: dart.definiteFunctionType(html$.OptionElement, [])
  }),
  fields: () => ({
    [dartx.defaultSelected]: core.bool,
    [dartx.disabled]: core.bool,
    [dartx.form]: html$.FormElement,
    [dartx.index]: core.int,
    [dartx.label]: core.String,
    [dartx.selected]: core.bool,
    [dartx.value]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic]),
    _create_4: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic]),
    _create_5: dart.definiteFunctionType(html$.OptionElement, [])
  }),
  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
});
dart.registerExtension(dart.global.HTMLOptionElement, html$.OptionElement);
dart.defineExtensionNames([
  'checkValidity',
  'reportValidity',
  'setCustomValidity',
  'defaultValue',
  'form',
  'htmlFor',
  'labels',
  'name',
  'type',
  'validationMessage',
  'validity',
  'value',
  'willValidate'
]);
html$.OutputElement = class OutputElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.OutputElement._check(html$.document[dartx.createElement]("output"));
  }
  created() {
    this[dartx.defaultValue] = null;
    this[dartx.form] = null;
    this[dartx.htmlFor] = null;
    this[dartx.labels] = null;
    this[dartx.name] = null;
    this[dartx.type] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.value] = null;
    this[dartx.willValidate] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('output');
  }
  get [dartx.defaultValue]() {
    return this.defaultValue;
  }
  set [dartx.defaultValue](value) {
    this.defaultValue = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.htmlFor]() {
    return this.htmlFor;
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.OutputElement, 'created');
dart.setSignature(html$.OutputElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.OutputElement, []),
    new: dart.definiteFunctionType(html$.OutputElement, []),
    created: dart.definiteFunctionType(html$.OutputElement, [])
  }),
  fields: () => ({
    [dartx.defaultValue]: core.String,
    [dartx.form]: html$.FormElement,
    [dartx.htmlFor]: html$.DomSettableTokenList,
    [dartx.labels]: ListOfNode(),
    [dartx.name]: core.String,
    [dartx.type]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.value]: core.String,
    [dartx.willValidate]: core.bool
  }),
  methods: () => ({
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLOutputElement, html$.OutputElement);
dart.defineExtensionNames([
  'persisted'
]);
html$.PageTransitionEvent = class PageTransitionEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PageTransitionEvent._create_1(type, eventInitDict_1);
    }
    return html$.PageTransitionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.PageTransitionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.PageTransitionEvent(type);
  }
  get [dartx.persisted]() {
    return this.persisted;
  }
};
dart.setSignature(html$.PageTransitionEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PageTransitionEvent, []),
    new: dart.definiteFunctionType(html$.PageTransitionEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.persisted]: core.bool}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.PageTransitionEvent, html$.PageTransitionEvent);
html$.ParagraphElement = class ParagraphElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ParagraphElement._check(html$.document[dartx.createElement]("p"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.ParagraphElement, 'created');
dart.setSignature(html$.ParagraphElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ParagraphElement, []),
    new: dart.definiteFunctionType(html$.ParagraphElement, []),
    created: dart.definiteFunctionType(html$.ParagraphElement, [])
  })
});
dart.registerExtension(dart.global.HTMLParagraphElement, html$.ParagraphElement);
dart.defineExtensionNames([
  'name',
  'value'
]);
html$.ParamElement = class ParamElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ParamElement._check(html$.document[dartx.createElement]("param"));
  }
  created() {
    this[dartx.name] = null;
    this[dartx.value] = null;
    super.created();
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.defineNamedConstructor(html$.ParamElement, 'created');
dart.setSignature(html$.ParamElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ParamElement, []),
    new: dart.definiteFunctionType(html$.ParamElement, []),
    created: dart.definiteFunctionType(html$.ParamElement, [])
  }),
  fields: () => ({
    [dartx.name]: core.String,
    [dartx.value]: core.String
  })
});
dart.registerExtension(dart.global.HTMLParamElement, html$.ParamElement);
html$.ParentNode = class ParentNode extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.ParentNode, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ParentNode, [])}),
  fields: () => ({
    [_childElementCount]: core.int,
    [_children]: ListOfNode(),
    [_firstElementChild]: html$.Element,
    [_lastElementChild]: html$.Element
  })
});
dart.defineExtensionNames([
  'formData',
  'password'
]);
html$.PasswordCredential = class PasswordCredential extends html$.Credential {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(id, password, name, iconURL) {
    if (name === void 0) name = null;
    if (iconURL === void 0) iconURL = null;
    if (iconURL != null) {
      return html$.PasswordCredential._create_1(id, password, name, iconURL);
    }
    if (name != null) {
      return html$.PasswordCredential._create_2(id, password, name);
    }
    return html$.PasswordCredential._create_3(id, password);
  }
  static _create_1(id, password, name, iconURL) {
    return new self.PasswordCredential(id, password, name, iconURL);
  }
  static _create_2(id, password, name) {
    return new self.PasswordCredential(id, password, name);
  }
  static _create_3(id, password) {
    return new self.PasswordCredential(id, password);
  }
  get [dartx.formData]() {
    return this.formData;
  }
  get [dartx.password]() {
    return this.password;
  }
};
dart.setSignature(html$.PasswordCredential, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PasswordCredential, []),
    new: dart.definiteFunctionType(html$.PasswordCredential, [core.String, core.String], [core.String, core.String])
  }),
  fields: () => ({
    [dartx.formData]: html$.FormData,
    [dartx.password]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_3']
});
dart.registerExtension(dart.global.PasswordCredential, html$.PasswordCredential);
dart.defineExtensionNames([
  'addPath',
  'arc',
  'arcTo',
  'bezierCurveTo',
  'closePath',
  'ellipse',
  'lineTo',
  'moveTo',
  'quadraticCurveTo',
  'rect'
]);
html$.Path2D = class Path2D extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(path_OR_text) {
    if (path_OR_text === void 0) path_OR_text = null;
    if (path_OR_text == null) {
      return html$.Path2D._create_1();
    }
    if (html$.Path2D.is(path_OR_text) || path_OR_text == null) {
      return html$.Path2D._create_2(path_OR_text);
    }
    if (typeof path_OR_text == 'string' || path_OR_text == null) {
      return html$.Path2D._create_3(path_OR_text);
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  static _create_1() {
    return new Path2D();
  }
  static _create_2(path_OR_text) {
    return new Path2D(path_OR_text);
  }
  static _create_3(path_OR_text) {
    return new Path2D(path_OR_text);
  }
  [dartx.addPath](...args) {
    return this.addPath.apply(this, args);
  }
  [dartx.arc](...args) {
    return this.arc.apply(this, args);
  }
  [dartx.arcTo](...args) {
    return this.arcTo.apply(this, args);
  }
  [dartx.bezierCurveTo](...args) {
    return this.bezierCurveTo.apply(this, args);
  }
  [dartx.closePath](...args) {
    return this.closePath.apply(this, args);
  }
  [dartx.ellipse](...args) {
    return this.ellipse.apply(this, args);
  }
  [dartx.lineTo](...args) {
    return this.lineTo.apply(this, args);
  }
  [dartx.moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [dartx.quadraticCurveTo](...args) {
    return this.quadraticCurveTo.apply(this, args);
  }
  [dartx.rect](...args) {
    return this.rect.apply(this, args);
  }
};
html$.Path2D[dart.implements] = () => [html$._CanvasPathMethods];
dart.setSignature(html$.Path2D, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.Path2D, []),
    new: dart.definiteFunctionType(html$.Path2D, [], [dart.dynamic])
  }),
  methods: () => ({
    [dartx.addPath]: dart.definiteFunctionType(dart.void, [html$.Path2D], [svg$.Matrix]),
    [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
    [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
    [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
    [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
    [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.Path2D, []),
    _create_2: dart.definiteFunctionType(html$.Path2D, [dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.Path2D, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2', '_create_3']
});
dart.registerExtension(dart.global.Path2D, html$.Path2D);
dart.defineExtensionNames([
  'clearFrameTimings',
  'clearMarks',
  'clearMeasures',
  'getEntries',
  'getEntriesByName',
  'getEntriesByType',
  'mark',
  'measure',
  'now',
  'setFrameTimingBufferSize',
  'clearResourceTimings',
  'setResourceTimingBufferSize',
  'onResourceTimingBufferFull',
  'memory',
  'navigation',
  'timing'
]);
html$.Performance = class Performance extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!window.performance;
  }
  get [dartx.memory]() {
    return this.memory;
  }
  get [dartx.navigation]() {
    return this.navigation;
  }
  get [dartx.timing]() {
    return this.timing;
  }
  [dartx.clearFrameTimings](...args) {
    return this.clearFrameTimings.apply(this, args);
  }
  [dartx.clearMarks](...args) {
    return this.clearMarks.apply(this, args);
  }
  [dartx.clearMeasures](...args) {
    return this.clearMeasures.apply(this, args);
  }
  [dartx.getEntries](...args) {
    return this.getEntries.apply(this, args);
  }
  [dartx.getEntriesByName](...args) {
    return this.getEntriesByName.apply(this, args);
  }
  [dartx.getEntriesByType](...args) {
    return this.getEntriesByType.apply(this, args);
  }
  [dartx.mark](...args) {
    return this.mark.apply(this, args);
  }
  [dartx.measure](...args) {
    return this.measure.apply(this, args);
  }
  [dartx.now](...args) {
    return this.now.apply(this, args);
  }
  [dartx.setFrameTimingBufferSize](...args) {
    return this.setFrameTimingBufferSize.apply(this, args);
  }
  [dartx.clearResourceTimings](...args) {
    return this.webkitClearResourceTimings.apply(this, args);
  }
  [dartx.setResourceTimingBufferSize](...args) {
    return this.webkitSetResourceTimingBufferSize.apply(this, args);
  }
  get [dartx.onResourceTimingBufferFull]() {
    return html$.Performance.resourceTimingBufferFullEvent.forTarget(this);
  }
};
dart.setSignature(html$.Performance, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Performance, [])}),
  fields: () => ({
    [dartx.memory]: html$.MemoryInfo,
    [dartx.navigation]: html$.PerformanceNavigation,
    [dartx.timing]: html$.PerformanceTiming
  }),
  getters: () => ({[dartx.onResourceTimingBufferFull]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.clearFrameTimings]: dart.definiteFunctionType(dart.void, []),
    [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
    [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
    [dartx.now]: dart.definiteFunctionType(core.double, []),
    [dartx.setFrameTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
    [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
  }),
  sfields: () => ({resourceTimingBufferFullEvent: EventStreamProviderOfEvent()}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineLazy(html$.Performance, {
  get resourceTimingBufferFullEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('webkitresourcetimingbufferfull'));
  }
});
dart.registerExtension(dart.global.Performance, html$.Performance);
dart.defineExtensionNames([
  'duration',
  'entryType',
  'name',
  'startTime'
]);
html$.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.duration]() {
    return this.duration;
  }
  get [dartx.entryType]() {
    return this.entryType;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.startTime]() {
    return this.startTime;
  }
};
dart.setSignature(html$.PerformanceEntry, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceEntry, [])}),
  fields: () => ({
    [dartx.duration]: core.double,
    [dartx.entryType]: core.String,
    [dartx.name]: core.String,
    [dartx.startTime]: core.double
  })
});
dart.registerExtension(dart.global.PerformanceEntry, html$.PerformanceEntry);
dart.defineExtensionNames([
  'sourceFrame'
]);
html$.PerformanceCompositeTiming = class PerformanceCompositeTiming extends html$.PerformanceEntry {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.sourceFrame]() {
    return this.sourceFrame;
  }
};
dart.setSignature(html$.PerformanceCompositeTiming, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceCompositeTiming, [])}),
  fields: () => ({[dartx.sourceFrame]: core.int})
});
dart.registerExtension(dart.global.PerformanceCompositeTiming, html$.PerformanceCompositeTiming);
html$.PerformanceMark = class PerformanceMark extends html$.PerformanceEntry {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.PerformanceMark, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMark, [])})
});
dart.registerExtension(dart.global.PerformanceMark, html$.PerformanceMark);
html$.PerformanceMeasure = class PerformanceMeasure extends html$.PerformanceEntry {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.PerformanceMeasure, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMeasure, [])})
});
dart.registerExtension(dart.global.PerformanceMeasure, html$.PerformanceMeasure);
dart.defineExtensionNames([
  'redirectCount',
  'type'
]);
html$.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.redirectCount]() {
    return this.redirectCount;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.PerformanceNavigation, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceNavigation, [])}),
  fields: () => ({
    [dartx.redirectCount]: core.int,
    [dartx.type]: core.int
  }),
  sfields: () => ({
    TYPE_BACK_FORWARD: core.int,
    TYPE_NAVIGATE: core.int,
    TYPE_RELOAD: core.int,
    TYPE_RESERVED: core.int
  })
});
html$.PerformanceNavigation.TYPE_BACK_FORWARD = 2;
html$.PerformanceNavigation.TYPE_NAVIGATE = 0;
html$.PerformanceNavigation.TYPE_RELOAD = 1;
html$.PerformanceNavigation.TYPE_RESERVED = 255;
dart.registerExtension(dart.global.PerformanceNavigation, html$.PerformanceNavigation);
dart.defineExtensionNames([
  'sourceFrame'
]);
html$.PerformanceRenderTiming = class PerformanceRenderTiming extends html$.PerformanceEntry {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.sourceFrame]() {
    return this.sourceFrame;
  }
};
dart.setSignature(html$.PerformanceRenderTiming, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceRenderTiming, [])}),
  fields: () => ({[dartx.sourceFrame]: core.int})
});
dart.registerExtension(dart.global.PerformanceRenderTiming, html$.PerformanceRenderTiming);
dart.defineExtensionNames([
  'connectEnd',
  'connectStart',
  'domainLookupEnd',
  'domainLookupStart',
  'fetchStart',
  'initiatorType',
  'redirectEnd',
  'redirectStart',
  'requestStart',
  'responseEnd',
  'responseStart',
  'secureConnectionStart',
  'workerStart'
]);
html$.PerformanceResourceTiming = class PerformanceResourceTiming extends html$.PerformanceEntry {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.connectEnd]() {
    return this.connectEnd;
  }
  get [dartx.connectStart]() {
    return this.connectStart;
  }
  get [dartx.domainLookupEnd]() {
    return this.domainLookupEnd;
  }
  get [dartx.domainLookupStart]() {
    return this.domainLookupStart;
  }
  get [dartx.fetchStart]() {
    return this.fetchStart;
  }
  get [dartx.initiatorType]() {
    return this.initiatorType;
  }
  get [dartx.redirectEnd]() {
    return this.redirectEnd;
  }
  get [dartx.redirectStart]() {
    return this.redirectStart;
  }
  get [dartx.requestStart]() {
    return this.requestStart;
  }
  get [dartx.responseEnd]() {
    return this.responseEnd;
  }
  get [dartx.responseStart]() {
    return this.responseStart;
  }
  get [dartx.secureConnectionStart]() {
    return this.secureConnectionStart;
  }
  get [dartx.workerStart]() {
    return this.workerStart;
  }
};
dart.setSignature(html$.PerformanceResourceTiming, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceResourceTiming, [])}),
  fields: () => ({
    [dartx.connectEnd]: core.double,
    [dartx.connectStart]: core.double,
    [dartx.domainLookupEnd]: core.double,
    [dartx.domainLookupStart]: core.double,
    [dartx.fetchStart]: core.double,
    [dartx.initiatorType]: core.String,
    [dartx.redirectEnd]: core.double,
    [dartx.redirectStart]: core.double,
    [dartx.requestStart]: core.double,
    [dartx.responseEnd]: core.double,
    [dartx.responseStart]: core.double,
    [dartx.secureConnectionStart]: core.double,
    [dartx.workerStart]: core.double
  })
});
dart.registerExtension(dart.global.PerformanceResourceTiming, html$.PerformanceResourceTiming);
dart.defineExtensionNames([
  'connectEnd',
  'connectStart',
  'domComplete',
  'domContentLoadedEventEnd',
  'domContentLoadedEventStart',
  'domInteractive',
  'domLoading',
  'domainLookupEnd',
  'domainLookupStart',
  'fetchStart',
  'loadEventEnd',
  'loadEventStart',
  'navigationStart',
  'redirectEnd',
  'redirectStart',
  'requestStart',
  'responseEnd',
  'responseStart',
  'secureConnectionStart',
  'unloadEventEnd',
  'unloadEventStart'
]);
html$.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.connectEnd]() {
    return this.connectEnd;
  }
  get [dartx.connectStart]() {
    return this.connectStart;
  }
  get [dartx.domComplete]() {
    return this.domComplete;
  }
  get [dartx.domContentLoadedEventEnd]() {
    return this.domContentLoadedEventEnd;
  }
  get [dartx.domContentLoadedEventStart]() {
    return this.domContentLoadedEventStart;
  }
  get [dartx.domInteractive]() {
    return this.domInteractive;
  }
  get [dartx.domLoading]() {
    return this.domLoading;
  }
  get [dartx.domainLookupEnd]() {
    return this.domainLookupEnd;
  }
  get [dartx.domainLookupStart]() {
    return this.domainLookupStart;
  }
  get [dartx.fetchStart]() {
    return this.fetchStart;
  }
  get [dartx.loadEventEnd]() {
    return this.loadEventEnd;
  }
  get [dartx.loadEventStart]() {
    return this.loadEventStart;
  }
  get [dartx.navigationStart]() {
    return this.navigationStart;
  }
  get [dartx.redirectEnd]() {
    return this.redirectEnd;
  }
  get [dartx.redirectStart]() {
    return this.redirectStart;
  }
  get [dartx.requestStart]() {
    return this.requestStart;
  }
  get [dartx.responseEnd]() {
    return this.responseEnd;
  }
  get [dartx.responseStart]() {
    return this.responseStart;
  }
  get [dartx.secureConnectionStart]() {
    return this.secureConnectionStart;
  }
  get [dartx.unloadEventEnd]() {
    return this.unloadEventEnd;
  }
  get [dartx.unloadEventStart]() {
    return this.unloadEventStart;
  }
};
dart.setSignature(html$.PerformanceTiming, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceTiming, [])}),
  fields: () => ({
    [dartx.connectEnd]: core.int,
    [dartx.connectStart]: core.int,
    [dartx.domComplete]: core.int,
    [dartx.domContentLoadedEventEnd]: core.int,
    [dartx.domContentLoadedEventStart]: core.int,
    [dartx.domInteractive]: core.int,
    [dartx.domLoading]: core.int,
    [dartx.domainLookupEnd]: core.int,
    [dartx.domainLookupStart]: core.int,
    [dartx.fetchStart]: core.int,
    [dartx.loadEventEnd]: core.int,
    [dartx.loadEventStart]: core.int,
    [dartx.navigationStart]: core.int,
    [dartx.redirectEnd]: core.int,
    [dartx.redirectStart]: core.int,
    [dartx.requestStart]: core.int,
    [dartx.responseEnd]: core.int,
    [dartx.responseStart]: core.int,
    [dartx.secureConnectionStart]: core.int,
    [dartx.unloadEventEnd]: core.int,
    [dartx.unloadEventStart]: core.int
  })
});
dart.registerExtension(dart.global.PerformanceTiming, html$.PerformanceTiming);
dart.defineExtensionNames([
  'registration'
]);
html$.PeriodicSyncEvent = class PeriodicSyncEvent extends html$.ExtendableEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.PeriodicSyncEvent._create_1(type, init_1);
  }
  static _create_1(type, init) {
    return new self.PeriodicSyncEvent(type, init);
  }
  get [dartx.registration]() {
    return this.registration;
  }
};
dart.setSignature(html$.PeriodicSyncEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PeriodicSyncEvent, []),
    new: dart.definiteFunctionType(html$.PeriodicSyncEvent, [core.String, core.Map])
  }),
  fields: () => ({[dartx.registration]: html$.PeriodicSyncRegistration}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.PeriodicSyncEvent, [dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.PeriodicSyncEvent, html$.PeriodicSyncEvent);
const _register_1 = Symbol('_register_1');
const _register_2 = Symbol('_register_2');
dart.defineExtensionNames([
  'getRegistration',
  'getRegistrations',
  'permissionState',
  'register',
  'minPossiblePeriod'
]);
html$.PeriodicSyncManager = class PeriodicSyncManager extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.minPossiblePeriod]() {
    return this.minPossiblePeriod;
  }
  [dartx.getRegistration](...args) {
    return this.getRegistration.apply(this, args);
  }
  [dartx.getRegistrations](...args) {
    return this.getRegistrations.apply(this, args);
  }
  [dartx.permissionState](...args) {
    return this.permissionState.apply(this, args);
  }
  [dartx.register](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_register_1](options_1);
    }
    return this[_register_2]();
  }
  [_register_1](...args) {
    return this.register.apply(this, args);
  }
  [_register_2](...args) {
    return this.register.apply(this, args);
  }
};
dart.setSignature(html$.PeriodicSyncManager, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncManager, [])}),
  fields: () => ({[dartx.minPossiblePeriod]: core.int}),
  methods: () => ({
    [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
    [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
    [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_register_2]: dart.definiteFunctionType(async.Future, [])
  })
});
dart.registerExtension(dart.global.PeriodicSyncManager, html$.PeriodicSyncManager);
dart.defineExtensionNames([
  'unregister',
  'minPeriod',
  'networkState',
  'powerState',
  'tag'
]);
html$.PeriodicSyncRegistration = class PeriodicSyncRegistration extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.minPeriod]() {
    return this.minPeriod;
  }
  get [dartx.networkState]() {
    return this.networkState;
  }
  get [dartx.powerState]() {
    return this.powerState;
  }
  get [dartx.tag]() {
    return this.tag;
  }
  [dartx.unregister](...args) {
    return this.unregister.apply(this, args);
  }
};
dart.setSignature(html$.PeriodicSyncRegistration, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncRegistration, [])}),
  fields: () => ({
    [dartx.minPeriod]: core.int,
    [dartx.networkState]: core.String,
    [dartx.powerState]: core.String,
    [dartx.tag]: core.String
  }),
  methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
});
dart.registerExtension(dart.global.PeriodicSyncRegistration, html$.PeriodicSyncRegistration);
dart.defineExtensionNames([
  'onChange',
  'state',
  'status'
]);
html$.PermissionStatus = class PermissionStatus extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.state]() {
    return this.state;
  }
  get [dartx.status]() {
    return this.status;
  }
  get [dartx.onChange]() {
    return html$.PermissionStatus.changeEvent.forTarget(this);
  }
};
dart.setSignature(html$.PermissionStatus, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PermissionStatus, [])}),
  fields: () => ({
    [dartx.state]: core.String,
    [dartx.status]: core.String
  }),
  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.PermissionStatus, {
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  }
});
dart.registerExtension(dart.global.PermissionStatus, html$.PermissionStatus);
dart.defineExtensionNames([
  'query'
]);
html$.Permissions = class Permissions extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.query](...args) {
    return this.query.apply(this, args);
  }
};
dart.setSignature(html$.Permissions, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Permissions, [])}),
  methods: () => ({[dartx.query]: dart.definiteFunctionType(async.Future, [core.Object])})
});
dart.registerExtension(dart.global.Permissions, html$.Permissions);
html$.PictureElement = class PictureElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.PictureElement, 'created');
dart.setSignature(html$.PictureElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PictureElement, []),
    created: dart.definiteFunctionType(html$.PictureElement, [])
  })
});
dart.registerExtension(dart.global.HTMLPictureElement, html$.PictureElement);
dart.defineExtensionNames([
  'item',
  'namedItem',
  'description',
  'filename',
  'length',
  'name'
]);
html$.Plugin = class Plugin extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.description]() {
    return this.description;
  }
  get [dartx.filename]() {
    return this.filename;
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.name]() {
    return this.name;
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
dart.setSignature(html$.Plugin, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Plugin, [])}),
  fields: () => ({
    [dartx.description]: core.String,
    [dartx.filename]: core.String,
    [dartx.length]: core.int,
    [dartx.name]: core.String
  }),
  methods: () => ({
    [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
    [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
  })
});
dart.registerExtension(dart.global.Plugin, html$.Plugin);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item',
  'namedItem',
  'refresh'
]);
html$.PluginArray = class PluginArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Plugin), html$.ImmutableListMixin$(html$.Plugin)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
  [dartx.refresh](...args) {
    return this.refresh.apply(this, args);
  }
};
html$.PluginArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfPlugin()];
dart.setSignature(html$.PluginArray, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PluginArray, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.Plugin, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Plugin]),
    [dartx.item]: dart.definiteFunctionType(html$.Plugin, [core.int]),
    [dartx.namedItem]: dart.definiteFunctionType(html$.Plugin, [core.String]),
    [dartx.refresh]: dart.definiteFunctionType(dart.void, [core.bool])
  })
});
dart.registerExtension(dart.global.PluginArray, html$.PluginArray);
dart.defineExtensionNames([
  'createdCallback',
  'closeable',
  'message'
]);
html$.PluginPlaceholderElement = class PluginPlaceholderElement extends html$.DivElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.closeable] = null;
    this[dartx.message] = null;
    super.created();
  }
  get [dartx.closeable]() {
    return this.closeable;
  }
  set [dartx.closeable](value) {
    this.closeable = value;
  }
  get [dartx.message]() {
    return this.message;
  }
  set [dartx.message](value) {
    this.message = value;
  }
  [dartx.createdCallback](...args) {
    return this.createdCallback.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.PluginPlaceholderElement, 'created');
dart.setSignature(html$.PluginPlaceholderElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PluginPlaceholderElement, []),
    created: dart.definiteFunctionType(html$.PluginPlaceholderElement, [])
  }),
  fields: () => ({
    [dartx.closeable]: core.bool,
    [dartx.message]: core.String
  }),
  methods: () => ({[dartx.createdCallback]: dart.definiteFunctionType(dart.void, [])})
});
dart.registerExtension(dart.global.PluginPlaceholderElement, html$.PluginPlaceholderElement);
dart.defineExtensionNames([
  'height',
  'isPrimary',
  'pointerId',
  'pointerType',
  'pressure',
  'tiltX',
  'tiltY',
  'width'
]);
html$.PointerEvent = class PointerEvent extends html$.MouseEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PointerEvent._create_1(type, eventInitDict_1);
    }
    return html$.PointerEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.PointerEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.PointerEvent(type);
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.isPrimary]() {
    return this.isPrimary;
  }
  get [dartx.pointerId]() {
    return this.pointerId;
  }
  get [dartx.pointerType]() {
    return this.pointerType;
  }
  get [dartx.pressure]() {
    return this.pressure;
  }
  get [dartx.tiltX]() {
    return this.tiltX;
  }
  get [dartx.tiltY]() {
    return this.tiltY;
  }
  get [dartx.width]() {
    return this.width;
  }
};
dart.setSignature(html$.PointerEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PointerEvent, []),
    new: dart.definiteFunctionType(html$.PointerEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.height]: core.double,
    [dartx.isPrimary]: core.bool,
    [dartx.pointerId]: core.int,
    [dartx.pointerType]: core.String,
    [dartx.pressure]: core.double,
    [dartx.tiltX]: core.int,
    [dartx.tiltY]: core.int,
    [dartx.width]: core.double
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.PointerEvent, html$.PointerEvent);
dart.defineExtensionNames([
  'state'
]);
html$.PopStateEvent = class PopStateEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PopStateEvent._create_1(type, eventInitDict_1);
    }
    return html$.PopStateEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.PopStateEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.PopStateEvent(type);
  }
  get [dartx.state]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
  }
  get [_get_state]() {
    return this.state;
  }
};
dart.setSignature(html$.PopStateEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PopStateEvent, []),
    new: dart.definiteFunctionType(html$.PopStateEvent, [core.String], [core.Map])
  }),
  fields: () => ({[_get_state]: dart.dynamic}),
  getters: () => ({[dartx.state]: dart.definiteFunctionType(dart.dynamic, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.PopStateEvent, html$.PopStateEvent);
html$._PositionCallback = dart.typedef('_PositionCallback', () => dart.functionType(dart.void, [html$.Geoposition]));
dart.defineExtensionNames([
  'code',
  'message'
]);
html$.PositionError = class PositionError extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.code]() {
    return this.code;
  }
  get [dartx.message]() {
    return this.message;
  }
};
dart.setSignature(html$.PositionError, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PositionError, [])}),
  fields: () => ({
    [dartx.code]: core.int,
    [dartx.message]: core.String
  }),
  sfields: () => ({
    PERMISSION_DENIED: core.int,
    POSITION_UNAVAILABLE: core.int,
    TIMEOUT: core.int
  })
});
html$.PositionError.PERMISSION_DENIED = 1;
html$.PositionError.POSITION_UNAVAILABLE = 2;
html$.PositionError.TIMEOUT = 3;
dart.registerExtension(dart.global.PositionError, html$.PositionError);
html$._PositionErrorCallback = dart.typedef('_PositionErrorCallback', () => dart.functionType(dart.void, [html$.PositionError]));
dart.defineExtensionNames([
  'getImmediateState',
  'getState',
  'resetSensor'
]);
html$.PositionSensorVRDevice = class PositionSensorVRDevice extends html$.VRDevice {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getImmediateState](...args) {
    return this.getImmediateState.apply(this, args);
  }
  [dartx.getState](...args) {
    return this.getState.apply(this, args);
  }
  [dartx.resetSensor](...args) {
    return this.resetSensor.apply(this, args);
  }
};
dart.setSignature(html$.PositionSensorVRDevice, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PositionSensorVRDevice, [])}),
  methods: () => ({
    [dartx.getImmediateState]: dart.definiteFunctionType(html$.VRPositionState, []),
    [dartx.getState]: dart.definiteFunctionType(html$.VRPositionState, []),
    [dartx.resetSensor]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.PositionSensorVRDevice, html$.PositionSensorVRDevice);
html$.PreElement = class PreElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.PreElement._check(html$.document[dartx.createElement]("pre"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.PreElement, 'created');
dart.setSignature(html$.PreElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PreElement, []),
    new: dart.definiteFunctionType(html$.PreElement, []),
    created: dart.definiteFunctionType(html$.PreElement, [])
  })
});
dart.registerExtension(dart.global.HTMLPreElement, html$.PreElement);
dart.defineExtensionNames([
  'getAvailability',
  'joinSession',
  'startSession',
  'session'
]);
html$.Presentation = class Presentation extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.session]() {
    return this.session;
  }
  [dartx.getAvailability](...args) {
    return this.getAvailability.apply(this, args);
  }
  [dartx.joinSession](...args) {
    return this.joinSession.apply(this, args);
  }
  [dartx.startSession](...args) {
    return this.startSession.apply(this, args);
  }
};
dart.setSignature(html$.Presentation, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Presentation, [])}),
  fields: () => ({[dartx.session]: html$.PresentationSession}),
  methods: () => ({
    [dartx.getAvailability]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.joinSession]: dart.definiteFunctionType(async.Future, [core.String, core.String]),
    [dartx.startSession]: dart.definiteFunctionType(async.Future, [core.String])
  })
});
dart.registerExtension(dart.global.Presentation, html$.Presentation);
dart.defineExtensionNames([
  'onChange',
  'value'
]);
html$.PresentationAvailability = class PresentationAvailability extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.value]() {
    return this.value;
  }
  get [dartx.onChange]() {
    return html$.PresentationAvailability.changeEvent.forTarget(this);
  }
};
dart.setSignature(html$.PresentationAvailability, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PresentationAvailability, [])}),
  fields: () => ({[dartx.value]: core.bool}),
  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.PresentationAvailability, {
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  }
});
dart.registerExtension(dart.global.PresentationAvailability, html$.PresentationAvailability);
dart.defineExtensionNames([
  'close',
  'send',
  'onMessage',
  'binaryType',
  'id',
  'state'
]);
html$.PresentationSession = class PresentationSession extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.binaryType]() {
    return this.binaryType;
  }
  set [dartx.binaryType](value) {
    this.binaryType = value;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.state]() {
    return this.state;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.send](...args) {
    return this.send.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.PresentationSession.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.PresentationSession, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PresentationSession, [])}),
  fields: () => ({
    [dartx.binaryType]: core.String,
    [dartx.id]: core.String,
    [dartx.state]: core.String
  }),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.PresentationSession, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.PresentationSession, html$.PresentationSession);
dart.defineExtensionNames([
  'sheet',
  'target'
]);
html$.ProcessingInstruction = class ProcessingInstruction extends html$.CharacterData {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.sheet]() {
    return this.sheet;
  }
  get [dartx.target]() {
    return this.target;
  }
};
dart.setSignature(html$.ProcessingInstruction, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ProcessingInstruction, [])}),
  fields: () => ({
    [dartx.sheet]: html$.StyleSheet,
    [dartx.target]: core.String
  })
});
dart.registerExtension(dart.global.ProcessingInstruction, html$.ProcessingInstruction);
dart.defineExtensionNames([
  'labels',
  'max',
  'position',
  'value'
]);
html$.ProgressElement = class ProgressElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ProgressElement._check(html$.document[dartx.createElement]("progress"));
  }
  created() {
    this[dartx.labels] = null;
    this[dartx.max] = null;
    this[dartx.position] = null;
    this[dartx.value] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('progress');
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.max]() {
    return this.max;
  }
  set [dartx.max](value) {
    this.max = value;
  }
  get [dartx.position]() {
    return this.position;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.defineNamedConstructor(html$.ProgressElement, 'created');
dart.setSignature(html$.ProgressElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ProgressElement, []),
    new: dart.definiteFunctionType(html$.ProgressElement, []),
    created: dart.definiteFunctionType(html$.ProgressElement, [])
  }),
  fields: () => ({
    [dartx.labels]: ListOfNode(),
    [dartx.max]: core.num,
    [dartx.position]: core.double,
    [dartx.value]: core.num
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLProgressElement, html$.ProgressElement);
dart.defineExtensionNames([
  'lengthComputable',
  'loaded',
  'total'
]);
html$.ProgressEvent = class ProgressEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ProgressEvent._create_1(type, eventInitDict_1);
    }
    return html$.ProgressEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.ProgressEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.ProgressEvent(type);
  }
  get [dartx.lengthComputable]() {
    return this.lengthComputable;
  }
  get [dartx.loaded]() {
    return this.loaded;
  }
  get [dartx.total]() {
    return this.total;
  }
};
dart.setSignature(html$.ProgressEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ProgressEvent, []),
    new: dart.definiteFunctionType(html$.ProgressEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.lengthComputable]: core.bool,
    [dartx.loaded]: core.int,
    [dartx.total]: core.int
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.ProgressEvent, html$.ProgressEvent);
dart.defineExtensionNames([
  'promise',
  'reason'
]);
html$.PromiseRejectionEvent = class PromiseRejectionEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PromiseRejectionEvent._create_1(type, eventInitDict_1);
    }
    return html$.PromiseRejectionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.PromiseRejectionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.PromiseRejectionEvent(type);
  }
  get [dartx.promise]() {
    return this.promise;
  }
  get [dartx.reason]() {
    return this.reason;
  }
};
dart.setSignature(html$.PromiseRejectionEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PromiseRejectionEvent, []),
    new: dart.definiteFunctionType(html$.PromiseRejectionEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.promise]: async.Future,
    [dartx.reason]: core.Object
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.PromiseRejectionEvent, html$.PromiseRejectionEvent);
dart.defineExtensionNames([
  'data'
]);
html$.PushEvent = class PushEvent extends html$.ExtendableEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PushEvent._create_1(type, eventInitDict_1);
    }
    return html$.PushEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.PushEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.PushEvent(type);
  }
  get [dartx.data]() {
    return this.data;
  }
};
dart.setSignature(html$.PushEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PushEvent, []),
    new: dart.definiteFunctionType(html$.PushEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.data]: html$.PushMessageData}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.PushEvent, html$.PushEvent);
const _permissionState_1 = Symbol('_permissionState_1');
const _permissionState_2 = Symbol('_permissionState_2');
const _subscribe_1 = Symbol('_subscribe_1');
const _subscribe_2 = Symbol('_subscribe_2');
dart.defineExtensionNames([
  'getSubscription',
  'permissionState',
  'subscribe'
]);
html$.PushManager = class PushManager extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getSubscription](...args) {
    return this.getSubscription.apply(this, args);
  }
  [dartx.permissionState](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_permissionState_1](options_1);
    }
    return this[_permissionState_2]();
  }
  [_permissionState_1](...args) {
    return this.permissionState.apply(this, args);
  }
  [_permissionState_2](...args) {
    return this.permissionState.apply(this, args);
  }
  [dartx.subscribe](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_subscribe_1](options_1);
    }
    return this[_subscribe_2]();
  }
  [_subscribe_1](...args) {
    return this.subscribe.apply(this, args);
  }
  [_subscribe_2](...args) {
    return this.subscribe.apply(this, args);
  }
};
dart.setSignature(html$.PushManager, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PushManager, [])}),
  methods: () => ({
    [dartx.getSubscription]: dart.definiteFunctionType(async.Future, []),
    [dartx.permissionState]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_permissionState_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_permissionState_2]: dart.definiteFunctionType(async.Future, []),
    [dartx.subscribe]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_subscribe_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_subscribe_2]: dart.definiteFunctionType(async.Future, [])
  })
});
dart.registerExtension(dart.global.PushManager, html$.PushManager);
dart.defineExtensionNames([
  'arrayBuffer',
  'blob',
  'json',
  'text'
]);
html$.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(message) {
    return html$.PushMessageData._create_1(message);
  }
  static _create_1(message) {
    return new self.PushMessageData(message);
  }
  [dartx.arrayBuffer](...args) {
    return this.arrayBuffer.apply(this, args);
  }
  [dartx.blob](...args) {
    return this.blob.apply(this, args);
  }
  [dartx.json](...args) {
    return this.json.apply(this, args);
  }
  [dartx.text](...args) {
    return this.text.apply(this, args);
  }
};
dart.setSignature(html$.PushMessageData, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.PushMessageData, []),
    new: dart.definiteFunctionType(html$.PushMessageData, [core.String])
  }),
  methods: () => ({
    [dartx.arrayBuffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
    [dartx.blob]: dart.definiteFunctionType(html$.Blob, []),
    [dartx.json]: dart.definiteFunctionType(core.Object, []),
    [dartx.text]: dart.definiteFunctionType(core.String, [])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.PushMessageData, [dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.PushMessageData, html$.PushMessageData);
dart.defineExtensionNames([
  'unsubscribe',
  'endpoint'
]);
html$.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.endpoint]() {
    return this.endpoint;
  }
  [dartx.unsubscribe](...args) {
    return this.unsubscribe.apply(this, args);
  }
};
dart.setSignature(html$.PushSubscription, {
  constructors: () => ({_: dart.definiteFunctionType(html$.PushSubscription, [])}),
  fields: () => ({[dartx.endpoint]: core.String}),
  methods: () => ({[dartx.unsubscribe]: dart.definiteFunctionType(async.Future, [])})
});
dart.registerExtension(dart.global.PushSubscription, html$.PushSubscription);
dart.defineExtensionNames([
  'cite'
]);
html$.QuoteElement = class QuoteElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.QuoteElement._check(html$.document[dartx.createElement]("q"));
  }
  created() {
    this[dartx.cite] = null;
    super.created();
  }
  get [dartx.cite]() {
    return this.cite;
  }
  set [dartx.cite](value) {
    this.cite = value;
  }
};
dart.defineNamedConstructor(html$.QuoteElement, 'created');
dart.setSignature(html$.QuoteElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.QuoteElement, []),
    new: dart.definiteFunctionType(html$.QuoteElement, []),
    created: dart.definiteFunctionType(html$.QuoteElement, [])
  }),
  fields: () => ({[dartx.cite]: core.String})
});
dart.registerExtension(dart.global.HTMLQuoteElement, html$.QuoteElement);
html$._RtcErrorCallback = dart.typedef('_RtcErrorCallback', () => dart.functionType(dart.void, [core.String]));
html$._RtcSessionDescriptionCallback = dart.typedef('_RtcSessionDescriptionCallback', () => dart.functionType(dart.void, [html$.RtcSessionDescription]));
html$.RtcStatsCallback = dart.typedef('RtcStatsCallback', () => dart.functionType(dart.void, [html$.RtcStatsResponse]));
dart.defineExtensionNames([
  'cloneContents',
  'cloneRange',
  'collapse',
  'compareBoundaryPoints',
  'comparePoint',
  'createContextualFragment',
  'deleteContents',
  'detach',
  'expand',
  'extractContents',
  'getBoundingClientRect',
  'getClientRects',
  'insertNode',
  'isPointInRange',
  'selectNode',
  'selectNodeContents',
  'setEnd',
  'setEndAfter',
  'setEndBefore',
  'setStart',
  'setStartAfter',
  'setStartBefore',
  'surroundContents',
  'collapsed',
  'commonAncestorContainer',
  'endContainer',
  'endOffset',
  'startContainer',
  'startOffset'
]);
html$.Range = class Range extends _interceptors.Interceptor {
  static new() {
    return html$.document[dartx.createRange]();
  }
  static fromPoint(point) {
    return html$.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.collapsed]() {
    return this.collapsed;
  }
  get [dartx.commonAncestorContainer]() {
    return this.commonAncestorContainer;
  }
  get [dartx.endContainer]() {
    return this.endContainer;
  }
  get [dartx.endOffset]() {
    return this.endOffset;
  }
  get [dartx.startContainer]() {
    return this.startContainer;
  }
  get [dartx.startOffset]() {
    return this.startOffset;
  }
  [dartx.cloneContents](...args) {
    return this.cloneContents.apply(this, args);
  }
  [dartx.cloneRange](...args) {
    return this.cloneRange.apply(this, args);
  }
  [dartx.collapse](...args) {
    return this.collapse.apply(this, args);
  }
  [dartx.compareBoundaryPoints](...args) {
    return this.compareBoundaryPoints.apply(this, args);
  }
  [dartx.comparePoint](...args) {
    return this.comparePoint.apply(this, args);
  }
  [dartx.createContextualFragment](...args) {
    return this.createContextualFragment.apply(this, args);
  }
  [dartx.deleteContents](...args) {
    return this.deleteContents.apply(this, args);
  }
  [dartx.detach](...args) {
    return this.detach.apply(this, args);
  }
  [dartx.expand](...args) {
    return this.expand.apply(this, args);
  }
  [dartx.extractContents](...args) {
    return this.extractContents.apply(this, args);
  }
  [dartx.getBoundingClientRect](...args) {
    return this.getBoundingClientRect.apply(this, args);
  }
  [dartx.getClientRects](...args) {
    return this.getClientRects.apply(this, args);
  }
  [dartx.insertNode](...args) {
    return this.insertNode.apply(this, args);
  }
  [dartx.isPointInRange](...args) {
    return this.isPointInRange.apply(this, args);
  }
  [dartx.selectNode](...args) {
    return this.selectNode.apply(this, args);
  }
  [dartx.selectNodeContents](...args) {
    return this.selectNodeContents.apply(this, args);
  }
  [dartx.setEnd](...args) {
    return this.setEnd.apply(this, args);
  }
  [dartx.setEndAfter](...args) {
    return this.setEndAfter.apply(this, args);
  }
  [dartx.setEndBefore](...args) {
    return this.setEndBefore.apply(this, args);
  }
  [dartx.setStart](...args) {
    return this.setStart.apply(this, args);
  }
  [dartx.setStartAfter](...args) {
    return this.setStartAfter.apply(this, args);
  }
  [dartx.setStartBefore](...args) {
    return this.setStartBefore.apply(this, args);
  }
  [dartx.surroundContents](...args) {
    return this.surroundContents.apply(this, args);
  }
  static get supportsCreateContextualFragment() {
    return "createContextualFragment" in window.Range.prototype;
  }
};
dart.setSignature(html$.Range, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.Range, []),
    fromPoint: dart.definiteFunctionType(html$.Range, [PointOfnum()]),
    _: dart.definiteFunctionType(html$.Range, [])
  }),
  fields: () => ({
    [dartx.collapsed]: core.bool,
    [dartx.commonAncestorContainer]: html$.Node,
    [dartx.endContainer]: html$.Node,
    [dartx.endOffset]: core.int,
    [dartx.startContainer]: html$.Node,
    [dartx.startOffset]: core.int
  }),
  methods: () => ({
    [dartx.cloneContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
    [dartx.cloneRange]: dart.definiteFunctionType(html$.Range, []),
    [dartx.collapse]: dart.definiteFunctionType(dart.void, [], [core.bool]),
    [dartx.compareBoundaryPoints]: dart.definiteFunctionType(core.int, [core.int, html$.Range]),
    [dartx.comparePoint]: dart.definiteFunctionType(core.int, [html$.Node, core.int]),
    [dartx.createContextualFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String]),
    [dartx.deleteContents]: dart.definiteFunctionType(dart.void, []),
    [dartx.detach]: dart.definiteFunctionType(dart.void, []),
    [dartx.expand]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.extractContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
    [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
    [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
    [dartx.insertNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.isPointInRange]: dart.definiteFunctionType(core.bool, [html$.Node, core.int]),
    [dartx.selectNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.selectNodeContents]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.setEnd]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
    [dartx.setEndAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.setEndBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.setStart]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
    [dartx.setStartAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.setStartBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.surroundContents]: dart.definiteFunctionType(dart.void, [html$.Node])
  }),
  sfields: () => ({
    END_TO_END: core.int,
    END_TO_START: core.int,
    START_TO_END: core.int,
    START_TO_START: core.int
  }),
  sgetters: () => ({supportsCreateContextualFragment: dart.definiteFunctionType(core.bool, [])})
});
html$.Range.END_TO_END = 2;
html$.Range.END_TO_START = 3;
html$.Range.START_TO_END = 1;
html$.Range.START_TO_START = 0;
dart.registerExtension(dart.global.Range, html$.Range);
dart.defineExtensionNames([
  'cancel',
  'getReader'
]);
html$.ReadableByteStream = class ReadableByteStream extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [dartx.getReader](...args) {
    return this.getReader.apply(this, args);
  }
};
dart.setSignature(html$.ReadableByteStream, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStream, [])}),
  methods: () => ({
    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
    [dartx.getReader]: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])
  })
});
dart.registerExtension(dart.global.ReadableByteStream, html$.ReadableByteStream);
dart.defineExtensionNames([
  'cancel',
  'read',
  'releaseLock',
  'closed'
]);
html$.ReadableByteStreamReader = class ReadableByteStreamReader extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.closed]() {
    return this.closed;
  }
  [dartx.cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [dartx.read](...args) {
    return this.read.apply(this, args);
  }
  [dartx.releaseLock](...args) {
    return this.releaseLock.apply(this, args);
  }
};
dart.setSignature(html$.ReadableByteStreamReader, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])}),
  fields: () => ({[dartx.closed]: async.Future}),
  methods: () => ({
    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
    [dartx.read]: dart.definiteFunctionType(async.Future, []),
    [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.ReadableByteStreamReader, html$.ReadableByteStreamReader);
dart.defineExtensionNames([
  'cancel',
  'getReader'
]);
html$.ReadableStream = class ReadableStream extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [dartx.getReader](...args) {
    return this.getReader.apply(this, args);
  }
};
dart.setSignature(html$.ReadableStream, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStream, [])}),
  methods: () => ({
    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
    [dartx.getReader]: dart.definiteFunctionType(html$.ReadableStreamReader, [])
  })
});
dart.registerExtension(dart.global.ReadableStream, html$.ReadableStream);
dart.defineExtensionNames([
  'cancel',
  'read',
  'releaseLock',
  'closed'
]);
html$.ReadableStreamReader = class ReadableStreamReader extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.closed]() {
    return this.closed;
  }
  [dartx.cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [dartx.read](...args) {
    return this.read.apply(this, args);
  }
  [dartx.releaseLock](...args) {
    return this.releaseLock.apply(this, args);
  }
};
dart.setSignature(html$.ReadableStreamReader, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStreamReader, [])}),
  fields: () => ({[dartx.closed]: async.Future}),
  methods: () => ({
    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
    [dartx.read]: dart.definiteFunctionType(async.Future, []),
    [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.ReadableStreamReader, html$.ReadableStreamReader);
dart.defineExtensionNames([
  'relatedTarget'
]);
html$.RelatedEvent = class RelatedEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.RelatedEvent._create_1(type, eventInitDict_1);
    }
    return html$.RelatedEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.RelatedEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.RelatedEvent(type);
  }
  get [dartx.relatedTarget]() {
    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
  }
  get [_get_relatedTarget]() {
    return this.relatedTarget;
  }
};
dart.setSignature(html$.RelatedEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.RelatedEvent, []),
    new: dart.definiteFunctionType(html$.RelatedEvent, [core.String], [core.Map])
  }),
  fields: () => ({[_get_relatedTarget]: dart.dynamic}),
  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.RelatedEvent, html$.RelatedEvent);
html$.RequestAnimationFrameCallback = dart.typedef('RequestAnimationFrameCallback', () => dart.functionType(dart.void, [core.num]));
dart.defineExtensionNames([
  'url'
]);
html$.ResourceProgressEvent = class ResourceProgressEvent extends html$.ProgressEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.url]() {
    return this.url;
  }
};
dart.setSignature(html$.ResourceProgressEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ResourceProgressEvent, [])}),
  fields: () => ({[dartx.url]: core.String})
});
dart.registerExtension(dart.global.ResourceProgressEvent, html$.ResourceProgressEvent);
dart.defineExtensionNames([
  'close',
  'send',
  'sendBlob',
  'sendByteBuffer',
  'sendString',
  'sendTypedData',
  'onClose',
  'onError',
  'onMessage',
  'onOpen',
  'binaryType',
  'bufferedAmount',
  'id',
  'label',
  'maxRetransmitTime',
  'maxRetransmits',
  'negotiated',
  'ordered',
  'protocol',
  'readyState',
  'reliable'
]);
html$.RtcDataChannel = class RtcDataChannel extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.binaryType]() {
    return this.binaryType;
  }
  set [dartx.binaryType](value) {
    this.binaryType = value;
  }
  get [dartx.bufferedAmount]() {
    return this.bufferedAmount;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.label]() {
    return this.label;
  }
  get [dartx.maxRetransmitTime]() {
    return this.maxRetransmitTime;
  }
  get [dartx.maxRetransmits]() {
    return this.maxRetransmits;
  }
  get [dartx.negotiated]() {
    return this.negotiated;
  }
  get [dartx.ordered]() {
    return this.ordered;
  }
  get [dartx.protocol]() {
    return this.protocol;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.reliable]() {
    return this.reliable;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.send](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendBlob](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendByteBuffer](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendString](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendTypedData](...args) {
    return this.send.apply(this, args);
  }
  get [dartx.onClose]() {
    return html$.RtcDataChannel.closeEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.RtcDataChannel.errorEvent.forTarget(this);
  }
  get [dartx.onMessage]() {
    return html$.RtcDataChannel.messageEvent.forTarget(this);
  }
  get [dartx.onOpen]() {
    return html$.RtcDataChannel.openEvent.forTarget(this);
  }
};
dart.setSignature(html$.RtcDataChannel, {
  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannel, [])}),
  fields: () => ({
    [dartx.binaryType]: core.String,
    [dartx.bufferedAmount]: core.int,
    [dartx.id]: core.int,
    [dartx.label]: core.String,
    [dartx.maxRetransmitTime]: core.int,
    [dartx.maxRetransmits]: core.int,
    [dartx.negotiated]: core.bool,
    [dartx.ordered]: core.bool,
    [dartx.protocol]: core.String,
    [dartx.readyState]: core.String,
    [dartx.reliable]: core.bool
  }),
  getters: () => ({
    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
    [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
    [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
  }),
  sfields: () => ({
    closeEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent(),
    openEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(html$.RtcDataChannel, {
  get closeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('close'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  },
  get openEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('open'));
  }
});
dart.registerExtension(dart.global.RTCDataChannel, html$.RtcDataChannel);
dart.registerExtension(dart.global.DataChannel, html$.RtcDataChannel);
dart.defineExtensionNames([
  'channel'
]);
html$.RtcDataChannelEvent = class RtcDataChannelEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.channel]() {
    return this.channel;
  }
};
dart.setSignature(html$.RtcDataChannelEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannelEvent, [])}),
  fields: () => ({[dartx.channel]: html$.RtcDataChannel})
});
dart.registerExtension(dart.global.RTCDataChannelEvent, html$.RtcDataChannelEvent);
dart.defineExtensionNames([
  'insertDtmf',
  'onToneChange',
  'canInsertDtmf',
  'duration',
  'interToneGap',
  'toneBuffer',
  'track'
]);
html$.RtcDtmfSender = class RtcDtmfSender extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.canInsertDtmf]() {
    return this.canInsertDTMF;
  }
  get [dartx.duration]() {
    return this.duration;
  }
  get [dartx.interToneGap]() {
    return this.interToneGap;
  }
  get [dartx.toneBuffer]() {
    return this.toneBuffer;
  }
  get [dartx.track]() {
    return this.track;
  }
  [dartx.insertDtmf](...args) {
    return this.insertDTMF.apply(this, args);
  }
  get [dartx.onToneChange]() {
    return html$.RtcDtmfSender.toneChangeEvent.forTarget(this);
  }
};
dart.setSignature(html$.RtcDtmfSender, {
  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDtmfSender, [])}),
  fields: () => ({
    [dartx.canInsertDtmf]: core.bool,
    [dartx.duration]: core.int,
    [dartx.interToneGap]: core.int,
    [dartx.toneBuffer]: core.String,
    [dartx.track]: html$.MediaStreamTrack
  }),
  getters: () => ({[dartx.onToneChange]: dart.definiteFunctionType(async.Stream$(html$.RtcDtmfToneChangeEvent), [])}),
  methods: () => ({[dartx.insertDtmf]: dart.definiteFunctionType(dart.void, [core.String], [core.int, core.int])}),
  sfields: () => ({toneChangeEvent: EventStreamProviderOfRtcDtmfToneChangeEvent()})
});
dart.defineLazy(html$.RtcDtmfSender, {
  get toneChangeEvent() {
    return dart.const(new (EventStreamProviderOfRtcDtmfToneChangeEvent())('tonechange'));
  }
});
dart.registerExtension(dart.global.RTCDTMFSender, html$.RtcDtmfSender);
dart.defineExtensionNames([
  'tone'
]);
html$.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new RTCDTMFToneChangeEvent(type, eventInitDict);
  }
  get [dartx.tone]() {
    return this.tone;
  }
};
dart.setSignature(html$.RtcDtmfToneChangeEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, []),
    new: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [core.String, core.Map])
  }),
  fields: () => ({[dartx.tone]: core.String}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.RTCDTMFToneChangeEvent, html$.RtcDtmfToneChangeEvent);
dart.defineExtensionNames([
  'candidate',
  'sdpMLineIndex',
  'sdpMid'
]);
html$.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
  static new(dictionary) {
    let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCIceCandidate` : 'RTCIceCandidate'];
    return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.candidate]() {
    return this.candidate;
  }
  set [dartx.candidate](value) {
    this.candidate = value;
  }
  get [dartx.sdpMLineIndex]() {
    return this.sdpMLineIndex;
  }
  set [dartx.sdpMLineIndex](value) {
    this.sdpMLineIndex = value;
  }
  get [dartx.sdpMid]() {
    return this.sdpMid;
  }
  set [dartx.sdpMid](value) {
    this.sdpMid = value;
  }
};
dart.setSignature(html$.RtcIceCandidate, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.RtcIceCandidate, [core.Map]),
    _: dart.definiteFunctionType(html$.RtcIceCandidate, [])
  }),
  fields: () => ({
    [dartx.candidate]: core.String,
    [dartx.sdpMLineIndex]: core.int,
    [dartx.sdpMid]: core.String
  })
});
dart.registerExtension(dart.global.RTCIceCandidate, html$.RtcIceCandidate);
dart.registerExtension(dart.global.mozRTCIceCandidate, html$.RtcIceCandidate);
dart.defineExtensionNames([
  'candidate'
]);
html$.RtcIceCandidateEvent = class RtcIceCandidateEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.candidate]() {
    return this.candidate;
  }
};
dart.setSignature(html$.RtcIceCandidateEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.RtcIceCandidateEvent, [])}),
  fields: () => ({[dartx.candidate]: html$.RtcIceCandidate})
});
dart.registerExtension(dart.global.RTCIceCandidateEvent, html$.RtcIceCandidateEvent);
dart.registerExtension(dart.global.RTCPeerConnectionIceEvent, html$.RtcIceCandidateEvent);
const _createOffer = Symbol('_createOffer');
const _createAnswer = Symbol('_createAnswer');
const _getStats = Symbol('_getStats');
const _addStream_1 = Symbol('_addStream_1');
const _addStream_2 = Symbol('_addStream_2');
const _createAnswer_1 = Symbol('_createAnswer_1');
const _createAnswer_2 = Symbol('_createAnswer_2');
const _createDataChannel_1 = Symbol('_createDataChannel_1');
const _createDataChannel_2 = Symbol('_createDataChannel_2');
const _createOffer_1 = Symbol('_createOffer_1');
const _createOffer_2 = Symbol('_createOffer_2');
const _setLocalDescription = Symbol('_setLocalDescription');
const _setRemoteDescription = Symbol('_setRemoteDescription');
const _updateIce_1 = Symbol('_updateIce_1');
const _updateIce_2 = Symbol('_updateIce_2');
const _updateIce_3 = Symbol('_updateIce_3');
dart.defineExtensionNames([
  'createOffer',
  'createAnswer',
  'getStats',
  'addIceCandidate',
  'addStream',
  'close',
  'createDtmfSender',
  'createDataChannel',
  'getLocalStreams',
  'getRemoteStreams',
  'getStreamById',
  'removeStream',
  'setLocalDescription',
  'setRemoteDescription',
  'updateIce',
  'onAddStream',
  'onDataChannel',
  'onIceCandidate',
  'onIceConnectionStateChange',
  'onNegotiationNeeded',
  'onRemoveStream',
  'onSignalingStateChange',
  'iceConnectionState',
  'iceGatheringState',
  'localDescription',
  'remoteDescription',
  'signalingState'
]);
html$.RtcPeerConnection = class RtcPeerConnection extends html$.EventTarget {
  static new(rtcIceServers, mediaConstraints) {
    if (mediaConstraints === void 0) mediaConstraints = null;
    let constructorName = window[dart.str`${html_common.Device.propertyPrefix}RTCPeerConnection`];
    if (mediaConstraints != null) {
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers), html_common.convertDartToNative_SerializedScriptValue(mediaConstraints));
    } else {
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers));
    }
  }
  static get supported() {
    try {
      html$.RtcPeerConnection.new(dart.map({iceServers: JSArrayOfMapOfString$String().of([dart.map({url: "stun:localhost"}, core.String, core.String)])}, core.String, ListOfMapOfString$String()));
      return true;
    } catch (_) {
      return false;
    }

    return false;
  }
  [dartx.createOffer](mediaConstraints) {
    if (mediaConstraints === void 0) mediaConstraints = null;
    let completer = CompleterOfRtcSessionDescription().new();
    this[_createOffer](dart.fn(value => {
      completer.complete(value);
    }, RtcSessionDescriptionToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()), mediaConstraints);
    return completer.future;
  }
  [dartx.createAnswer](mediaConstraints) {
    if (mediaConstraints === void 0) mediaConstraints = null;
    let completer = CompleterOfRtcSessionDescription().new();
    this[_createAnswer](dart.fn(value => {
      completer.complete(value);
    }, RtcSessionDescriptionToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()), mediaConstraints);
    return completer.future;
  }
  [dartx.getStats](selector) {
    let completer = CompleterOfRtcStatsResponse().new();
    this[_getStats](dart.fn(value => {
      completer.complete(value);
    }, RtcStatsResponseToNull()), selector);
    return completer.future;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.iceConnectionState]() {
    return this.iceConnectionState;
  }
  get [dartx.iceGatheringState]() {
    return this.iceGatheringState;
  }
  get [dartx.localDescription]() {
    return this.localDescription;
  }
  get [dartx.remoteDescription]() {
    return this.remoteDescription;
  }
  get [dartx.signalingState]() {
    return this.signalingState;
  }
  [dartx.addIceCandidate](...args) {
    return this.addIceCandidate.apply(this, args);
  }
  [dartx.addStream](stream, mediaConstraints) {
    if (mediaConstraints === void 0) mediaConstraints = null;
    if (mediaConstraints != null) {
      let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
      this[_addStream_1](stream, mediaConstraints_1);
      return;
    }
    this[_addStream_2](stream);
    return;
  }
  [_addStream_1](...args) {
    return this.addStream.apply(this, args);
  }
  [_addStream_2](...args) {
    return this.addStream.apply(this, args);
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [_createAnswer](successCallback, failureCallback, mediaConstraints) {
    if (failureCallback === void 0) failureCallback = null;
    if (mediaConstraints === void 0) mediaConstraints = null;
    if (mediaConstraints != null) {
      let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
      this[_createAnswer_1](successCallback, failureCallback, mediaConstraints_1);
      return;
    }
    this[_createAnswer_2](successCallback, failureCallback);
    return;
  }
  [_createAnswer_1](...args) {
    return this.createAnswer.apply(this, args);
  }
  [_createAnswer_2](...args) {
    return this.createAnswer.apply(this, args);
  }
  [dartx.createDtmfSender](...args) {
    return this.createDTMFSender.apply(this, args);
  }
  [dartx.createDataChannel](label, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_createDataChannel_1](label, options_1);
    }
    return this[_createDataChannel_2](label);
  }
  [_createDataChannel_1](...args) {
    return this.createDataChannel.apply(this, args);
  }
  [_createDataChannel_2](...args) {
    return this.createDataChannel.apply(this, args);
  }
  [_createOffer](successCallback, failureCallback, rtcOfferOptions) {
    if (failureCallback === void 0) failureCallback = null;
    if (rtcOfferOptions === void 0) rtcOfferOptions = null;
    if (rtcOfferOptions != null) {
      let rtcOfferOptions_1 = html_common.convertDartToNative_Dictionary(rtcOfferOptions);
      this[_createOffer_1](successCallback, failureCallback, rtcOfferOptions_1);
      return;
    }
    this[_createOffer_2](successCallback, failureCallback);
    return;
  }
  [_createOffer_1](...args) {
    return this.createOffer.apply(this, args);
  }
  [_createOffer_2](...args) {
    return this.createOffer.apply(this, args);
  }
  [dartx.getLocalStreams](...args) {
    return this.getLocalStreams.apply(this, args);
  }
  [dartx.getRemoteStreams](...args) {
    return this.getRemoteStreams.apply(this, args);
  }
  [_getStats](...args) {
    return this.getStats.apply(this, args);
  }
  [dartx.getStreamById](...args) {
    return this.getStreamById.apply(this, args);
  }
  [dartx.removeStream](...args) {
    return this.removeStream.apply(this, args);
  }
  [_setLocalDescription](...args) {
    return this.setLocalDescription.apply(this, args);
  }
  [dartx.setLocalDescription](description) {
    let completer = async.Completer.new();
    this[_setLocalDescription](description, dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()));
    return completer.future;
  }
  [_setRemoteDescription](...args) {
    return this.setRemoteDescription.apply(this, args);
  }
  [dartx.setRemoteDescription](description) {
    let completer = async.Completer.new();
    this[_setRemoteDescription](description, dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()));
    return completer.future;
  }
  [dartx.updateIce](configuration, mediaConstraints) {
    if (configuration === void 0) configuration = null;
    if (mediaConstraints === void 0) mediaConstraints = null;
    if (mediaConstraints != null) {
      let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
      let mediaConstraints_2 = html_common.convertDartToNative_Dictionary(mediaConstraints);
      this[_updateIce_1](configuration_1, mediaConstraints_2);
      return;
    }
    if (configuration != null) {
      let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
      this[_updateIce_2](configuration_1);
      return;
    }
    this[_updateIce_3]();
    return;
  }
  [_updateIce_1](...args) {
    return this.updateIce.apply(this, args);
  }
  [_updateIce_2](...args) {
    return this.updateIce.apply(this, args);
  }
  [_updateIce_3](...args) {
    return this.updateIce.apply(this, args);
  }
  get [dartx.onAddStream]() {
    return html$.RtcPeerConnection.addStreamEvent.forTarget(this);
  }
  get [dartx.onDataChannel]() {
    return html$.RtcPeerConnection.dataChannelEvent.forTarget(this);
  }
  get [dartx.onIceCandidate]() {
    return html$.RtcPeerConnection.iceCandidateEvent.forTarget(this);
  }
  get [dartx.onIceConnectionStateChange]() {
    return html$.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
  }
  get [dartx.onNegotiationNeeded]() {
    return html$.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
  }
  get [dartx.onRemoveStream]() {
    return html$.RtcPeerConnection.removeStreamEvent.forTarget(this);
  }
  get [dartx.onSignalingStateChange]() {
    return html$.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
  }
};
dart.setSignature(html$.RtcPeerConnection, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.RtcPeerConnection, [core.Map], [core.Map]),
    _: dart.definiteFunctionType(html$.RtcPeerConnection, [])
  }),
  fields: () => ({
    [dartx.iceConnectionState]: core.String,
    [dartx.iceGatheringState]: core.String,
    [dartx.localDescription]: html$.RtcSessionDescription,
    [dartx.remoteDescription]: html$.RtcSessionDescription,
    [dartx.signalingState]: core.String
  }),
  getters: () => ({
    [dartx.onAddStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
    [dartx.onDataChannel]: dart.definiteFunctionType(async.Stream$(html$.RtcDataChannelEvent), []),
    [dartx.onIceCandidate]: dart.definiteFunctionType(async.Stream$(html$.RtcIceCandidateEvent), []),
    [dartx.onIceConnectionStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onNegotiationNeeded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onRemoveStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
    [dartx.onSignalingStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.createOffer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
    [dartx.createAnswer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
    [dartx.getStats]: dart.definiteFunctionType(async.Future$(html$.RtcStatsResponse), [html$.MediaStreamTrack]),
    [dartx.addIceCandidate]: dart.definiteFunctionType(dart.void, [html$.RtcIceCandidate, html$.VoidCallback, html$._RtcErrorCallback]),
    [dartx.addStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream], [core.Map]),
    [_addStream_1]: dart.definiteFunctionType(dart.void, [html$.MediaStream, dart.dynamic]),
    [_addStream_2]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [_createAnswer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
    [_createAnswer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
    [_createAnswer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
    [dartx.createDtmfSender]: dart.definiteFunctionType(html$.RtcDtmfSender, [html$.MediaStreamTrack]),
    [dartx.createDataChannel]: dart.definiteFunctionType(html$.RtcDataChannel, [core.String], [core.Map]),
    [_createDataChannel_1]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic, dart.dynamic]),
    [_createDataChannel_2]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic]),
    [_createOffer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
    [_createOffer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
    [_createOffer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
    [dartx.getLocalStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
    [dartx.getRemoteStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
    [_getStats]: dart.definiteFunctionType(dart.void, [html$.RtcStatsCallback, html$.MediaStreamTrack]),
    [dartx.getStreamById]: dart.definiteFunctionType(html$.MediaStream, [core.String]),
    [dartx.removeStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
    [_setLocalDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
    [dartx.setLocalDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
    [_setRemoteDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
    [dartx.setRemoteDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
    [dartx.updateIce]: dart.definiteFunctionType(dart.void, [], [core.Map, core.Map]),
    [_updateIce_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    [_updateIce_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_updateIce_3]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    addStreamEvent: EventStreamProviderOfMediaStreamEvent(),
    dataChannelEvent: EventStreamProviderOfRtcDataChannelEvent(),
    iceCandidateEvent: EventStreamProviderOfRtcIceCandidateEvent(),
    iceConnectionStateChangeEvent: EventStreamProviderOfEvent(),
    negotiationNeededEvent: EventStreamProviderOfEvent(),
    removeStreamEvent: EventStreamProviderOfMediaStreamEvent(),
    signalingStateChangeEvent: EventStreamProviderOfEvent()
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineLazy(html$.RtcPeerConnection, {
  get addStreamEvent() {
    return dart.const(new (EventStreamProviderOfMediaStreamEvent())('addstream'));
  },
  get dataChannelEvent() {
    return dart.const(new (EventStreamProviderOfRtcDataChannelEvent())('datachannel'));
  },
  get iceCandidateEvent() {
    return dart.const(new (EventStreamProviderOfRtcIceCandidateEvent())('icecandidate'));
  },
  get iceConnectionStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('iceconnectionstatechange'));
  },
  get negotiationNeededEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('negotiationneeded'));
  },
  get removeStreamEvent() {
    return dart.const(new (EventStreamProviderOfMediaStreamEvent())('removestream'));
  },
  get signalingStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('signalingstatechange'));
  }
});
dart.registerExtension(dart.global.RTCPeerConnection, html$.RtcPeerConnection);
dart.registerExtension(dart.global.mozRTCPeerConnection, html$.RtcPeerConnection);
dart.defineExtensionNames([
  'sdp',
  'type'
]);
html$.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
  static new(dictionary) {
    let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCSessionDescription` : 'RTCSessionDescription'];
    return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.sdp]() {
    return this.sdp;
  }
  set [dartx.sdp](value) {
    this.sdp = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.setSignature(html$.RtcSessionDescription, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.RtcSessionDescription, [core.Map]),
    _: dart.definiteFunctionType(html$.RtcSessionDescription, [])
  }),
  fields: () => ({
    [dartx.sdp]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.RTCSessionDescription, html$.RtcSessionDescription);
dart.registerExtension(dart.global.mozRTCSessionDescription, html$.RtcSessionDescription);
const _get_timestamp = Symbol('_get_timestamp');
dart.defineExtensionNames([
  'timestamp',
  'names',
  'stat',
  'id',
  'type'
]);
html$.RtcStatsReport = class RtcStatsReport extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.timestamp]() {
    return html_common.convertNativeToDart_DateTime(this[_get_timestamp]);
  }
  get [_get_timestamp]() {
    return this.timestamp;
  }
  get [dartx.type]() {
    return this.type;
  }
  [dartx.names](...args) {
    return this.names.apply(this, args);
  }
  [dartx.stat](...args) {
    return this.stat.apply(this, args);
  }
};
dart.setSignature(html$.RtcStatsReport, {
  constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsReport, [])}),
  fields: () => ({
    [dartx.id]: core.String,
    [_get_timestamp]: dart.dynamic,
    [dartx.type]: core.String
  }),
  getters: () => ({[dartx.timestamp]: dart.definiteFunctionType(core.DateTime, [])}),
  methods: () => ({
    [dartx.names]: dart.definiteFunctionType(core.List$(core.String), []),
    [dartx.stat]: dart.definiteFunctionType(core.String, [core.String])
  })
});
dart.registerExtension(dart.global.RTCStatsReport, html$.RtcStatsReport);
dart.defineExtensionNames([
  'namedItem',
  'result'
]);
html$.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
  [dartx.result](...args) {
    return this.result.apply(this, args);
  }
};
dart.setSignature(html$.RtcStatsResponse, {
  constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsResponse, [])}),
  methods: () => ({
    [dartx.namedItem]: dart.definiteFunctionType(html$.RtcStatsReport, [core.String]),
    [dartx.result]: dart.definiteFunctionType(core.List$(html$.RtcStatsReport), [])
  })
});
dart.registerExtension(dart.global.RTCStatsResponse, html$.RtcStatsResponse);
const _availLeft = Symbol('_availLeft');
const _availTop = Symbol('_availTop');
const _availWidth = Symbol('_availWidth');
const _availHeight = Symbol('_availHeight');
dart.defineExtensionNames([
  'available',
  'colorDepth',
  'height',
  'orientation',
  'pixelDepth',
  'width'
]);
html$.Screen = class Screen extends _interceptors.Interceptor {
  get [dartx.available]() {
    return new (RectangleOfint())(this[_availLeft], this[_availTop], this[_availWidth], this[_availHeight]);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [_availHeight]() {
    return this.availHeight;
  }
  get [_availLeft]() {
    return this.availLeft;
  }
  get [_availTop]() {
    return this.availTop;
  }
  get [_availWidth]() {
    return this.availWidth;
  }
  get [dartx.colorDepth]() {
    return this.colorDepth;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.orientation]() {
    return this.orientation;
  }
  get [dartx.pixelDepth]() {
    return this.pixelDepth;
  }
  get [dartx.width]() {
    return this.width;
  }
};
dart.setSignature(html$.Screen, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Screen, [])}),
  fields: () => ({
    [_availHeight]: core.int,
    [_availLeft]: core.int,
    [_availTop]: core.int,
    [_availWidth]: core.int,
    [dartx.colorDepth]: core.int,
    [dartx.height]: core.int,
    [dartx.orientation]: html$.ScreenOrientation,
    [dartx.pixelDepth]: core.int,
    [dartx.width]: core.int
  }),
  getters: () => ({[dartx.available]: dart.definiteFunctionType(math.Rectangle$(core.num), [])})
});
dart.registerExtension(dart.global.Screen, html$.Screen);
dart.defineExtensionNames([
  'lock',
  'unlock',
  'onChange',
  'angle',
  'type'
]);
html$.ScreenOrientation = class ScreenOrientation extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.angle]() {
    return this.angle;
  }
  get [dartx.type]() {
    return this.type;
  }
  [dartx.lock](...args) {
    return this.lock.apply(this, args);
  }
  [dartx.unlock](...args) {
    return this.unlock.apply(this, args);
  }
  get [dartx.onChange]() {
    return html$.ScreenOrientation.changeEvent.forTarget(this);
  }
};
dart.setSignature(html$.ScreenOrientation, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ScreenOrientation, [])}),
  fields: () => ({
    [dartx.angle]: core.int,
    [dartx.type]: core.String
  }),
  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.lock]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.unlock]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.ScreenOrientation, {
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  }
});
dart.registerExtension(dart.global.ScreenOrientation, html$.ScreenOrientation);
dart.defineExtensionNames([
  'async',
  'charset',
  'crossOrigin',
  'defer',
  'integrity',
  'nonce',
  'src',
  'type'
]);
html$.ScriptElement = class ScriptElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ScriptElement._check(html$.document[dartx.createElement]("script"));
  }
  created() {
    this[dartx.async] = null;
    this[dartx.charset] = null;
    this[dartx.crossOrigin] = null;
    this[dartx.defer] = null;
    this[dartx.integrity] = null;
    this[dartx.nonce] = null;
    this[dartx.src] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.async]() {
    return this.async;
  }
  set [dartx.async](value) {
    this.async = value;
  }
  get [dartx.charset]() {
    return this.charset;
  }
  set [dartx.charset](value) {
    this.charset = value;
  }
  get [dartx.crossOrigin]() {
    return this.crossOrigin;
  }
  set [dartx.crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [dartx.defer]() {
    return this.defer;
  }
  set [dartx.defer](value) {
    this.defer = value;
  }
  get [dartx.integrity]() {
    return this.integrity;
  }
  set [dartx.integrity](value) {
    this.integrity = value;
  }
  get [dartx.nonce]() {
    return this.nonce;
  }
  set [dartx.nonce](value) {
    this.nonce = value;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.defineNamedConstructor(html$.ScriptElement, 'created');
dart.setSignature(html$.ScriptElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ScriptElement, []),
    new: dart.definiteFunctionType(html$.ScriptElement, []),
    created: dart.definiteFunctionType(html$.ScriptElement, [])
  }),
  fields: () => ({
    [dartx.async]: core.bool,
    [dartx.charset]: core.String,
    [dartx.crossOrigin]: core.String,
    [dartx.defer]: core.bool,
    [dartx.integrity]: core.String,
    [dartx.nonce]: core.String,
    [dartx.src]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.HTMLScriptElement, html$.ScriptElement);
dart.defineExtensionNames([
  'consumeDelta',
  'deltaGranularity',
  'deltaX',
  'deltaY',
  'fromUserInput',
  'inInertialPhase',
  'isBeginning',
  'isEnding',
  'shouldPropagate',
  'velocityX',
  'velocityY'
]);
html$.ScrollState = class ScrollState extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
    if (deltaX === void 0) deltaX = null;
    if (deltaY === void 0) deltaY = null;
    if (deltaGranularity === void 0) deltaGranularity = null;
    if (velocityX === void 0) velocityX = null;
    if (velocityY === void 0) velocityY = null;
    if (inInertialPhase === void 0) inInertialPhase = null;
    if (isBeginning === void 0) isBeginning = null;
    if (isEnding === void 0) isEnding = null;
    if (isEnding != null) {
      return html$.ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
    }
    if (isBeginning != null) {
      return html$.ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
    }
    if (inInertialPhase != null) {
      return html$.ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
    }
    if (velocityY != null) {
      return html$.ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
    }
    if (velocityX != null) {
      return html$.ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
    }
    if (deltaGranularity != null) {
      return html$.ScrollState._create_6(deltaX, deltaY, deltaGranularity);
    }
    if (deltaY != null) {
      return html$.ScrollState._create_7(deltaX, deltaY);
    }
    if (deltaX != null) {
      return html$.ScrollState._create_8(deltaX);
    }
    return html$.ScrollState._create_9();
  }
  static _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
  }
  static _create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning) {
    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
  }
  static _create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase) {
    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
  }
  static _create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY) {
    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
  }
  static _create_5(deltaX, deltaY, deltaGranularity, velocityX) {
    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX);
  }
  static _create_6(deltaX, deltaY, deltaGranularity) {
    return new self.ScrollState(deltaX, deltaY, deltaGranularity);
  }
  static _create_7(deltaX, deltaY) {
    return new self.ScrollState(deltaX, deltaY);
  }
  static _create_8(deltaX) {
    return new self.ScrollState(deltaX);
  }
  static _create_9() {
    return new self.ScrollState();
  }
  get [dartx.deltaGranularity]() {
    return this.deltaGranularity;
  }
  get [dartx.deltaX]() {
    return this.deltaX;
  }
  get [dartx.deltaY]() {
    return this.deltaY;
  }
  get [dartx.fromUserInput]() {
    return this.fromUserInput;
  }
  get [dartx.inInertialPhase]() {
    return this.inInertialPhase;
  }
  get [dartx.isBeginning]() {
    return this.isBeginning;
  }
  get [dartx.isEnding]() {
    return this.isEnding;
  }
  get [dartx.shouldPropagate]() {
    return this.shouldPropagate;
  }
  get [dartx.velocityX]() {
    return this.velocityX;
  }
  get [dartx.velocityY]() {
    return this.velocityY;
  }
  [dartx.consumeDelta](...args) {
    return this.consumeDelta.apply(this, args);
  }
};
dart.setSignature(html$.ScrollState, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ScrollState, []),
    new: dart.definiteFunctionType(html$.ScrollState, [], [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool, core.bool])
  }),
  fields: () => ({
    [dartx.deltaGranularity]: core.double,
    [dartx.deltaX]: core.double,
    [dartx.deltaY]: core.double,
    [dartx.fromUserInput]: core.bool,
    [dartx.inInertialPhase]: core.bool,
    [dartx.isBeginning]: core.bool,
    [dartx.isEnding]: core.bool,
    [dartx.shouldPropagate]: core.bool,
    [dartx.velocityX]: core.double,
    [dartx.velocityY]: core.double
  }),
  methods: () => ({[dartx.consumeDelta]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_4: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_5: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_6: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_7: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic]),
    _create_8: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic]),
    _create_9: dart.definiteFunctionType(html$.ScrollState, [])
  }),
  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6', '_create_7', '_create_8', '_create_9']
});
dart.registerExtension(dart.global.ScrollState, html$.ScrollState);
dart.defineExtensionNames([
  'blockedUri',
  'columnNumber',
  'documentUri',
  'effectiveDirective',
  'lineNumber',
  'originalPolicy',
  'referrer',
  'sourceFile',
  'statusCode',
  'violatedDirective'
]);
html$.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
    }
    return html$.SecurityPolicyViolationEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.SecurityPolicyViolationEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.SecurityPolicyViolationEvent(type);
  }
  get [dartx.blockedUri]() {
    return this.blockedURI;
  }
  get [dartx.columnNumber]() {
    return this.columnNumber;
  }
  get [dartx.documentUri]() {
    return this.documentURI;
  }
  get [dartx.effectiveDirective]() {
    return this.effectiveDirective;
  }
  get [dartx.lineNumber]() {
    return this.lineNumber;
  }
  get [dartx.originalPolicy]() {
    return this.originalPolicy;
  }
  get [dartx.referrer]() {
    return this.referrer;
  }
  get [dartx.sourceFile]() {
    return this.sourceFile;
  }
  get [dartx.statusCode]() {
    return this.statusCode;
  }
  get [dartx.violatedDirective]() {
    return this.violatedDirective;
  }
};
dart.setSignature(html$.SecurityPolicyViolationEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, []),
    new: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.blockedUri]: core.String,
    [dartx.columnNumber]: core.int,
    [dartx.documentUri]: core.String,
    [dartx.effectiveDirective]: core.String,
    [dartx.lineNumber]: core.int,
    [dartx.originalPolicy]: core.String,
    [dartx.referrer]: core.String,
    [dartx.sourceFile]: core.String,
    [dartx.statusCode]: core.int,
    [dartx.violatedDirective]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.SecurityPolicyViolationEvent, html$.SecurityPolicyViolationEvent);
dart.defineExtensionNames([
  'add',
  'checkValidity',
  'item',
  'namedItem',
  'reportValidity',
  'setCustomValidity',
  'options',
  'selectedOptions',
  'autofocus',
  'disabled',
  'form',
  'labels',
  'length',
  'multiple',
  'name',
  'required',
  'selectedIndex',
  'size',
  'type',
  'validationMessage',
  'validity',
  'value',
  'willValidate'
]);
html$.SelectElement = class SelectElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.SelectElement._check(html$.document[dartx.createElement]("select"));
  }
  created() {
    this[dartx.autofocus] = null;
    this[dartx.disabled] = null;
    this[dartx.form] = null;
    this[dartx.labels] = null;
    this[dartx.length] = null;
    this[dartx.multiple] = null;
    this[dartx.name] = null;
    this[dartx.required] = null;
    this[dartx.selectedIndex] = null;
    this[dartx.size] = null;
    this[dartx.type] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.value] = null;
    this[dartx.willValidate] = null;
    super.created();
  }
  get [dartx.autofocus]() {
    return this.autofocus;
  }
  set [dartx.autofocus](value) {
    this.autofocus = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.length]() {
    return this.length;
  }
  set [dartx.length](value) {
    this.length = value;
  }
  get [dartx.multiple]() {
    return this.multiple;
  }
  set [dartx.multiple](value) {
    this.multiple = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.required]() {
    return this.required;
  }
  set [dartx.required](value) {
    this.required = value;
  }
  get [dartx.selectedIndex]() {
    return this.selectedIndex;
  }
  set [dartx.selectedIndex](value) {
    this.selectedIndex = value;
  }
  get [dartx.size]() {
    return this.size;
  }
  set [dartx.size](value) {
    this.size = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.add](...args) {
    return this.add.apply(this, args);
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
  get [dartx.options]() {
    let options = ListOfOptionElement().from(this[dartx.querySelectorAll](html$.Element)('option'));
    return new (UnmodifiableListViewOfOptionElement())(options);
  }
  get [dartx.selectedOptions]() {
    if (dart.test(this[dartx.multiple])) {
      let options = this[dartx.options][dartx.where](dart.fn(o => o[dartx.selected], OptionElementTobool()))[dartx.toList]();
      return new (UnmodifiableListViewOfOptionElement())(options);
    } else {
      return JSArrayOfOptionElement().of([this[dartx.options][dartx._get](this[dartx.selectedIndex])]);
    }
  }
};
dart.defineNamedConstructor(html$.SelectElement, 'created');
dart.setSignature(html$.SelectElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SelectElement, []),
    new: dart.definiteFunctionType(html$.SelectElement, []),
    created: dart.definiteFunctionType(html$.SelectElement, [])
  }),
  fields: () => ({
    [dartx.autofocus]: core.bool,
    [dartx.disabled]: core.bool,
    [dartx.form]: html$.FormElement,
    [dartx.labels]: ListOfNode(),
    [dartx.length]: core.int,
    [dartx.multiple]: core.bool,
    [dartx.name]: core.String,
    [dartx.required]: core.bool,
    [dartx.selectedIndex]: core.int,
    [dartx.size]: core.int,
    [dartx.type]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.value]: core.String,
    [dartx.willValidate]: core.bool
  }),
  getters: () => ({
    [dartx.options]: dart.definiteFunctionType(core.List$(html$.OptionElement), []),
    [dartx.selectedOptions]: dart.definiteFunctionType(core.List$(html$.OptionElement), [])
  }),
  methods: () => ({
    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, html$.OptionElement]),
    [dartx.add]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
    [dartx.namedItem]: dart.definiteFunctionType(html$.OptionElement, [core.String]),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
  })
});
dart.registerExtension(dart.global.HTMLSelectElement, html$.SelectElement);
dart.defineExtensionNames([
  'addRange',
  'collapse',
  'collapseToEnd',
  'collapseToStart',
  'containsNode',
  'deleteFromDocument',
  'empty',
  'extend',
  'getRangeAt',
  'modify',
  'removeAllRanges',
  'selectAllChildren',
  'setBaseAndExtent',
  'setPosition',
  'anchorNode',
  'anchorOffset',
  'baseNode',
  'baseOffset',
  'extentNode',
  'extentOffset',
  'focusNode',
  'focusOffset',
  'isCollapsed',
  'rangeCount',
  'type'
]);
html$.Selection = class Selection extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.anchorNode]() {
    return this.anchorNode;
  }
  get [dartx.anchorOffset]() {
    return this.anchorOffset;
  }
  get [dartx.baseNode]() {
    return this.baseNode;
  }
  get [dartx.baseOffset]() {
    return this.baseOffset;
  }
  get [dartx.extentNode]() {
    return this.extentNode;
  }
  get [dartx.extentOffset]() {
    return this.extentOffset;
  }
  get [dartx.focusNode]() {
    return this.focusNode;
  }
  get [dartx.focusOffset]() {
    return this.focusOffset;
  }
  get [dartx.isCollapsed]() {
    return this.isCollapsed;
  }
  get [dartx.rangeCount]() {
    return this.rangeCount;
  }
  get [dartx.type]() {
    return this.type;
  }
  [dartx.addRange](...args) {
    return this.addRange.apply(this, args);
  }
  [dartx.collapse](...args) {
    return this.collapse.apply(this, args);
  }
  [dartx.collapseToEnd](...args) {
    return this.collapseToEnd.apply(this, args);
  }
  [dartx.collapseToStart](...args) {
    return this.collapseToStart.apply(this, args);
  }
  [dartx.containsNode](...args) {
    return this.containsNode.apply(this, args);
  }
  [dartx.deleteFromDocument](...args) {
    return this.deleteFromDocument.apply(this, args);
  }
  [dartx.empty](...args) {
    return this.empty.apply(this, args);
  }
  [dartx.extend](...args) {
    return this.extend.apply(this, args);
  }
  [dartx.getRangeAt](...args) {
    return this.getRangeAt.apply(this, args);
  }
  [dartx.modify](...args) {
    return this.modify.apply(this, args);
  }
  [dartx.removeAllRanges](...args) {
    return this.removeAllRanges.apply(this, args);
  }
  [dartx.selectAllChildren](...args) {
    return this.selectAllChildren.apply(this, args);
  }
  [dartx.setBaseAndExtent](...args) {
    return this.setBaseAndExtent.apply(this, args);
  }
  [dartx.setPosition](...args) {
    return this.setPosition.apply(this, args);
  }
};
dart.setSignature(html$.Selection, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Selection, [])}),
  fields: () => ({
    [dartx.anchorNode]: html$.Node,
    [dartx.anchorOffset]: core.int,
    [dartx.baseNode]: html$.Node,
    [dartx.baseOffset]: core.int,
    [dartx.extentNode]: html$.Node,
    [dartx.extentOffset]: core.int,
    [dartx.focusNode]: html$.Node,
    [dartx.focusOffset]: core.int,
    [dartx.isCollapsed]: core.bool,
    [dartx.rangeCount]: core.int,
    [dartx.type]: core.String
  }),
  methods: () => ({
    [dartx.addRange]: dart.definiteFunctionType(dart.void, [html$.Range]),
    [dartx.collapse]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
    [dartx.collapseToEnd]: dart.definiteFunctionType(dart.void, []),
    [dartx.collapseToStart]: dart.definiteFunctionType(dart.void, []),
    [dartx.containsNode]: dart.definiteFunctionType(core.bool, [html$.Node, core.bool]),
    [dartx.deleteFromDocument]: dart.definiteFunctionType(dart.void, []),
    [dartx.empty]: dart.definiteFunctionType(dart.void, []),
    [dartx.extend]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
    [dartx.getRangeAt]: dart.definiteFunctionType(html$.Range, [core.int]),
    [dartx.modify]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
    [dartx.removeAllRanges]: dart.definiteFunctionType(dart.void, []),
    [dartx.selectAllChildren]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.setBaseAndExtent]: dart.definiteFunctionType(dart.void, [html$.Node, core.int, html$.Node, core.int]),
    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int])
  })
});
dart.registerExtension(dart.global.Selection, html$.Selection);
dart.defineExtensionNames([
  'close',
  'postMessage',
  'data',
  'name',
  'targetUrl'
]);
html$.ServicePort = class ServicePort extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.data]() {
    return this.data;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.targetUrl]() {
    return this.targetURL;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
};
dart.setSignature(html$.ServicePort, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ServicePort, [])}),
  fields: () => ({
    [dartx.data]: core.Object,
    [dartx.name]: core.String,
    [dartx.targetUrl]: core.String
  }),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.ServicePort, html$.ServicePort);
const _connect_1 = Symbol('_connect_1');
const _connect_2 = Symbol('_connect_2');
dart.defineExtensionNames([
  'connect',
  'match',
  'matchAll',
  'onMessage'
]);
html$.ServicePortCollection = class ServicePortCollection extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.connect](url, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_connect_1](url, options_1);
    }
    return this[_connect_2](url);
  }
  [_connect_1](...args) {
    return this.connect.apply(this, args);
  }
  [_connect_2](...args) {
    return this.connect.apply(this, args);
  }
  [dartx.match](options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    return this[_match_1](options_1);
  }
  [_match_1](...args) {
    return this.match.apply(this, args);
  }
  [dartx.matchAll](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_matchAll_1](options_1);
    }
    return this[_matchAll_2]();
  }
  [_matchAll_1](...args) {
    return this.matchAll.apply(this, args);
  }
  [_matchAll_2](...args) {
    return this.matchAll.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.ServicePortCollection.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.ServicePortCollection, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ServicePortCollection, [])}),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({
    [dartx.connect]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
    [_connect_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
    [_connect_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.match]: dart.definiteFunctionType(async.Future, [core.Map]),
    [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_matchAll_2]: dart.definiteFunctionType(async.Future, [])
  }),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.ServicePortCollection, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.ServicePortCollection, html$.ServicePortCollection);
dart.defineExtensionNames([
  'respondWith',
  'origin',
  'targetUrl'
]);
html$.ServicePortConnectEvent = class ServicePortConnectEvent extends html$.ExtendableEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ServicePortConnectEvent._create_1(type, eventInitDict_1);
    }
    return html$.ServicePortConnectEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.ServicePortConnectEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.ServicePortConnectEvent(type);
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.targetUrl]() {
    return this.targetURL;
  }
  [dartx.respondWith](...args) {
    return this.respondWith.apply(this, args);
  }
};
dart.setSignature(html$.ServicePortConnectEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ServicePortConnectEvent, []),
    new: dart.definiteFunctionType(html$.ServicePortConnectEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.origin]: core.String,
    [dartx.targetUrl]: core.String
  }),
  methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(async.Future, [async.Future])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.ServicePortConnectEvent, html$.ServicePortConnectEvent);
dart.defineExtensionNames([
  'getRegistration',
  'getRegistrations',
  'register',
  'onMessage',
  'controller',
  'ready'
]);
html$.ServiceWorkerContainer = class ServiceWorkerContainer extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.controller]() {
    return this.controller;
  }
  get [dartx.ready]() {
    return this.ready;
  }
  [dartx.getRegistration](...args) {
    return this.getRegistration.apply(this, args);
  }
  [dartx.getRegistrations](...args) {
    return this.getRegistrations.apply(this, args);
  }
  [dartx.register](url, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_register_1](url, options_1);
    }
    return this[_register_2](url);
  }
  [_register_1](...args) {
    return this.register.apply(this, args);
  }
  [_register_2](...args) {
    return this.register.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.ServiceWorkerContainer.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.ServiceWorkerContainer, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerContainer, [])}),
  fields: () => ({
    [dartx.controller]: html$._ServiceWorker,
    [dartx.ready]: async.Future
  }),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({
    [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [], [core.String]),
    [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
    [dartx.register]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
    [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
    [_register_2]: dart.definiteFunctionType(async.Future, [dart.dynamic])
  }),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.ServiceWorkerContainer, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.ServiceWorkerContainer, html$.ServiceWorkerContainer);
dart.defineExtensionNames([
  'skipWaiting',
  'onMessage',
  'clients',
  'ports',
  'registration'
]);
html$.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html$.WorkerGlobalScope {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.clients]() {
    return this.clients;
  }
  get [dartx.ports]() {
    return this.ports;
  }
  get [dartx.registration]() {
    return this.registration;
  }
  [dartx.skipWaiting](...args) {
    return this.skipWaiting.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.ServiceWorkerGlobalScope, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerGlobalScope, [])}),
  fields: () => ({
    [dartx.clients]: html$.Clients,
    [dartx.ports]: html$.StashedPortCollection,
    [dartx.registration]: html$.ServiceWorkerRegistration
  }),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({[dartx.skipWaiting]: dart.definiteFunctionType(async.Future, [])}),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.ServiceWorkerGlobalScope, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.ServiceWorkerGlobalScope, html$.ServiceWorkerGlobalScope);
dart.defineExtensionNames([
  'data',
  'lastEventId',
  'origin',
  'ports',
  'source'
]);
html$.ServiceWorkerMessageEvent = class ServiceWorkerMessageEvent extends html$.Event {
  get [dartx.data]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
  }
  get [_get_data]() {
    return this.data;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
    }
    return html$.ServiceWorkerMessageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.ServiceWorkerMessageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.ServiceWorkerMessageEvent(type);
  }
  get [dartx.lastEventId]() {
    return this.lastEventId;
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.ports]() {
    return this.ports;
  }
  get [dartx.source]() {
    return this.source;
  }
};
dart.setSignature(html$.ServiceWorkerMessageEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, []),
    new: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [_get_data]: dart.dynamic,
    [dartx.lastEventId]: core.String,
    [dartx.origin]: core.String,
    [dartx.ports]: ListOfMessagePort(),
    [dartx.source]: core.Object
  }),
  getters: () => ({[dartx.data]: dart.definiteFunctionType(dart.dynamic, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.ServiceWorkerMessageEvent, html$.ServiceWorkerMessageEvent);
const _getNotifications_1 = Symbol('_getNotifications_1');
const _getNotifications_2 = Symbol('_getNotifications_2');
const _showNotification_1 = Symbol('_showNotification_1');
const _showNotification_2 = Symbol('_showNotification_2');
dart.defineExtensionNames([
  'getNotifications',
  'showNotification',
  'unregister',
  'update',
  'active',
  'geofencing',
  'installing',
  'periodicSync',
  'pushManager',
  'scope',
  'sync',
  'waiting'
]);
html$.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.active]() {
    return this.active;
  }
  get [dartx.geofencing]() {
    return this.geofencing;
  }
  get [dartx.installing]() {
    return this.installing;
  }
  get [dartx.periodicSync]() {
    return this.periodicSync;
  }
  get [dartx.pushManager]() {
    return this.pushManager;
  }
  get [dartx.scope]() {
    return this.scope;
  }
  get [dartx.sync]() {
    return this.sync;
  }
  get [dartx.waiting]() {
    return this.waiting;
  }
  [dartx.getNotifications](filter) {
    if (filter === void 0) filter = null;
    if (filter != null) {
      let filter_1 = html_common.convertDartToNative_Dictionary(filter);
      return this[_getNotifications_1](filter_1);
    }
    return this[_getNotifications_2]();
  }
  [_getNotifications_1](...args) {
    return this.getNotifications.apply(this, args);
  }
  [_getNotifications_2](...args) {
    return this.getNotifications.apply(this, args);
  }
  [dartx.showNotification](title, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_showNotification_1](title, options_1);
    }
    return this[_showNotification_2](title);
  }
  [_showNotification_1](...args) {
    return this.showNotification.apply(this, args);
  }
  [_showNotification_2](...args) {
    return this.showNotification.apply(this, args);
  }
  [dartx.unregister](...args) {
    return this.unregister.apply(this, args);
  }
  [dartx.update](...args) {
    return this.update.apply(this, args);
  }
};
dart.setSignature(html$.ServiceWorkerRegistration, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerRegistration, [])}),
  fields: () => ({
    [dartx.active]: html$._ServiceWorker,
    [dartx.geofencing]: html$.Geofencing,
    [dartx.installing]: html$._ServiceWorker,
    [dartx.periodicSync]: html$.PeriodicSyncManager,
    [dartx.pushManager]: html$.PushManager,
    [dartx.scope]: core.String,
    [dartx.sync]: html$.SyncManager,
    [dartx.waiting]: html$._ServiceWorker
  }),
  methods: () => ({
    [dartx.getNotifications]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_getNotifications_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_getNotifications_2]: dart.definiteFunctionType(async.Future, []),
    [dartx.showNotification]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
    [_showNotification_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
    [_showNotification_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.unregister]: dart.definiteFunctionType(async.Future, []),
    [dartx.update]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.ServiceWorkerRegistration, html$.ServiceWorkerRegistration);
dart.defineExtensionNames([
  'getDistributedNodes'
]);
html$.ShadowElement = class ShadowElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.ShadowElement._check(html$.document[dartx.createElement]("shadow"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('shadow');
  }
  [dartx.getDistributedNodes](...args) {
    return this.getDistributedNodes.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.ShadowElement, 'created');
dart.setSignature(html$.ShadowElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.ShadowElement, []),
    new: dart.definiteFunctionType(html$.ShadowElement, []),
    created: dart.definiteFunctionType(html$.ShadowElement, [])
  }),
  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLShadowElement, html$.ShadowElement);
dart.defineExtensionNames([
  'clone',
  'elementFromPoint',
  'elementsFromPoint',
  'getSelection',
  'resetStyleInheritance',
  'resetStyleInheritance',
  'applyAuthorStyles',
  'applyAuthorStyles',
  'activeElement',
  'delegatesFocus',
  'host',
  'innerHtml',
  'olderShadowRoot',
  'styleSheets'
]);
html$.ShadowRoot = class ShadowRoot extends html$.DocumentFragment {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.activeElement]() {
    return this.activeElement;
  }
  get [dartx.delegatesFocus]() {
    return this.delegatesFocus;
  }
  get [dartx.host]() {
    return this.host;
  }
  get [dartx.innerHtml]() {
    return this.innerHTML;
  }
  set [dartx.innerHtml](value) {
    this.innerHTML = value;
  }
  get [dartx.olderShadowRoot]() {
    return this.olderShadowRoot;
  }
  get [dartx.styleSheets]() {
    return this.styleSheets;
  }
  [dartx.clone](...args) {
    return this.cloneNode.apply(this, args);
  }
  [dartx.elementFromPoint](...args) {
    return this.elementFromPoint.apply(this, args);
  }
  [dartx.elementsFromPoint](...args) {
    return this.elementsFromPoint.apply(this, args);
  }
  [dartx.getSelection](...args) {
    return this.getSelection.apply(this, args);
  }
  static get supported() {
    return !!(Element.prototype.createShadowRoot || Element.prototype.webkitCreateShadowRoot);
  }
  static _shadowRootDeprecationReport() {
    if (!dart.test(html$.ShadowRoot._shadowRootDeprecationReported)) {
      html$.window[dartx.console].warn('ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n');
      html$.ShadowRoot._shadowRootDeprecationReported = true;
    }
  }
  get [dartx.resetStyleInheritance]() {
    html$.ShadowRoot._shadowRootDeprecationReport();
    return false;
  }
  set [dartx.resetStyleInheritance](value) {
    html$.ShadowRoot._shadowRootDeprecationReport();
  }
  get [dartx.applyAuthorStyles]() {
    html$.ShadowRoot._shadowRootDeprecationReport();
    return false;
  }
  set [dartx.applyAuthorStyles](value) {
    html$.ShadowRoot._shadowRootDeprecationReport();
  }
};
const innerHtml = Symbol(html$.ShadowRoot.name + "." + dartx.innerHtml.toString());
dart.setSignature(html$.ShadowRoot, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ShadowRoot, [])}),
  fields: () => ({
    [dartx.activeElement]: html$.Element,
    [dartx.delegatesFocus]: core.bool,
    [dartx.host]: html$.Element,
    [dartx.innerHtml]: core.String,
    [dartx.olderShadowRoot]: html$.ShadowRoot,
    [dartx.styleSheets]: ListOfStyleSheet()
  }),
  getters: () => ({
    [dartx.resetStyleInheritance]: dart.definiteFunctionType(core.bool, []),
    [dartx.applyAuthorStyles]: dart.definiteFunctionType(core.bool, [])
  }),
  setters: () => ({
    [dartx.resetStyleInheritance]: dart.definiteFunctionType(dart.void, [core.bool]),
    [dartx.applyAuthorStyles]: dart.definiteFunctionType(dart.void, [core.bool])
  }),
  methods: () => ({
    [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
    [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, [])
  }),
  sfields: () => ({_shadowRootDeprecationReported: core.bool}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({_shadowRootDeprecationReport: dart.definiteFunctionType(dart.void, [])}),
  names: ['_shadowRootDeprecationReport']
});
html$.ShadowRoot._shadowRootDeprecationReported = false;
dart.registerExtension(dart.global.ShadowRoot, html$.ShadowRoot);
dart.defineExtensionNames([
  'byteLength'
]);
html$.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.byteLength]() {
    return this.byteLength;
  }
};
dart.setSignature(html$.SharedArrayBuffer, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SharedArrayBuffer, [])}),
  fields: () => ({[dartx.byteLength]: core.int})
});
dart.registerExtension(dart.global.SharedArrayBuffer, html$.SharedArrayBuffer);
dart.defineExtensionNames([
  'onError',
  'port',
  'workerStart'
]);
html$.SharedWorker = class SharedWorker extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(scriptURL, name) {
    if (name === void 0) name = null;
    if (name != null) {
      return html$.SharedWorker._create_1(scriptURL, name);
    }
    return html$.SharedWorker._create_2(scriptURL);
  }
  static _create_1(scriptURL, name) {
    return new self.SharedWorker(scriptURL, name);
  }
  static _create_2(scriptURL) {
    return new self.SharedWorker(scriptURL);
  }
  get [dartx.port]() {
    return this.port;
  }
  get [dartx.workerStart]() {
    return this.workerStart;
  }
  get [dartx.onError]() {
    return html$.SharedWorker.errorEvent.forTarget(this);
  }
};
html$.SharedWorker[dart.implements] = () => [html$.AbstractWorker];
dart.setSignature(html$.SharedWorker, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SharedWorker, []),
    new: dart.definiteFunctionType(html$.SharedWorker, [core.String], [core.String])
  }),
  fields: () => ({
    [dartx.port]: html$.MessagePort,
    [dartx.workerStart]: core.double
  }),
  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  sfields: () => ({errorEvent: EventStreamProviderOfEvent()}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.defineLazy(html$.SharedWorker, {
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  }
});
dart.registerExtension(dart.global.SharedWorker, html$.SharedWorker);
dart.defineExtensionNames([
  'onConnect',
  'name'
]);
html$.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html$.WorkerGlobalScope {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.onConnect]() {
    return html$.SharedWorkerGlobalScope.connectEvent.forTarget(this);
  }
};
dart.setSignature(html$.SharedWorkerGlobalScope, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SharedWorkerGlobalScope, [])}),
  fields: () => ({[dartx.name]: core.String}),
  getters: () => ({[dartx.onConnect]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  sfields: () => ({connectEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.SharedWorkerGlobalScope, {
  get connectEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('connect'));
  }
});
dart.registerExtension(dart.global.SharedWorkerGlobalScope, html$.SharedWorkerGlobalScope);
dart.defineExtensionNames([
  'abort',
  'appendBuffer',
  'appendStream',
  'appendTypedData',
  'remove',
  'appendWindowEnd',
  'appendWindowStart',
  'buffered',
  'mode',
  'timestampOffset',
  'trackDefaults',
  'updating'
]);
html$.SourceBuffer = class SourceBuffer extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.appendWindowEnd]() {
    return this.appendWindowEnd;
  }
  set [dartx.appendWindowEnd](value) {
    this.appendWindowEnd = value;
  }
  get [dartx.appendWindowStart]() {
    return this.appendWindowStart;
  }
  set [dartx.appendWindowStart](value) {
    this.appendWindowStart = value;
  }
  get [dartx.buffered]() {
    return this.buffered;
  }
  get [dartx.mode]() {
    return this.mode;
  }
  set [dartx.mode](value) {
    this.mode = value;
  }
  get [dartx.timestampOffset]() {
    return this.timestampOffset;
  }
  set [dartx.timestampOffset](value) {
    this.timestampOffset = value;
  }
  get [dartx.trackDefaults]() {
    return this.trackDefaults;
  }
  set [dartx.trackDefaults](value) {
    this.trackDefaults = value;
  }
  get [dartx.updating]() {
    return this.updating;
  }
  [dartx.abort](...args) {
    return this.abort.apply(this, args);
  }
  [dartx.appendBuffer](...args) {
    return this.appendBuffer.apply(this, args);
  }
  [dartx.appendStream](...args) {
    return this.appendStream.apply(this, args);
  }
  [dartx.appendTypedData](...args) {
    return this.appendBuffer.apply(this, args);
  }
  [dartx.remove](...args) {
    return this.remove.apply(this, args);
  }
};
dart.setSignature(html$.SourceBuffer, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SourceBuffer, [])}),
  fields: () => ({
    [dartx.appendWindowEnd]: core.num,
    [dartx.appendWindowStart]: core.num,
    [dartx.buffered]: html$.TimeRanges,
    [dartx.mode]: core.String,
    [dartx.timestampOffset]: core.num,
    [dartx.trackDefaults]: html$.TrackDefaultList,
    [dartx.updating]: core.bool
  }),
  methods: () => ({
    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
    [dartx.appendBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
    [dartx.appendStream]: dart.definiteFunctionType(dart.void, [html$.FileStream], [core.int]),
    [dartx.appendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData]),
    [dartx.remove]: dart.definiteFunctionType(dart.void, [core.num, core.num])
  })
});
dart.registerExtension(dart.global.SourceBuffer, html$.SourceBuffer);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$.SourceBufferList = class SourceBufferList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.SourceBuffer), html$.ImmutableListMixin$(html$.SourceBuffer)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$.SourceBufferList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSourceBuffer()];
dart.setSignature(html$.SourceBufferList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SourceBufferList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SourceBuffer]),
    [dartx.item]: dart.definiteFunctionType(html$.SourceBuffer, [core.int])
  })
});
dart.registerExtension(dart.global.SourceBufferList, html$.SourceBufferList);
dart.defineExtensionNames([
  'media',
  'sizes',
  'src',
  'srcset',
  'type'
]);
html$.SourceElement = class SourceElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.SourceElement._check(html$.document[dartx.createElement]("source"));
  }
  created() {
    this[dartx.media] = null;
    this[dartx.sizes] = null;
    this[dartx.src] = null;
    this[dartx.srcset] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.media]() {
    return this.media;
  }
  set [dartx.media](value) {
    this.media = value;
  }
  get [dartx.sizes]() {
    return this.sizes;
  }
  set [dartx.sizes](value) {
    this.sizes = value;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.srcset]() {
    return this.srcset;
  }
  set [dartx.srcset](value) {
    this.srcset = value;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.defineNamedConstructor(html$.SourceElement, 'created');
dart.setSignature(html$.SourceElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SourceElement, []),
    new: dart.definiteFunctionType(html$.SourceElement, []),
    created: dart.definiteFunctionType(html$.SourceElement, [])
  }),
  fields: () => ({
    [dartx.media]: core.String,
    [dartx.sizes]: core.String,
    [dartx.src]: core.String,
    [dartx.srcset]: core.String,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.HTMLSourceElement, html$.SourceElement);
dart.defineExtensionNames([
  'facing',
  'id',
  'kind',
  'label'
]);
html$.SourceInfo = class SourceInfo extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.facing]() {
    return this.facing;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.kind]() {
    return this.kind;
  }
  get [dartx.label]() {
    return this.label;
  }
};
dart.setSignature(html$.SourceInfo, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SourceInfo, [])}),
  fields: () => ({
    [dartx.facing]: core.String,
    [dartx.id]: core.String,
    [dartx.kind]: core.String,
    [dartx.label]: core.String
  })
});
dart.registerExtension(dart.global.SourceInfo, html$.SourceInfo);
html$.SpanElement = class SpanElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.SpanElement._check(html$.document[dartx.createElement]("span"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.SpanElement, 'created');
dart.setSignature(html$.SpanElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SpanElement, []),
    new: dart.definiteFunctionType(html$.SpanElement, []),
    created: dart.definiteFunctionType(html$.SpanElement, [])
  })
});
dart.registerExtension(dart.global.HTMLSpanElement, html$.SpanElement);
dart.defineExtensionNames([
  'src',
  'weight'
]);
html$.SpeechGrammar = class SpeechGrammar extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.SpeechGrammar._create_1();
  }
  static _create_1() {
    return new self.SpeechGrammar();
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.weight]() {
    return this.weight;
  }
  set [dartx.weight](value) {
    this.weight = value;
  }
};
dart.setSignature(html$.SpeechGrammar, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SpeechGrammar, []),
    new: dart.definiteFunctionType(html$.SpeechGrammar, [])
  }),
  fields: () => ({
    [dartx.src]: core.String,
    [dartx.weight]: core.num
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammar, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.SpeechGrammar, html$.SpeechGrammar);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'addFromString',
  'addFromUri',
  'item'
]);
html$.SpeechGrammarList = class SpeechGrammarList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechGrammar), html$.ImmutableListMixin$(html$.SpeechGrammar)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.SpeechGrammarList._create_1();
  }
  static _create_1() {
    return new self.SpeechGrammarList();
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.addFromString](...args) {
    return this.addFromString.apply(this, args);
  }
  [dartx.addFromUri](...args) {
    return this.addFromUri.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$.SpeechGrammarList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechGrammar()];
dart.setSignature(html$.SpeechGrammarList, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SpeechGrammarList, []),
    new: dart.definiteFunctionType(html$.SpeechGrammarList, [])
  }),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechGrammar]),
    [dartx.addFromString]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
    [dartx.addFromUri]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
    [dartx.item]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammarList, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.SpeechGrammarList, html$.SpeechGrammarList);
dart.defineExtensionNames([
  'abort',
  'start',
  'stop',
  'onAudioEnd',
  'onAudioStart',
  'onEnd',
  'onError',
  'onNoMatch',
  'onResult',
  'onSoundEnd',
  'onSoundStart',
  'onSpeechEnd',
  'onSpeechStart',
  'onStart',
  'audioTrack',
  'continuous',
  'grammars',
  'interimResults',
  'lang',
  'maxAlternatives',
  'serviceUri'
]);
html$.SpeechRecognition = class SpeechRecognition extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
  }
  get [dartx.audioTrack]() {
    return this.audioTrack;
  }
  set [dartx.audioTrack](value) {
    this.audioTrack = value;
  }
  get [dartx.continuous]() {
    return this.continuous;
  }
  set [dartx.continuous](value) {
    this.continuous = value;
  }
  get [dartx.grammars]() {
    return this.grammars;
  }
  set [dartx.grammars](value) {
    this.grammars = value;
  }
  get [dartx.interimResults]() {
    return this.interimResults;
  }
  set [dartx.interimResults](value) {
    this.interimResults = value;
  }
  get [dartx.lang]() {
    return this.lang;
  }
  set [dartx.lang](value) {
    this.lang = value;
  }
  get [dartx.maxAlternatives]() {
    return this.maxAlternatives;
  }
  set [dartx.maxAlternatives](value) {
    this.maxAlternatives = value;
  }
  get [dartx.serviceUri]() {
    return this.serviceURI;
  }
  set [dartx.serviceUri](value) {
    this.serviceURI = value;
  }
  [dartx.abort](...args) {
    return this.abort.apply(this, args);
  }
  [dartx.start](...args) {
    return this.start.apply(this, args);
  }
  [dartx.stop](...args) {
    return this.stop.apply(this, args);
  }
  get [dartx.onAudioEnd]() {
    return html$.SpeechRecognition.audioEndEvent.forTarget(this);
  }
  get [dartx.onAudioStart]() {
    return html$.SpeechRecognition.audioStartEvent.forTarget(this);
  }
  get [dartx.onEnd]() {
    return html$.SpeechRecognition.endEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.SpeechRecognition.errorEvent.forTarget(this);
  }
  get [dartx.onNoMatch]() {
    return html$.SpeechRecognition.noMatchEvent.forTarget(this);
  }
  get [dartx.onResult]() {
    return html$.SpeechRecognition.resultEvent.forTarget(this);
  }
  get [dartx.onSoundEnd]() {
    return html$.SpeechRecognition.soundEndEvent.forTarget(this);
  }
  get [dartx.onSoundStart]() {
    return html$.SpeechRecognition.soundStartEvent.forTarget(this);
  }
  get [dartx.onSpeechEnd]() {
    return html$.SpeechRecognition.speechEndEvent.forTarget(this);
  }
  get [dartx.onSpeechStart]() {
    return html$.SpeechRecognition.speechStartEvent.forTarget(this);
  }
  get [dartx.onStart]() {
    return html$.SpeechRecognition.startEvent.forTarget(this);
  }
  static new() {
    return new (window.SpeechRecognition || window.webkitSpeechRecognition)();
  }
};
dart.setSignature(html$.SpeechRecognition, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SpeechRecognition, []),
    new: dart.definiteFunctionType(html$.SpeechRecognition, [])
  }),
  fields: () => ({
    [dartx.audioTrack]: html$.MediaStreamTrack,
    [dartx.continuous]: core.bool,
    [dartx.grammars]: html$.SpeechGrammarList,
    [dartx.interimResults]: core.bool,
    [dartx.lang]: core.String,
    [dartx.maxAlternatives]: core.int,
    [dartx.serviceUri]: core.String
  }),
  getters: () => ({
    [dartx.onAudioEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onAudioStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionError), []),
    [dartx.onNoMatch]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
    [dartx.onResult]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
    [dartx.onSoundEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSoundStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSpeechEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSpeechStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
    [dartx.start]: dart.definiteFunctionType(dart.void, []),
    [dartx.stop]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    audioEndEvent: EventStreamProviderOfEvent(),
    audioStartEvent: EventStreamProviderOfEvent(),
    endEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfSpeechRecognitionError(),
    noMatchEvent: EventStreamProviderOfSpeechRecognitionEvent(),
    resultEvent: EventStreamProviderOfSpeechRecognitionEvent(),
    soundEndEvent: EventStreamProviderOfEvent(),
    soundStartEvent: EventStreamProviderOfEvent(),
    speechEndEvent: EventStreamProviderOfEvent(),
    speechStartEvent: EventStreamProviderOfEvent(),
    startEvent: EventStreamProviderOfEvent()
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.defineLazy(html$.SpeechRecognition, {
  get audioEndEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('audioend'));
  },
  get audioStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('audiostart'));
  },
  get endEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('end'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfSpeechRecognitionError())('error'));
  },
  get noMatchEvent() {
    return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('nomatch'));
  },
  get resultEvent() {
    return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('result'));
  },
  get soundEndEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('soundend'));
  },
  get soundStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('soundstart'));
  },
  get speechEndEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('speechend'));
  },
  get speechStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('speechstart'));
  },
  get startEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('start'));
  }
});
dart.registerExtension(dart.global.SpeechRecognition, html$.SpeechRecognition);
dart.defineExtensionNames([
  'confidence',
  'transcript'
]);
html$.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.confidence]() {
    return this.confidence;
  }
  get [dartx.transcript]() {
    return this.transcript;
  }
};
dart.setSignature(html$.SpeechRecognitionAlternative, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [])}),
  fields: () => ({
    [dartx.confidence]: core.double,
    [dartx.transcript]: core.String
  })
});
dart.registerExtension(dart.global.SpeechRecognitionAlternative, html$.SpeechRecognitionAlternative);
dart.defineExtensionNames([
  'error',
  'message'
]);
html$.SpeechRecognitionError = class SpeechRecognitionError extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, initDict) {
    if (initDict === void 0) initDict = null;
    if (initDict != null) {
      let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
      return html$.SpeechRecognitionError._create_1(type, initDict_1);
    }
    return html$.SpeechRecognitionError._create_2(type);
  }
  static _create_1(type, initDict) {
    return new self.SpeechRecognitionError(type, initDict);
  }
  static _create_2(type) {
    return new self.SpeechRecognitionError(type);
  }
  get [dartx.error]() {
    return this.error;
  }
  get [dartx.message]() {
    return this.message;
  }
};
dart.setSignature(html$.SpeechRecognitionError, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SpeechRecognitionError, []),
    new: dart.definiteFunctionType(html$.SpeechRecognitionError, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.error]: core.String,
    [dartx.message]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.SpeechRecognitionError, html$.SpeechRecognitionError);
dart.defineExtensionNames([
  'emma',
  'interpretation',
  'resultIndex',
  'results'
]);
html$.SpeechRecognitionEvent = class SpeechRecognitionEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, initDict) {
    if (initDict === void 0) initDict = null;
    if (initDict != null) {
      let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
      return html$.SpeechRecognitionEvent._create_1(type, initDict_1);
    }
    return html$.SpeechRecognitionEvent._create_2(type);
  }
  static _create_1(type, initDict) {
    return new self.SpeechRecognitionEvent(type, initDict);
  }
  static _create_2(type) {
    return new self.SpeechRecognitionEvent(type);
  }
  get [dartx.emma]() {
    return this.emma;
  }
  get [dartx.interpretation]() {
    return this.interpretation;
  }
  get [dartx.resultIndex]() {
    return this.resultIndex;
  }
  get [dartx.results]() {
    return this.results;
  }
};
dart.setSignature(html$.SpeechRecognitionEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SpeechRecognitionEvent, []),
    new: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.emma]: html$.Document,
    [dartx.interpretation]: html$.Document,
    [dartx.resultIndex]: core.int,
    [dartx.results]: ListOfSpeechRecognitionResult()
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.SpeechRecognitionEvent, html$.SpeechRecognitionEvent);
dart.defineExtensionNames([
  'item',
  'isFinal',
  'length'
]);
html$.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.isFinal]() {
    return this.isFinal;
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
dart.setSignature(html$.SpeechRecognitionResult, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])}),
  fields: () => ({
    [dartx.isFinal]: core.bool,
    [dartx.length]: core.int
  }),
  methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [core.int])})
});
dart.registerExtension(dart.global.SpeechRecognitionResult, html$.SpeechRecognitionResult);
dart.defineExtensionNames([
  'cancel',
  'getVoices',
  'pause',
  'resume',
  'speak',
  'paused',
  'pending',
  'speaking'
]);
html$.SpeechSynthesis = class SpeechSynthesis extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.paused]() {
    return this.paused;
  }
  get [dartx.pending]() {
    return this.pending;
  }
  get [dartx.speaking]() {
    return this.speaking;
  }
  [dartx.cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [dartx.getVoices](...args) {
    return this.getVoices.apply(this, args);
  }
  [dartx.pause](...args) {
    return this.pause.apply(this, args);
  }
  [dartx.resume](...args) {
    return this.resume.apply(this, args);
  }
  [dartx.speak](...args) {
    return this.speak.apply(this, args);
  }
};
dart.setSignature(html$.SpeechSynthesis, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesis, [])}),
  fields: () => ({
    [dartx.paused]: core.bool,
    [dartx.pending]: core.bool,
    [dartx.speaking]: core.bool
  }),
  methods: () => ({
    [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
    [dartx.getVoices]: dart.definiteFunctionType(core.List$(html$.SpeechSynthesisVoice), []),
    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
    [dartx.resume]: dart.definiteFunctionType(dart.void, []),
    [dartx.speak]: dart.definiteFunctionType(dart.void, [html$.SpeechSynthesisUtterance])
  })
});
dart.registerExtension(dart.global.SpeechSynthesis, html$.SpeechSynthesis);
dart.defineExtensionNames([
  'charIndex',
  'elapsedTime',
  'name',
  'utterance'
]);
html$.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.charIndex]() {
    return this.charIndex;
  }
  get [dartx.elapsedTime]() {
    return this.elapsedTime;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.utterance]() {
    return this.utterance;
  }
};
dart.setSignature(html$.SpeechSynthesisEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisEvent, [])}),
  fields: () => ({
    [dartx.charIndex]: core.int,
    [dartx.elapsedTime]: core.double,
    [dartx.name]: core.String,
    [dartx.utterance]: html$.SpeechSynthesisUtterance
  })
});
dart.registerExtension(dart.global.SpeechSynthesisEvent, html$.SpeechSynthesisEvent);
dart.defineExtensionNames([
  'onBoundary',
  'onEnd',
  'onError',
  'onMark',
  'onPause',
  'onResume',
  'onStart',
  'lang',
  'pitch',
  'rate',
  'text',
  'voice',
  'volume'
]);
html$.SpeechSynthesisUtterance = class SpeechSynthesisUtterance extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(text) {
    if (text === void 0) text = null;
    if (text != null) {
      return html$.SpeechSynthesisUtterance._create_1(text);
    }
    return html$.SpeechSynthesisUtterance._create_2();
  }
  static _create_1(text) {
    return new self.SpeechSynthesisUtterance(text);
  }
  static _create_2() {
    return new self.SpeechSynthesisUtterance();
  }
  get [dartx.lang]() {
    return this.lang;
  }
  set [dartx.lang](value) {
    this.lang = value;
  }
  get [dartx.pitch]() {
    return this.pitch;
  }
  set [dartx.pitch](value) {
    this.pitch = value;
  }
  get [dartx.rate]() {
    return this.rate;
  }
  set [dartx.rate](value) {
    this.rate = value;
  }
  get [dartx.text]() {
    return this.text;
  }
  set [dartx.text](value) {
    this.text = value;
  }
  get [dartx.voice]() {
    return this.voice;
  }
  set [dartx.voice](value) {
    this.voice = value;
  }
  get [dartx.volume]() {
    return this.volume;
  }
  set [dartx.volume](value) {
    this.volume = value;
  }
  get [dartx.onBoundary]() {
    return html$.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
  }
  get [dartx.onEnd]() {
    return html$.SpeechSynthesisUtterance.endEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.SpeechSynthesisUtterance.errorEvent.forTarget(this);
  }
  get [dartx.onMark]() {
    return html$.SpeechSynthesisUtterance.markEvent.forTarget(this);
  }
  get [dartx.onPause]() {
    return html$.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
  }
  get [dartx.onResume]() {
    return html$.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
  }
  get [dartx.onStart]() {
    return html$.SpeechSynthesisUtterance.startEvent.forTarget(this);
  }
};
dart.setSignature(html$.SpeechSynthesisUtterance, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, []),
    new: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [], [core.String])
  }),
  fields: () => ({
    [dartx.lang]: core.String,
    [dartx.pitch]: core.num,
    [dartx.rate]: core.num,
    [dartx.text]: core.String,
    [dartx.voice]: html$.SpeechSynthesisVoice,
    [dartx.volume]: core.num
  }),
  getters: () => ({
    [dartx.onBoundary]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMark]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onResume]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), [])
  }),
  sfields: () => ({
    boundaryEvent: EventStreamProviderOfSpeechSynthesisEvent(),
    endEvent: EventStreamProviderOfSpeechSynthesisEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    markEvent: EventStreamProviderOfSpeechSynthesisEvent(),
    pauseEvent: EventStreamProviderOfEvent(),
    resumeEvent: EventStreamProviderOfSpeechSynthesisEvent(),
    startEvent: EventStreamProviderOfSpeechSynthesisEvent()
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [])
  }),
  names: ['_create_1', '_create_2']
});
dart.defineLazy(html$.SpeechSynthesisUtterance, {
  get boundaryEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('boundary'));
  },
  get endEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('end'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get markEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('mark'));
  },
  get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pause'));
  },
  get resumeEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('resume'));
  },
  get startEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('start'));
  }
});
dart.registerExtension(dart.global.SpeechSynthesisUtterance, html$.SpeechSynthesisUtterance);
dart.defineExtensionNames([
  'defaultValue',
  'lang',
  'localService',
  'name',
  'voiceUri'
]);
html$.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.defaultValue]() {
    return this.default;
  }
  get [dartx.lang]() {
    return this.lang;
  }
  get [dartx.localService]() {
    return this.localService;
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.voiceUri]() {
    return this.voiceURI;
  }
};
dart.setSignature(html$.SpeechSynthesisVoice, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisVoice, [])}),
  fields: () => ({
    [dartx.defaultValue]: core.bool,
    [dartx.lang]: core.String,
    [dartx.localService]: core.bool,
    [dartx.name]: core.String,
    [dartx.voiceUri]: core.String
  })
});
dart.registerExtension(dart.global.SpeechSynthesisVoice, html$.SpeechSynthesisVoice);
dart.defineExtensionNames([
  'name'
]);
html$.StashedMessagePort = class StashedMessagePort extends html$.MessagePort {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.name]() {
    return this.name;
  }
};
dart.setSignature(html$.StashedMessagePort, {
  constructors: () => ({_: dart.definiteFunctionType(html$.StashedMessagePort, [])}),
  fields: () => ({[dartx.name]: core.String})
});
dart.registerExtension(dart.global.StashedMessagePort, html$.StashedMessagePort);
dart.defineExtensionNames([
  'add',
  'onMessage'
]);
html$.StashedPortCollection = class StashedPortCollection extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.add](...args) {
    return this.add.apply(this, args);
  }
  get [dartx.onMessage]() {
    return html$.StashedPortCollection.messageEvent.forTarget(this);
  }
};
dart.setSignature(html$.StashedPortCollection, {
  constructors: () => ({_: dart.definiteFunctionType(html$.StashedPortCollection, [])}),
  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
  methods: () => ({[dartx.add]: dart.definiteFunctionType(html$.StashedMessagePort, [core.String, html$.MessagePort])}),
  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
});
dart.defineLazy(html$.StashedPortCollection, {
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.StashedPortCollection, html$.StashedPortCollection);
const _getItem = Symbol('_getItem');
const _setItem = Symbol('_setItem');
const _removeItem = Symbol('_removeItem');
const _key = Symbol('_key');
const _length$3 = Symbol('_length');
const __delete__ = Symbol('__delete__');
dart.defineExtensionNames([
  'addAll',
  'containsValue',
  'containsKey',
  '_get',
  '_set',
  'putIfAbsent',
  'remove',
  'clear',
  'forEach',
  'keys',
  'values',
  'length',
  'isEmpty',
  'isNotEmpty'
]);
html$.Storage = class Storage extends _interceptors.Interceptor {
  [dartx.addAll](other) {
    other[dartx.forEach](dart.fn((k, v) => {
      this[dartx._set](k, v);
    }, StringAndStringToNull()));
  }
  [dartx.containsValue](value) {
    return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
  }
  [dartx.containsKey](key) {
    return this[_getItem](core.String._check(key)) != null;
  }
  [dartx._get](key) {
    return this[_getItem](core.String._check(key));
  }
  [dartx._set](key, value) {
    this[_setItem](key, value);
    return value;
  }
  [dartx.putIfAbsent](key, ifAbsent) {
    if (!dart.test(this[dartx.containsKey](key))) this[dartx._set](key, ifAbsent());
    return this[dartx._get](key);
  }
  [dartx.remove](key) {
    let value = this[dartx._get](key);
    this[_removeItem](core.String._check(key));
    return value;
  }
  [dartx.clear]() {
    return this[_clear$1]();
  }
  [dartx.forEach](f) {
    for (let i = 0; true; i++) {
      let key = this[_key](i);
      if (key == null) return;
      f(key, this[dartx._get](key));
    }
  }
  get [dartx.keys]() {
    let keys = JSArrayOfString().of([]);
    this[dartx.forEach](dart.fn((k, v) => keys[dartx.add](k), StringAndStringTovoid$()));
    return keys;
  }
  get [dartx.values]() {
    let values = JSArrayOfString().of([]);
    this[dartx.forEach](dart.fn((k, v) => values[dartx.add](v), StringAndStringTovoid$()));
    return values;
  }
  get [dartx.length]() {
    return this[_length$3];
  }
  get [dartx.isEmpty]() {
    return this[_key](0) == null;
  }
  get [dartx.isNotEmpty]() {
    return !dart.test(this[dartx.isEmpty]);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [_length$3]() {
    return this.length;
  }
  [__delete__](...args) {
    return this.__delete__.apply(this, args);
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
  [_clear$1](...args) {
    return this.clear.apply(this, args);
  }
  [_getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [_key](...args) {
    return this.key.apply(this, args);
  }
  [_removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [_setItem](...args) {
    return this.setItem.apply(this, args);
  }
};
html$.Storage[dart.implements] = () => [MapOfString$String()];
dart.setSignature(html$.Storage, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Storage, [])}),
  fields: () => ({[_length$3]: core.int}),
  getters: () => ({
    [dartx.keys]: dart.definiteFunctionType(core.Iterable$(core.String), []),
    [dartx.values]: dart.definiteFunctionType(core.Iterable$(core.String), []),
    [dartx.length]: dart.definiteFunctionType(core.int, []),
    [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
    [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    [dartx.addAll]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
    [dartx.containsValue]: dart.definiteFunctionType(core.bool, [core.Object]),
    [dartx.containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
    [dartx._get]: dart.definiteFunctionType(core.String, [core.Object]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.putIfAbsent]: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
    [dartx.remove]: dart.definiteFunctionType(core.String, [core.Object]),
    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
    [dartx.forEach]: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
    [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
    [_clear$1]: dart.definiteFunctionType(dart.void, []),
    [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
    [_key]: dart.definiteFunctionType(core.String, [core.int]),
    [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
    [_setItem]: dart.definiteFunctionType(dart.void, [core.String, core.String])
  })
});
dart.registerExtension(dart.global.Storage, html$.Storage);
html$.StorageErrorCallback = dart.typedef('StorageErrorCallback', () => dart.functionType(dart.void, [html$.DomError]));
const _initStorageEvent = Symbol('_initStorageEvent');
dart.defineExtensionNames([
  'key',
  'newValue',
  'oldValue',
  'storageArea',
  'url'
]);
html$.StorageEvent = class StorageEvent extends html$.Event {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let key = opts && 'key' in opts ? opts.key : null;
    let oldValue = opts && 'oldValue' in opts ? opts.oldValue : null;
    let newValue = opts && 'newValue' in opts ? opts.newValue : null;
    let url = opts && 'url' in opts ? opts.url : null;
    let storageArea = opts && 'storageArea' in opts ? opts.storageArea : null;
    let e = html$.StorageEvent._check(html$.document[_createEvent]("StorageEvent"));
    e[_initStorageEvent](type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
    return e;
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.StorageEvent._create_1(type, eventInitDict_1);
    }
    return html$.StorageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.StorageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.StorageEvent(type);
  }
  get [dartx.key]() {
    return this.key;
  }
  get [dartx.newValue]() {
    return this.newValue;
  }
  get [dartx.oldValue]() {
    return this.oldValue;
  }
  get [dartx.storageArea]() {
    return this.storageArea;
  }
  get [dartx.url]() {
    return this.url;
  }
  [_initStorageEvent](...args) {
    return this.initStorageEvent.apply(this, args);
  }
};
dart.setSignature(html$.StorageEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.StorageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, key: core.String, oldValue: core.String, newValue: core.String, url: core.String, storageArea: html$.Storage}),
    _: dart.definiteFunctionType(html$.StorageEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.key]: core.String,
    [dartx.newValue]: core.String,
    [dartx.oldValue]: core.String,
    [dartx.storageArea]: html$.Storage,
    [dartx.url]: core.String
  }),
  methods: () => ({[_initStorageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html$.Storage])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.StorageEvent, html$.StorageEvent);
dart.defineExtensionNames([
  'quota',
  'usage'
]);
html$.StorageInfo = class StorageInfo extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.quota]() {
    return this.quota;
  }
  get [dartx.usage]() {
    return this.usage;
  }
};
dart.setSignature(html$.StorageInfo, {
  constructors: () => ({_: dart.definiteFunctionType(html$.StorageInfo, [])}),
  fields: () => ({
    [dartx.quota]: core.int,
    [dartx.usage]: core.int
  })
});
dart.registerExtension(dart.global.StorageInfo, html$.StorageInfo);
dart.defineExtensionNames([
  'queryInfo',
  'requestPersistentQuota',
  'supportedTypes'
]);
html$.StorageQuota = class StorageQuota extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.supportedTypes]() {
    return this.supportedTypes;
  }
  [dartx.queryInfo](...args) {
    return this.queryInfo.apply(this, args);
  }
  [dartx.requestPersistentQuota](...args) {
    return this.requestPersistentQuota.apply(this, args);
  }
};
dart.setSignature(html$.StorageQuota, {
  constructors: () => ({_: dart.definiteFunctionType(html$.StorageQuota, [])}),
  fields: () => ({[dartx.supportedTypes]: ListOfString()}),
  methods: () => ({
    [dartx.queryInfo]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.requestPersistentQuota]: dart.definiteFunctionType(async.Future, [core.int])
  })
});
dart.registerExtension(dart.global.StorageQuota, html$.StorageQuota);
html$.StorageQuotaCallback = dart.typedef('StorageQuotaCallback', () => dart.functionType(dart.void, [core.int]));
html$.StorageUsageCallback = dart.typedef('StorageUsageCallback', () => dart.functionType(dart.void, [core.int, core.int]));
html$._StringCallback = dart.typedef('_StringCallback', () => dart.functionType(dart.void, [core.String]));
dart.defineExtensionNames([
  'disabled',
  'media',
  'sheet',
  'type'
]);
html$.StyleElement = class StyleElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.StyleElement._check(html$.document[dartx.createElement]("style"));
  }
  created() {
    this[dartx.disabled] = null;
    this[dartx.media] = null;
    this[dartx.sheet] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.media]() {
    return this.media;
  }
  set [dartx.media](value) {
    this.media = value;
  }
  get [dartx.sheet]() {
    return this.sheet;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.defineNamedConstructor(html$.StyleElement, 'created');
dart.setSignature(html$.StyleElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.StyleElement, []),
    new: dart.definiteFunctionType(html$.StyleElement, []),
    created: dart.definiteFunctionType(html$.StyleElement, [])
  }),
  fields: () => ({
    [dartx.disabled]: core.bool,
    [dartx.media]: core.String,
    [dartx.sheet]: html$.StyleSheet,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.HTMLStyleElement, html$.StyleElement);
dart.defineExtensionNames([
  'matchMedium',
  'type'
]);
html$.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.type]() {
    return this.type;
  }
  [dartx.matchMedium](...args) {
    return this.matchMedium.apply(this, args);
  }
};
dart.setSignature(html$.StyleMedia, {
  constructors: () => ({_: dart.definiteFunctionType(html$.StyleMedia, [])}),
  fields: () => ({[dartx.type]: core.String}),
  methods: () => ({[dartx.matchMedium]: dart.definiteFunctionType(core.bool, [core.String])})
});
dart.registerExtension(dart.global.StyleMedia, html$.StyleMedia);
dart.defineExtensionNames([
  'registration'
]);
html$.SyncEvent = class SyncEvent extends html$.ExtendableEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.SyncEvent._create_1(type, init_1);
  }
  static _create_1(type, init) {
    return new self.SyncEvent(type, init);
  }
  get [dartx.registration]() {
    return this.registration;
  }
};
dart.setSignature(html$.SyncEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.SyncEvent, []),
    new: dart.definiteFunctionType(html$.SyncEvent, [core.String, core.Map])
  }),
  fields: () => ({[dartx.registration]: html$.SyncRegistration}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.SyncEvent, [dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.SyncEvent, html$.SyncEvent);
dart.defineExtensionNames([
  'getRegistration',
  'getRegistrations',
  'permissionState',
  'register'
]);
html$.SyncManager = class SyncManager extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getRegistration](...args) {
    return this.getRegistration.apply(this, args);
  }
  [dartx.getRegistrations](...args) {
    return this.getRegistrations.apply(this, args);
  }
  [dartx.permissionState](...args) {
    return this.permissionState.apply(this, args);
  }
  [dartx.register](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_register_1](options_1);
    }
    return this[_register_2]();
  }
  [_register_1](...args) {
    return this.register.apply(this, args);
  }
  [_register_2](...args) {
    return this.register.apply(this, args);
  }
};
dart.setSignature(html$.SyncManager, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SyncManager, [])}),
  methods: () => ({
    [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
    [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
    [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
    [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
    [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [_register_2]: dart.definiteFunctionType(async.Future, [])
  })
});
dart.registerExtension(dart.global.SyncManager, html$.SyncManager);
dart.defineExtensionNames([
  'unregister',
  'tag'
]);
html$.SyncRegistration = class SyncRegistration extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.tag]() {
    return this.tag;
  }
  [dartx.unregister](...args) {
    return this.unregister.apply(this, args);
  }
};
dart.setSignature(html$.SyncRegistration, {
  constructors: () => ({_: dart.definiteFunctionType(html$.SyncRegistration, [])}),
  fields: () => ({[dartx.tag]: core.String}),
  methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
});
dart.registerExtension(dart.global.SyncRegistration, html$.SyncRegistration);
html$.TableCaptionElement = class TableCaptionElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TableCaptionElement._check(html$.document[dartx.createElement]("caption"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.TableCaptionElement, 'created');
dart.setSignature(html$.TableCaptionElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TableCaptionElement, []),
    new: dart.definiteFunctionType(html$.TableCaptionElement, []),
    created: dart.definiteFunctionType(html$.TableCaptionElement, [])
  })
});
dart.registerExtension(dart.global.HTMLTableCaptionElement, html$.TableCaptionElement);
dart.defineExtensionNames([
  'cellIndex',
  'colSpan',
  'headers',
  'rowSpan'
]);
html$.TableCellElement = class TableCellElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TableCellElement._check(html$.document[dartx.createElement]("td"));
  }
  created() {
    this[dartx.cellIndex] = null;
    this[dartx.colSpan] = null;
    this[dartx.headers] = null;
    this[dartx.rowSpan] = null;
    super.created();
  }
  get [dartx.cellIndex]() {
    return this.cellIndex;
  }
  get [dartx.colSpan]() {
    return this.colSpan;
  }
  set [dartx.colSpan](value) {
    this.colSpan = value;
  }
  get [dartx.headers]() {
    return this.headers;
  }
  set [dartx.headers](value) {
    this.headers = value;
  }
  get [dartx.rowSpan]() {
    return this.rowSpan;
  }
  set [dartx.rowSpan](value) {
    this.rowSpan = value;
  }
};
dart.defineNamedConstructor(html$.TableCellElement, 'created');
dart.setSignature(html$.TableCellElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TableCellElement, []),
    new: dart.definiteFunctionType(html$.TableCellElement, []),
    created: dart.definiteFunctionType(html$.TableCellElement, [])
  }),
  fields: () => ({
    [dartx.cellIndex]: core.int,
    [dartx.colSpan]: core.int,
    [dartx.headers]: core.String,
    [dartx.rowSpan]: core.int
  })
});
dart.registerExtension(dart.global.HTMLTableCellElement, html$.TableCellElement);
dart.registerExtension(dart.global.HTMLTableDataCellElement, html$.TableCellElement);
dart.registerExtension(dart.global.HTMLTableHeaderCellElement, html$.TableCellElement);
dart.defineExtensionNames([
  'span'
]);
html$.TableColElement = class TableColElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TableColElement._check(html$.document[dartx.createElement]("col"));
  }
  created() {
    this[dartx.span] = null;
    super.created();
  }
  get [dartx.span]() {
    return this.span;
  }
  set [dartx.span](value) {
    this.span = value;
  }
};
dart.defineNamedConstructor(html$.TableColElement, 'created');
dart.setSignature(html$.TableColElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TableColElement, []),
    new: dart.definiteFunctionType(html$.TableColElement, []),
    created: dart.definiteFunctionType(html$.TableColElement, [])
  }),
  fields: () => ({[dartx.span]: core.int})
});
dart.registerExtension(dart.global.HTMLTableColElement, html$.TableColElement);
const _tBodies = Symbol('_tBodies');
const _rows = Symbol('_rows');
const _createCaption = Symbol('_createCaption');
const _createTBody = Symbol('_createTBody');
const _createTFoot = Symbol('_createTFoot');
const _createTHead = Symbol('_createTHead');
const _insertRow = Symbol('_insertRow');
const _nativeCreateTBody = Symbol('_nativeCreateTBody');
dart.defineExtensionNames([
  'tBodies',
  'rows',
  'addRow',
  'createCaption',
  'createTBody',
  'createTFoot',
  'createTHead',
  'insertRow',
  'createFragment',
  'deleteCaption',
  'deleteRow',
  'deleteTFoot',
  'deleteTHead',
  'caption',
  'tFoot',
  'tHead'
]);
html$.TableElement = class TableElement extends html$.HtmlElement {
  get [dartx.tBodies]() {
    return new (_WrappedListOfTableSectionElement())(this[_tBodies]);
  }
  get [dartx.rows]() {
    return new (_WrappedListOfTableRowElement())(this[_rows]);
  }
  [dartx.addRow]() {
    return this[dartx.insertRow](-1);
  }
  [dartx.createCaption]() {
    return html$.TableCaptionElement._check(this[_createCaption]());
  }
  [dartx.createTBody]() {
    return this[_createTBody]();
  }
  [dartx.createTFoot]() {
    return html$.TableSectionElement._check(this[_createTFoot]());
  }
  [dartx.createTHead]() {
    return html$.TableSectionElement._check(this[_createTHead]());
  }
  [dartx.insertRow](index) {
    return html$.TableRowElement._check(this[_insertRow](index));
  }
  [_createTBody]() {
    if (!!this.createTBody) {
      return this[_nativeCreateTBody]();
    }
    let tbody = html$.Element.tag('tbody');
    this[dartx.children][dartx.add](tbody);
    return html$.TableSectionElement._check(tbody);
  }
  [_nativeCreateTBody](...args) {
    return this.createTBody.apply(this, args);
  }
  [dartx.createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
      return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    let contextualHtml = dart.str`<table>${html}</table>`;
    let table = html$.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
    let fragment = html$.DocumentFragment.new();
    fragment[dartx.nodes][dartx.addAll](table[dartx.nodes]);
    return fragment;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TableElement._check(html$.document[dartx.createElement]("table"));
  }
  created() {
    this[dartx.caption] = null;
    this[_rows] = null;
    this[_tBodies] = null;
    this[dartx.tFoot] = null;
    this[dartx.tHead] = null;
    super.created();
  }
  get [dartx.caption]() {
    return this.caption;
  }
  set [dartx.caption](value) {
    this.caption = value;
  }
  get [_rows]() {
    return this.rows;
  }
  get [_tBodies]() {
    return this.tBodies;
  }
  get [dartx.tFoot]() {
    return this.tFoot;
  }
  set [dartx.tFoot](value) {
    this.tFoot = value;
  }
  get [dartx.tHead]() {
    return this.tHead;
  }
  set [dartx.tHead](value) {
    this.tHead = value;
  }
  [_createCaption](...args) {
    return this.createCaption.apply(this, args);
  }
  [_createTFoot](...args) {
    return this.createTFoot.apply(this, args);
  }
  [_createTHead](...args) {
    return this.createTHead.apply(this, args);
  }
  [dartx.deleteCaption](...args) {
    return this.deleteCaption.apply(this, args);
  }
  [dartx.deleteRow](...args) {
    return this.deleteRow.apply(this, args);
  }
  [dartx.deleteTFoot](...args) {
    return this.deleteTFoot.apply(this, args);
  }
  [dartx.deleteTHead](...args) {
    return this.deleteTHead.apply(this, args);
  }
  [_insertRow](...args) {
    return this.insertRow.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.TableElement, 'created');
dart.setSignature(html$.TableElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TableElement, []),
    new: dart.definiteFunctionType(html$.TableElement, []),
    created: dart.definiteFunctionType(html$.TableElement, [])
  }),
  fields: () => ({
    [dartx.caption]: html$.TableCaptionElement,
    [_rows]: ListOfNode(),
    [_tBodies]: ListOfNode(),
    [dartx.tFoot]: html$.TableSectionElement,
    [dartx.tHead]: html$.TableSectionElement
  }),
  getters: () => ({
    [dartx.tBodies]: dart.definiteFunctionType(core.List$(html$.TableSectionElement), []),
    [dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])
  }),
  methods: () => ({
    [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
    [dartx.createCaption]: dart.definiteFunctionType(html$.TableCaptionElement, []),
    [dartx.createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
    [dartx.createTFoot]: dart.definiteFunctionType(html$.TableSectionElement, []),
    [dartx.createTHead]: dart.definiteFunctionType(html$.TableSectionElement, []),
    [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
    [_createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
    [_nativeCreateTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
    [_createCaption]: dart.definiteFunctionType(html$.HtmlElement, []),
    [_createTFoot]: dart.definiteFunctionType(html$.HtmlElement, []),
    [_createTHead]: dart.definiteFunctionType(html$.HtmlElement, []),
    [dartx.deleteCaption]: dart.definiteFunctionType(dart.void, []),
    [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.deleteTFoot]: dart.definiteFunctionType(dart.void, []),
    [dartx.deleteTHead]: dart.definiteFunctionType(dart.void, []),
    [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
  })
});
dart.registerExtension(dart.global.HTMLTableElement, html$.TableElement);
const _cells = Symbol('_cells');
const _insertCell = Symbol('_insertCell');
dart.defineExtensionNames([
  'cells',
  'addCell',
  'insertCell',
  'createFragment',
  'deleteCell',
  'rowIndex',
  'sectionRowIndex'
]);
html$.TableRowElement = class TableRowElement extends html$.HtmlElement {
  get [dartx.cells]() {
    return new (_WrappedListOfTableCellElement())(this[_cells]);
  }
  [dartx.addCell]() {
    return this[dartx.insertCell](-1);
  }
  [dartx.insertCell](index) {
    return html$.TableCellElement._check(this[_insertCell](index));
  }
  [dartx.createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
      return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    let fragment = html$.DocumentFragment.new();
    let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
    let row = section[dartx.nodes][dartx.single];
    fragment[dartx.nodes][dartx.addAll](row[dartx.nodes]);
    return fragment;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TableRowElement._check(html$.document[dartx.createElement]("tr"));
  }
  created() {
    this[_cells] = null;
    this[dartx.rowIndex] = null;
    this[dartx.sectionRowIndex] = null;
    super.created();
  }
  get [_cells]() {
    return this.cells;
  }
  get [dartx.rowIndex]() {
    return this.rowIndex;
  }
  get [dartx.sectionRowIndex]() {
    return this.sectionRowIndex;
  }
  [dartx.deleteCell](...args) {
    return this.deleteCell.apply(this, args);
  }
  [_insertCell](...args) {
    return this.insertCell.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.TableRowElement, 'created');
dart.setSignature(html$.TableRowElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TableRowElement, []),
    new: dart.definiteFunctionType(html$.TableRowElement, []),
    created: dart.definiteFunctionType(html$.TableRowElement, [])
  }),
  fields: () => ({
    [_cells]: ListOfNode(),
    [dartx.rowIndex]: core.int,
    [dartx.sectionRowIndex]: core.int
  }),
  getters: () => ({[dartx.cells]: dart.definiteFunctionType(core.List$(html$.TableCellElement), [])}),
  methods: () => ({
    [dartx.addCell]: dart.definiteFunctionType(html$.TableCellElement, []),
    [dartx.insertCell]: dart.definiteFunctionType(html$.TableCellElement, [core.int]),
    [dartx.deleteCell]: dart.definiteFunctionType(dart.void, [core.int]),
    [_insertCell]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
  })
});
dart.registerExtension(dart.global.HTMLTableRowElement, html$.TableRowElement);
dart.defineExtensionNames([
  'rows',
  'addRow',
  'insertRow',
  'createFragment',
  'deleteRow'
]);
html$.TableSectionElement = class TableSectionElement extends html$.HtmlElement {
  get [dartx.rows]() {
    return new (_WrappedListOfTableRowElement())(this[_rows]);
  }
  [dartx.addRow]() {
    return this[dartx.insertRow](-1);
  }
  [dartx.insertRow](index) {
    return html$.TableRowElement._check(this[_insertRow](index));
  }
  [dartx.createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
      return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    let fragment = html$.DocumentFragment.new();
    let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
    fragment[dartx.nodes][dartx.addAll](section[dartx.nodes]);
    return fragment;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[_rows] = null;
    super.created();
  }
  get [_rows]() {
    return this.rows;
  }
  [dartx.deleteRow](...args) {
    return this.deleteRow.apply(this, args);
  }
  [_insertRow](...args) {
    return this.insertRow.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.TableSectionElement, 'created');
dart.setSignature(html$.TableSectionElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TableSectionElement, []),
    created: dart.definiteFunctionType(html$.TableSectionElement, [])
  }),
  fields: () => ({[_rows]: ListOfNode()}),
  getters: () => ({[dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])}),
  methods: () => ({
    [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
    [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
    [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
    [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
  })
});
dart.registerExtension(dart.global.HTMLTableSectionElement, html$.TableSectionElement);
dart.defineExtensionNames([
  'setInnerHtml',
  'content'
]);
html$.TemplateElement = class TemplateElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TemplateElement._check(html$.document[dartx.createElement]("template"));
  }
  created() {
    this[dartx.content] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('template');
  }
  get [dartx.content]() {
    return this.content;
  }
  [dartx.setInnerHtml](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[dartx.text] = null;
    let fragment = this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    this[dartx.content][dartx.append](fragment);
  }
};
dart.defineNamedConstructor(html$.TemplateElement, 'created');
dart.setSignature(html$.TemplateElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TemplateElement, []),
    new: dart.definiteFunctionType(html$.TemplateElement, []),
    created: dart.definiteFunctionType(html$.TemplateElement, [])
  }),
  fields: () => ({[dartx.content]: html$.DocumentFragment}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.HTMLTemplateElement, html$.TemplateElement);
dart.defineExtensionNames([
  'checkValidity',
  'reportValidity',
  'select',
  'setCustomValidity',
  'setRangeText',
  'setSelectionRange',
  'autocapitalize',
  'autofocus',
  'cols',
  'defaultValue',
  'dirName',
  'disabled',
  'form',
  'inputMode',
  'labels',
  'maxLength',
  'minLength',
  'name',
  'placeholder',
  'readOnly',
  'required',
  'rows',
  'selectionDirection',
  'selectionEnd',
  'selectionStart',
  'textLength',
  'type',
  'validationMessage',
  'validity',
  'value',
  'willValidate',
  'wrap'
]);
html$.TextAreaElement = class TextAreaElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TextAreaElement._check(html$.document[dartx.createElement]("textarea"));
  }
  created() {
    this[dartx.autocapitalize] = null;
    this[dartx.autofocus] = null;
    this[dartx.cols] = null;
    this[dartx.defaultValue] = null;
    this[dartx.dirName] = null;
    this[dartx.disabled] = null;
    this[dartx.form] = null;
    this[dartx.inputMode] = null;
    this[dartx.labels] = null;
    this[dartx.maxLength] = null;
    this[dartx.minLength] = null;
    this[dartx.name] = null;
    this[dartx.placeholder] = null;
    this[dartx.readOnly] = null;
    this[dartx.required] = null;
    this[dartx.rows] = null;
    this[dartx.selectionDirection] = null;
    this[dartx.selectionEnd] = null;
    this[dartx.selectionStart] = null;
    this[dartx.textLength] = null;
    this[dartx.type] = null;
    this[dartx.validationMessage] = null;
    this[dartx.validity] = null;
    this[dartx.value] = null;
    this[dartx.willValidate] = null;
    this[dartx.wrap] = null;
    super.created();
  }
  get [dartx.autocapitalize]() {
    return this.autocapitalize;
  }
  set [dartx.autocapitalize](value) {
    this.autocapitalize = value;
  }
  get [dartx.autofocus]() {
    return this.autofocus;
  }
  set [dartx.autofocus](value) {
    this.autofocus = value;
  }
  get [dartx.cols]() {
    return this.cols;
  }
  set [dartx.cols](value) {
    this.cols = value;
  }
  get [dartx.defaultValue]() {
    return this.defaultValue;
  }
  set [dartx.defaultValue](value) {
    this.defaultValue = value;
  }
  get [dartx.dirName]() {
    return this.dirName;
  }
  set [dartx.dirName](value) {
    this.dirName = value;
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.form]() {
    return this.form;
  }
  get [dartx.inputMode]() {
    return this.inputMode;
  }
  set [dartx.inputMode](value) {
    this.inputMode = value;
  }
  get [dartx.labels]() {
    return this.labels;
  }
  get [dartx.maxLength]() {
    return this.maxLength;
  }
  set [dartx.maxLength](value) {
    this.maxLength = value;
  }
  get [dartx.minLength]() {
    return this.minLength;
  }
  set [dartx.minLength](value) {
    this.minLength = value;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.placeholder]() {
    return this.placeholder;
  }
  set [dartx.placeholder](value) {
    this.placeholder = value;
  }
  get [dartx.readOnly]() {
    return this.readOnly;
  }
  set [dartx.readOnly](value) {
    this.readOnly = value;
  }
  get [dartx.required]() {
    return this.required;
  }
  set [dartx.required](value) {
    this.required = value;
  }
  get [dartx.rows]() {
    return this.rows;
  }
  set [dartx.rows](value) {
    this.rows = value;
  }
  get [dartx.selectionDirection]() {
    return this.selectionDirection;
  }
  set [dartx.selectionDirection](value) {
    this.selectionDirection = value;
  }
  get [dartx.selectionEnd]() {
    return this.selectionEnd;
  }
  set [dartx.selectionEnd](value) {
    this.selectionEnd = value;
  }
  get [dartx.selectionStart]() {
    return this.selectionStart;
  }
  set [dartx.selectionStart](value) {
    this.selectionStart = value;
  }
  get [dartx.textLength]() {
    return this.textLength;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.validationMessage]() {
    return this.validationMessage;
  }
  get [dartx.validity]() {
    return this.validity;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  get [dartx.willValidate]() {
    return this.willValidate;
  }
  get [dartx.wrap]() {
    return this.wrap;
  }
  set [dartx.wrap](value) {
    this.wrap = value;
  }
  [dartx.checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [dartx.reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [dartx.select](...args) {
    return this.select.apply(this, args);
  }
  [dartx.setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
  [dartx.setRangeText](...args) {
    return this.setRangeText.apply(this, args);
  }
  [dartx.setSelectionRange](...args) {
    return this.setSelectionRange.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.TextAreaElement, 'created');
dart.setSignature(html$.TextAreaElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TextAreaElement, []),
    new: dart.definiteFunctionType(html$.TextAreaElement, []),
    created: dart.definiteFunctionType(html$.TextAreaElement, [])
  }),
  fields: () => ({
    [dartx.autocapitalize]: core.String,
    [dartx.autofocus]: core.bool,
    [dartx.cols]: core.int,
    [dartx.defaultValue]: core.String,
    [dartx.dirName]: core.String,
    [dartx.disabled]: core.bool,
    [dartx.form]: html$.FormElement,
    [dartx.inputMode]: core.String,
    [dartx.labels]: ListOfNode(),
    [dartx.maxLength]: core.int,
    [dartx.minLength]: core.int,
    [dartx.name]: core.String,
    [dartx.placeholder]: core.String,
    [dartx.readOnly]: core.bool,
    [dartx.required]: core.bool,
    [dartx.rows]: core.int,
    [dartx.selectionDirection]: core.String,
    [dartx.selectionEnd]: core.int,
    [dartx.selectionStart]: core.int,
    [dartx.textLength]: core.int,
    [dartx.type]: core.String,
    [dartx.validationMessage]: core.String,
    [dartx.validity]: html$.ValidityState,
    [dartx.value]: core.String,
    [dartx.willValidate]: core.bool,
    [dartx.wrap]: core.String
  }),
  methods: () => ({
    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
    [dartx.select]: dart.definiteFunctionType(dart.void, []),
    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
    [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String])
  })
});
dart.registerExtension(dart.global.HTMLTextAreaElement, html$.TextAreaElement);
const _initTextEvent = Symbol('_initTextEvent');
dart.defineExtensionNames([
  'data'
]);
html$.TextEvent = class TextEvent extends html$.UIEvent {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let view = opts && 'view' in opts ? opts.view : null;
    let data = opts && 'data' in opts ? opts.data : null;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.TextEvent._check(html$.document[_createEvent]("TextEvent"));
    e[_initTextEvent](type, canBubble, cancelable, view, data);
    return e;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.data]() {
    return this.data;
  }
  [_initTextEvent](...args) {
    return this.initTextEvent.apply(this, args);
  }
};
dart.setSignature(html$.TextEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.TextEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String}),
    _: dart.definiteFunctionType(html$.TextEvent, [])
  }),
  fields: () => ({[dartx.data]: core.String}),
  methods: () => ({[_initTextEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])})
});
dart.registerExtension(dart.global.TextEvent, html$.TextEvent);
dart.defineExtensionNames([
  'actualBoundingBoxAscent',
  'actualBoundingBoxDescent',
  'actualBoundingBoxLeft',
  'actualBoundingBoxRight',
  'alphabeticBaseline',
  'emHeightAscent',
  'emHeightDescent',
  'fontBoundingBoxAscent',
  'fontBoundingBoxDescent',
  'hangingBaseline',
  'ideographicBaseline',
  'width'
]);
html$.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.actualBoundingBoxAscent]() {
    return this.actualBoundingBoxAscent;
  }
  get [dartx.actualBoundingBoxDescent]() {
    return this.actualBoundingBoxDescent;
  }
  get [dartx.actualBoundingBoxLeft]() {
    return this.actualBoundingBoxLeft;
  }
  get [dartx.actualBoundingBoxRight]() {
    return this.actualBoundingBoxRight;
  }
  get [dartx.alphabeticBaseline]() {
    return this.alphabeticBaseline;
  }
  get [dartx.emHeightAscent]() {
    return this.emHeightAscent;
  }
  get [dartx.emHeightDescent]() {
    return this.emHeightDescent;
  }
  get [dartx.fontBoundingBoxAscent]() {
    return this.fontBoundingBoxAscent;
  }
  get [dartx.fontBoundingBoxDescent]() {
    return this.fontBoundingBoxDescent;
  }
  get [dartx.hangingBaseline]() {
    return this.hangingBaseline;
  }
  get [dartx.ideographicBaseline]() {
    return this.ideographicBaseline;
  }
  get [dartx.width]() {
    return this.width;
  }
};
dart.setSignature(html$.TextMetrics, {
  constructors: () => ({_: dart.definiteFunctionType(html$.TextMetrics, [])}),
  fields: () => ({
    [dartx.actualBoundingBoxAscent]: core.double,
    [dartx.actualBoundingBoxDescent]: core.double,
    [dartx.actualBoundingBoxLeft]: core.double,
    [dartx.actualBoundingBoxRight]: core.double,
    [dartx.alphabeticBaseline]: core.double,
    [dartx.emHeightAscent]: core.double,
    [dartx.emHeightDescent]: core.double,
    [dartx.fontBoundingBoxAscent]: core.double,
    [dartx.fontBoundingBoxDescent]: core.double,
    [dartx.hangingBaseline]: core.double,
    [dartx.ideographicBaseline]: core.double,
    [dartx.width]: core.double
  })
});
dart.registerExtension(dart.global.TextMetrics, html$.TextMetrics);
dart.defineExtensionNames([
  'addCue',
  'addRegion',
  'removeCue',
  'removeRegion',
  'onCueChange',
  'activeCues',
  'cues',
  'id',
  'kind',
  'label',
  'language',
  'mode',
  'regions'
]);
html$.TextTrack = class TextTrack extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.activeCues]() {
    return this.activeCues;
  }
  get [dartx.cues]() {
    return this.cues;
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.kind]() {
    return this.kind;
  }
  get [dartx.label]() {
    return this.label;
  }
  get [dartx.language]() {
    return this.language;
  }
  get [dartx.mode]() {
    return this.mode;
  }
  set [dartx.mode](value) {
    this.mode = value;
  }
  get [dartx.regions]() {
    return this.regions;
  }
  [dartx.addCue](...args) {
    return this.addCue.apply(this, args);
  }
  [dartx.addRegion](...args) {
    return this.addRegion.apply(this, args);
  }
  [dartx.removeCue](...args) {
    return this.removeCue.apply(this, args);
  }
  [dartx.removeRegion](...args) {
    return this.removeRegion.apply(this, args);
  }
  get [dartx.onCueChange]() {
    return html$.TextTrack.cueChangeEvent.forTarget(this);
  }
};
dart.setSignature(html$.TextTrack, {
  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrack, [])}),
  fields: () => ({
    [dartx.activeCues]: html$.TextTrackCueList,
    [dartx.cues]: html$.TextTrackCueList,
    [dartx.id]: core.String,
    [dartx.kind]: core.String,
    [dartx.label]: core.String,
    [dartx.language]: core.String,
    [dartx.mode]: core.String,
    [dartx.regions]: html$.VttRegionList
  }),
  getters: () => ({[dartx.onCueChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.addCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
    [dartx.addRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion]),
    [dartx.removeCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
    [dartx.removeRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion])
  }),
  sfields: () => ({cueChangeEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.TextTrack, {
  get cueChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('cuechange'));
  }
});
dart.registerExtension(dart.global.TextTrack, html$.TextTrack);
dart.defineExtensionNames([
  'onEnter',
  'onExit',
  'endTime',
  'id',
  'pauseOnExit',
  'startTime',
  'track'
]);
html$.TextTrackCue = class TextTrackCue extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.endTime]() {
    return this.endTime;
  }
  set [dartx.endTime](value) {
    this.endTime = value;
  }
  get [dartx.id]() {
    return this.id;
  }
  set [dartx.id](value) {
    this.id = value;
  }
  get [dartx.pauseOnExit]() {
    return this.pauseOnExit;
  }
  set [dartx.pauseOnExit](value) {
    this.pauseOnExit = value;
  }
  get [dartx.startTime]() {
    return this.startTime;
  }
  set [dartx.startTime](value) {
    this.startTime = value;
  }
  get [dartx.track]() {
    return this.track;
  }
  get [dartx.onEnter]() {
    return html$.TextTrackCue.enterEvent.forTarget(this);
  }
  get [dartx.onExit]() {
    return html$.TextTrackCue.exitEvent.forTarget(this);
  }
};
dart.setSignature(html$.TextTrackCue, {
  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCue, [])}),
  fields: () => ({
    [dartx.endTime]: core.num,
    [dartx.id]: core.String,
    [dartx.pauseOnExit]: core.bool,
    [dartx.startTime]: core.num,
    [dartx.track]: html$.TextTrack
  }),
  getters: () => ({
    [dartx.onEnter]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onExit]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  sfields: () => ({
    enterEvent: EventStreamProviderOfEvent(),
    exitEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(html$.TextTrackCue, {
  get enterEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('enter'));
  },
  get exitEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('exit'));
  }
});
dart.registerExtension(dart.global.TextTrackCue, html$.TextTrackCue);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'getCueById',
  'item'
]);
html$.TextTrackCueList = class TextTrackCueList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.TextTrackCue), html$.ImmutableListMixin$(html$.TextTrackCue)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.getCueById](...args) {
    return this.getCueById.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), _js_helper.JavaScriptIndexingBehavior];
dart.setSignature(html$.TextTrackCueList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCueList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrackCue]),
    [dartx.getCueById]: dart.definiteFunctionType(html$.TextTrackCue, [core.String]),
    [dartx.item]: dart.definiteFunctionType(html$.TextTrackCue, [core.int])
  })
});
dart.registerExtension(dart.global.TextTrackCueList, html$.TextTrackCueList);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'getTrackById',
  'item',
  'onAddTrack',
  'onChange'
]);
html$.TextTrackList = class TextTrackList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.TextTrack), html$.ImmutableListMixin$(html$.TextTrack)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  get [dartx.onAddTrack]() {
    return html$.TextTrackList.addTrackEvent.forTarget(this);
  }
  get [dartx.onChange]() {
    return html$.TextTrackList.changeEvent.forTarget(this);
  }
};
html$.TextTrackList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTextTrack()];
dart.setSignature(html$.TextTrackList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackList, [])}),
  getters: () => ({
    [dartx.length]: dart.definiteFunctionType(core.int, []),
    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.TrackEvent), []),
    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrack]),
    [dartx.getTrackById]: dart.definiteFunctionType(html$.TextTrack, [core.String]),
    [dartx.item]: dart.definiteFunctionType(html$.TextTrack, [core.int])
  }),
  sfields: () => ({
    addTrackEvent: EventStreamProviderOfTrackEvent(),
    changeEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(html$.TextTrackList, {
  get addTrackEvent() {
    return dart.const(new (EventStreamProviderOfTrackEvent())('addtrack'));
  },
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  }
});
dart.registerExtension(dart.global.TextTrackList, html$.TextTrackList);
dart.defineExtensionNames([
  'end',
  'start',
  'length'
]);
html$.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx.end](...args) {
    return this.end.apply(this, args);
  }
  [dartx.start](...args) {
    return this.start.apply(this, args);
  }
};
dart.setSignature(html$.TimeRanges, {
  constructors: () => ({_: dart.definiteFunctionType(html$.TimeRanges, [])}),
  fields: () => ({[dartx.length]: core.int}),
  methods: () => ({
    [dartx.end]: dart.definiteFunctionType(core.double, [core.int]),
    [dartx.start]: dart.definiteFunctionType(core.double, [core.int])
  })
});
dart.registerExtension(dart.global.TimeRanges, html$.TimeRanges);
html$.TimeoutHandler = dart.typedef('TimeoutHandler', () => dart.functionType(dart.void, []));
html$.TitleElement = class TitleElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TitleElement._check(html$.document[dartx.createElement]("title"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.TitleElement, 'created');
dart.setSignature(html$.TitleElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TitleElement, []),
    new: dart.definiteFunctionType(html$.TitleElement, []),
    created: dart.definiteFunctionType(html$.TitleElement, [])
  })
});
dart.registerExtension(dart.global.HTMLTitleElement, html$.TitleElement);
const _radiusX = Symbol('_radiusX');
const _radiusY = Symbol('_radiusY');
const __clientX = Symbol('__clientX');
const __clientY = Symbol('__clientY');
const __screenX = Symbol('__screenX');
const __screenY = Symbol('__screenY');
const __pageX = Symbol('__pageX');
const __pageY = Symbol('__pageY');
const __radiusX = Symbol('__radiusX');
const __radiusY = Symbol('__radiusY');
dart.defineExtensionNames([
  'target',
  'client',
  'page',
  'screen',
  'radiusX',
  'radiusY',
  'force',
  'identifier',
  'rotationAngle'
]);
html$.Touch = class Touch extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [_clientX]() {
    return this.clientX;
  }
  get [_clientY]() {
    return this.clientY;
  }
  get [dartx.force]() {
    return this.force;
  }
  get [dartx.identifier]() {
    return this.identifier;
  }
  get [_pageX]() {
    return this.pageX;
  }
  get [_pageY]() {
    return this.pageY;
  }
  get [_radiusX]() {
    return this.radiusX;
  }
  get [_radiusY]() {
    return this.radiusY;
  }
  get [dartx.rotationAngle]() {
    return this.rotationAngle;
  }
  get [_screenX]() {
    return this.screenX;
  }
  get [_screenY]() {
    return this.screenY;
  }
  get [dartx.target]() {
    return html$._convertNativeToDart_EventTarget(this[_get_target]);
  }
  get [_get_target]() {
    return this.target;
  }
  get [__clientX]() {
    return this.clientX[dartx.round]();
  }
  get [__clientY]() {
    return this.clientY[dartx.round]();
  }
  get [__screenX]() {
    return this.screenX[dartx.round]();
  }
  get [__screenY]() {
    return this.screenY[dartx.round]();
  }
  get [__pageX]() {
    return this.pageX[dartx.round]();
  }
  get [__pageY]() {
    return this.pageY[dartx.round]();
  }
  get [__radiusX]() {
    return this.radiusX[dartx.round]();
  }
  get [__radiusY]() {
    return this.radiusY[dartx.round]();
  }
  get [dartx.client]() {
    return new (PointOfnum())(this[__clientX], this[__clientY]);
  }
  get [dartx.page]() {
    return new (PointOfnum())(this[__pageX], this[__pageY]);
  }
  get [dartx.screen]() {
    return new (PointOfnum())(this[__screenX], this[__screenY]);
  }
  get [dartx.radiusX]() {
    return this[__radiusX];
  }
  get [dartx.radiusY]() {
    return this[__radiusY];
  }
};
dart.setSignature(html$.Touch, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Touch, [])}),
  fields: () => ({
    [_clientX]: core.double,
    [_clientY]: core.double,
    [dartx.force]: core.double,
    [dartx.identifier]: core.int,
    [_pageX]: core.double,
    [_pageY]: core.double,
    [_radiusX]: core.double,
    [_radiusY]: core.double,
    [dartx.rotationAngle]: core.double,
    [_screenX]: core.double,
    [_screenY]: core.double,
    [_get_target]: dart.dynamic
  }),
  getters: () => ({
    [dartx.target]: dart.definiteFunctionType(html$.EventTarget, []),
    [__clientX]: dart.definiteFunctionType(core.int, []),
    [__clientY]: dart.definiteFunctionType(core.int, []),
    [__screenX]: dart.definiteFunctionType(core.int, []),
    [__screenY]: dart.definiteFunctionType(core.int, []),
    [__pageX]: dart.definiteFunctionType(core.int, []),
    [__pageY]: dart.definiteFunctionType(core.int, []),
    [__radiusX]: dart.definiteFunctionType(core.int, []),
    [__radiusY]: dart.definiteFunctionType(core.int, []),
    [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.radiusX]: dart.definiteFunctionType(core.int, []),
    [dartx.radiusY]: dart.definiteFunctionType(core.int, [])
  })
});
dart.registerExtension(dart.global.Touch, html$.Touch);
const _initTouchEvent = Symbol('_initTouchEvent');
dart.defineExtensionNames([
  'altKey',
  'changedTouches',
  'ctrlKey',
  'metaKey',
  'shiftKey',
  'targetTouches',
  'touches'
]);
html$.TouchEvent = class TouchEvent extends html$.UIEvent {
  static new(touches, targetTouches, changedTouches, type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.TouchEvent._check(html$.document[_createEvent]("TouchEvent"));
    e[_initTouchEvent](touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
    return e;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.altKey]() {
    return this.altKey;
  }
  get [dartx.changedTouches]() {
    return this.changedTouches;
  }
  get [dartx.ctrlKey]() {
    return this.ctrlKey;
  }
  get [dartx.metaKey]() {
    return this.metaKey;
  }
  get [dartx.shiftKey]() {
    return this.shiftKey;
  }
  get [dartx.targetTouches]() {
    return this.targetTouches;
  }
  get [dartx.touches]() {
    return this.touches;
  }
  [_initTouchEvent](...args) {
    return this.initTouchEvent.apply(this, args);
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported('TouchEvent');
  }
};
dart.setSignature(html$.TouchEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.TouchEvent, [html$.TouchList, html$.TouchList, html$.TouchList, core.String], {view: html$.Window, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
    _: dart.definiteFunctionType(html$.TouchEvent, [])
  }),
  fields: () => ({
    [dartx.altKey]: core.bool,
    [dartx.changedTouches]: html$.TouchList,
    [dartx.ctrlKey]: core.bool,
    [dartx.metaKey]: core.bool,
    [dartx.shiftKey]: core.bool,
    [dartx.targetTouches]: html$.TouchList,
    [dartx.touches]: html$.TouchList
  }),
  methods: () => ({[_initTouchEvent]: dart.definiteFunctionType(dart.void, [html$.TouchList, html$.TouchList, html$.TouchList, core.String, html$.Window, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.TouchEvent, html$.TouchEvent);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$.TouchList = class TouchList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Touch), html$.ImmutableListMixin$(html$.Touch)) {
  static new() {
    return null;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!document.createTouchList;
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$.TouchList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTouch()];
dart.setSignature(html$.TouchList, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.TouchList, []),
    _: dart.definiteFunctionType(html$.TouchList, [])
  }),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.Touch, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Touch]),
    [dartx.item]: dart.definiteFunctionType(html$.Touch, [core.int])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.TouchList, html$.TouchList);
dart.defineExtensionNames([
  'byteStreamTrackID',
  'kinds',
  'label',
  'language',
  'type'
]);
html$.TrackDefault = class TrackDefault extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, language, label, kinds, byteStreamTrackID) {
    if (byteStreamTrackID === void 0) byteStreamTrackID = null;
    if (byteStreamTrackID != null) {
      let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
      return html$.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
    }
    let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
    return html$.TrackDefault._create_2(type, language, label, kinds_1);
  }
  static _create_1(type, language, label, kinds, byteStreamTrackID) {
    return new self.TrackDefault(type, language, label, kinds, byteStreamTrackID);
  }
  static _create_2(type, language, label, kinds) {
    return new self.TrackDefault(type, language, label, kinds);
  }
  get [dartx.byteStreamTrackID]() {
    return this.byteStreamTrackID;
  }
  get [dartx.kinds]() {
    return this.kinds;
  }
  get [dartx.label]() {
    return this.label;
  }
  get [dartx.language]() {
    return this.language;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(html$.TrackDefault, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TrackDefault, []),
    new: dart.definiteFunctionType(html$.TrackDefault, [core.String, core.String, core.String, ListOfString()], [core.String])
  }),
  fields: () => ({
    [dartx.byteStreamTrackID]: core.String,
    [dartx.kinds]: ListOfString(),
    [dartx.label]: core.String,
    [dartx.language]: core.String,
    [dartx.type]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.TrackDefault, html$.TrackDefault);
dart.defineExtensionNames([
  'item',
  'length'
]);
html$.TrackDefaultList = class TrackDefaultList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(trackDefaults) {
    if (trackDefaults === void 0) trackDefaults = null;
    if (trackDefaults != null) {
      return html$.TrackDefaultList._create_1(trackDefaults);
    }
    return html$.TrackDefaultList._create_2();
  }
  static _create_1(trackDefaults) {
    return new self.TrackDefaultList(trackDefaults);
  }
  static _create_2() {
    return new self.TrackDefaultList();
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
dart.setSignature(html$.TrackDefaultList, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TrackDefaultList, []),
    new: dart.definiteFunctionType(html$.TrackDefaultList, [], [ListOfTrackDefault()])
  }),
  fields: () => ({[dartx.length]: core.int}),
  methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.TrackDefault, [core.int])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.TrackDefaultList, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.TrackDefaultList, [])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.TrackDefaultList, html$.TrackDefaultList);
dart.defineExtensionNames([
  'defaultValue',
  'kind',
  'label',
  'readyState',
  'src',
  'srclang',
  'track'
]);
html$.TrackElement = class TrackElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.TrackElement._check(html$.document[dartx.createElement]("track"));
  }
  created() {
    this[dartx.defaultValue] = null;
    this[dartx.kind] = null;
    this[dartx.label] = null;
    this[dartx.readyState] = null;
    this[dartx.src] = null;
    this[dartx.srclang] = null;
    this[dartx.track] = null;
    super.created();
  }
  static get supported() {
    return html$.Element.isTagSupported('track');
  }
  get [dartx.defaultValue]() {
    return this.default;
  }
  set [dartx.defaultValue](value) {
    this.default = value;
  }
  get [dartx.kind]() {
    return this.kind;
  }
  set [dartx.kind](value) {
    this.kind = value;
  }
  get [dartx.label]() {
    return this.label;
  }
  set [dartx.label](value) {
    this.label = value;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.src]() {
    return this.src;
  }
  set [dartx.src](value) {
    this.src = value;
  }
  get [dartx.srclang]() {
    return this.srclang;
  }
  set [dartx.srclang](value) {
    this.srclang = value;
  }
  get [dartx.track]() {
    return this.track;
  }
};
dart.defineNamedConstructor(html$.TrackElement, 'created');
dart.setSignature(html$.TrackElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TrackElement, []),
    new: dart.definiteFunctionType(html$.TrackElement, []),
    created: dart.definiteFunctionType(html$.TrackElement, [])
  }),
  fields: () => ({
    [dartx.defaultValue]: core.bool,
    [dartx.kind]: core.String,
    [dartx.label]: core.String,
    [dartx.readyState]: core.int,
    [dartx.src]: core.String,
    [dartx.srclang]: core.String,
    [dartx.track]: html$.TextTrack
  }),
  sfields: () => ({
    ERROR: core.int,
    LOADED: core.int,
    LOADING: core.int,
    NONE: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
html$.TrackElement.ERROR = 3;
html$.TrackElement.LOADED = 2;
html$.TrackElement.LOADING = 1;
html$.TrackElement.NONE = 0;
dart.registerExtension(dart.global.HTMLTrackElement, html$.TrackElement);
dart.defineExtensionNames([
  'track'
]);
html$.TrackEvent = class TrackEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.TrackEvent._create_1(type, eventInitDict_1);
    }
    return html$.TrackEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.TrackEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.TrackEvent(type);
  }
  get [dartx.track]() {
    return this.track;
  }
};
dart.setSignature(html$.TrackEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TrackEvent, []),
    new: dart.definiteFunctionType(html$.TrackEvent, [core.String], [core.Map])
  }),
  fields: () => ({[dartx.track]: core.Object}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.TrackEvent, html$.TrackEvent);
dart.defineExtensionNames([
  'elapsedTime',
  'propertyName',
  'pseudoElement'
]);
html$.TransitionEvent = class TransitionEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.TransitionEvent._create_1(type, eventInitDict_1);
    }
    return html$.TransitionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.TransitionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.TransitionEvent(type);
  }
  get [dartx.elapsedTime]() {
    return this.elapsedTime;
  }
  get [dartx.propertyName]() {
    return this.propertyName;
  }
  get [dartx.pseudoElement]() {
    return this.pseudoElement;
  }
};
dart.setSignature(html$.TransitionEvent, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.TransitionEvent, []),
    new: dart.definiteFunctionType(html$.TransitionEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [dartx.elapsedTime]: core.double,
    [dartx.propertyName]: core.String,
    [dartx.pseudoElement]: core.String
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.TransitionEvent, html$.TransitionEvent);
dart.registerExtension(dart.global.WebKitTransitionEvent, html$.TransitionEvent);
dart.defineExtensionNames([
  'firstChild',
  'lastChild',
  'nextNode',
  'nextSibling',
  'parentNode',
  'previousNode',
  'previousSibling',
  'currentNode',
  'filter',
  'root',
  'whatToShow'
]);
html$.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
  static new(root, whatToShow) {
    return html$.document[_createTreeWalker](root, whatToShow, null);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.currentNode]() {
    return this.currentNode;
  }
  set [dartx.currentNode](value) {
    this.currentNode = value;
  }
  get [dartx.filter]() {
    return this.filter;
  }
  get [dartx.root]() {
    return this.root;
  }
  get [dartx.whatToShow]() {
    return this.whatToShow;
  }
  [dartx.firstChild](...args) {
    return this.firstChild.apply(this, args);
  }
  [dartx.lastChild](...args) {
    return this.lastChild.apply(this, args);
  }
  [dartx.nextNode](...args) {
    return this.nextNode.apply(this, args);
  }
  [dartx.nextSibling](...args) {
    return this.nextSibling.apply(this, args);
  }
  [dartx.parentNode](...args) {
    return this.parentNode.apply(this, args);
  }
  [dartx.previousNode](...args) {
    return this.previousNode.apply(this, args);
  }
  [dartx.previousSibling](...args) {
    return this.previousSibling.apply(this, args);
  }
};
dart.setSignature(html$.TreeWalker, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.TreeWalker, [html$.Node, core.int]),
    _: dart.definiteFunctionType(html$.TreeWalker, [])
  }),
  fields: () => ({
    [dartx.currentNode]: html$.Node,
    [dartx.filter]: html$.NodeFilter,
    [dartx.root]: html$.Node,
    [dartx.whatToShow]: core.int
  }),
  methods: () => ({
    [dartx.firstChild]: dart.definiteFunctionType(html$.Node, []),
    [dartx.lastChild]: dart.definiteFunctionType(html$.Node, []),
    [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
    [dartx.nextSibling]: dart.definiteFunctionType(html$.Node, []),
    [dartx.parentNode]: dart.definiteFunctionType(html$.Node, []),
    [dartx.previousNode]: dart.definiteFunctionType(html$.Node, []),
    [dartx.previousSibling]: dart.definiteFunctionType(html$.Node, [])
  })
});
dart.registerExtension(dart.global.TreeWalker, html$.TreeWalker);
html$.UListElement = class UListElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.UListElement._check(html$.document[dartx.createElement]("ul"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.UListElement, 'created');
dart.setSignature(html$.UListElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.UListElement, []),
    new: dart.definiteFunctionType(html$.UListElement, []),
    created: dart.definiteFunctionType(html$.UListElement, [])
  })
});
dart.registerExtension(dart.global.HTMLUListElement, html$.UListElement);
html$.UnknownElement = class UnknownElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$.UnknownElement, 'created');
dart.setSignature(html$.UnknownElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.UnknownElement, []),
    created: dart.definiteFunctionType(html$.UnknownElement, [])
  })
});
dart.registerExtension(dart.global.HTMLUnknownElement, html$.UnknownElement);
dart.defineExtensionNames([
  'toString',
  'hash',
  'host',
  'hostname',
  'href',
  'origin',
  'password',
  'pathname',
  'port',
  'protocol',
  'search',
  'username'
]);
html$.Url = class Url extends _interceptors.Interceptor {
  static createObjectUrl(blob_OR_source_OR_stream) {
    return (self.URL || self.webkitURL).createObjectURL(blob_OR_source_OR_stream);
  }
  static createObjectUrlFromSource(source) {
    return (self.URL || self.webkitURL).createObjectURL(source);
  }
  static createObjectUrlFromStream(stream) {
    return (self.URL || self.webkitURL).createObjectURL(stream);
  }
  static createObjectUrlFromBlob(blob) {
    return (self.URL || self.webkitURL).createObjectURL(blob);
  }
  static revokeObjectUrl(url) {
    return (self.URL || self.webkitURL).revokeObjectURL(url);
  }
  [dartx.toString]() {
    return String(this);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.hash]() {
    return this.hash;
  }
  set [dartx.hash](value) {
    this.hash = value;
  }
  get [dartx.host]() {
    return this.host;
  }
  set [dartx.host](value) {
    this.host = value;
  }
  get [dartx.hostname]() {
    return this.hostname;
  }
  set [dartx.hostname](value) {
    this.hostname = value;
  }
  get [dartx.href]() {
    return this.href;
  }
  set [dartx.href](value) {
    this.href = value;
  }
  get [dartx.origin]() {
    return this.origin;
  }
  get [dartx.password]() {
    return this.password;
  }
  set [dartx.password](value) {
    this.password = value;
  }
  get [dartx.pathname]() {
    return this.pathname;
  }
  set [dartx.pathname](value) {
    this.pathname = value;
  }
  get [dartx.port]() {
    return this.port;
  }
  set [dartx.port](value) {
    this.port = value;
  }
  get [dartx.protocol]() {
    return this.protocol;
  }
  set [dartx.protocol](value) {
    this.protocol = value;
  }
  get [dartx.search]() {
    return this.search;
  }
  set [dartx.search](value) {
    this.search = value;
  }
  get [dartx.username]() {
    return this.username;
  }
  set [dartx.username](value) {
    this.username = value;
  }
};
html$.Url[dart.implements] = () => [html$.UrlUtils];
dart.setSignature(html$.Url, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Url, [])}),
  fields: () => ({
    [dartx.hash]: core.String,
    [dartx.host]: core.String,
    [dartx.hostname]: core.String,
    [dartx.href]: core.String,
    [dartx.origin]: core.String,
    [dartx.password]: core.String,
    [dartx.pathname]: core.String,
    [dartx.port]: core.String,
    [dartx.protocol]: core.String,
    [dartx.search]: core.String,
    [dartx.username]: core.String
  }),
  statics: () => ({
    createObjectUrl: dart.definiteFunctionType(core.String, [dart.dynamic]),
    createObjectUrlFromSource: dart.definiteFunctionType(core.String, [html$.MediaSource]),
    createObjectUrlFromStream: dart.definiteFunctionType(core.String, [html$.MediaStream]),
    createObjectUrlFromBlob: dart.definiteFunctionType(core.String, [html$.Blob]),
    revokeObjectUrl: dart.definiteFunctionType(dart.void, [core.String])
  }),
  names: ['createObjectUrl', 'createObjectUrlFromSource', 'createObjectUrlFromStream', 'createObjectUrlFromBlob', 'revokeObjectUrl']
});
dart.registerExtension(dart.global.URL, html$.Url);
dart.defineExtensionNames([
  'hash',
  'host',
  'hostname',
  'href',
  'origin',
  'password',
  'pathname',
  'port',
  'protocol',
  'search',
  'username'
]);
html$.UrlUtils = class UrlUtils extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get hash() {
    return this[hash];
  }
  set hash(value) {
    this[hash] = value;
  }
  get host() {
    return this[host];
  }
  set host(value) {
    this[host] = value;
  }
  get hostname() {
    return this[hostname];
  }
  set hostname(value) {
    this[hostname] = value;
  }
  get href() {
    return this[href];
  }
  set href(value) {
    this[href] = value;
  }
  get origin() {
    return this[origin];
  }
  set origin(value) {
    super.origin = value;
  }
  get password() {
    return this[password];
  }
  set password(value) {
    this[password] = value;
  }
  get pathname() {
    return this[pathname];
  }
  set pathname(value) {
    this[pathname] = value;
  }
  get port() {
    return this[port];
  }
  set port(value) {
    this[port] = value;
  }
  get protocol() {
    return this[protocol];
  }
  set protocol(value) {
    this[protocol] = value;
  }
  get search() {
    return this[search];
  }
  set search(value) {
    this[search] = value;
  }
  get username() {
    return this[username];
  }
  set username(value) {
    this[username] = value;
  }
};
const hash = Symbol(html$.UrlUtils.name + "." + 'hash'.toString());
const host = Symbol(html$.UrlUtils.name + "." + 'host'.toString());
const hostname = Symbol(html$.UrlUtils.name + "." + 'hostname'.toString());
const href = Symbol(html$.UrlUtils.name + "." + 'href'.toString());
const origin = Symbol(html$.UrlUtils.name + "." + 'origin'.toString());
const password = Symbol(html$.UrlUtils.name + "." + 'password'.toString());
const pathname = Symbol(html$.UrlUtils.name + "." + 'pathname'.toString());
const port = Symbol(html$.UrlUtils.name + "." + 'port'.toString());
const protocol = Symbol(html$.UrlUtils.name + "." + 'protocol'.toString());
const search = Symbol(html$.UrlUtils.name + "." + 'search'.toString());
const username = Symbol(html$.UrlUtils.name + "." + 'username'.toString());
dart.setSignature(html$.UrlUtils, {
  constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtils, [])}),
  fields: () => ({
    hash: core.String,
    host: core.String,
    hostname: core.String,
    href: core.String,
    origin: core.String,
    password: core.String,
    pathname: core.String,
    port: core.String,
    protocol: core.String,
    search: core.String,
    username: core.String
  })
});
dart.defineExtensionMembers(html$.UrlUtils, [
  'hash',
  'hash',
  'host',
  'host',
  'hostname',
  'hostname',
  'href',
  'href',
  'origin',
  'password',
  'password',
  'pathname',
  'pathname',
  'port',
  'port',
  'protocol',
  'protocol',
  'search',
  'search',
  'username',
  'username'
]);
dart.defineExtensionNames([
  'hash',
  'host',
  'hostname',
  'href',
  'origin',
  'pathname',
  'port',
  'protocol',
  'search'
]);
html$.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get hash() {
    return this[hash$];
  }
  set hash(value) {
    super.hash = value;
  }
  get host() {
    return this[host$];
  }
  set host(value) {
    super.host = value;
  }
  get hostname() {
    return this[hostname$];
  }
  set hostname(value) {
    super.hostname = value;
  }
  get href() {
    return this[href$];
  }
  set href(value) {
    super.href = value;
  }
  get origin() {
    return this[origin$];
  }
  set origin(value) {
    super.origin = value;
  }
  get pathname() {
    return this[pathname$];
  }
  set pathname(value) {
    super.pathname = value;
  }
  get port() {
    return this[port$];
  }
  set port(value) {
    super.port = value;
  }
  get protocol() {
    return this[protocol$];
  }
  set protocol(value) {
    super.protocol = value;
  }
  get search() {
    return this[search$];
  }
  set search(value) {
    super.search = value;
  }
};
const hash$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hash'.toString());
const host$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'host'.toString());
const hostname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hostname'.toString());
const href$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'href'.toString());
const origin$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'origin'.toString());
const pathname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'pathname'.toString());
const port$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'port'.toString());
const protocol$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'protocol'.toString());
const search$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'search'.toString());
dart.setSignature(html$.UrlUtilsReadOnly, {
  constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtilsReadOnly, [])}),
  fields: () => ({
    hash: core.String,
    host: core.String,
    hostname: core.String,
    href: core.String,
    origin: core.String,
    pathname: core.String,
    port: core.String,
    protocol: core.String,
    search: core.String
  })
});
dart.defineExtensionMembers(html$.UrlUtilsReadOnly, [
  'hash',
  'host',
  'hostname',
  'href',
  'origin',
  'pathname',
  'port',
  'protocol',
  'search'
]);
dart.defineExtensionNames([
  'currentFieldOfView',
  'eyeTranslation',
  'maximumFieldOfView',
  'minimumFieldOfView',
  'recommendedFieldOfView',
  'renderRect'
]);
html$.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.currentFieldOfView]() {
    return this.currentFieldOfView;
  }
  get [dartx.eyeTranslation]() {
    return this.eyeTranslation;
  }
  get [dartx.maximumFieldOfView]() {
    return this.maximumFieldOfView;
  }
  get [dartx.minimumFieldOfView]() {
    return this.minimumFieldOfView;
  }
  get [dartx.recommendedFieldOfView]() {
    return this.recommendedFieldOfView;
  }
  get [dartx.renderRect]() {
    return this.renderRect;
  }
};
dart.setSignature(html$.VREyeParameters, {
  constructors: () => ({_: dart.definiteFunctionType(html$.VREyeParameters, [])}),
  fields: () => ({
    [dartx.currentFieldOfView]: html$.VRFieldOfView,
    [dartx.eyeTranslation]: html$.DomPoint,
    [dartx.maximumFieldOfView]: html$.VRFieldOfView,
    [dartx.minimumFieldOfView]: html$.VRFieldOfView,
    [dartx.recommendedFieldOfView]: html$.VRFieldOfView,
    [dartx.renderRect]: html$._DomRect
  })
});
dart.registerExtension(dart.global.VREyeParameters, html$.VREyeParameters);
dart.defineExtensionNames([
  'downDegrees',
  'leftDegrees',
  'rightDegrees',
  'upDegrees'
]);
html$.VRFieldOfView = class VRFieldOfView extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(fov) {
    if (fov === void 0) fov = null;
    if (fov != null) {
      let fov_1 = html_common.convertDartToNative_Dictionary(fov);
      return html$.VRFieldOfView._create_1(fov_1);
    }
    return html$.VRFieldOfView._create_2();
  }
  static _create_1(fov) {
    return new self.VRFieldOfView(fov);
  }
  static _create_2() {
    return new self.VRFieldOfView();
  }
  get [dartx.downDegrees]() {
    return this.downDegrees;
  }
  set [dartx.downDegrees](value) {
    this.downDegrees = value;
  }
  get [dartx.leftDegrees]() {
    return this.leftDegrees;
  }
  set [dartx.leftDegrees](value) {
    this.leftDegrees = value;
  }
  get [dartx.rightDegrees]() {
    return this.rightDegrees;
  }
  set [dartx.rightDegrees](value) {
    this.rightDegrees = value;
  }
  get [dartx.upDegrees]() {
    return this.upDegrees;
  }
  set [dartx.upDegrees](value) {
    this.upDegrees = value;
  }
};
dart.setSignature(html$.VRFieldOfView, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.VRFieldOfView, []),
    new: dart.definiteFunctionType(html$.VRFieldOfView, [], [core.Map])
  }),
  fields: () => ({
    [dartx.downDegrees]: core.num,
    [dartx.leftDegrees]: core.num,
    [dartx.rightDegrees]: core.num,
    [dartx.upDegrees]: core.num
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.VRFieldOfView, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.VRFieldOfView, [])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.VRFieldOfView, html$.VRFieldOfView);
dart.defineExtensionNames([
  'angularAcceleration',
  'angularVelocity',
  'linearAcceleration',
  'linearVelocity',
  'orientation',
  'position',
  'timeStamp'
]);
html$.VRPositionState = class VRPositionState extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.angularAcceleration]() {
    return this.angularAcceleration;
  }
  get [dartx.angularVelocity]() {
    return this.angularVelocity;
  }
  get [dartx.linearAcceleration]() {
    return this.linearAcceleration;
  }
  get [dartx.linearVelocity]() {
    return this.linearVelocity;
  }
  get [dartx.orientation]() {
    return this.orientation;
  }
  get [dartx.position]() {
    return this.position;
  }
  get [dartx.timeStamp]() {
    return this.timeStamp;
  }
};
dart.setSignature(html$.VRPositionState, {
  constructors: () => ({_: dart.definiteFunctionType(html$.VRPositionState, [])}),
  fields: () => ({
    [dartx.angularAcceleration]: html$.DomPoint,
    [dartx.angularVelocity]: html$.DomPoint,
    [dartx.linearAcceleration]: html$.DomPoint,
    [dartx.linearVelocity]: html$.DomPoint,
    [dartx.orientation]: html$.DomPoint,
    [dartx.position]: html$.DomPoint,
    [dartx.timeStamp]: core.double
  })
});
dart.registerExtension(dart.global.VRPositionState, html$.VRPositionState);
dart.defineExtensionNames([
  'badInput',
  'customError',
  'patternMismatch',
  'rangeOverflow',
  'rangeUnderflow',
  'stepMismatch',
  'tooLong',
  'tooShort',
  'typeMismatch',
  'valid',
  'valueMissing'
]);
html$.ValidityState = class ValidityState extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.badInput]() {
    return this.badInput;
  }
  get [dartx.customError]() {
    return this.customError;
  }
  get [dartx.patternMismatch]() {
    return this.patternMismatch;
  }
  get [dartx.rangeOverflow]() {
    return this.rangeOverflow;
  }
  get [dartx.rangeUnderflow]() {
    return this.rangeUnderflow;
  }
  get [dartx.stepMismatch]() {
    return this.stepMismatch;
  }
  get [dartx.tooLong]() {
    return this.tooLong;
  }
  get [dartx.tooShort]() {
    return this.tooShort;
  }
  get [dartx.typeMismatch]() {
    return this.typeMismatch;
  }
  get [dartx.valid]() {
    return this.valid;
  }
  get [dartx.valueMissing]() {
    return this.valueMissing;
  }
};
dart.setSignature(html$.ValidityState, {
  constructors: () => ({_: dart.definiteFunctionType(html$.ValidityState, [])}),
  fields: () => ({
    [dartx.badInput]: core.bool,
    [dartx.customError]: core.bool,
    [dartx.patternMismatch]: core.bool,
    [dartx.rangeOverflow]: core.bool,
    [dartx.rangeUnderflow]: core.bool,
    [dartx.stepMismatch]: core.bool,
    [dartx.tooLong]: core.bool,
    [dartx.tooShort]: core.bool,
    [dartx.typeMismatch]: core.bool,
    [dartx.valid]: core.bool,
    [dartx.valueMissing]: core.bool
  })
});
dart.registerExtension(dart.global.ValidityState, html$.ValidityState);
dart.defineExtensionNames([
  'getVideoPlaybackQuality',
  'enterFullscreen',
  'exitFullscreen',
  'height',
  'poster',
  'videoHeight',
  'videoWidth',
  'decodedFrameCount',
  'droppedFrameCount',
  'width'
]);
html$.VideoElement = class VideoElement extends html$.MediaElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.VideoElement._check(html$.document[dartx.createElement]("video"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.poster] = null;
    this[dartx.videoHeight] = null;
    this[dartx.videoWidth] = null;
    this[dartx.decodedFrameCount] = null;
    this[dartx.droppedFrameCount] = null;
    this[dartx.width] = null;
    super.created();
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.poster]() {
    return this.poster;
  }
  set [dartx.poster](value) {
    this.poster = value;
  }
  get [dartx.videoHeight]() {
    return this.videoHeight;
  }
  get [dartx.videoWidth]() {
    return this.videoWidth;
  }
  get [dartx.decodedFrameCount]() {
    return this.webkitDecodedFrameCount;
  }
  get [dartx.droppedFrameCount]() {
    return this.webkitDroppedFrameCount;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
  [dartx.getVideoPlaybackQuality](...args) {
    return this.getVideoPlaybackQuality.apply(this, args);
  }
  [dartx.enterFullscreen](...args) {
    return this.webkitEnterFullscreen.apply(this, args);
  }
  [dartx.exitFullscreen](...args) {
    return this.webkitExitFullscreen.apply(this, args);
  }
};
dart.defineNamedConstructor(html$.VideoElement, 'created');
html$.VideoElement[dart.implements] = () => [html$.CanvasImageSource];
dart.setSignature(html$.VideoElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.VideoElement, []),
    new: dart.definiteFunctionType(html$.VideoElement, []),
    created: dart.definiteFunctionType(html$.VideoElement, [])
  }),
  fields: () => ({
    [dartx.height]: core.int,
    [dartx.poster]: core.String,
    [dartx.videoHeight]: core.int,
    [dartx.videoWidth]: core.int,
    [dartx.decodedFrameCount]: core.int,
    [dartx.droppedFrameCount]: core.int,
    [dartx.width]: core.int
  }),
  methods: () => ({
    [dartx.getVideoPlaybackQuality]: dart.definiteFunctionType(html$.VideoPlaybackQuality, []),
    [dartx.enterFullscreen]: dart.definiteFunctionType(dart.void, []),
    [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.HTMLVideoElement, html$.VideoElement);
dart.defineExtensionNames([
  'corruptedVideoFrames',
  'creationTime',
  'droppedVideoFrames',
  'totalVideoFrames'
]);
html$.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.corruptedVideoFrames]() {
    return this.corruptedVideoFrames;
  }
  get [dartx.creationTime]() {
    return this.creationTime;
  }
  get [dartx.droppedVideoFrames]() {
    return this.droppedVideoFrames;
  }
  get [dartx.totalVideoFrames]() {
    return this.totalVideoFrames;
  }
};
dart.setSignature(html$.VideoPlaybackQuality, {
  constructors: () => ({_: dart.definiteFunctionType(html$.VideoPlaybackQuality, [])}),
  fields: () => ({
    [dartx.corruptedVideoFrames]: core.int,
    [dartx.creationTime]: core.double,
    [dartx.droppedVideoFrames]: core.int,
    [dartx.totalVideoFrames]: core.int
  })
});
dart.registerExtension(dart.global.VideoPlaybackQuality, html$.VideoPlaybackQuality);
dart.defineExtensionNames([
  'id',
  'kind',
  'label',
  'language',
  'selected'
]);
html$.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.id]() {
    return this.id;
  }
  get [dartx.kind]() {
    return this.kind;
  }
  get [dartx.label]() {
    return this.label;
  }
  get [dartx.language]() {
    return this.language;
  }
  get [dartx.selected]() {
    return this.selected;
  }
  set [dartx.selected](value) {
    this.selected = value;
  }
};
dart.setSignature(html$.VideoTrack, {
  constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrack, [])}),
  fields: () => ({
    [dartx.id]: core.String,
    [dartx.kind]: core.String,
    [dartx.label]: core.String,
    [dartx.language]: core.String,
    [dartx.selected]: core.bool
  })
});
dart.registerExtension(dart.global.VideoTrack, html$.VideoTrack);
dart.defineExtensionNames([
  'getTrackById',
  'onChange',
  'length',
  'selectedIndex'
]);
html$.VideoTrackList = class VideoTrackList extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.selectedIndex]() {
    return this.selectedIndex;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  get [dartx.onChange]() {
    return html$.VideoTrackList.changeEvent.forTarget(this);
  }
};
dart.setSignature(html$.VideoTrackList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrackList, [])}),
  fields: () => ({
    [dartx.length]: core.int,
    [dartx.selectedIndex]: core.int
  }),
  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [__getter__]: dart.definiteFunctionType(html$.VideoTrack, [core.int]),
    [dartx.getTrackById]: dart.definiteFunctionType(html$.VideoTrack, [core.String])
  }),
  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
});
dart.defineLazy(html$.VideoTrackList, {
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  }
});
dart.registerExtension(dart.global.VideoTrackList, html$.VideoTrackList);
html$.VoidCallback = dart.typedef('VoidCallback', () => dart.functionType(dart.void, []));
dart.defineExtensionNames([
  'getCueAsHtml',
  'align',
  'line',
  'position',
  'regionId',
  'size',
  'snapToLines',
  'text',
  'vertical'
]);
html$.VttCue = class VttCue extends html$.TextTrackCue {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(startTime, endTime, text) {
    return html$.VttCue._create_1(startTime, endTime, text);
  }
  static _create_1(startTime, endTime, text) {
    return new VTTCue(startTime, endTime, text);
  }
  get [dartx.align]() {
    return this.align;
  }
  set [dartx.align](value) {
    this.align = value;
  }
  get [dartx.line]() {
    return this.line;
  }
  set [dartx.line](value) {
    this.line = value;
  }
  get [dartx.position]() {
    return this.position;
  }
  set [dartx.position](value) {
    this.position = value;
  }
  get [dartx.regionId]() {
    return this.regionId;
  }
  set [dartx.regionId](value) {
    this.regionId = value;
  }
  get [dartx.size]() {
    return this.size;
  }
  set [dartx.size](value) {
    this.size = value;
  }
  get [dartx.snapToLines]() {
    return this.snapToLines;
  }
  set [dartx.snapToLines](value) {
    this.snapToLines = value;
  }
  get [dartx.text]() {
    return this.text;
  }
  set [dartx.text](value) {
    this.text = value;
  }
  get [dartx.vertical]() {
    return this.vertical;
  }
  set [dartx.vertical](value) {
    this.vertical = value;
  }
  [dartx.getCueAsHtml](...args) {
    return this.getCueAsHTML.apply(this, args);
  }
};
dart.setSignature(html$.VttCue, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.VttCue, []),
    new: dart.definiteFunctionType(html$.VttCue, [core.num, core.num, core.String])
  }),
  fields: () => ({
    [dartx.align]: core.String,
    [dartx.line]: core.Object,
    [dartx.position]: core.Object,
    [dartx.regionId]: core.String,
    [dartx.size]: core.num,
    [dartx.snapToLines]: core.bool,
    [dartx.text]: core.String,
    [dartx.vertical]: core.String
  }),
  methods: () => ({[dartx.getCueAsHtml]: dart.definiteFunctionType(html$.DocumentFragment, [])}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.VttCue, [dart.dynamic, dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.VTTCue, html$.VttCue);
dart.defineExtensionNames([
  'height',
  'id',
  'regionAnchorX',
  'regionAnchorY',
  'scroll',
  'track',
  'viewportAnchorX',
  'viewportAnchorY',
  'width'
]);
html$.VttRegion = class VttRegion extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.VttRegion._create_1();
  }
  static _create_1() {
    return new VTTRegion();
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.id]() {
    return this.id;
  }
  set [dartx.id](value) {
    this.id = value;
  }
  get [dartx.regionAnchorX]() {
    return this.regionAnchorX;
  }
  set [dartx.regionAnchorX](value) {
    this.regionAnchorX = value;
  }
  get [dartx.regionAnchorY]() {
    return this.regionAnchorY;
  }
  set [dartx.regionAnchorY](value) {
    this.regionAnchorY = value;
  }
  get [dartx.scroll]() {
    return this.scroll;
  }
  set [dartx.scroll](value) {
    this.scroll = value;
  }
  get [dartx.track]() {
    return this.track;
  }
  get [dartx.viewportAnchorX]() {
    return this.viewportAnchorX;
  }
  set [dartx.viewportAnchorX](value) {
    this.viewportAnchorX = value;
  }
  get [dartx.viewportAnchorY]() {
    return this.viewportAnchorY;
  }
  set [dartx.viewportAnchorY](value) {
    this.viewportAnchorY = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
};
dart.setSignature(html$.VttRegion, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.VttRegion, []),
    new: dart.definiteFunctionType(html$.VttRegion, [])
  }),
  fields: () => ({
    [dartx.height]: core.int,
    [dartx.id]: core.String,
    [dartx.regionAnchorX]: core.num,
    [dartx.regionAnchorY]: core.num,
    [dartx.scroll]: core.String,
    [dartx.track]: html$.TextTrack,
    [dartx.viewportAnchorX]: core.num,
    [dartx.viewportAnchorY]: core.num,
    [dartx.width]: core.num
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.VttRegion, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.VTTRegion, html$.VttRegion);
dart.defineExtensionNames([
  'getRegionById',
  'item',
  'length'
]);
html$.VttRegionList = class VttRegionList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx.getRegionById](...args) {
    return this.getRegionById.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
dart.setSignature(html$.VttRegionList, {
  constructors: () => ({_: dart.definiteFunctionType(html$.VttRegionList, [])}),
  fields: () => ({[dartx.length]: core.int}),
  methods: () => ({
    [dartx.getRegionById]: dart.definiteFunctionType(html$.VttRegion, [core.String]),
    [dartx.item]: dart.definiteFunctionType(html$.VttRegion, [core.int])
  })
});
dart.registerExtension(dart.global.VTTRegionList, html$.VttRegionList);
dart.defineExtensionNames([
  'close',
  'send',
  'sendBlob',
  'sendByteBuffer',
  'sendString',
  'sendTypedData',
  'onClose',
  'onError',
  'onMessage',
  'onOpen',
  'binaryType',
  'bufferedAmount',
  'extensions',
  'protocol',
  'readyState',
  'url'
]);
html$.WebSocket = class WebSocket extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(url, protocols) {
    if (protocols === void 0) protocols = null;
    if (protocols != null) {
      return html$.WebSocket._create_1(url, protocols);
    }
    return html$.WebSocket._create_2(url);
  }
  static _create_1(url, protocols) {
    return new self.WebSocket(url, protocols);
  }
  static _create_2(url) {
    return new self.WebSocket(url);
  }
  static get supported() {
    return typeof window.WebSocket != "undefined";
  }
  get [dartx.binaryType]() {
    return this.binaryType;
  }
  set [dartx.binaryType](value) {
    this.binaryType = value;
  }
  get [dartx.bufferedAmount]() {
    return this.bufferedAmount;
  }
  get [dartx.extensions]() {
    return this.extensions;
  }
  get [dartx.protocol]() {
    return this.protocol;
  }
  get [dartx.readyState]() {
    return this.readyState;
  }
  get [dartx.url]() {
    return this.url;
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.send](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendBlob](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendByteBuffer](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendString](...args) {
    return this.send.apply(this, args);
  }
  [dartx.sendTypedData](...args) {
    return this.send.apply(this, args);
  }
  get [dartx.onClose]() {
    return html$.WebSocket.closeEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.WebSocket.errorEvent.forTarget(this);
  }
  get [dartx.onMessage]() {
    return html$.WebSocket.messageEvent.forTarget(this);
  }
  get [dartx.onOpen]() {
    return html$.WebSocket.openEvent.forTarget(this);
  }
};
dart.setSignature(html$.WebSocket, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.WebSocket, []),
    new: dart.definiteFunctionType(html$.WebSocket, [core.String], [core.Object])
  }),
  fields: () => ({
    [dartx.binaryType]: core.String,
    [dartx.bufferedAmount]: core.int,
    [dartx.extensions]: core.String,
    [dartx.protocol]: core.String,
    [dartx.readyState]: core.int,
    [dartx.url]: core.String
  }),
  getters: () => ({
    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.CloseEvent), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  methods: () => ({
    [dartx.close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
    [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
    [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
    [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
  }),
  sfields: () => ({
    closeEvent: EventStreamProviderOfCloseEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent(),
    openEvent: EventStreamProviderOfEvent(),
    CLOSED: core.int,
    CLOSING: core.int,
    CONNECTING: core.int,
    OPEN: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
html$.WebSocket.CLOSED = 3;
html$.WebSocket.CLOSING = 2;
html$.WebSocket.CONNECTING = 0;
html$.WebSocket.OPEN = 1;
dart.defineLazy(html$.WebSocket, {
  get closeEvent() {
    return dart.const(new (EventStreamProviderOfCloseEvent())('close'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  },
  get openEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('open'));
  }
});
dart.registerExtension(dart.global.WebSocket, html$.WebSocket);
const _deltaX = Symbol('_deltaX');
const _deltaY = Symbol('_deltaY');
const _wheelDelta = Symbol('_wheelDelta');
const _wheelDeltaX = Symbol('_wheelDeltaX');
const _hasInitMouseScrollEvent = Symbol('_hasInitMouseScrollEvent');
const _initMouseScrollEvent = Symbol('_initMouseScrollEvent');
const _hasInitWheelEvent = Symbol('_hasInitWheelEvent');
const _initWheelEvent = Symbol('_initWheelEvent');
dart.defineExtensionNames([
  'deltaY',
  'deltaX',
  'deltaMode',
  'deltaZ'
]);
html$.WheelEvent = class WheelEvent extends html$.MouseEvent {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let deltaX = opts && 'deltaX' in opts ? opts.deltaX : 0;
    let deltaY = opts && 'deltaY' in opts ? opts.deltaY : 0;
    let deltaZ = opts && 'deltaZ' in opts ? opts.deltaZ : 0;
    let deltaMode = opts && 'deltaMode' in opts ? opts.deltaMode : 0;
    let detail = opts && 'detail' in opts ? opts.detail : 0;
    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
    let button = opts && 'button' in opts ? opts.button : 0;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
    let options = dart.map({view: view, deltaMode: deltaMode, deltaX: deltaX, deltaY: deltaY, deltaZ: deltaZ, detail: detail, screenX: screenX, screenY: screenY, clientX: clientX, clientY: clientY, button: button, bubbles: canBubble, cancelable: cancelable, ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey, metaKey: metaKey, relatedTarget: relatedTarget}, core.String, core.Object);
    if (view == null) {
      view = html$.window;
    }
    return new self.WheelEvent(type, html_common.convertDartToNative_Dictionary(options));
  }
  static _(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.WheelEvent._create_1(type, eventInitDict_1);
    }
    return html$.WheelEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new self.WheelEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new self.WheelEvent(type);
  }
  get [_deltaX]() {
    return this.deltaX;
  }
  get [_deltaY]() {
    return this.deltaY;
  }
  get [dartx.deltaZ]() {
    return this.deltaZ;
  }
  get [dartx.deltaY]() {
    if (this.deltaY !== undefined) {
      return this[_deltaY];
    }
    dart.throw(new core.UnsupportedError('deltaY is not supported'));
  }
  get [dartx.deltaX]() {
    if (this.deltaX !== undefined) {
      return this[_deltaX];
    }
    dart.throw(new core.UnsupportedError('deltaX is not supported'));
  }
  get [dartx.deltaMode]() {
    if (!!this.deltaMode) {
      return this.deltaMode;
    }
    return 0;
  }
  get [_wheelDelta]() {
    return this.wheelDelta;
  }
  get [_wheelDeltaX]() {
    return this.wheelDeltaX;
  }
  get [_detail]() {
    return this.detail;
  }
  get [_hasInitMouseScrollEvent]() {
    return !!this.initMouseScrollEvent;
  }
  [_initMouseScrollEvent](...args) {
    return this.initMouseScrollEvent.apply(this, args);
  }
  get [_hasInitWheelEvent]() {
    return !!this.initWheelEvent;
  }
  [_initWheelEvent](...args) {
    return this.initWheelEvent.apply(this, args);
  }
};
dart.setSignature(html$.WheelEvent, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.WheelEvent, [core.String], {view: html$.Window, deltaX: core.num, deltaY: core.num, deltaZ: core.num, deltaMode: core.int, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
    _: dart.definiteFunctionType(html$.WheelEvent, [core.String], [core.Map])
  }),
  fields: () => ({
    [_deltaX]: core.double,
    [_deltaY]: core.double,
    [dartx.deltaZ]: core.double
  }),
  getters: () => ({
    [dartx.deltaY]: dart.definiteFunctionType(core.num, []),
    [dartx.deltaX]: dart.definiteFunctionType(core.num, []),
    [dartx.deltaMode]: dart.definiteFunctionType(core.int, []),
    [_wheelDelta]: dart.definiteFunctionType(core.num, []),
    [_wheelDeltaX]: dart.definiteFunctionType(core.num, []),
    [_detail]: dart.definiteFunctionType(core.num, []),
    [_hasInitMouseScrollEvent]: dart.definiteFunctionType(core.bool, []),
    [_hasInitWheelEvent]: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    [_initMouseScrollEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget, core.int]),
    [_initWheelEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.int, html$.EventTarget, core.String, core.int, core.int, core.int, core.int])
  }),
  sfields: () => ({
    DOM_DELTA_LINE: core.int,
    DOM_DELTA_PAGE: core.int,
    DOM_DELTA_PIXEL: core.int
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
html$.WheelEvent.DOM_DELTA_LINE = 1;
html$.WheelEvent.DOM_DELTA_PAGE = 2;
html$.WheelEvent.DOM_DELTA_PIXEL = 0;
dart.registerExtension(dart.global.WheelEvent, html$.WheelEvent);
const _open2 = Symbol('_open2');
const _open3 = Symbol('_open3');
const _location = Symbol('_location');
const _ensureRequestAnimationFrame = Symbol('_ensureRequestAnimationFrame');
const _requestAnimationFrame = Symbol('_requestAnimationFrame');
const _cancelAnimationFrame = Symbol('_cancelAnimationFrame');
const _requestFileSystem = Symbol('_requestFileSystem');
const _get_opener = Symbol('_get_opener');
const _pageXOffset = Symbol('_pageXOffset');
const _pageYOffset = Symbol('_pageYOffset');
const _get_parent = Symbol('_get_parent');
const _get_self = Symbol('_get_self');
const _get_top = Symbol('_get_top');
const __getter___1 = Symbol('__getter___1');
const __getter___2 = Symbol('__getter___2');
const _scroll_4 = Symbol('_scroll_4');
const _scroll_5 = Symbol('_scroll_5');
const _scrollBy_4 = Symbol('_scrollBy_4');
const _scrollBy_5 = Symbol('_scrollBy_5');
const _scrollTo_4 = Symbol('_scrollTo_4');
const _scrollTo_5 = Symbol('_scrollTo_5');
const __requestFileSystem = Symbol('__requestFileSystem');
const _resolveLocalFileSystemUrl = Symbol('_resolveLocalFileSystemUrl');
dart.defineExtensionNames([
  'animationFrame',
  'document',
  'open',
  'location',
  'location',
  'requestAnimationFrame',
  'cancelAnimationFrame',
  'indexedDB',
  'console',
  'requestFileSystem',
  'opener',
  'opener',
  'parent',
  'self',
  'top',
  'window',
  'alert',
  'close',
  'confirm',
  'fetch',
  'find',
  'getMatchedCssRules',
  'getSelection',
  'matchMedia',
  'moveBy',
  'openDatabase',
  'postMessage',
  'print',
  'resizeBy',
  'resizeTo',
  'scroll',
  'scrollBy',
  'scrollTo',
  'stop',
  'resolveLocalFileSystemUrl',
  'atob',
  'btoa',
  'onContentLoaded',
  'onAbort',
  'onBlur',
  'onCanPlay',
  'onCanPlayThrough',
  'onChange',
  'onClick',
  'onContextMenu',
  'onDoubleClick',
  'onDeviceMotion',
  'onDeviceOrientation',
  'onDrag',
  'onDragEnd',
  'onDragEnter',
  'onDragLeave',
  'onDragOver',
  'onDragStart',
  'onDrop',
  'onDurationChange',
  'onEmptied',
  'onEnded',
  'onError',
  'onFocus',
  'onHashChange',
  'onInput',
  'onInvalid',
  'onKeyDown',
  'onKeyPress',
  'onKeyUp',
  'onLoad',
  'onLoadedData',
  'onLoadedMetadata',
  'onLoadStart',
  'onMessage',
  'onMouseDown',
  'onMouseEnter',
  'onMouseLeave',
  'onMouseMove',
  'onMouseOut',
  'onMouseOver',
  'onMouseUp',
  'onMouseWheel',
  'onOffline',
  'onOnline',
  'onPageHide',
  'onPageShow',
  'onPause',
  'onPlay',
  'onPlaying',
  'onPopState',
  'onProgress',
  'onRateChange',
  'onReset',
  'onResize',
  'onScroll',
  'onSearch',
  'onSeeked',
  'onSeeking',
  'onSelect',
  'onStalled',
  'onStorage',
  'onSubmit',
  'onSuspend',
  'onTimeUpdate',
  'onTouchCancel',
  'onTouchEnd',
  'onTouchMove',
  'onTouchStart',
  'onTransitionEnd',
  'onUnload',
  'onVolumeChange',
  'onWaiting',
  'onAnimationEnd',
  'onAnimationIteration',
  'onAnimationStart',
  'onBeforeUnload',
  'moveTo',
  'pageXOffset',
  'pageYOffset',
  'scrollX',
  'scrollY',
  'applicationCache',
  'caches',
  'closed',
  'crypto',
  'defaultStatus',
  'defaultstatus',
  'devicePixelRatio',
  'history',
  'innerHeight',
  'innerWidth',
  'localStorage',
  'locationbar',
  'menubar',
  'name',
  'navigator',
  'offscreenBuffering',
  'orientation',
  'outerHeight',
  'outerWidth',
  'performance',
  'screen',
  'screenLeft',
  'screenTop',
  'screenX',
  'screenY',
  'scrollbars',
  'sessionStorage',
  'speechSynthesis',
  'status',
  'statusbar',
  'styleMedia',
  'toolbar'
]);
html$.Window = class Window extends html$.EventTarget {
  get [dartx.animationFrame]() {
    let completer = CompleterOfnum().sync();
    this[dartx.requestAnimationFrame](dart.fn(time => {
      completer.complete(time);
    }, numToNull()));
    return completer.future;
  }
  get [dartx.document]() {
    return this.document;
  }
  [_open2](url, name) {
    return this.open(url, name);
  }
  [_open3](url, name, options) {
    return this.open(url, name, options);
  }
  [dartx.open](url, name, options) {
    if (options === void 0) options = null;
    if (options == null) {
      return html$._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
    } else {
      return html$._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
    }
  }
  get [dartx.location]() {
    return html$.Location._check(this[_location]);
  }
  set [dartx.location](value) {
    this[_location] = value;
  }
  get [_location]() {
    return this.location;
  }
  set [_location](value) {
    this.location = value;
  }
  [dartx.requestAnimationFrame](callback) {
    this[_ensureRequestAnimationFrame]();
    return this[_requestAnimationFrame](html$._wrapZone(core.num, dart.dynamic)(callback));
  }
  [dartx.cancelAnimationFrame](id) {
    this[_ensureRequestAnimationFrame]();
    this[_cancelAnimationFrame](id);
  }
  [_requestAnimationFrame](...args) {
    return this.requestAnimationFrame.apply(this, args);
  }
  [_cancelAnimationFrame](...args) {
    return this.cancelAnimationFrame.apply(this, args);
  }
  [_ensureRequestAnimationFrame]() {
    if (!!(this.requestAnimationFrame && this.cancelAnimationFrame)) return;
    (function($this) {
      var vendors = ['ms', 'moz', 'webkit', 'o'];
      for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
        $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
        $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
      }
      if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
      $this.requestAnimationFrame = function(callback) {
        return window.setTimeout(function() {
          callback(Date.now());
        }, 16);
      };
      $this.cancelAnimationFrame = function(id) {
        clearTimeout(id);
      };
    })(this);
  }
  get [dartx.indexedDB]() {
    return this.indexedDB || this.webkitIndexedDB || this.mozIndexedDB;
  }
  get [dartx.console]() {
    return html$.Console._safeConsole;
  }
  [dartx.requestFileSystem](size, opts) {
    let persistent = opts && 'persistent' in opts ? opts.persistent : false;
    return this[_requestFileSystem](dart.test(persistent) ? 1 : 0, size);
  }
  static get supportsPointConversions() {
    return html$.DomPoint.supported;
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.applicationCache]() {
    return this.applicationCache;
  }
  get [dartx.caches]() {
    return this.caches;
  }
  get [dartx.closed]() {
    return this.closed;
  }
  get [dartx.crypto]() {
    return this.crypto;
  }
  get [dartx.defaultStatus]() {
    return this.defaultStatus;
  }
  set [dartx.defaultStatus](value) {
    this.defaultStatus = value;
  }
  get [dartx.defaultstatus]() {
    return this.defaultstatus;
  }
  set [dartx.defaultstatus](value) {
    this.defaultstatus = value;
  }
  get [dartx.devicePixelRatio]() {
    return this.devicePixelRatio;
  }
  get [dartx.history]() {
    return this.history;
  }
  get [dartx.innerHeight]() {
    return this.innerHeight;
  }
  get [dartx.innerWidth]() {
    return this.innerWidth;
  }
  get [dartx.localStorage]() {
    return this.localStorage;
  }
  get [dartx.locationbar]() {
    return this.locationbar;
  }
  get [dartx.menubar]() {
    return this.menubar;
  }
  get [dartx.name]() {
    return this.name;
  }
  set [dartx.name](value) {
    this.name = value;
  }
  get [dartx.navigator]() {
    return this.navigator;
  }
  get [dartx.offscreenBuffering]() {
    return this.offscreenBuffering;
  }
  get [dartx.opener]() {
    return html$._convertNativeToDart_Window(this[_get_opener]);
  }
  get [_get_opener]() {
    return this.opener;
  }
  set [dartx.opener](value) {
    this.opener = value;
  }
  get [dartx.orientation]() {
    return this.orientation;
  }
  get [dartx.outerHeight]() {
    return this.outerHeight;
  }
  get [dartx.outerWidth]() {
    return this.outerWidth;
  }
  get [_pageXOffset]() {
    return this.pageXOffset;
  }
  get [_pageYOffset]() {
    return this.pageYOffset;
  }
  get [dartx.parent]() {
    return html$._convertNativeToDart_Window(this[_get_parent]);
  }
  get [_get_parent]() {
    return this.parent;
  }
  get [dartx.performance]() {
    return this.performance;
  }
  get [dartx.screen]() {
    return this.screen;
  }
  get [dartx.screenLeft]() {
    return this.screenLeft;
  }
  get [dartx.screenTop]() {
    return this.screenTop;
  }
  get [dartx.screenX]() {
    return this.screenX;
  }
  get [dartx.screenY]() {
    return this.screenY;
  }
  get [dartx.scrollbars]() {
    return this.scrollbars;
  }
  get [dartx.self]() {
    return html$._convertNativeToDart_Window(this[_get_self]);
  }
  get [_get_self]() {
    return this.self;
  }
  get [dartx.sessionStorage]() {
    return this.sessionStorage;
  }
  get [dartx.speechSynthesis]() {
    return this.speechSynthesis;
  }
  get [dartx.status]() {
    return this.status;
  }
  set [dartx.status](value) {
    this.status = value;
  }
  get [dartx.statusbar]() {
    return this.statusbar;
  }
  get [dartx.styleMedia]() {
    return this.styleMedia;
  }
  get [dartx.toolbar]() {
    return this.toolbar;
  }
  get [dartx.top]() {
    return html$._convertNativeToDart_Window(this[_get_top]);
  }
  get [_get_top]() {
    return this.top;
  }
  get [dartx.window]() {
    return html$._convertNativeToDart_Window(this[_get_window]);
  }
  get [_get_window]() {
    return this.window;
  }
  [__getter__](index_OR_name) {
    if (typeof index_OR_name == 'number') {
      return html$._convertNativeToDart_Window(this[__getter___1](index_OR_name));
    }
    if (typeof index_OR_name == 'string') {
      return html$._convertNativeToDart_Window(this[__getter___2](index_OR_name));
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [__getter___1](...args) {
    return this.__getter__.apply(this, args);
  }
  [__getter___2](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.alert](...args) {
    return this.alert.apply(this, args);
  }
  [dartx.close](...args) {
    return this.close.apply(this, args);
  }
  [dartx.confirm](...args) {
    return this.confirm.apply(this, args);
  }
  [dartx.fetch](input, init) {
    if (init === void 0) init = null;
    if (init != null) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return this[_fetch_1](input, init_1);
    }
    return this[_fetch_2](input);
  }
  [_fetch_1](...args) {
    return this.fetch.apply(this, args);
  }
  [_fetch_2](...args) {
    return this.fetch.apply(this, args);
  }
  [dartx.find](...args) {
    return this.find.apply(this, args);
  }
  [_getComputedStyle](...args) {
    return this.getComputedStyle.apply(this, args);
  }
  [dartx.getMatchedCssRules](...args) {
    return this.getMatchedCSSRules.apply(this, args);
  }
  [dartx.getSelection](...args) {
    return this.getSelection.apply(this, args);
  }
  [dartx.matchMedia](...args) {
    return this.matchMedia.apply(this, args);
  }
  [dartx.moveBy](...args) {
    return this.moveBy.apply(this, args);
  }
  [_moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [dartx.openDatabase](...args) {
    return this.openDatabase.apply(this, args);
  }
  [dartx.postMessage](message, targetOrigin, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, targetOrigin, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1, targetOrigin);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [dartx.print](...args) {
    return this.print.apply(this, args);
  }
  [dartx.resizeBy](...args) {
    return this.resizeBy.apply(this, args);
  }
  [dartx.resizeTo](...args) {
    return this.resizeTo.apply(this, args);
  }
  [dartx.scroll](options_OR_x, y, scrollOptions) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (scrollOptions === void 0) scrollOptions = null;
    if (options_OR_x == null && y == null && scrollOptions == null) {
      this[_scroll_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scroll_2](options_1);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scroll_3](options_OR_x, y);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scroll_4](options_OR_x, y);
      return;
    }
    if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
      this[_scroll_5](options_OR_x, y, scrollOptions_1);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_scroll_1](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_2](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_3](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_4](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_5](...args) {
    return this.scroll.apply(this, args);
  }
  [dartx.scrollBy](options_OR_x, y, scrollOptions) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (scrollOptions === void 0) scrollOptions = null;
    if (options_OR_x == null && y == null && scrollOptions == null) {
      this[_scrollBy_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollBy_2](options_1);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scrollBy_3](options_OR_x, y);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scrollBy_4](options_OR_x, y);
      return;
    }
    if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
      this[_scrollBy_5](options_OR_x, y, scrollOptions_1);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_scrollBy_1](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_2](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_3](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_4](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_5](...args) {
    return this.scrollBy.apply(this, args);
  }
  [dartx.scrollTo](options_OR_x, y, scrollOptions) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (scrollOptions === void 0) scrollOptions = null;
    if (options_OR_x == null && y == null && scrollOptions == null) {
      this[_scrollTo_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollTo_2](options_1);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scrollTo_3](options_OR_x, y);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scrollTo_4](options_OR_x, y);
      return;
    }
    if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
      this[_scrollTo_5](options_OR_x, y, scrollOptions_1);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_scrollTo_1](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_2](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_3](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_4](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_5](...args) {
    return this.scrollTo.apply(this, args);
  }
  [dartx.stop](...args) {
    return this.stop.apply(this, args);
  }
  [__requestFileSystem](...args) {
    return this.webkitRequestFileSystem.apply(this, args);
  }
  [_requestFileSystem](type, size) {
    let completer = CompleterOfFileSystem().new();
    this[__requestFileSystem](type, size, dart.fn(value => {
      completer.complete(value);
    }, FileSystemToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [_resolveLocalFileSystemUrl](...args) {
    return this.webkitResolveLocalFileSystemURL.apply(this, args);
  }
  [dartx.resolveLocalFileSystemUrl](url) {
    let completer = CompleterOfEntry().new();
    this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    return completer.future;
  }
  [dartx.atob](...args) {
    return this.atob.apply(this, args);
  }
  [dartx.btoa](...args) {
    return this.btoa.apply(this, args);
  }
  [_setInterval_String](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout_String](...args) {
    return this.setTimeout.apply(this, args);
  }
  [_clearInterval](...args) {
    return this.clearInterval.apply(this, args);
  }
  [_clearTimeout](...args) {
    return this.clearTimeout.apply(this, args);
  }
  [_setInterval](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout](...args) {
    return this.setTimeout.apply(this, args);
  }
  get [dartx.onContentLoaded]() {
    return html$.Window.contentLoadedEvent.forTarget(this);
  }
  get [dartx.onAbort]() {
    return html$.Element.abortEvent.forTarget(this);
  }
  get [dartx.onBlur]() {
    return html$.Element.blurEvent.forTarget(this);
  }
  get [dartx.onCanPlay]() {
    return html$.Element.canPlayEvent.forTarget(this);
  }
  get [dartx.onCanPlayThrough]() {
    return html$.Element.canPlayThroughEvent.forTarget(this);
  }
  get [dartx.onChange]() {
    return html$.Element.changeEvent.forTarget(this);
  }
  get [dartx.onClick]() {
    return html$.Element.clickEvent.forTarget(this);
  }
  get [dartx.onContextMenu]() {
    return html$.Element.contextMenuEvent.forTarget(this);
  }
  get [dartx.onDoubleClick]() {
    return html$.Element.doubleClickEvent.forTarget(this);
  }
  get [dartx.onDeviceMotion]() {
    return html$.Window.deviceMotionEvent.forTarget(this);
  }
  get [dartx.onDeviceOrientation]() {
    return html$.Window.deviceOrientationEvent.forTarget(this);
  }
  get [dartx.onDrag]() {
    return html$.Element.dragEvent.forTarget(this);
  }
  get [dartx.onDragEnd]() {
    return html$.Element.dragEndEvent.forTarget(this);
  }
  get [dartx.onDragEnter]() {
    return html$.Element.dragEnterEvent.forTarget(this);
  }
  get [dartx.onDragLeave]() {
    return html$.Element.dragLeaveEvent.forTarget(this);
  }
  get [dartx.onDragOver]() {
    return html$.Element.dragOverEvent.forTarget(this);
  }
  get [dartx.onDragStart]() {
    return html$.Element.dragStartEvent.forTarget(this);
  }
  get [dartx.onDrop]() {
    return html$.Element.dropEvent.forTarget(this);
  }
  get [dartx.onDurationChange]() {
    return html$.Element.durationChangeEvent.forTarget(this);
  }
  get [dartx.onEmptied]() {
    return html$.Element.emptiedEvent.forTarget(this);
  }
  get [dartx.onEnded]() {
    return html$.Element.endedEvent.forTarget(this);
  }
  get [dartx.onError]() {
    return html$.Element.errorEvent.forTarget(this);
  }
  get [dartx.onFocus]() {
    return html$.Element.focusEvent.forTarget(this);
  }
  get [dartx.onHashChange]() {
    return html$.Window.hashChangeEvent.forTarget(this);
  }
  get [dartx.onInput]() {
    return html$.Element.inputEvent.forTarget(this);
  }
  get [dartx.onInvalid]() {
    return html$.Element.invalidEvent.forTarget(this);
  }
  get [dartx.onKeyDown]() {
    return html$.Element.keyDownEvent.forTarget(this);
  }
  get [dartx.onKeyPress]() {
    return html$.Element.keyPressEvent.forTarget(this);
  }
  get [dartx.onKeyUp]() {
    return html$.Element.keyUpEvent.forTarget(this);
  }
  get [dartx.onLoad]() {
    return html$.Element.loadEvent.forTarget(this);
  }
  get [dartx.onLoadedData]() {
    return html$.Element.loadedDataEvent.forTarget(this);
  }
  get [dartx.onLoadedMetadata]() {
    return html$.Element.loadedMetadataEvent.forTarget(this);
  }
  get [dartx.onLoadStart]() {
    return html$.Window.loadStartEvent.forTarget(this);
  }
  get [dartx.onMessage]() {
    return html$.Window.messageEvent.forTarget(this);
  }
  get [dartx.onMouseDown]() {
    return html$.Element.mouseDownEvent.forTarget(this);
  }
  get [dartx.onMouseEnter]() {
    return html$.Element.mouseEnterEvent.forTarget(this);
  }
  get [dartx.onMouseLeave]() {
    return html$.Element.mouseLeaveEvent.forTarget(this);
  }
  get [dartx.onMouseMove]() {
    return html$.Element.mouseMoveEvent.forTarget(this);
  }
  get [dartx.onMouseOut]() {
    return html$.Element.mouseOutEvent.forTarget(this);
  }
  get [dartx.onMouseOver]() {
    return html$.Element.mouseOverEvent.forTarget(this);
  }
  get [dartx.onMouseUp]() {
    return html$.Element.mouseUpEvent.forTarget(this);
  }
  get [dartx.onMouseWheel]() {
    return html$.Element.mouseWheelEvent.forTarget(this);
  }
  get [dartx.onOffline]() {
    return html$.Window.offlineEvent.forTarget(this);
  }
  get [dartx.onOnline]() {
    return html$.Window.onlineEvent.forTarget(this);
  }
  get [dartx.onPageHide]() {
    return html$.Window.pageHideEvent.forTarget(this);
  }
  get [dartx.onPageShow]() {
    return html$.Window.pageShowEvent.forTarget(this);
  }
  get [dartx.onPause]() {
    return html$.Element.pauseEvent.forTarget(this);
  }
  get [dartx.onPlay]() {
    return html$.Element.playEvent.forTarget(this);
  }
  get [dartx.onPlaying]() {
    return html$.Element.playingEvent.forTarget(this);
  }
  get [dartx.onPopState]() {
    return html$.Window.popStateEvent.forTarget(this);
  }
  get [dartx.onProgress]() {
    return html$.Window.progressEvent.forTarget(this);
  }
  get [dartx.onRateChange]() {
    return html$.Element.rateChangeEvent.forTarget(this);
  }
  get [dartx.onReset]() {
    return html$.Element.resetEvent.forTarget(this);
  }
  get [dartx.onResize]() {
    return html$.Element.resizeEvent.forTarget(this);
  }
  get [dartx.onScroll]() {
    return html$.Element.scrollEvent.forTarget(this);
  }
  get [dartx.onSearch]() {
    return html$.Element.searchEvent.forTarget(this);
  }
  get [dartx.onSeeked]() {
    return html$.Element.seekedEvent.forTarget(this);
  }
  get [dartx.onSeeking]() {
    return html$.Element.seekingEvent.forTarget(this);
  }
  get [dartx.onSelect]() {
    return html$.Element.selectEvent.forTarget(this);
  }
  get [dartx.onStalled]() {
    return html$.Element.stalledEvent.forTarget(this);
  }
  get [dartx.onStorage]() {
    return html$.Window.storageEvent.forTarget(this);
  }
  get [dartx.onSubmit]() {
    return html$.Element.submitEvent.forTarget(this);
  }
  get [dartx.onSuspend]() {
    return html$.Element.suspendEvent.forTarget(this);
  }
  get [dartx.onTimeUpdate]() {
    return html$.Element.timeUpdateEvent.forTarget(this);
  }
  get [dartx.onTouchCancel]() {
    return html$.Element.touchCancelEvent.forTarget(this);
  }
  get [dartx.onTouchEnd]() {
    return html$.Element.touchEndEvent.forTarget(this);
  }
  get [dartx.onTouchMove]() {
    return html$.Element.touchMoveEvent.forTarget(this);
  }
  get [dartx.onTouchStart]() {
    return html$.Element.touchStartEvent.forTarget(this);
  }
  get [dartx.onTransitionEnd]() {
    return html$.Element.transitionEndEvent.forTarget(this);
  }
  get [dartx.onUnload]() {
    return html$.Window.unloadEvent.forTarget(this);
  }
  get [dartx.onVolumeChange]() {
    return html$.Element.volumeChangeEvent.forTarget(this);
  }
  get [dartx.onWaiting]() {
    return html$.Element.waitingEvent.forTarget(this);
  }
  get [dartx.onAnimationEnd]() {
    return html$.Window.animationEndEvent.forTarget(this);
  }
  get [dartx.onAnimationIteration]() {
    return html$.Window.animationIterationEvent.forTarget(this);
  }
  get [dartx.onAnimationStart]() {
    return html$.Window.animationStartEvent.forTarget(this);
  }
  get [dartx.onBeforeUnload]() {
    return html$.Window.beforeUnloadEvent.forTarget(this);
  }
  [dartx.moveTo](p) {
    this[_moveTo](dart.asInt(p.x), dart.asInt(p.y));
  }
  get [dartx.pageXOffset]() {
    return this.pageXOffset[dartx.round]();
  }
  get [dartx.pageYOffset]() {
    return this.pageYOffset[dartx.round]();
  }
  get [dartx.scrollX]() {
    return "scrollX" in this ? this.scrollX[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollLeft];
  }
  get [dartx.scrollY]() {
    return "scrollY" in this ? this.scrollY[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollTop];
  }
};
html$.Window[dart.implements] = () => [html$.WindowEventHandlers, html$.WindowBase, html$.GlobalEventHandlers, html$._WindowTimers, html$.WindowBase64];
dart.setSignature(html$.Window, {
  constructors: () => ({_: dart.definiteFunctionType(html$.Window, [])}),
  fields: () => ({
    [dartx.applicationCache]: html$.ApplicationCache,
    [dartx.caches]: html$.CacheStorage,
    [dartx.closed]: core.bool,
    [dartx.crypto]: html$.Crypto,
    [dartx.defaultStatus]: core.String,
    [dartx.defaultstatus]: core.String,
    [dartx.devicePixelRatio]: core.double,
    [dartx.history]: html$.History,
    [dartx.innerHeight]: core.int,
    [dartx.innerWidth]: core.int,
    [dartx.localStorage]: html$.Storage,
    [dartx.locationbar]: html$.BarProp,
    [dartx.menubar]: html$.BarProp,
    [dartx.name]: core.String,
    [dartx.navigator]: html$.Navigator,
    [dartx.offscreenBuffering]: core.bool,
    [_get_opener]: dart.dynamic,
    [dartx.orientation]: core.int,
    [dartx.outerHeight]: core.int,
    [dartx.outerWidth]: core.int,
    [_pageXOffset]: core.double,
    [_pageYOffset]: core.double,
    [_get_parent]: dart.dynamic,
    [dartx.performance]: html$.Performance,
    [dartx.screen]: html$.Screen,
    [dartx.screenLeft]: core.int,
    [dartx.screenTop]: core.int,
    [dartx.screenX]: core.int,
    [dartx.screenY]: core.int,
    [dartx.scrollbars]: html$.BarProp,
    [_get_self]: dart.dynamic,
    [dartx.sessionStorage]: html$.Storage,
    [dartx.speechSynthesis]: html$.SpeechSynthesis,
    [dartx.status]: core.String,
    [dartx.statusbar]: html$.BarProp,
    [dartx.styleMedia]: html$.StyleMedia,
    [dartx.toolbar]: html$.BarProp,
    [_get_top]: dart.dynamic,
    [_get_window]: dart.dynamic
  }),
  getters: () => ({
    [dartx.animationFrame]: dart.definiteFunctionType(async.Future$(core.num), []),
    [dartx.document]: dart.definiteFunctionType(html$.Document, []),
    [dartx.location]: dart.definiteFunctionType(html$.Location, []),
    [_location]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.indexedDB]: dart.definiteFunctionType(indexed_db.IdbFactory, []),
    [dartx.console]: dart.definiteFunctionType(html$.Console, []),
    [dartx.opener]: dart.definiteFunctionType(html$.WindowBase, []),
    [dartx.parent]: dart.definiteFunctionType(html$.WindowBase, []),
    [dartx.self]: dart.definiteFunctionType(html$.WindowBase, []),
    [dartx.top]: dart.definiteFunctionType(html$.WindowBase, []),
    [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
    [dartx.onContentLoaded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onDeviceMotion]: dart.definiteFunctionType(async.Stream$(html$.DeviceMotionEvent), []),
    [dartx.onDeviceOrientation]: dart.definiteFunctionType(async.Stream$(html$.DeviceOrientationEvent), []),
    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onHashChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
    [dartx.onOffline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onOnline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPageHide]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPageShow]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onPopState]: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onStorage]: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
    [dartx.onTransitionEnd]: dart.definiteFunctionType(async.Stream$(html$.TransitionEvent), []),
    [dartx.onUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onAnimationEnd]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
    [dartx.onAnimationIteration]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
    [dartx.onAnimationStart]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
    [dartx.onBeforeUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.pageXOffset]: dart.definiteFunctionType(core.int, []),
    [dartx.pageYOffset]: dart.definiteFunctionType(core.int, []),
    [dartx.scrollX]: dart.definiteFunctionType(core.int, []),
    [dartx.scrollY]: dart.definiteFunctionType(core.int, [])
  }),
  setters: () => ({
    [dartx.location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.opener]: dart.definiteFunctionType(dart.void, [html$.Window])
  }),
  methods: () => ({
    [_open2]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic]),
    [_open3]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
    [dartx.open]: dart.definiteFunctionType(html$.WindowBase, [core.String, core.String], [core.String]),
    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
    [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
    [_requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
    [_cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
    [_ensureRequestAnimationFrame]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int], {persistent: core.bool}),
    [__getter__]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic]),
    [__getter___1]: dart.definiteFunctionType(dart.dynamic, [core.int]),
    [__getter___2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
    [dartx.alert]: dart.definiteFunctionType(dart.void, [], [core.String]),
    [dartx.close]: dart.definiteFunctionType(dart.void, []),
    [dartx.confirm]: dart.definiteFunctionType(core.bool, [], [core.String]),
    [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
    [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
    [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
    [dartx.find]: dart.definiteFunctionType(core.bool, [core.String, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool]),
    [_getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [html$.Element, core.String]),
    [dartx.getMatchedCssRules]: dart.definiteFunctionType(core.List$(html$.CssRule), [html$.Element, core.String]),
    [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, []),
    [dartx.matchMedia]: dart.definiteFunctionType(html$.MediaQueryList, [core.String]),
    [dartx.moveBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [_moveTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.openDatabase]: dart.definiteFunctionType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [html$.DatabaseCallback]),
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    [dartx.print]: dart.definiteFunctionType(dart.void, []),
    [dartx.resizeBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.resizeTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
    [_scroll_1]: dart.definiteFunctionType(dart.void, []),
    [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [_scroll_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [_scroll_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
    [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
    [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
    [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [_scrollBy_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [_scrollBy_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
    [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
    [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
    [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [_scrollTo_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [_scrollTo_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
    [dartx.stop]: dart.definiteFunctionType(dart.void, []),
    [__requestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int, html$._FileSystemCallback], [html$._ErrorCallback]),
    [_requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
    [_resolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
    [dartx.resolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
    [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
    [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
    [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
    [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
    [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
    [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
    [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
    [dartx.moveTo]: dart.definiteFunctionType(dart.void, [PointOfnum()])
  }),
  sfields: () => ({
    contentLoadedEvent: EventStreamProviderOfEvent(),
    deviceMotionEvent: EventStreamProviderOfDeviceMotionEvent(),
    deviceOrientationEvent: EventStreamProviderOfDeviceOrientationEvent(),
    hashChangeEvent: EventStreamProviderOfEvent(),
    loadStartEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent(),
    offlineEvent: EventStreamProviderOfEvent(),
    onlineEvent: EventStreamProviderOfEvent(),
    pageHideEvent: EventStreamProviderOfEvent(),
    pageShowEvent: EventStreamProviderOfEvent(),
    popStateEvent: EventStreamProviderOfPopStateEvent(),
    progressEvent: EventStreamProviderOfEvent(),
    storageEvent: EventStreamProviderOfStorageEvent(),
    unloadEvent: EventStreamProviderOfEvent(),
    animationEndEvent: EventStreamProviderOfAnimationEvent(),
    animationIterationEvent: EventStreamProviderOfAnimationEvent(),
    animationStartEvent: EventStreamProviderOfAnimationEvent(),
    PERSISTENT: core.int,
    TEMPORARY: core.int,
    beforeUnloadEvent: EventStreamProviderOfBeforeUnloadEvent()
  }),
  sgetters: () => ({supportsPointConversions: dart.definiteFunctionType(core.bool, [])})
});
html$.Window.PERSISTENT = 1;
html$.Window.TEMPORARY = 0;
dart.defineLazy(html$.Window, {
  get contentLoadedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('DOMContentLoaded'));
  },
  get deviceMotionEvent() {
    return dart.const(new (EventStreamProviderOfDeviceMotionEvent())('devicemotion'));
  },
  get deviceOrientationEvent() {
    return dart.const(new (EventStreamProviderOfDeviceOrientationEvent())('deviceorientation'));
  },
  get hashChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
  },
  get loadStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('loadstart'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  },
  get offlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('offline'));
  },
  get onlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('online'));
  },
  get pageHideEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pagehide'));
  },
  get pageShowEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pageshow'));
  },
  get popStateEvent() {
    return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
  },
  get progressEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('progress'));
  },
  get storageEvent() {
    return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
  },
  get unloadEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('unload'));
  },
  get animationEndEvent() {
    return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationEnd'));
  },
  get animationIterationEvent() {
    return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationIteration'));
  },
  get animationStartEvent() {
    return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationStart'));
  },
  get beforeUnloadEvent() {
    return dart.const(new html$._BeforeUnloadEventStreamProvider('beforeunload'));
  }
});
dart.registerExtension(dart.global.Window, html$.Window);
dart.registerExtension(dart.global.DOMWindow, html$.Window);
const _returnValue = Symbol('_returnValue');
html$._WrappedEvent = class _WrappedEvent extends core.Object {
  new(wrapped) {
    this.wrapped = wrapped;
    this[_selector] = null;
  }
  get bubbles() {
    return this.wrapped[dartx.bubbles];
  }
  get cancelable() {
    return this.wrapped[dartx.cancelable];
  }
  get currentTarget() {
    return this.wrapped[dartx.currentTarget];
  }
  get defaultPrevented() {
    return this.wrapped[dartx.defaultPrevented];
  }
  get eventPhase() {
    return this.wrapped[dartx.eventPhase];
  }
  get target() {
    return this.wrapped[dartx.target];
  }
  get timeStamp() {
    return this.wrapped[dartx.timeStamp];
  }
  get type() {
    return this.wrapped[dartx.type];
  }
  [_initEvent](eventTypeArg, canBubbleArg, cancelableArg) {
    dart.throw(new core.UnsupportedError('Cannot initialize this Event.'));
  }
  preventDefault() {
    this.wrapped[dartx.preventDefault]();
  }
  stopImmediatePropagation() {
    this.wrapped[dartx.stopImmediatePropagation]();
  }
  stopPropagation() {
    this.wrapped[dartx.stopPropagation]();
  }
  get matchingTarget() {
    if (this[_selector] == null) {
      dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
    }
    let currentTarget = html$.Element._check(this.currentTarget);
    let target = html$.Element._check(this.target);
    let matchedTarget = null;
    do {
      if (dart.test(target[dartx.matches](this[_selector]))) return target;
      target = target[dartx.parent];
    } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
    dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
  }
  get path() {
    return ListOfNode()._check(this.wrapped[dartx.path]);
  }
  get [_get_currentTarget]() {
    return this.wrapped[_get_currentTarget];
  }
  get [_get_target]() {
    return this.wrapped[_get_target];
  }
};
html$._WrappedEvent[dart.implements] = () => [html$.Event];
dart.setSignature(html$._WrappedEvent, {
  constructors: () => ({new: dart.definiteFunctionType(html$._WrappedEvent, [html$.Event])}),
  fields: () => ({
    wrapped: html$.Event,
    [_selector]: core.String
  }),
  getters: () => ({
    bubbles: dart.definiteFunctionType(core.bool, []),
    cancelable: dart.definiteFunctionType(core.bool, []),
    currentTarget: dart.definiteFunctionType(html$.EventTarget, []),
    defaultPrevented: dart.definiteFunctionType(core.bool, []),
    eventPhase: dart.definiteFunctionType(core.int, []),
    target: dart.definiteFunctionType(html$.EventTarget, []),
    timeStamp: dart.definiteFunctionType(core.int, []),
    type: dart.definiteFunctionType(core.String, []),
    matchingTarget: dart.definiteFunctionType(html$.Element, []),
    path: dart.definiteFunctionType(core.List$(html$.Node), []),
    [_get_currentTarget]: dart.definiteFunctionType(dart.dynamic, []),
    [_get_target]: dart.definiteFunctionType(dart.dynamic, [])
  }),
  methods: () => ({
    [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
    preventDefault: dart.definiteFunctionType(dart.void, []),
    stopImmediatePropagation: dart.definiteFunctionType(dart.void, []),
    stopPropagation: dart.definiteFunctionType(dart.void, [])
  })
});
html$._BeforeUnloadEvent = class _BeforeUnloadEvent extends html$._WrappedEvent {
  new(base) {
    this[_returnValue] = null;
    super.new(base);
  }
  get returnValue() {
    return this[_returnValue];
  }
  set returnValue(value) {
    this[_returnValue] = value;
    if ("returnValue" in this.wrapped) {
      this.wrapped.returnValue = value;
    }
  }
};
html$._BeforeUnloadEvent[dart.implements] = () => [html$.BeforeUnloadEvent];
dart.setSignature(html$._BeforeUnloadEvent, {
  constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEvent, [html$.Event])}),
  fields: () => ({[_returnValue]: core.String}),
  getters: () => ({returnValue: dart.definiteFunctionType(core.String, [])}),
  setters: () => ({returnValue: dart.definiteFunctionType(dart.void, [core.String])})
});
const _eventType = Symbol('_eventType');
html$._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
  new(eventType) {
    this[_eventType] = eventType;
  }
  forTarget(e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    let stream = new (_EventStreamOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
    let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
    stream.listen(dart.fn(event => {
      let wrapped = new html$._BeforeUnloadEvent(event);
      controller.add(wrapped);
    }, BeforeUnloadEventToNull()));
    return controller.stream;
  }
  getEventType(target) {
    return this[_eventType];
  }
  forElement(e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    return new (_ElementEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
  }
  [_forElementList](e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    return new (_ElementListEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
  }
};
html$._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
dart.setSignature(html$._BeforeUnloadEventStreamProvider, {
  constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEventStreamProvider, [core.String])}),
  fields: () => ({[_eventType]: core.String}),
  methods: () => ({
    forTarget: dart.definiteFunctionType(async.Stream$(html$.BeforeUnloadEvent), [html$.EventTarget], {useCapture: core.bool}),
    getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
    forElement: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.Element], {useCapture: core.bool}),
    [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [ElementListOfElement()], {useCapture: core.bool})
  })
});
html$.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.WindowBase64, {
  constructors: () => ({_: dart.definiteFunctionType(html$.WindowBase64, [])})
});
dart.defineExtensionNames([
  'focus',
  'focused',
  'visibilityState'
]);
html$.WindowClient = class WindowClient extends html$.Client {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.focused]() {
    return this.focused;
  }
  get [dartx.visibilityState]() {
    return this.visibilityState;
  }
  [dartx.focus](...args) {
    return this.focus.apply(this, args);
  }
};
dart.setSignature(html$.WindowClient, {
  constructors: () => ({_: dart.definiteFunctionType(html$.WindowClient, [])}),
  fields: () => ({
    [dartx.focused]: core.bool,
    [dartx.visibilityState]: core.String
  }),
  methods: () => ({[dartx.focus]: dart.definiteFunctionType(async.Future, [])})
});
dart.registerExtension(dart.global.WindowClient, html$.WindowClient);
dart.defineExtensionNames([
  'onHashChange',
  'onMessage',
  'onOffline',
  'onOnline',
  'onPopState',
  'onStorage',
  'onUnload'
]);
html$.WindowEventHandlers = class WindowEventHandlers extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get onHashChange() {
    return html$.WindowEventHandlers.hashChangeEvent.forTarget(this);
  }
  get onMessage() {
    return html$.WindowEventHandlers.messageEvent.forTarget(this);
  }
  get onOffline() {
    return html$.WindowEventHandlers.offlineEvent.forTarget(this);
  }
  get onOnline() {
    return html$.WindowEventHandlers.onlineEvent.forTarget(this);
  }
  get onPopState() {
    return html$.WindowEventHandlers.popStateEvent.forTarget(this);
  }
  get onStorage() {
    return html$.WindowEventHandlers.storageEvent.forTarget(this);
  }
  get onUnload() {
    return html$.WindowEventHandlers.unloadEvent.forTarget(this);
  }
};
dart.setSignature(html$.WindowEventHandlers, {
  constructors: () => ({_: dart.definiteFunctionType(html$.WindowEventHandlers, [])}),
  getters: () => ({
    onHashChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onMessage: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
    onOffline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onOnline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    onPopState: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
    onStorage: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
    onUnload: dart.definiteFunctionType(async.Stream$(html$.Event), [])
  }),
  sfields: () => ({
    hashChangeEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent(),
    offlineEvent: EventStreamProviderOfEvent(),
    onlineEvent: EventStreamProviderOfEvent(),
    popStateEvent: EventStreamProviderOfPopStateEvent(),
    storageEvent: EventStreamProviderOfStorageEvent(),
    unloadEvent: EventStreamProviderOfEvent()
  })
});
dart.defineExtensionMembers(html$.WindowEventHandlers, [
  'onHashChange',
  'onMessage',
  'onOffline',
  'onOnline',
  'onPopState',
  'onStorage',
  'onUnload'
]);
dart.defineLazy(html$.WindowEventHandlers, {
  get hashChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  },
  get offlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('offline'));
  },
  get onlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('online'));
  },
  get popStateEvent() {
    return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
  },
  get storageEvent() {
    return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
  },
  get unloadEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('unload'));
  }
});
dart.defineExtensionNames([
  'postMessage',
  'terminate',
  'onError',
  'onMessage'
]);
html$.Worker = class Worker extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(scriptUrl) {
    return html$.Worker._create_1(scriptUrl);
  }
  static _create_1(scriptUrl) {
    return new self.Worker(scriptUrl);
  }
  static get supported() {
    return typeof window.Worker != "undefined";
  }
  [dartx.postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [dartx.terminate](...args) {
    return this.terminate.apply(this, args);
  }
  get [dartx.onError]() {
    return html$.Worker.errorEvent.forTarget(this);
  }
  get [dartx.onMessage]() {
    return html$.Worker.messageEvent.forTarget(this);
  }
};
html$.Worker[dart.implements] = () => [html$.AbstractWorker];
dart.setSignature(html$.Worker, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.Worker, []),
    new: dart.definiteFunctionType(html$.Worker, [core.String])
  }),
  getters: () => ({
    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
  }),
  methods: () => ({
    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    errorEvent: EventStreamProviderOfEvent(),
    messageEvent: EventStreamProviderOfMessageEvent()
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.Worker, [dart.dynamic])}),
  names: ['_create_1']
});
dart.defineLazy(html$.Worker, {
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
  }
});
dart.registerExtension(dart.global.Worker, html$.Worker);
html$.WorkerConsole = class WorkerConsole extends html$.ConsoleBase {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.WorkerConsole, {
  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerConsole, [])})
});
dart.registerExtension(dart.global.WorkerConsole, html$.WorkerConsole);
dart.defineExtensionNames([
  'clearMarks',
  'clearMeasures',
  'getEntries',
  'getEntriesByName',
  'getEntriesByType',
  'mark',
  'measure',
  'now',
  'clearResourceTimings',
  'setResourceTimingBufferSize',
  'memory'
]);
html$.WorkerPerformance = class WorkerPerformance extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.memory]() {
    return this.memory;
  }
  [dartx.clearMarks](...args) {
    return this.clearMarks.apply(this, args);
  }
  [dartx.clearMeasures](...args) {
    return this.clearMeasures.apply(this, args);
  }
  [dartx.getEntries](...args) {
    return this.getEntries.apply(this, args);
  }
  [dartx.getEntriesByName](...args) {
    return this.getEntriesByName.apply(this, args);
  }
  [dartx.getEntriesByType](...args) {
    return this.getEntriesByType.apply(this, args);
  }
  [dartx.mark](...args) {
    return this.mark.apply(this, args);
  }
  [dartx.measure](...args) {
    return this.measure.apply(this, args);
  }
  [dartx.now](...args) {
    return this.now.apply(this, args);
  }
  [dartx.clearResourceTimings](...args) {
    return this.webkitClearResourceTimings.apply(this, args);
  }
  [dartx.setResourceTimingBufferSize](...args) {
    return this.webkitSetResourceTimingBufferSize.apply(this, args);
  }
};
dart.setSignature(html$.WorkerPerformance, {
  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerPerformance, [])}),
  fields: () => ({[dartx.memory]: html$.MemoryInfo}),
  methods: () => ({
    [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
    [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
    [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
    [dartx.now]: dart.definiteFunctionType(core.double, []),
    [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
    [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
  })
});
dart.registerExtension(dart.global.WorkerPerformance, html$.WorkerPerformance);
dart.defineExtensionNames([
  'createExpression',
  'createNSResolver',
  'evaluate'
]);
html$.XPathEvaluator = class XPathEvaluator extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.XPathEvaluator._create_1();
  }
  static _create_1() {
    return new self.XPathEvaluator();
  }
  [dartx.createExpression](...args) {
    return this.createExpression.apply(this, args);
  }
  [dartx.createNSResolver](...args) {
    return this.createNSResolver.apply(this, args);
  }
  [dartx.evaluate](...args) {
    return this.evaluate.apply(this, args);
  }
};
dart.setSignature(html$.XPathEvaluator, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.XPathEvaluator, []),
    new: dart.definiteFunctionType(html$.XPathEvaluator, [])
  }),
  methods: () => ({
    [dartx.createExpression]: dart.definiteFunctionType(html$.XPathExpression, [core.String, html$.XPathNSResolver]),
    [dartx.createNSResolver]: dart.definiteFunctionType(html$.XPathNSResolver, [html$.Node]),
    [dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [core.String, html$.Node, html$.XPathNSResolver], [core.int, core.Object])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.XPathEvaluator, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.XPathEvaluator, html$.XPathEvaluator);
dart.defineExtensionNames([
  'evaluate'
]);
html$.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.evaluate](...args) {
    return this.evaluate.apply(this, args);
  }
};
dart.setSignature(html$.XPathExpression, {
  constructors: () => ({_: dart.definiteFunctionType(html$.XPathExpression, [])}),
  methods: () => ({[dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [html$.Node], [core.int, core.Object])})
});
dart.registerExtension(dart.global.XPathExpression, html$.XPathExpression);
dart.defineExtensionNames([
  'lookupNamespaceUri'
]);
html$.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.lookupNamespaceUri](...args) {
    return this.lookupNamespaceURI.apply(this, args);
  }
};
dart.setSignature(html$.XPathNSResolver, {
  constructors: () => ({_: dart.definiteFunctionType(html$.XPathNSResolver, [])}),
  methods: () => ({[dartx.lookupNamespaceUri]: dart.definiteFunctionType(core.String, [core.String])})
});
dart.registerExtension(dart.global.XPathNSResolver, html$.XPathNSResolver);
dart.defineExtensionNames([
  'iterateNext',
  'snapshotItem',
  'booleanValue',
  'invalidIteratorState',
  'numberValue',
  'resultType',
  'singleNodeValue',
  'snapshotLength',
  'stringValue'
]);
html$.XPathResult = class XPathResult extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.booleanValue]() {
    return this.booleanValue;
  }
  get [dartx.invalidIteratorState]() {
    return this.invalidIteratorState;
  }
  get [dartx.numberValue]() {
    return this.numberValue;
  }
  get [dartx.resultType]() {
    return this.resultType;
  }
  get [dartx.singleNodeValue]() {
    return this.singleNodeValue;
  }
  get [dartx.snapshotLength]() {
    return this.snapshotLength;
  }
  get [dartx.stringValue]() {
    return this.stringValue;
  }
  [dartx.iterateNext](...args) {
    return this.iterateNext.apply(this, args);
  }
  [dartx.snapshotItem](...args) {
    return this.snapshotItem.apply(this, args);
  }
};
dart.setSignature(html$.XPathResult, {
  constructors: () => ({_: dart.definiteFunctionType(html$.XPathResult, [])}),
  fields: () => ({
    [dartx.booleanValue]: core.bool,
    [dartx.invalidIteratorState]: core.bool,
    [dartx.numberValue]: core.double,
    [dartx.resultType]: core.int,
    [dartx.singleNodeValue]: html$.Node,
    [dartx.snapshotLength]: core.int,
    [dartx.stringValue]: core.String
  }),
  methods: () => ({
    [dartx.iterateNext]: dart.definiteFunctionType(html$.Node, []),
    [dartx.snapshotItem]: dart.definiteFunctionType(html$.Node, [core.int])
  }),
  sfields: () => ({
    ANY_TYPE: core.int,
    ANY_UNORDERED_NODE_TYPE: core.int,
    BOOLEAN_TYPE: core.int,
    FIRST_ORDERED_NODE_TYPE: core.int,
    NUMBER_TYPE: core.int,
    ORDERED_NODE_ITERATOR_TYPE: core.int,
    ORDERED_NODE_SNAPSHOT_TYPE: core.int,
    STRING_TYPE: core.int,
    UNORDERED_NODE_ITERATOR_TYPE: core.int,
    UNORDERED_NODE_SNAPSHOT_TYPE: core.int
  })
});
html$.XPathResult.ANY_TYPE = 0;
html$.XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
html$.XPathResult.BOOLEAN_TYPE = 3;
html$.XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
html$.XPathResult.NUMBER_TYPE = 1;
html$.XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
html$.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
html$.XPathResult.STRING_TYPE = 2;
html$.XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
html$.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
dart.registerExtension(dart.global.XPathResult, html$.XPathResult);
html$.XmlDocument = class XmlDocument extends html$.Document {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$.XmlDocument, {
  constructors: () => ({_: dart.definiteFunctionType(html$.XmlDocument, [])})
});
dart.registerExtension(dart.global.XMLDocument, html$.XmlDocument);
dart.defineExtensionNames([
  'serializeToString'
]);
html$.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.XmlSerializer._create_1();
  }
  static _create_1() {
    return new XMLSerializer();
  }
  [dartx.serializeToString](...args) {
    return this.serializeToString.apply(this, args);
  }
};
dart.setSignature(html$.XmlSerializer, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.XmlSerializer, []),
    new: dart.definiteFunctionType(html$.XmlSerializer, [])
  }),
  methods: () => ({[dartx.serializeToString]: dart.definiteFunctionType(core.String, [html$.Node])}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.XmlSerializer, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.XMLSerializer, html$.XmlSerializer);
dart.defineExtensionNames([
  'clearParameters',
  'getParameter',
  'importStylesheet',
  'removeParameter',
  'reset',
  'setParameter',
  'transformToDocument',
  'transformToFragment'
]);
html$.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$.XsltProcessor._create_1();
  }
  static _create_1() {
    return new XSLTProcessor();
  }
  static get supported() {
    return !!window.XSLTProcessor;
  }
  [dartx.clearParameters](...args) {
    return this.clearParameters.apply(this, args);
  }
  [dartx.getParameter](...args) {
    return this.getParameter.apply(this, args);
  }
  [dartx.importStylesheet](...args) {
    return this.importStylesheet.apply(this, args);
  }
  [dartx.removeParameter](...args) {
    return this.removeParameter.apply(this, args);
  }
  [dartx.reset](...args) {
    return this.reset.apply(this, args);
  }
  [dartx.setParameter](...args) {
    return this.setParameter.apply(this, args);
  }
  [dartx.transformToDocument](...args) {
    return this.transformToDocument.apply(this, args);
  }
  [dartx.transformToFragment](...args) {
    return this.transformToFragment.apply(this, args);
  }
};
dart.setSignature(html$.XsltProcessor, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$.XsltProcessor, []),
    new: dart.definiteFunctionType(html$.XsltProcessor, [])
  }),
  methods: () => ({
    [dartx.clearParameters]: dart.definiteFunctionType(dart.void, []),
    [dartx.getParameter]: dart.definiteFunctionType(core.String, [core.String, core.String]),
    [dartx.importStylesheet]: dart.definiteFunctionType(dart.void, [html$.Node]),
    [dartx.removeParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [dartx.reset]: dart.definiteFunctionType(dart.void, []),
    [dartx.setParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
    [dartx.transformToDocument]: dart.definiteFunctionType(html$.Document, [html$.Node]),
    [dartx.transformToFragment]: dart.definiteFunctionType(html$.DocumentFragment, [html$.Node, html$.Document])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({_create_1: dart.definiteFunctionType(html$.XsltProcessor, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.XSLTProcessor, html$.XsltProcessor);
dart.defineExtensionNames([
  'name',
  'value'
]);
html$._Attr = class _Attr extends html$.Node {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.setSignature(html$._Attr, {
  constructors: () => ({_: dart.definiteFunctionType(html$._Attr, [])}),
  fields: () => ({
    [dartx.name]: core.String,
    [dartx.value]: core.String
  })
});
dart.registerExtension(dart.global.Attr, html$._Attr);
html$._Cache = class _Cache extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._Cache, {
  constructors: () => ({_: dart.definiteFunctionType(html$._Cache, [])})
});
dart.registerExtension(dart.global.Cache, html$._Cache);
html$._CanvasPathMethods = class _CanvasPathMethods extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._CanvasPathMethods, {
  constructors: () => ({_: dart.definiteFunctionType(html$._CanvasPathMethods, [])})
});
dart.defineExtensionNames([
  'toString',
  '==',
  'hashCode',
  'intersection',
  'intersects',
  'boundingBox',
  'containsRectangle',
  'containsPoint',
  'topLeft',
  'topRight',
  'bottomRight',
  'bottomLeft',
  'bottom',
  'height',
  'left',
  'right',
  'top',
  'width'
]);
html$._ClientRect = class _ClientRect extends _interceptors.Interceptor {
  [dartx.toString]() {
    return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
  }
  [dartx['==']](other) {
    if (!RectangleOfnum().is(other)) return false;
    return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
  }
  get [dartx.hashCode]() {
    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
  }
  [dartx.intersection](other) {
    let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
    let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
    if (dart.notNull(x0) <= dart.notNull(x1)) {
      let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
      let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      if (dart.notNull(y0) <= dart.notNull(y1)) {
        return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
      }
    }
    return null;
  }
  [dartx.intersects](other) {
    return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
  }
  [dartx.boundingBox](other) {
    let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
    let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
    let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
    let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
    return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
  }
  [dartx.containsRectangle](another) {
    return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
  }
  [dartx.containsPoint](another) {
    return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
  }
  get [dartx.topLeft]() {
    return new (PointOfnum())(this[dartx.left], this[dartx.top]);
  }
  get [dartx.topRight]() {
    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
  }
  get [dartx.bottomRight]() {
    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
  }
  get [dartx.bottomLeft]() {
    return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.bottom]() {
    return this.bottom;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.left]() {
    return this.left;
  }
  get [dartx.right]() {
    return this.right;
  }
  get [dartx.top]() {
    return this.top;
  }
  get [dartx.width]() {
    return this.width;
  }
};
html$._ClientRect[dart.implements] = () => [RectangleOfnum()];
dart.setSignature(html$._ClientRect, {
  constructors: () => ({_: dart.definiteFunctionType(html$._ClientRect, [])}),
  fields: () => ({
    [dartx.bottom]: core.double,
    [dartx.height]: core.double,
    [dartx.left]: core.double,
    [dartx.right]: core.double,
    [dartx.top]: core.double,
    [dartx.width]: core.double
  }),
  getters: () => ({
    [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
    [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), [])
  }),
  methods: () => ({
    [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
    [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
    [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
    [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
    [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
  })
});
dart.registerExtension(dart.global.ClientRect, html$._ClientRect);
html$._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
  static combine(hash, value) {
    hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
    hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
    return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
  }
  static finish(hash) {
    hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
    hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
    return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
  }
  static hash2(a, b) {
    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
  }
  static hash4(a, b, c, d) {
    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
  }
};
dart.setSignature(html$._JenkinsSmiHash, {
  statics: () => ({
    combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
    finish: dart.definiteFunctionType(core.int, [core.int]),
    hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
    hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
  }),
  names: ['combine', 'finish', 'hash2', 'hash4']
});
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$._ClientRectList = class _ClientRectList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(math.Rectangle$(core.num)), html$.ImmutableListMixin$(math.Rectangle$(core.num))) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.item](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$._ClientRectList[dart.implements] = () => [ListOfRectangleOfnum()];
dart.setSignature(html$._ClientRectList, {
  constructors: () => ({_: dart.definiteFunctionType(html$._ClientRectList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, RectangleOfnum()]),
    [__getter__]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
    [dartx.item]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int])
  })
});
dart.registerExtension(dart.global.ClientRectList, html$._ClientRectList);
dart.registerExtension(dart.global.DOMRectList, html$._ClientRectList);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$._CssRuleList = class _CssRuleList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.CssRule), html$.ImmutableListMixin$(html$.CssRule)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$._CssRuleList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfCssRule()];
dart.setSignature(html$._CssRuleList, {
  constructors: () => ({_: dart.definiteFunctionType(html$._CssRuleList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.CssRule, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.CssRule]),
    [dartx.item]: dart.definiteFunctionType(html$.CssRule, [core.int])
  })
});
dart.registerExtension(dart.global.CSSRuleList, html$._CssRuleList);
html$._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._DOMFileSystemSync, {
  constructors: () => ({_: dart.definiteFunctionType(html$._DOMFileSystemSync, [])})
});
dart.registerExtension(dart.global.DOMFileSystemSync, html$._DOMFileSystemSync);
html$._EntrySync = class _EntrySync extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._EntrySync, {
  constructors: () => ({_: dart.definiteFunctionType(html$._EntrySync, [])})
});
dart.registerExtension(dart.global.EntrySync, html$._EntrySync);
html$._DirectoryEntrySync = class _DirectoryEntrySync extends html$._EntrySync {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._DirectoryEntrySync, {
  constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryEntrySync, [])})
});
dart.registerExtension(dart.global.DirectoryEntrySync, html$._DirectoryEntrySync);
html$._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._DirectoryReaderSync, {
  constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryReaderSync, [])})
});
dart.registerExtension(dart.global.DirectoryReaderSync, html$._DirectoryReaderSync);
html$._DocumentType = class _DocumentType extends html$.Node {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
html$._DocumentType[dart.implements] = () => [html$.ChildNode];
dart.setSignature(html$._DocumentType, {
  constructors: () => ({_: dart.definiteFunctionType(html$._DocumentType, [])})
});
dart.registerExtension(dart.global.DocumentType, html$._DocumentType);
dart.defineExtensionNames([
  'height',
  'height',
  'width',
  'width',
  'x',
  'x',
  'y',
  'y'
]);
html$._DomRect = class _DomRect extends html$.DomRectReadOnly {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(x, y, width, height) {
    if (x === void 0) x = null;
    if (y === void 0) y = null;
    if (width === void 0) width = null;
    if (height === void 0) height = null;
    if (height != null) {
      return html$._DomRect._create_1(x, y, width, height);
    }
    if (width != null) {
      return html$._DomRect._create_2(x, y, width);
    }
    if (y != null) {
      return html$._DomRect._create_3(x, y);
    }
    if (x != null) {
      return html$._DomRect._create_4(x);
    }
    return html$._DomRect._create_5();
  }
  static _create_1(x, y, width, height) {
    return new DOMRect(x, y, width, height);
  }
  static _create_2(x, y, width) {
    return new DOMRect(x, y, width);
  }
  static _create_3(x, y) {
    return new DOMRect(x, y);
  }
  static _create_4(x) {
    return new DOMRect(x);
  }
  static _create_5() {
    return new DOMRect();
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(html$._DomRect, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._DomRect, []),
    new: dart.definiteFunctionType(html$._DomRect, [], [core.num, core.num, core.num, core.num])
  }),
  setters: () => ({
    [dartx.height]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.width]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.y]: dart.definiteFunctionType(dart.void, [core.num])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic]),
    _create_4: dart.definiteFunctionType(html$._DomRect, [dart.dynamic]),
    _create_5: dart.definiteFunctionType(html$._DomRect, [])
  }),
  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
});
dart.registerExtension(dart.global.DOMRect, html$._DomRect);
html$._FileEntrySync = class _FileEntrySync extends html$._EntrySync {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._FileEntrySync, {
  constructors: () => ({_: dart.definiteFunctionType(html$._FileEntrySync, [])})
});
dart.registerExtension(dart.global.FileEntrySync, html$._FileEntrySync);
html$._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return html$._FileReaderSync._create_1();
  }
  static _create_1() {
    return new FileReaderSync();
  }
};
dart.setSignature(html$._FileReaderSync, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._FileReaderSync, []),
    new: dart.definiteFunctionType(html$._FileReaderSync, [])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(html$._FileReaderSync, [])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.FileReaderSync, html$._FileReaderSync);
html$._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._FileWriterSync, {
  constructors: () => ({_: dart.definiteFunctionType(html$._FileWriterSync, [])})
});
dart.registerExtension(dart.global.FileWriterSync, html$._FileWriterSync);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$._GamepadList = class _GamepadList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Gamepad), html$.ImmutableListMixin$(html$.Gamepad)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$._GamepadList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfGamepad()];
dart.setSignature(html$._GamepadList, {
  constructors: () => ({_: dart.definiteFunctionType(html$._GamepadList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Gamepad]),
    [dartx.item]: dart.definiteFunctionType(html$.Gamepad, [core.int])
  })
});
dart.registerExtension(dart.global.GamepadList, html$._GamepadList);
html$._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [_item](...args) {
    return this.item.apply(this, args);
  }
};
dart.setSignature(html$._HTMLAllCollection, {
  constructors: () => ({_: dart.definiteFunctionType(html$._HTMLAllCollection, [])}),
  methods: () => ({[_item]: dart.definiteFunctionType(html$.Element, [core.int])})
});
dart.registerExtension(dart.global.HTMLAllCollection, html$._HTMLAllCollection);
html$._HTMLAppletElement = class _HTMLAppletElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$._HTMLAppletElement, 'created');
dart.setSignature(html$._HTMLAppletElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._HTMLAppletElement, []),
    created: dart.definiteFunctionType(html$._HTMLAppletElement, [])
  })
});
dart.registerExtension(dart.global.HTMLAppletElement, html$._HTMLAppletElement);
html$._HTMLDirectoryElement = class _HTMLDirectoryElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$._HTMLDirectoryElement, 'created');
dart.setSignature(html$._HTMLDirectoryElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._HTMLDirectoryElement, []),
    created: dart.definiteFunctionType(html$._HTMLDirectoryElement, [])
  })
});
dart.registerExtension(dart.global.HTMLDirectoryElement, html$._HTMLDirectoryElement);
html$._HTMLFontElement = class _HTMLFontElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$._HTMLFontElement, 'created');
dart.setSignature(html$._HTMLFontElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._HTMLFontElement, []),
    created: dart.definiteFunctionType(html$._HTMLFontElement, [])
  })
});
dart.registerExtension(dart.global.HTMLFontElement, html$._HTMLFontElement);
html$._HTMLFrameElement = class _HTMLFrameElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$._HTMLFrameElement, 'created');
dart.setSignature(html$._HTMLFrameElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._HTMLFrameElement, []),
    created: dart.definiteFunctionType(html$._HTMLFrameElement, [])
  })
});
dart.registerExtension(dart.global.HTMLFrameElement, html$._HTMLFrameElement);
html$._HTMLFrameSetElement = class _HTMLFrameSetElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$._HTMLFrameSetElement, 'created');
html$._HTMLFrameSetElement[dart.implements] = () => [html$.WindowEventHandlers];
dart.setSignature(html$._HTMLFrameSetElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._HTMLFrameSetElement, []),
    created: dart.definiteFunctionType(html$._HTMLFrameSetElement, [])
  })
});
dart.registerExtension(dart.global.HTMLFrameSetElement, html$._HTMLFrameSetElement);
html$._HTMLMarqueeElement = class _HTMLMarqueeElement extends html$.HtmlElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(html$._HTMLMarqueeElement, 'created');
dart.setSignature(html$._HTMLMarqueeElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._HTMLMarqueeElement, []),
    created: dart.definiteFunctionType(html$._HTMLMarqueeElement, [])
  })
});
dart.registerExtension(dart.global.HTMLMarqueeElement, html$._HTMLMarqueeElement);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'getNamedItem',
  'getNamedItemNS',
  'item',
  'removeNamedItem',
  'removeNamedItemNS',
  'setNamedItem',
  'setNamedItemNS'
]);
html$._NamedNodeMap = class _NamedNodeMap extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.getNamedItem](...args) {
    return this.getNamedItem.apply(this, args);
  }
  [dartx.getNamedItemNS](...args) {
    return this.getNamedItemNS.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
  [dartx.removeNamedItem](...args) {
    return this.removeNamedItem.apply(this, args);
  }
  [dartx.removeNamedItemNS](...args) {
    return this.removeNamedItemNS.apply(this, args);
  }
  [dartx.setNamedItem](...args) {
    return this.setNamedItem.apply(this, args);
  }
  [dartx.setNamedItemNS](...args) {
    return this.setNamedItemNS.apply(this, args);
  }
};
html$._NamedNodeMap[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
dart.setSignature(html$._NamedNodeMap, {
  constructors: () => ({_: dart.definiteFunctionType(html$._NamedNodeMap, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
    [dartx.getNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
    [dartx.getNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
    [dartx.item]: dart.definiteFunctionType(html$._Attr, [core.int]),
    [dartx.removeNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
    [dartx.removeNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
    [dartx.setNamedItem]: dart.definiteFunctionType(html$._Attr, [html$._Attr]),
    [dartx.setNamedItemNS]: dart.definiteFunctionType(html$._Attr, [html$._Attr])
  })
});
dart.registerExtension(dart.global.NamedNodeMap, html$._NamedNodeMap);
dart.registerExtension(dart.global.MozNamedAttrMap, html$._NamedNodeMap);
html$._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._PagePopupController, {
  constructors: () => ({_: dart.definiteFunctionType(html$._PagePopupController, [])})
});
dart.registerExtension(dart.global.PagePopupController, html$._PagePopupController);
dart.defineExtensionNames([
  'clone',
  'context',
  'credentials',
  'headers',
  'mode',
  'referrer',
  'url'
]);
html$._Request = class _Request extends html$.Body {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(input, requestInitDict) {
    if (requestInitDict === void 0) requestInitDict = null;
    if (requestInitDict != null) {
      let requestInitDict_1 = html_common.convertDartToNative_Dictionary(requestInitDict);
      return html$._Request._create_1(input, requestInitDict_1);
    }
    return html$._Request._create_2(input);
  }
  static _create_1(input, requestInitDict) {
    return new Request(input, requestInitDict);
  }
  static _create_2(input) {
    return new Request(input);
  }
  get [dartx.context]() {
    return this.context;
  }
  get [dartx.credentials]() {
    return this.credentials;
  }
  get [dartx.headers]() {
    return this.headers;
  }
  get [dartx.mode]() {
    return this.mode;
  }
  get [dartx.referrer]() {
    return this.referrer;
  }
  get [dartx.url]() {
    return this.url;
  }
  [dartx.clone](...args) {
    return this.clone.apply(this, args);
  }
};
dart.setSignature(html$._Request, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._Request, []),
    new: dart.definiteFunctionType(html$._Request, [core.Object], [core.Map])
  }),
  fields: () => ({
    [dartx.context]: core.String,
    [dartx.credentials]: core.String,
    [dartx.headers]: html$.Headers,
    [dartx.mode]: core.String,
    [dartx.referrer]: core.String,
    [dartx.url]: core.String
  }),
  methods: () => ({[dartx.clone]: dart.definiteFunctionType(html$._Request, [])}),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$._Request, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$._Request, [dart.dynamic])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.Request, html$._Request);
html$._Response = class _Response extends html$.Body {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(body, responseInitDict) {
    if (body === void 0) body = null;
    if (responseInitDict === void 0) responseInitDict = null;
    if (responseInitDict != null) {
      let responseInitDict_1 = html_common.convertDartToNative_Dictionary(responseInitDict);
      return html$._Response._create_1(body, responseInitDict_1);
    }
    if (body != null) {
      return html$._Response._create_2(body);
    }
    return html$._Response._create_3();
  }
  static _create_1(body, responseInitDict) {
    return new Response(body, responseInitDict);
  }
  static _create_2(body) {
    return new Response(body);
  }
  static _create_3() {
    return new Response();
  }
};
dart.setSignature(html$._Response, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._Response, []),
    new: dart.definiteFunctionType(html$._Response, [], [core.Object, core.Map])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$._Response, [dart.dynamic, dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$._Response, [dart.dynamic]),
    _create_3: dart.definiteFunctionType(html$._Response, [])
  }),
  names: ['_create_1', '_create_2', '_create_3']
});
dart.registerExtension(dart.global.Response, html$._Response);
html$._ServiceWorker = class _ServiceWorker extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
html$._ServiceWorker[dart.implements] = () => [html$.AbstractWorker];
dart.setSignature(html$._ServiceWorker, {
  constructors: () => ({_: dart.definiteFunctionType(html$._ServiceWorker, [])})
});
dart.registerExtension(dart.global.ServiceWorker, html$._ServiceWorker);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechRecognitionResult), html$.ImmutableListMixin$(html$.SpeechRecognitionResult)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$._SpeechRecognitionResultList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechRecognitionResult()];
dart.setSignature(html$._SpeechRecognitionResultList, {
  constructors: () => ({_: dart.definiteFunctionType(html$._SpeechRecognitionResultList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechRecognitionResult]),
    [dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int])
  })
});
dart.registerExtension(dart.global.SpeechRecognitionResultList, html$._SpeechRecognitionResultList);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
html$._StyleSheetList = class _StyleSheetList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.StyleSheet), html$.ImmutableListMixin$(html$.StyleSheet)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [dartx.item](...args) {
    return this.item.apply(this, args);
  }
};
html$._StyleSheetList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfStyleSheet()];
dart.setSignature(html$._StyleSheetList, {
  constructors: () => ({_: dart.definiteFunctionType(html$._StyleSheetList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.StyleSheet]),
    [__getter__]: dart.definiteFunctionType(html$.CssStyleSheet, [core.String]),
    [dartx.item]: dart.definiteFunctionType(html$.StyleSheet, [core.int])
  })
});
dart.registerExtension(dart.global.StyleSheetList, html$._StyleSheetList);
html$._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._SubtleCrypto, {
  constructors: () => ({_: dart.definiteFunctionType(html$._SubtleCrypto, [])})
});
dart.registerExtension(dart.global.SubtleCrypto, html$._SubtleCrypto);
html$._WebKitCSSMatrix = class _WebKitCSSMatrix extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(cssValue) {
    if (cssValue === void 0) cssValue = null;
    if (cssValue != null) {
      return html$._WebKitCSSMatrix._create_1(cssValue);
    }
    return html$._WebKitCSSMatrix._create_2();
  }
  static _create_1(cssValue) {
    return new WebKitCSSMatrix(cssValue);
  }
  static _create_2() {
    return new WebKitCSSMatrix();
  }
};
dart.setSignature(html$._WebKitCSSMatrix, {
  constructors: () => ({
    _: dart.definiteFunctionType(html$._WebKitCSSMatrix, []),
    new: dart.definiteFunctionType(html$._WebKitCSSMatrix, [], [core.String])
  }),
  statics: () => ({
    _create_1: dart.definiteFunctionType(html$._WebKitCSSMatrix, [dart.dynamic]),
    _create_2: dart.definiteFunctionType(html$._WebKitCSSMatrix, [])
  }),
  names: ['_create_1', '_create_2']
});
dart.registerExtension(dart.global.WebKitCSSMatrix, html$._WebKitCSSMatrix);
html$._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._WindowTimers, {
  constructors: () => ({_: dart.definiteFunctionType(html$._WindowTimers, [])})
});
html$._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
html$._WorkerLocation[dart.implements] = () => [html$.UrlUtilsReadOnly];
dart.setSignature(html$._WorkerLocation, {
  constructors: () => ({_: dart.definiteFunctionType(html$._WorkerLocation, [])})
});
dart.registerExtension(dart.global.WorkerLocation, html$._WorkerLocation);
html$._WorkerNavigator = class _WorkerNavigator extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
html$._WorkerNavigator[dart.implements] = () => [html$.NavigatorCpu, html$.NavigatorOnLine, html$.NavigatorID];
dart.setSignature(html$._WorkerNavigator, {
  constructors: () => ({_: dart.definiteFunctionType(html$._WorkerNavigator, [])})
});
dart.registerExtension(dart.global.WorkerNavigator, html$._WorkerNavigator);
html$._XMLHttpRequestProgressEvent = class _XMLHttpRequestProgressEvent extends html$.ProgressEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(html$._XMLHttpRequestProgressEvent, {
  constructors: () => ({_: dart.definiteFunctionType(html$._XMLHttpRequestProgressEvent, [])})
});
dart.registerExtension(dart.global.XMLHttpRequestProgressEvent, html$._XMLHttpRequestProgressEvent);
const _matches = Symbol('_matches');
html$._AttributeMap = class _AttributeMap extends core.Object {
  new(element) {
    this[_element$] = element;
  }
  addAll(other) {
    other[dartx.forEach](dart.fn((k, v) => {
      this._set(k, v);
    }, StringAndStringToNull()));
  }
  containsValue(value) {
    for (let v of this.values) {
      if (dart.equals(value, v)) {
        return true;
      }
    }
    return false;
  }
  putIfAbsent(key, ifAbsent) {
    if (!dart.test(this[dartx.containsKey](key))) {
      this._set(key, ifAbsent());
    }
    return this._get(key);
  }
  clear() {
    for (let key of this.keys) {
      this[dartx.remove](key);
    }
  }
  forEach(f) {
    for (let key of this.keys) {
      let value = this._get(key);
      f(key, value);
    }
  }
  get keys() {
    let attributes = this[_element$][_attributes$];
    let keys = JSArrayOfString().of([]);
    for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
      let attr = html$._Attr._check(attributes[dartx._get](i));
      if (dart.test(this[_matches](attr))) {
        keys[dartx.add](attr[dartx.name]);
      }
    }
    return keys;
  }
  get values() {
    let attributes = this[_element$][_attributes$];
    let values = JSArrayOfString().of([]);
    for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
      let attr = html$._Attr._check(attributes[dartx._get](i));
      if (dart.test(this[_matches](attr))) {
        values[dartx.add](attr[dartx.value]);
      }
    }
    return values;
  }
  get isEmpty() {
    return this[dartx.length] == 0;
  }
  get isNotEmpty() {
    return !dart.test(this.isEmpty);
  }
};
html$._AttributeMap[dart.implements] = () => [MapOfString$String()];
dart.setSignature(html$._AttributeMap, {
  constructors: () => ({new: dart.definiteFunctionType(html$._AttributeMap, [html$.Element])}),
  fields: () => ({[_element$]: html$.Element}),
  getters: () => ({
    keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
    values: dart.definiteFunctionType(core.Iterable$(core.String), []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
    putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
    clear: dart.definiteFunctionType(dart.void, []),
    forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()])
  })
});
dart.defineExtensionMembers(html$._AttributeMap, [
  'addAll',
  'containsValue',
  'putIfAbsent',
  'clear',
  'forEach',
  'keys',
  'values',
  'isEmpty',
  'isNotEmpty'
]);
html$._ElementAttributeMap = class _ElementAttributeMap extends html$._AttributeMap {
  new(element) {
    super.new(element);
  }
  containsKey(key) {
    return this[_element$][_hasAttribute](core.String._check(key));
  }
  _get(key) {
    return this[_element$][dartx.getAttribute](core.String._check(key));
  }
  _set(key, value) {
    this[_element$][dartx.setAttribute](key, value);
    return value;
  }
  remove(key) {
    let value = this[_element$][dartx.getAttribute](core.String._check(key));
    this[_element$][_removeAttribute](core.String._check(key));
    return value;
  }
  get length() {
    return this.keys[dartx.length];
  }
  [_matches](node) {
    return node[_namespaceUri] == null;
  }
};
dart.setSignature(html$._ElementAttributeMap, {
  constructors: () => ({new: dart.definiteFunctionType(html$._ElementAttributeMap, [html$.Element])}),
  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
    _get: dart.definiteFunctionType(core.String, [core.Object]),
    _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    remove: dart.definiteFunctionType(core.String, [core.Object]),
    [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
  })
});
dart.defineExtensionMembers(html$._ElementAttributeMap, [
  'containsKey',
  '_get',
  '_set',
  'remove',
  'length'
]);
const _namespace = Symbol('_namespace');
html$._NamespacedAttributeMap = class _NamespacedAttributeMap extends html$._AttributeMap {
  new(element, namespace) {
    this[_namespace] = namespace;
    super.new(element);
  }
  containsKey(key) {
    return this[_element$][_hasAttributeNS](this[_namespace], core.String._check(key));
  }
  _get(key) {
    return this[_element$][dartx.getAttributeNS](this[_namespace], core.String._check(key));
  }
  _set(key, value) {
    this[_element$][dartx.setAttributeNS](this[_namespace], key, value);
    return value;
  }
  remove(key) {
    let value = this._get(key);
    this[_element$][_removeAttributeNS](this[_namespace], core.String._check(key));
    return value;
  }
  get length() {
    return this.keys[dartx.length];
  }
  [_matches](node) {
    return node[_namespaceUri] == this[_namespace];
  }
};
dart.setSignature(html$._NamespacedAttributeMap, {
  constructors: () => ({new: dart.definiteFunctionType(html$._NamespacedAttributeMap, [html$.Element, core.String])}),
  fields: () => ({[_namespace]: core.String}),
  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
    _get: dart.definiteFunctionType(core.String, [core.Object]),
    _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    remove: dart.definiteFunctionType(core.String, [core.Object]),
    [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
  })
});
dart.defineExtensionMembers(html$._NamespacedAttributeMap, [
  'containsKey',
  '_get',
  '_set',
  'remove',
  'length'
]);
const _attr = Symbol('_attr');
const _strip = Symbol('_strip');
const _toHyphenedName = Symbol('_toHyphenedName');
const _toCamelCase = Symbol('_toCamelCase');
html$._DataAttributeMap = class _DataAttributeMap extends core.Object {
  new(attributes) {
    this[_attributes$] = attributes;
  }
  addAll(other) {
    other[dartx.forEach](dart.fn((k, v) => {
      this._set(k, v);
    }, StringAndStringToNull()));
  }
  containsValue(value) {
    return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
  }
  containsKey(key) {
    return this[_attributes$][dartx.containsKey](this[_attr](core.String._check(key)));
  }
  _get(key) {
    return this[_attributes$][dartx._get](this[_attr](core.String._check(key)));
  }
  _set(key, value) {
    this[_attributes$][dartx._set](this[_attr](key), value);
    return value;
  }
  putIfAbsent(key, ifAbsent) {
    return this[_attributes$][dartx.putIfAbsent](this[_attr](key), ifAbsent);
  }
  remove(key) {
    return this[_attributes$][dartx.remove](this[_attr](core.String._check(key)));
  }
  clear() {
    for (let key of this.keys) {
      this.remove(key);
    }
  }
  forEach(f) {
    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
      if (dart.test(this[_matches](key))) {
        f(this[_strip](key), value);
      }
    }, StringAndStringToNull()));
  }
  get keys() {
    let keys = JSArrayOfString().of([]);
    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
      if (dart.test(this[_matches](key))) {
        keys[dartx.add](this[_strip](key));
      }
    }, StringAndStringToNull()));
    return keys;
  }
  get values() {
    let values = JSArrayOfString().of([]);
    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
      if (dart.test(this[_matches](key))) {
        values[dartx.add](value);
      }
    }, StringAndStringToNull()));
    return values;
  }
  get length() {
    return this.keys[dartx.length];
  }
  get isEmpty() {
    return this.length == 0;
  }
  get isNotEmpty() {
    return !dart.test(this.isEmpty);
  }
  [_attr](key) {
    return dart.str`data-${this[_toHyphenedName](key)}`;
  }
  [_matches](key) {
    return key[dartx.startsWith]('data-');
  }
  [_strip](key) {
    return this[_toCamelCase](key[dartx.substring](5));
  }
  [_toCamelCase](hyphenedName, opts) {
    let startUppercase = opts && 'startUppercase' in opts ? opts.startUppercase : false;
    let segments = hyphenedName[dartx.split]('-');
    let start = dart.test(startUppercase) ? 0 : 1;
    for (let i = start; i < dart.notNull(segments[dartx.length]); i++) {
      let segment = segments[dartx._get](i);
      if (dart.notNull(segment[dartx.length]) > 0) {
        segments[dartx._set](i, dart.str`${segment[dartx._get](0)[dartx.toUpperCase]()}${segment[dartx.substring](1)}`);
      }
    }
    return segments[dartx.join]('');
  }
  [_toHyphenedName](word) {
    let sb = new core.StringBuffer();
    for (let i = 0; i < dart.notNull(word[dartx.length]); i++) {
      let lower = word[dartx._get](i)[dartx.toLowerCase]();
      if (word[dartx._get](i) != lower && i > 0) sb.write('-');
      sb.write(lower);
    }
    return sb.toString();
  }
};
html$._DataAttributeMap[dart.implements] = () => [MapOfString$String()];
dart.setSignature(html$._DataAttributeMap, {
  constructors: () => ({new: dart.definiteFunctionType(html$._DataAttributeMap, [MapOfString$String()])}),
  fields: () => ({[_attributes$]: MapOfString$String()}),
  getters: () => ({
    keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
    values: dart.definiteFunctionType(core.Iterable$(core.String), []),
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
    _get: dart.definiteFunctionType(core.String, [core.Object]),
    _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
    remove: dart.definiteFunctionType(core.String, [core.Object]),
    clear: dart.definiteFunctionType(dart.void, []),
    forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
    [_attr]: dart.definiteFunctionType(core.String, [core.String]),
    [_matches]: dart.definiteFunctionType(core.bool, [core.String]),
    [_strip]: dart.definiteFunctionType(core.String, [core.String]),
    [_toCamelCase]: dart.definiteFunctionType(core.String, [core.String], {startUppercase: core.bool}),
    [_toHyphenedName]: dart.definiteFunctionType(core.String, [core.String])
  })
});
dart.defineExtensionMembers(html$._DataAttributeMap, [
  'addAll',
  'containsValue',
  'containsKey',
  '_get',
  '_set',
  'putIfAbsent',
  'remove',
  'clear',
  'forEach',
  'keys',
  'values',
  'length',
  'isEmpty',
  'isNotEmpty'
]);
html$.CanvasImageSource = class CanvasImageSource extends core.Object {};
html$.WindowBase = class WindowBase extends core.Object {};
html$.WindowBase[dart.implements] = () => [html$.EventTarget];
html$.LocationBase = class LocationBase extends core.Object {};
html$.HistoryBase = class HistoryBase extends core.Object {};
html$.CssClassSet = class CssClassSet extends core.Object {};
html$.CssClassSet[dart.implements] = () => [SetOfString()];
const _addOrSubtractToBoxModel = Symbol('_addOrSubtractToBoxModel');
html$.CssRect = class CssRect extends core.Object {
  new(element) {
    this[_element$] = element;
  }
  set height(newHeight) {
    dart.throw(new core.UnsupportedError("Can only set height for content rect."));
  }
  set width(newWidth) {
    dart.throw(new core.UnsupportedError("Can only set width for content rect."));
  }
  [_addOrSubtractToBoxModel](dimensions, augmentingMeasurement) {
    let styles = this[_element$][dartx.getComputedStyle]();
    let val = 0;
    for (let measurement of dimensions) {
      if (augmentingMeasurement == html$._MARGIN) {
        val = dart.notNull(val) + dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${augmentingMeasurement}-${measurement}`)).value);
      }
      if (augmentingMeasurement == html$._CONTENT) {
        val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${html$._PADDING}-${measurement}`)).value);
      }
      if (augmentingMeasurement != html$._MARGIN) {
        val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`border-${measurement}-width`)).value);
      }
    }
    return val;
  }
  get right() {
    return dart.notNull(this.left) + dart.notNull(this.width);
  }
  get bottom() {
    return dart.notNull(this.top) + dart.notNull(this.height);
  }
  toString() {
    return dart.str`Rectangle (${this.left}, ${this.top}) ${this.width} x ${this.height}`;
  }
  ['=='](other) {
    if (!RectangleOfnum().is(other)) return false;
    return dart.equals(this.left, dart.dload(other, 'left')) && dart.equals(this.top, dart.dload(other, 'top')) && dart.equals(this.right, dart.dload(other, 'right')) && dart.equals(this.bottom, dart.dload(other, 'bottom'));
  }
  get hashCode() {
    return html$._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
  }
  intersection(other) {
    let x0 = math.max(core.num)(this.left, other[dartx.left]);
    let x1 = math.min(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
    if (dart.notNull(x0) <= dart.notNull(x1)) {
      let y0 = math.max(core.num)(this.top, other[dartx.top]);
      let y1 = math.min(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      if (dart.notNull(y0) <= dart.notNull(y1)) {
        return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
      }
    }
    return null;
  }
  intersects(other) {
    return dart.notNull(this.left) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(this.top) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this.top) + dart.notNull(this.height);
  }
  boundingBox(other) {
    let right = math.max(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
    let bottom = math.max(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
    let left = math.min(core.num)(this.left, other[dartx.left]);
    let top = math.min(core.num)(this.top, other[dartx.top]);
    return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
  }
  containsRectangle(another) {
    return dart.notNull(this.left) <= dart.notNull(another[dartx.left]) && dart.notNull(this.left) + dart.notNull(this.width) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this.top) <= dart.notNull(another[dartx.top]) && dart.notNull(this.top) + dart.notNull(this.height) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
  }
  containsPoint(another) {
    return dart.notNull(another.x) >= dart.notNull(this.left) && dart.notNull(another.x) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(another.y) >= dart.notNull(this.top) && dart.notNull(another.y) <= dart.notNull(this.top) + dart.notNull(this.height);
  }
  get topLeft() {
    return new (PointOfnum())(this.left, this.top);
  }
  get topRight() {
    return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), this.top);
  }
  get bottomRight() {
    return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(this.top) + dart.notNull(this.height));
  }
  get bottomLeft() {
    return new (PointOfnum())(this.left, dart.notNull(this.top) + dart.notNull(this.height));
  }
};
html$.CssRect[dart.implements] = () => [RectangleOfnum()];
dart.setSignature(html$.CssRect, {
  constructors: () => ({new: dart.definiteFunctionType(html$.CssRect, [html$.Element])}),
  fields: () => ({[_element$]: html$.Element}),
  getters: () => ({
    right: dart.definiteFunctionType(core.num, []),
    bottom: dart.definiteFunctionType(core.num, []),
    topLeft: dart.definiteFunctionType(math.Point$(core.num), []),
    topRight: dart.definiteFunctionType(math.Point$(core.num), []),
    bottomRight: dart.definiteFunctionType(math.Point$(core.num), []),
    bottomLeft: dart.definiteFunctionType(math.Point$(core.num), [])
  }),
  setters: () => ({
    height: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    width: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  methods: () => ({
    [_addOrSubtractToBoxModel]: dart.definiteFunctionType(core.num, [ListOfString(), core.String]),
    intersection: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
    intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
    boundingBox: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
    containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
    containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
  })
});
dart.defineExtensionMembers(html$.CssRect, [
  'toString',
  '==',
  'intersection',
  'intersects',
  'boundingBox',
  'containsRectangle',
  'containsPoint',
  'right',
  'bottom',
  'hashCode',
  'topLeft',
  'topRight',
  'bottomRight',
  'bottomLeft'
]);
html$._ContentCssRect = class _ContentCssRect extends html$.CssRect {
  new(element) {
    super.new(element);
  }
  get height() {
    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._CONTENT));
  }
  get width() {
    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._CONTENT));
  }
  set height(newHeight) {
    if (html$.Dimension.is(newHeight)) {
      if (dart.test(dart.dsend(dart.dload(newHeight, 'value'), '<', 0))) newHeight = new html$.Dimension.px(0);
      this[_element$][dartx.style][dartx.height] = dart.toString(newHeight);
    } else if (typeof newHeight == 'number') {
      if (dart.test(dart.dsend(newHeight, '<', 0))) newHeight = 0;
      this[_element$][dartx.style][dartx.height] = dart.str`${newHeight}px`;
    } else {
      dart.throw(new core.ArgumentError("newHeight is not a Dimension or num"));
    }
  }
  set width(newWidth) {
    if (html$.Dimension.is(newWidth)) {
      if (dart.test(dart.dsend(dart.dload(newWidth, 'value'), '<', 0))) newWidth = new html$.Dimension.px(0);
      this[_element$][dartx.style][dartx.width] = dart.toString(newWidth);
    } else if (typeof newWidth == 'number') {
      if (dart.test(dart.dsend(newWidth, '<', 0))) newWidth = 0;
      this[_element$][dartx.style][dartx.width] = dart.str`${newWidth}px`;
    } else {
      dart.throw(new core.ArgumentError("newWidth is not a Dimension or num"));
    }
  }
  get left() {
    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._CONTENT));
  }
  get top() {
    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._CONTENT));
  }
};
dart.setSignature(html$._ContentCssRect, {
  constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssRect, [html$.Element])}),
  getters: () => ({
    height: dart.definiteFunctionType(core.num, []),
    width: dart.definiteFunctionType(core.num, []),
    left: dart.definiteFunctionType(core.num, []),
    top: dart.definiteFunctionType(core.num, [])
  })
});
dart.defineExtensionMembers(html$._ContentCssRect, ['height', 'width', 'left', 'top']);
const _elementList = Symbol('_elementList');
html$._ContentCssListRect = class _ContentCssListRect extends html$._ContentCssRect {
  new(elementList) {
    this[_elementList] = null;
    super.new(elementList[dartx.first]);
    this[_elementList] = elementList;
  }
  set height(newHeight) {
    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].height = newHeight, ElementTovoid$()));
  }
  get height() {
    return super.height;
  }
  set width(newWidth) {
    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].width = newWidth, ElementTovoid$()));
  }
  get width() {
    return super.width;
  }
};
dart.setSignature(html$._ContentCssListRect, {
  constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssListRect, [ListOfElement()])}),
  fields: () => ({[_elementList]: ListOfElement()})
});
html$._PaddingCssRect = class _PaddingCssRect extends html$.CssRect {
  new(element) {
    super.new(html$.Element._check(element));
  }
  get height() {
    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._PADDING));
  }
  set height(value) {
    super.height = value;
  }
  get width() {
    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._PADDING));
  }
  set width(value) {
    super.width = value;
  }
  get left() {
    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._PADDING));
  }
  get top() {
    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._PADDING));
  }
};
dart.setSignature(html$._PaddingCssRect, {
  constructors: () => ({new: dart.definiteFunctionType(html$._PaddingCssRect, [dart.dynamic])}),
  getters: () => ({
    height: dart.definiteFunctionType(core.num, []),
    width: dart.definiteFunctionType(core.num, []),
    left: dart.definiteFunctionType(core.num, []),
    top: dart.definiteFunctionType(core.num, [])
  })
});
dart.defineExtensionMembers(html$._PaddingCssRect, ['height', 'width', 'left', 'top']);
html$._BorderCssRect = class _BorderCssRect extends html$.CssRect {
  new(element) {
    super.new(html$.Element._check(element));
  }
  get height() {
    return this[_element$][dartx.offsetHeight];
  }
  set height(value) {
    super.height = value;
  }
  get width() {
    return this[_element$][dartx.offsetWidth];
  }
  set width(value) {
    super.width = value;
  }
  get left() {
    return this[_element$][dartx.getBoundingClientRect]()[dartx.left];
  }
  get top() {
    return this[_element$][dartx.getBoundingClientRect]()[dartx.top];
  }
};
dart.setSignature(html$._BorderCssRect, {
  constructors: () => ({new: dart.definiteFunctionType(html$._BorderCssRect, [dart.dynamic])}),
  getters: () => ({
    height: dart.definiteFunctionType(core.num, []),
    width: dart.definiteFunctionType(core.num, []),
    left: dart.definiteFunctionType(core.num, []),
    top: dart.definiteFunctionType(core.num, [])
  })
});
dart.defineExtensionMembers(html$._BorderCssRect, ['height', 'width', 'left', 'top']);
html$._MarginCssRect = class _MarginCssRect extends html$.CssRect {
  new(element) {
    super.new(html$.Element._check(element));
  }
  get height() {
    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._MARGIN));
  }
  set height(value) {
    super.height = value;
  }
  get width() {
    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._MARGIN));
  }
  set width(value) {
    super.width = value;
  }
  get left() {
    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._MARGIN));
  }
  get top() {
    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._MARGIN));
  }
};
dart.setSignature(html$._MarginCssRect, {
  constructors: () => ({new: dart.definiteFunctionType(html$._MarginCssRect, [dart.dynamic])}),
  getters: () => ({
    height: dart.definiteFunctionType(core.num, []),
    width: dart.definiteFunctionType(core.num, []),
    left: dart.definiteFunctionType(core.num, []),
    top: dart.definiteFunctionType(core.num, [])
  })
});
dart.defineExtensionMembers(html$._MarginCssRect, ['height', 'width', 'left', 'top']);
dart.defineLazy(html$, {
  get _HEIGHT() {
    return JSArrayOfString().of(['top', 'bottom']);
  }
});
dart.defineLazy(html$, {
  get _WIDTH() {
    return JSArrayOfString().of(['right', 'left']);
  }
});
html$._CONTENT = 'content';
html$._PADDING = 'padding';
html$._MARGIN = 'margin';
const _sets = Symbol('_sets');
const _validateToken = Symbol('_validateToken');
html_common.CssClassSetImpl = class CssClassSetImpl extends core.Object {
  [_validateToken](value) {
    if (dart.test(html_common.CssClassSetImpl._validTokenRE.hasMatch(value))) return value;
    dart.throw(new core.ArgumentError.value(value, 'value', 'Not a valid class token'));
  }
  toString() {
    return this.readClasses().join(' ');
  }
  toggle(value, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    this[_validateToken](value);
    let s = this.readClasses();
    let result = false;
    if (shouldAdd == null) shouldAdd = !dart.test(s.contains(value));
    if (dart.test(shouldAdd)) {
      s.add(value);
      result = true;
    } else {
      s.remove(value);
    }
    this.writeClasses(s);
    return result;
  }
  get frozen() {
    return false;
  }
  get iterator() {
    return this.readClasses().iterator;
  }
  [Symbol.iterator]() {
    return new dart.JsIterator(this.iterator);
  }
  forEach(f) {
    this.readClasses().forEach(f);
  }
  join(separator) {
    if (separator === void 0) separator = "";
    return this.readClasses().join(separator);
  }
  map(T) {
    return f => {
      return this.readClasses().map(T)(f);
    };
  }
  where(f) {
    return this.readClasses().where(f);
  }
  expand(T) {
    return f => {
      return this.readClasses().expand(T)(f);
    };
  }
  every(f) {
    return this.readClasses().every(f);
  }
  any(f) {
    return this.readClasses().any(f);
  }
  get isEmpty() {
    return this.readClasses().isEmpty;
  }
  get isNotEmpty() {
    return this.readClasses().isNotEmpty;
  }
  get length() {
    return this.readClasses().length;
  }
  reduce(combine) {
    return this.readClasses().reduce(combine);
  }
  fold(T) {
    return (initialValue, combine) => {
      return this.readClasses().fold(T)(initialValue, combine);
    };
  }
  contains(value) {
    if (!(typeof value == 'string')) return false;
    this[_validateToken](core.String._check(value));
    return this.readClasses().contains(value);
  }
  lookup(value) {
    return core.String._check(dart.test(this.contains(value)) ? value : null);
  }
  add(value) {
    this[_validateToken](value);
    return core.bool._check(this.modify(dart.fn(s => s.add(value), SetOfStringTobool())));
  }
  remove(value) {
    this[_validateToken](core.String._check(value));
    if (!(typeof value == 'string')) return false;
    let s = this.readClasses();
    let result = s.remove(value);
    this.writeClasses(s);
    return result;
  }
  addAll(iterable) {
    this.modify(dart.fn(s => s.addAll(iterable[dartx.map](core.String)(dart.bind(this, _validateToken))), SetOfStringTovoid()));
  }
  removeAll(iterable) {
    this.modify(dart.fn(s => s.removeAll(iterable), SetOfStringTovoid()));
  }
  toggleAll(iterable, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    iterable[dartx.forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool$()));
  }
  retainAll(iterable) {
    this.modify(dart.fn(s => s.retainAll(iterable), SetOfStringTovoid()));
  }
  removeWhere(test) {
    this.modify(dart.fn(s => s.removeWhere(test), SetOfStringTovoid()));
  }
  retainWhere(test) {
    this.modify(dart.fn(s => s.retainWhere(test), SetOfStringTovoid()));
  }
  containsAll(collection) {
    return this.readClasses().containsAll(collection);
  }
  intersection(other) {
    return this.readClasses().intersection(other);
  }
  union(other) {
    return this.readClasses().union(other);
  }
  difference(other) {
    return this.readClasses().difference(other);
  }
  get first() {
    return this.readClasses().first;
  }
  get last() {
    return this.readClasses().last;
  }
  get single() {
    return this.readClasses().single;
  }
  toList(opts) {
    let growable = opts && 'growable' in opts ? opts.growable : true;
    return this.readClasses().toList({growable: growable});
  }
  toSet() {
    return this.readClasses().toSet();
  }
  take(n) {
    return this.readClasses().take(n);
  }
  takeWhile(test) {
    return this.readClasses().takeWhile(test);
  }
  skip(n) {
    return this.readClasses().skip(n);
  }
  skipWhile(test) {
    return this.readClasses().skipWhile(test);
  }
  firstWhere(test, opts) {
    let orElse = opts && 'orElse' in opts ? opts.orElse : null;
    return this.readClasses().firstWhere(test, {orElse: orElse});
  }
  lastWhere(test, opts) {
    let orElse = opts && 'orElse' in opts ? opts.orElse : null;
    return this.readClasses().lastWhere(test, {orElse: orElse});
  }
  singleWhere(test) {
    return this.readClasses().singleWhere(test);
  }
  elementAt(index) {
    return this.readClasses().elementAt(index);
  }
  clear() {
    this.modify(dart.fn(s => s.clear(), SetOfStringTovoid()));
  }
  modify(f) {
    let s = this.readClasses();
    let ret = f(s);
    this.writeClasses(s);
    return ret;
  }
};
html_common.CssClassSetImpl[dart.implements] = () => [html$.CssClassSet];
dart.setSignature(html_common.CssClassSetImpl, {
  getters: () => ({
    frozen: dart.definiteFunctionType(core.bool, []),
    iterator: dart.definiteFunctionType(core.Iterator$(core.String), []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, []),
    length: dart.definiteFunctionType(core.int, []),
    first: dart.definiteFunctionType(core.String, []),
    last: dart.definiteFunctionType(core.String, []),
    single: dart.definiteFunctionType(core.String, [])
  }),
  methods: () => ({
    [_validateToken]: dart.definiteFunctionType(core.String, [core.String]),
    toggle: dart.definiteFunctionType(core.bool, [core.String], [core.bool]),
    forEach: dart.definiteFunctionType(dart.void, [StringTovoid()]),
    join: dart.definiteFunctionType(core.String, [], [core.String]),
    map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [core.String])]]),
    where: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
    expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [core.String])]]),
    every: dart.definiteFunctionType(core.bool, [StringTobool()]),
    any: dart.definiteFunctionType(core.bool, [StringTobool()]),
    reduce: dart.definiteFunctionType(core.String, [StringAndStringToString()]),
    fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, core.String])]]),
    contains: dart.definiteFunctionType(core.bool, [core.Object]),
    lookup: dart.definiteFunctionType(core.String, [core.Object]),
    add: dart.definiteFunctionType(core.bool, [core.String]),
    remove: dart.definiteFunctionType(core.bool, [core.Object]),
    addAll: dart.definiteFunctionType(dart.void, [IterableOfString()]),
    removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
    toggleAll: dart.definiteFunctionType(dart.void, [IterableOfString()], [core.bool]),
    retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
    removeWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
    retainWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
    containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
    intersection: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
    union: dart.definiteFunctionType(core.Set$(core.String), [SetOfString()]),
    difference: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
    toList: dart.definiteFunctionType(core.List$(core.String), [], {growable: core.bool}),
    toSet: dart.definiteFunctionType(core.Set$(core.String), []),
    take: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
    takeWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
    skip: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
    skipWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
    firstWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
    lastWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
    singleWhere: dart.definiteFunctionType(core.String, [StringTobool()]),
    elementAt: dart.definiteFunctionType(core.String, [core.int]),
    clear: dart.definiteFunctionType(dart.void, []),
    modify: dart.definiteFunctionType(dart.dynamic, [SetOfStringTodynamic()])
  }),
  sfields: () => ({_validTokenRE: core.RegExp})
});
dart.defineExtensionMembers(html_common.CssClassSetImpl, [
  'toString',
  'forEach',
  'join',
  'map',
  'where',
  'expand',
  'every',
  'any',
  'reduce',
  'fold',
  'contains',
  'toList',
  'toSet',
  'take',
  'takeWhile',
  'skip',
  'skipWhile',
  'firstWhere',
  'lastWhere',
  'singleWhere',
  'elementAt',
  'iterator',
  'isEmpty',
  'isNotEmpty',
  'length',
  'first',
  'last',
  'single'
]);
dart.defineLazy(html_common.CssClassSetImpl, {
  get _validTokenRE() {
    return core.RegExp.new('^\\S+$');
  }
});
html$._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
  static new(elements) {
    return new html$._MultiElementCssClassSet._(elements, ListOfCssClassSetImpl()._check(elements[dartx.map](html$.CssClassSet)(dart.fn(e => e[dartx.classes], ElementToCssClassSet()))[dartx.toList]()));
  }
  _(elementIterable, sets) {
    this[_elementIterable] = elementIterable;
    this[_sets] = sets;
  }
  readClasses() {
    let s = LinkedHashSetOfString().new();
    this[_sets][dartx.forEach](dart.fn(e => s.addAll(e.readClasses()), CssClassSetImplTovoid()));
    return s;
  }
  writeClasses(s) {
    let classes = s.join(' ');
    for (let e of this[_elementIterable]) {
      e[dartx.className] = classes;
    }
  }
  modify(f) {
    this[_sets][dartx.forEach](dart.fn(e => e.modify(f), CssClassSetImplTovoid()));
  }
  toggle(value, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.toggle(value, shouldAdd)) || dart.test(changed), boolAndCssClassSetImplTobool()));
  }
  remove(value) {
    return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.remove(value)) || dart.test(changed), boolAndCssClassSetImplTobool()));
  }
};
dart.defineNamedConstructor(html$._MultiElementCssClassSet, '_');
dart.setSignature(html$._MultiElementCssClassSet, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement()]),
    _: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement(), ListOfCssClassSetImpl()])
  }),
  fields: () => ({
    [_elementIterable]: IterableOfElement(),
    [_sets]: ListOfCssClassSetImpl()
  }),
  methods: () => ({
    readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
    writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
  })
});
html$._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
  new(element) {
    this[_element$] = element;
  }
  readClasses() {
    let s = LinkedHashSetOfString().new();
    let classname = this[_element$][dartx.className];
    for (let name of classname[dartx.split](' ')) {
      let trimmed = name[dartx.trim]();
      if (!dart.test(trimmed[dartx.isEmpty])) {
        s.add(trimmed);
      }
    }
    return s;
  }
  writeClasses(s) {
    this[_element$][dartx.className] = s.join(' ');
  }
  get length() {
    return html$._ElementCssClassSet._classListLength(html$._ElementCssClassSet._classListOf(this[_element$]));
  }
  get isEmpty() {
    return this.length == 0;
  }
  get isNotEmpty() {
    return this.length != 0;
  }
  clear() {
    this[_element$][dartx.className] = '';
  }
  contains(value) {
    return html$._ElementCssClassSet._contains(this[_element$], value);
  }
  add(value) {
    return html$._ElementCssClassSet._add(this[_element$], value);
  }
  remove(value) {
    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._remove(this[_element$], value));
  }
  toggle(value, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    return html$._ElementCssClassSet._toggle(this[_element$], value, shouldAdd);
  }
  addAll(iterable) {
    html$._ElementCssClassSet._addAll(this[_element$], iterable);
  }
  removeAll(iterable) {
    html$._ElementCssClassSet._removeAll(this[_element$], IterableOfString()._check(iterable));
  }
  retainAll(iterable) {
    html$._ElementCssClassSet._removeWhere(this[_element$], dart.bind(iterable[dartx.toSet](), 'contains'), false);
  }
  removeWhere(test) {
    html$._ElementCssClassSet._removeWhere(this[_element$], test, true);
  }
  retainWhere(test) {
    html$._ElementCssClassSet._removeWhere(this[_element$], test, false);
  }
  static _contains(_element, value) {
    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._classListContains(html$._ElementCssClassSet._classListOf(_element), value));
  }
  static _add(_element, value) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    let added = !dart.test(html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
    html$._ElementCssClassSet._classListAdd(list, value);
    return added;
  }
  static _remove(_element, value) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    let removed = html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
    html$._ElementCssClassSet._classListRemove(list, value);
    return removed;
  }
  static _toggle(_element, value, shouldAdd) {
    return shouldAdd == null ? html$._ElementCssClassSet._toggleDefault(_element, value) : html$._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
  }
  static _toggleDefault(_element, value) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    return html$._ElementCssClassSet._classListToggle1(list, value);
  }
  static _toggleOnOff(_element, value, shouldAdd) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    if (dart.test(shouldAdd)) {
      html$._ElementCssClassSet._classListAdd(list, value);
      return true;
    } else {
      html$._ElementCssClassSet._classListRemove(list, value);
      return false;
    }
  }
  static _addAll(_element, iterable) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    for (let value of iterable) {
      html$._ElementCssClassSet._classListAdd(list, value);
    }
  }
  static _removeAll(_element, iterable) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    for (let value of iterable) {
      html$._ElementCssClassSet._classListRemove(list, value);
    }
  }
  static _removeWhere(_element, test, doRemove) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    let i = 0;
    while (i < dart.notNull(html$._ElementCssClassSet._classListLength(list))) {
      let item = list[dartx.item](i);
      if (doRemove == test(item)) {
        html$._ElementCssClassSet._classListRemove(list, item);
      } else {
        ++i;
      }
    }
  }
  static _classListOf(e) {
    return e.classList;
  }
  static _classListLength(list) {
    return list.length;
  }
  static _classListContains(list, value) {
    return list.contains(value);
  }
  static _classListContainsBeforeAddOrRemove(list, value) {
    return list.contains(value);
  }
  static _classListAdd(list, value) {
    list.add(value);
  }
  static _classListRemove(list, value) {
    list.remove(value);
  }
  static _classListToggle1(list, value) {
    return list.toggle(value);
  }
  static _classListToggle2(list, value, shouldAdd) {
    return list.toggle(value, shouldAdd);
  }
};
dart.setSignature(html$._ElementCssClassSet, {
  constructors: () => ({new: dart.definiteFunctionType(html$._ElementCssClassSet, [html$.Element])}),
  fields: () => ({[_element$]: html$.Element}),
  methods: () => ({
    readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
    writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
  }),
  statics: () => ({
    _contains: dart.definiteFunctionType(core.bool, [html$.Element, core.Object]),
    _add: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
    _remove: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
    _toggle: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
    _toggleDefault: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
    _toggleOnOff: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
    _addAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
    _removeAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
    _removeWhere: dart.definiteFunctionType(dart.void, [html$.Element, StringTobool(), core.bool]),
    _classListOf: dart.definiteFunctionType(html$.DomTokenList, [html$.Element]),
    _classListLength: dart.definiteFunctionType(core.int, [html$.DomTokenList]),
    _classListContains: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
    _classListContainsBeforeAddOrRemove: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
    _classListAdd: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
    _classListRemove: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
    _classListToggle1: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
    _classListToggle2: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String, core.bool])
  }),
  names: ['_contains', '_add', '_remove', '_toggle', '_toggleDefault', '_toggleOnOff', '_addAll', '_removeAll', '_removeWhere', '_classListOf', '_classListLength', '_classListContains', '_classListContainsBeforeAddOrRemove', '_classListAdd', '_classListRemove', '_classListToggle1', '_classListToggle2']
});
dart.defineExtensionMembers(html$._ElementCssClassSet, ['contains', 'length', 'isEmpty', 'isNotEmpty']);
const _unit = Symbol('_unit');
html$.Dimension = class Dimension extends core.Object {
  percent(value) {
    this[_value$2] = value;
    this[_unit] = '%';
  }
  px(value) {
    this[_value$2] = value;
    this[_unit] = 'px';
  }
  pc(value) {
    this[_value$2] = value;
    this[_unit] = 'pc';
  }
  pt(value) {
    this[_value$2] = value;
    this[_unit] = 'pt';
  }
  inch(value) {
    this[_value$2] = value;
    this[_unit] = 'in';
  }
  cm(value) {
    this[_value$2] = value;
    this[_unit] = 'cm';
  }
  mm(value) {
    this[_value$2] = value;
    this[_unit] = 'mm';
  }
  em(value) {
    this[_value$2] = value;
    this[_unit] = 'em';
  }
  ex(value) {
    this[_value$2] = value;
    this[_unit] = 'ex';
  }
  css(cssValue) {
    this[_value$2] = null;
    this[_unit] = null;
    if (cssValue == '') cssValue = '0px';
    if (dart.test(cssValue[dartx.endsWith]('%'))) {
      this[_unit] = '%';
    } else {
      this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
    }
    if (dart.test(cssValue[dartx.contains]('.'))) {
      this[_value$2] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
    } else {
      this[_value$2] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
    }
  }
  toString() {
    return dart.str`${this[_value$2]}${this[_unit]}`;
  }
  get value() {
    return this[_value$2];
  }
};
dart.defineNamedConstructor(html$.Dimension, 'percent');
dart.defineNamedConstructor(html$.Dimension, 'px');
dart.defineNamedConstructor(html$.Dimension, 'pc');
dart.defineNamedConstructor(html$.Dimension, 'pt');
dart.defineNamedConstructor(html$.Dimension, 'inch');
dart.defineNamedConstructor(html$.Dimension, 'cm');
dart.defineNamedConstructor(html$.Dimension, 'mm');
dart.defineNamedConstructor(html$.Dimension, 'em');
dart.defineNamedConstructor(html$.Dimension, 'ex');
dart.defineNamedConstructor(html$.Dimension, 'css');
dart.setSignature(html$.Dimension, {
  constructors: () => ({
    percent: dart.definiteFunctionType(html$.Dimension, [core.num]),
    px: dart.definiteFunctionType(html$.Dimension, [core.num]),
    pc: dart.definiteFunctionType(html$.Dimension, [core.num]),
    pt: dart.definiteFunctionType(html$.Dimension, [core.num]),
    inch: dart.definiteFunctionType(html$.Dimension, [core.num]),
    cm: dart.definiteFunctionType(html$.Dimension, [core.num]),
    mm: dart.definiteFunctionType(html$.Dimension, [core.num]),
    em: dart.definiteFunctionType(html$.Dimension, [core.num]),
    ex: dart.definiteFunctionType(html$.Dimension, [core.num]),
    css: dart.definiteFunctionType(html$.Dimension, [core.String])
  }),
  fields: () => ({
    [_value$2]: core.num,
    [_unit]: core.String
  }),
  getters: () => ({value: dart.definiteFunctionType(core.num, [])})
});
html$.EventListener = dart.typedef('EventListener', () => dart.functionType(dart.dynamic, [html$.Event]));
html$.EventStreamProvider$ = dart.generic(T => {
  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
  class EventStreamProvider extends core.Object {
    new(eventType) {
      this[_eventType] = eventType;
    }
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_EventStreamOfT())(e, this[_eventType], useCapture);
    }
    forElement(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementEventStreamImplOfT())(e, this[_eventType], useCapture);
    }
    [_forElementList](e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementListEventStreamImplOfT())(e, this[_eventType], useCapture);
    }
    getEventType(target) {
      return this[_eventType];
    }
  }
  dart.addTypeTests(EventStreamProvider);
  dart.setSignature(EventStreamProvider, {
    constructors: () => ({new: dart.definiteFunctionType(html$.EventStreamProvider$(T), [core.String])}),
    fields: () => ({[_eventType]: core.String}),
    methods: () => ({
      forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
      forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
    })
  });
  return EventStreamProvider;
});
html$.EventStreamProvider = EventStreamProvider();
html$.ElementStream$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class ElementStream extends core.Object {}
  dart.addTypeTests(ElementStream);
  ElementStream[dart.implements] = () => [StreamOfT()];
  return ElementStream;
});
html$.ElementStream = ElementStream();
const _target$0 = Symbol('_target');
const _useCapture = Symbol('_useCapture');
html$._EventStream$ = dart.generic(T => {
  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _EventStream extends async.Stream$(T) {
    new(target, eventType, useCapture) {
      this[_target$0] = target;
      this[_eventType] = eventType;
      this[_useCapture] = useCapture;
      super.new();
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this;
    }
    get isBroadcast() {
      return true;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, this[_useCapture]);
    }
  }
  dart.setSignature(_EventStream, {
    constructors: () => ({new: dart.definiteFunctionType(html$._EventStream$(T), [html$.EventTarget, core.String, core.bool])}),
    fields: () => ({
      [_target$0]: html$.EventTarget,
      [_eventType]: core.String,
      [_useCapture]: core.bool
    }),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  return _EventStream;
});
html$._EventStream = _EventStream();
html$._matchesWithAncestors = function(event, selector) {
  let target = event[dartx.target];
  return html$.Element.is(target) ? target[dartx.matchesWithAncestors](selector) : false;
};
dart.fn(html$._matchesWithAncestors, EventAndStringTobool());
html$._ElementEventStreamImpl$ = dart.generic(T => {
  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
  let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
  class _ElementEventStreamImpl extends html$._EventStream$(T) {
    new(target, eventType, useCapture) {
      super.new(html$.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
    }
    matches(selector) {
      return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
        e[_selector] = selector;
        return e;
      }, TToT()));
    }
    capture(onData) {
      return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, true);
    }
  }
  _ElementEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
  dart.setSignature(_ElementEventStreamImpl, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ElementEventStreamImpl$(T), [dart.dynamic, dart.dynamic, dart.dynamic])}),
    methods: () => ({
      matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
      capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
    })
  });
  return _ElementEventStreamImpl;
});
html$._ElementEventStreamImpl = _ElementEventStreamImpl();
const _targetList = Symbol('_targetList');
html$._ElementListEventStreamImpl$ = dart.generic(T => {
  let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html$._StreamPool$(T)))();
  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
  let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
  let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
  class _ElementListEventStreamImpl extends async.Stream$(T) {
    new(targetList, eventType, useCapture) {
      this[_targetList] = targetList;
      this[_eventType] = eventType;
      this[_useCapture] = useCapture;
      super.new();
    }
    matches(selector) {
      return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
        e[_selector] = selector;
        return e;
      }, TToT()));
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      let pool = new (_StreamPoolOfT()).broadcast();
      for (let target of this[_targetList]) {
        pool.add(new (_EventStreamOfT())(target, this[_eventType], this[_useCapture]));
      }
      return pool.stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    capture(onData) {
      let pool = new (_StreamPoolOfT()).broadcast();
      for (let target of this[_targetList]) {
        pool.add(new (_EventStreamOfT())(target, this[_eventType], true));
      }
      return pool.stream.listen(onData);
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this;
    }
    get isBroadcast() {
      return true;
    }
  }
  _ElementListEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
  dart.setSignature(_ElementListEventStreamImpl, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ElementListEventStreamImpl$(T), [IterableOfElement(), core.String, core.bool])}),
    fields: () => ({
      [_targetList]: IterableOfElement(),
      [_useCapture]: core.bool,
      [_eventType]: core.String
    }),
    methods: () => ({
      matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
    })
  });
  return _ElementListEventStreamImpl;
});
html$._ElementListEventStreamImpl = _ElementListEventStreamImpl();
html$._EventListener$ = dart.generic(T => {
  const _EventListener = dart.typedef('_EventListener', () => dart.functionType(dart.dynamic, [T]));
  return _EventListener;
});
html$._EventListener = _EventListener();
const _onData$0 = Symbol('_onData');
const _pauseCount$0 = Symbol('_pauseCount');
const _tryResume = Symbol('_tryResume');
const _canceled = Symbol('_canceled');
const _unlisten = Symbol('_unlisten');
html$._EventStreamSubscription$ = dart.generic(T => {
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  class _EventStreamSubscription extends async.StreamSubscription$(T) {
    new(target, eventType, onData, useCapture) {
      this[_target$0] = target;
      this[_eventType] = eventType;
      this[_useCapture] = useCapture;
      this[_onData$0] = onData == null ? null : html$._wrapZone(html$.Event, dart.dynamic)(dart.fn(e => dart.dcall(onData, e), EventTodynamic()));
      this[_pauseCount$0] = 0;
      this[_tryResume]();
    }
    cancel() {
      if (dart.test(this[_canceled])) return null;
      this[_unlisten]();
      this[_target$0] = null;
      this[_onData$0] = null;
      return null;
    }
    get [_canceled]() {
      return this[_target$0] == null;
    }
    onData(handleData) {
      if (dart.test(this[_canceled])) {
        dart.throw(new core.StateError("Subscription has been canceled."));
      }
      this[_unlisten]();
      this[_onData$0] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(handleData));
      this[_tryResume]();
    }
    onError(handleError) {}
    onDone(handleDone) {}
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      if (dart.test(this[_canceled])) return;
      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) + 1;
      this[_unlisten]();
      if (resumeSignal != null) {
        resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
    }
    get isPaused() {
      return dart.notNull(this[_pauseCount$0]) > 0;
    }
    resume() {
      if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) - 1;
      this[_tryResume]();
    }
    [_tryResume]() {
      if (this[_onData$0] != null && !dart.test(this.isPaused)) {
        this[_target$0][dartx.addEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
      }
    }
    [_unlisten]() {
      if (this[_onData$0] != null) {
        this[_target$0][dartx.removeEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
      }
    }
    asFuture(E) {
      return futureValue => {
        if (futureValue === void 0) futureValue = null;
        let completer = async.Completer$(E).new();
        return completer.future;
      };
    }
  }
  dart.setSignature(_EventStreamSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(html$._EventStreamSubscription$(T), [html$.EventTarget, core.String, TTovoid(), core.bool])}),
    fields: () => ({
      [_pauseCount$0]: core.int,
      [_target$0]: html$.EventTarget,
      [_eventType]: core.String,
      [_onData$0]: html$.EventListener,
      [_useCapture]: core.bool
    }),
    getters: () => ({
      [_canceled]: dart.definiteFunctionType(core.bool, []),
      isPaused: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      cancel: dart.definiteFunctionType(async.Future, []),
      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
      onError: dart.definiteFunctionType(dart.void, [core.Function]),
      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
      resume: dart.definiteFunctionType(dart.void, []),
      [_tryResume]: dart.definiteFunctionType(dart.void, []),
      [_unlisten]: dart.definiteFunctionType(dart.void, []),
      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
    })
  });
  return _EventStreamSubscription;
});
html$._EventStreamSubscription = _EventStreamSubscription();
html$.CustomStream$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class CustomStream extends core.Object {}
  dart.addTypeTests(CustomStream);
  CustomStream[dart.implements] = () => [StreamOfT()];
  return CustomStream;
});
html$.CustomStream = CustomStream();
const _streamController = Symbol('_streamController');
const _type$ = Symbol('_type');
html$._CustomEventStreamImpl$ = dart.generic(T => {
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html$.CustomStream$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
  class _CustomEventStreamImpl extends async.Stream$(T) {
    new(type) {
      this[_streamController] = null;
      this[_type$] = null;
      super.new();
      this[_type$] = type;
      this[_streamController] = StreamControllerOfT().broadcast({sync: true});
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_streamController].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this[_streamController].stream;
    }
    get isBroadcast() {
      return true;
    }
    add(event) {
      T._check(event);
      if (event[dartx.type] == this[_type$]) this[_streamController].add(event);
    }
  }
  _CustomEventStreamImpl[dart.implements] = () => [CustomStreamOfT()];
  dart.setSignature(_CustomEventStreamImpl, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamImpl$(T), [core.String])}),
    fields: () => ({
      [_streamController]: StreamControllerOfT(),
      [_type$]: core.String
    }),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      add: dart.definiteFunctionType(dart.void, [T])
    })
  });
  return _CustomEventStreamImpl;
});
html$._CustomEventStreamImpl = _CustomEventStreamImpl();
const _parent$ = Symbol('_parent');
const _shadowKeyCode = Symbol('_shadowKeyCode');
const _shadowCharCode = Symbol('_shadowCharCode');
const _shadowAltKey = Symbol('_shadowAltKey');
const _realKeyCode = Symbol('_realKeyCode');
const _realCharCode = Symbol('_realCharCode');
const _realAltKey = Symbol('_realAltKey');
const _currentTarget = Symbol('_currentTarget');
const _shadowKeyIdentifier = Symbol('_shadowKeyIdentifier');
html$.KeyEvent = class KeyEvent extends html$._WrappedEvent {
  get keyCode() {
    return this[_shadowKeyCode];
  }
  get charCode() {
    return this.type == 'keypress' ? this[_shadowCharCode] : 0;
  }
  get altKey() {
    return this[_shadowAltKey];
  }
  get which() {
    return this.keyCode;
  }
  get [_realKeyCode]() {
    return this[_parent$].keyCode;
  }
  get [_realCharCode]() {
    return this[_parent$].charCode;
  }
  get [_realAltKey]() {
    return this[_parent$].altKey;
  }
  static _makeRecord() {
    let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent));
    return _js_helper.makeLeafDispatchRecord(interceptor);
  }
  wrap(parent) {
    this[_parent$] = null;
    this[_shadowAltKey] = null;
    this[_shadowCharCode] = null;
    this[_shadowKeyCode] = null;
    this[_currentTarget] = null;
    super.new(parent);
    this[_parent$] = parent;
    this[_shadowAltKey] = this[_realAltKey];
    this[_shadowCharCode] = this[_realCharCode];
    this[_shadowKeyCode] = this[_realKeyCode];
    this[_currentTarget] = this[_parent$][dartx.currentTarget];
  }
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let keyCode = opts && 'keyCode' in opts ? opts.keyCode : 0;
    let charCode = opts && 'charCode' in opts ? opts.charCode : 0;
    let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    let currentTarget = opts && 'currentTarget' in opts ? opts.currentTarget : null;
    if (view == null) {
      view = html$.window;
    }
    let eventObj = null;
    if (dart.test(html$.KeyEvent.canUseDispatchEvent)) {
      eventObj = html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
      eventObj.keyCode = keyCode;
      eventObj.which = keyCode;
      eventObj.charCode = charCode;
      eventObj.keyLocation = keyLocation;
      eventObj.ctrlKey = ctrlKey;
      eventObj.altKey = altKey;
      eventObj.shiftKey = shiftKey;
      eventObj.metaKey = metaKey;
    } else {
      eventObj = html$.Event.eventType('KeyboardEvent', type, {canBubble: canBubble, cancelable: cancelable});
      Object.defineProperty(eventObj, 'keyCode', {
        get: function() {
          return this.keyCodeVal;
        }
      });
      Object.defineProperty(eventObj, 'which', {
        get: function() {
          return this.keyCodeVal;
        }
      });
      Object.defineProperty(eventObj, 'charCode', {
        get: function() {
          return this.charCodeVal;
        }
      });
      let keyIdentifier = html$.KeyEvent._convertToHexString(charCode, keyCode);
      dart.dsend(eventObj, _initKeyboardEvent, type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
      eventObj.keyCodeVal = keyCode;
      eventObj.charCodeVal = charCode;
    }
    _interceptors.setDispatchProperty(eventObj, html$.KeyEvent._keyboardEventDispatchRecord);
    let keyEvent = new html$.KeyEvent.wrap(html$.KeyboardEvent._check(eventObj));
    if (keyEvent[_currentTarget] == null) {
      keyEvent[_currentTarget] = currentTarget == null ? html$.window : currentTarget;
    }
    return keyEvent;
  }
  static get canUseDispatchEvent() {
    return typeof document.body.dispatchEvent == "function" && document.body.dispatchEvent.length > 0;
  }
  get currentTarget() {
    return this[_currentTarget];
  }
  static _convertToHexString(charCode, keyCode) {
    if (charCode != -1) {
      let hex = charCode[dartx.toRadixString](16);
      let sb = new core.StringBuffer('U+');
      for (let i = 0; i < 4 - dart.notNull(hex[dartx.length]); i++)
        sb.write('0');
      sb.write(hex);
      return sb.toString();
    } else {
      return html$.KeyCode._convertKeyCodeToKeyName(keyCode);
    }
  }
  get code() {
    return this[_parent$][dartx.code];
  }
  get ctrlKey() {
    return this[_parent$][dartx.ctrlKey];
  }
  get detail() {
    return this[_parent$][dartx.detail];
  }
  get key() {
    return this[_parent$][dartx.key];
  }
  get keyLocation() {
    return this[_parent$][dartx.keyLocation];
  }
  get metaKey() {
    return this[_parent$][dartx.metaKey];
  }
  get shiftKey() {
    return this[_parent$][dartx.shiftKey];
  }
  get sourceDevice() {
    return this[_parent$][dartx.sourceDevice];
  }
  get view() {
    return html$.Window._check(this[_parent$][dartx.view]);
  }
  [_initUIEvent](type, canBubble, cancelable, view, detail) {
    dart.throw(new core.UnsupportedError("Cannot initialize a UI Event from a KeyEvent."));
  }
  get [_shadowKeyIdentifier]() {
    return this[_parent$].keyIdentifier;
  }
  get [_charCode]() {
    return this.charCode;
  }
  get [_keyCode]() {
    return this.keyCode;
  }
  get [_which]() {
    return this.which;
  }
  get [_keyIdentifier]() {
    dart.throw(new core.UnsupportedError("keyIdentifier is unsupported."));
  }
  [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
    dart.throw(new core.UnsupportedError("Cannot initialize a KeyboardEvent from a KeyEvent."));
  }
  getModifierState(keyArgument) {
    return dart.throw(new core.UnimplementedError());
  }
  get location() {
    return dart.throw(new core.UnimplementedError());
  }
  get repeat() {
    return dart.throw(new core.UnimplementedError());
  }
  get [_get_view]() {
    return dart.throw(new core.UnimplementedError());
  }
};
dart.defineNamedConstructor(html$.KeyEvent, 'wrap');
html$.KeyEvent[dart.implements] = () => [html$.KeyboardEvent];
dart.setSignature(html$.KeyEvent, {
  constructors: () => ({
    wrap: dart.definiteFunctionType(html$.KeyEvent, [html$.KeyboardEvent]),
    new: dart.definiteFunctionType(html$.KeyEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyCode: core.int, charCode: core.int, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, currentTarget: html$.EventTarget})
  }),
  fields: () => ({
    [_parent$]: html$.KeyboardEvent,
    [_shadowAltKey]: core.bool,
    [_shadowCharCode]: core.int,
    [_shadowKeyCode]: core.int,
    [_currentTarget]: html$.EventTarget
  }),
  getters: () => ({
    keyCode: dart.definiteFunctionType(core.int, []),
    charCode: dart.definiteFunctionType(core.int, []),
    altKey: dart.definiteFunctionType(core.bool, []),
    which: dart.definiteFunctionType(core.int, []),
    [_realKeyCode]: dart.definiteFunctionType(core.int, []),
    [_realCharCode]: dart.definiteFunctionType(core.int, []),
    [_realAltKey]: dart.definiteFunctionType(core.bool, []),
    code: dart.definiteFunctionType(core.String, []),
    ctrlKey: dart.definiteFunctionType(core.bool, []),
    detail: dart.definiteFunctionType(core.int, []),
    key: dart.definiteFunctionType(core.String, []),
    keyLocation: dart.definiteFunctionType(core.int, []),
    metaKey: dart.definiteFunctionType(core.bool, []),
    shiftKey: dart.definiteFunctionType(core.bool, []),
    sourceDevice: dart.definiteFunctionType(html$.InputDevice, []),
    view: dart.definiteFunctionType(html$.Window, []),
    [_shadowKeyIdentifier]: dart.definiteFunctionType(core.String, []),
    [_charCode]: dart.definiteFunctionType(core.int, []),
    [_keyCode]: dart.definiteFunctionType(core.int, []),
    [_which]: dart.definiteFunctionType(core.int, []),
    [_keyIdentifier]: dart.definiteFunctionType(core.String, []),
    location: dart.definiteFunctionType(core.int, []),
    repeat: dart.definiteFunctionType(core.bool, []),
    [_get_view]: dart.definiteFunctionType(dart.dynamic, [])
  }),
  methods: () => ({
    [_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int]),
    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
    getModifierState: dart.definiteFunctionType(core.bool, [core.String])
  }),
  sfields: () => ({
    _keyboardEventDispatchRecord: dart.dynamic,
    keyDownEvent: EventStreamProviderOfKeyEvent(),
    keyUpEvent: EventStreamProviderOfKeyEvent(),
    keyPressEvent: EventStreamProviderOfKeyEvent()
  }),
  sgetters: () => ({canUseDispatchEvent: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    _makeRecord: dart.definiteFunctionType(dart.dynamic, []),
    _convertToHexString: dart.definiteFunctionType(core.String, [core.int, core.int])
  }),
  names: ['_makeRecord', '_convertToHexString']
});
dart.defineLazy(html$.KeyEvent, {
  get _keyboardEventDispatchRecord() {
    return html$.KeyEvent._makeRecord();
  },
  get keyDownEvent() {
    return new html$._KeyboardEventHandler('keydown');
  },
  set keyDownEvent(_) {},
  get keyUpEvent() {
    return new html$._KeyboardEventHandler('keyup');
  },
  set keyUpEvent(_) {},
  get keyPressEvent() {
    return new html$._KeyboardEventHandler('keypress');
  },
  set keyPressEvent(_) {}
});
html$._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html$._CustomEventStreamImpl$(html$.KeyEvent) {
  new(type) {
    super.new(type);
  }
  add(event) {
    if (event.type == this[_type$]) {
      event.currentTarget[dartx.dispatchEvent](event[_parent$]);
      this[_streamController].add(event);
    }
  }
};
dart.addSimpleTypeTests(html$._CustomKeyEventStreamImpl);
html$._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
dart.setSignature(html$._CustomKeyEventStreamImpl, {
  constructors: () => ({new: dart.definiteFunctionType(html$._CustomKeyEventStreamImpl, [core.String])})
});
const _subscriptions = Symbol('_subscriptions');
const _controller$1 = Symbol('_controller');
html$._StreamPool$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let MapOfStreamOfT$StreamSubscriptionOfT = () => (MapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(core.Map$(StreamOfT(), StreamSubscriptionOfT())))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  class _StreamPool extends core.Object {
    broadcast() {
      this[_subscriptions] = MapOfStreamOfT$StreamSubscriptionOfT().new();
      this[_controller$1] = null;
      this[_controller$1] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
    }
    get stream() {
      return this[_controller$1].stream;
    }
    add(stream) {
      StreamOfT()._check(stream);
      if (dart.test(this[_subscriptions][dartx.containsKey](stream))) return;
      this[_subscriptions][dartx._set](stream, stream.listen(dart.bind(this[_controller$1], 'add'), {onError: dart.bind(this[_controller$1], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid$())}));
    }
    remove(stream) {
      StreamOfT()._check(stream);
      let subscription = this[_subscriptions][dartx.remove](stream);
      if (subscription != null) subscription.cancel();
    }
    close() {
      for (let subscription of this[_subscriptions][dartx.values]) {
        subscription.cancel();
      }
      this[_subscriptions][dartx.clear]();
      this[_controller$1].close();
    }
  }
  dart.addTypeTests(_StreamPool);
  dart.defineNamedConstructor(_StreamPool, 'broadcast');
  dart.setSignature(_StreamPool, {
    constructors: () => ({broadcast: dart.definiteFunctionType(html$._StreamPool$(T), [])}),
    fields: () => ({
      [_controller$1]: StreamControllerOfT(),
      [_subscriptions]: MapOfStreamOfT$StreamSubscriptionOfT()
    }),
    getters: () => ({stream: dart.definiteFunctionType(async.Stream$(T), [])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [StreamOfT()]),
      remove: dart.definiteFunctionType(dart.void, [StreamOfT()]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  return _StreamPool;
});
html$._StreamPool = _StreamPool();
const _eventTypeGetter = Symbol('_eventTypeGetter');
html$._CustomEventStreamProvider$ = dart.generic(T => {
  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
  let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html$.EventStreamProvider$(T)))();
  class _CustomEventStreamProvider extends core.Object {
    new(eventTypeGetter) {
      this[_eventTypeGetter] = eventTypeGetter;
    }
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_EventStreamOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
    }
    forElement(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementEventStreamImplOfT())(e, dart.dcall(this[_eventTypeGetter], e), useCapture);
    }
    [_forElementList](e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementListEventStreamImplOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
    }
    getEventType(target) {
      return core.String._check(dart.dcall(this[_eventTypeGetter], target));
    }
    get [_eventType]() {
      return dart.throw(new core.UnsupportedError('Access type through getEventType method.'));
    }
  }
  dart.addTypeTests(_CustomEventStreamProvider);
  _CustomEventStreamProvider[dart.implements] = () => [EventStreamProviderOfT()];
  dart.setSignature(_CustomEventStreamProvider, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamProvider$(T), [dart.dynamic])}),
    fields: () => ({[_eventTypeGetter]: dart.dynamic}),
    getters: () => ({[_eventType]: dart.definiteFunctionType(core.String, [])}),
    methods: () => ({
      forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
      forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
    })
  });
  return _CustomEventStreamProvider;
});
html$._CustomEventStreamProvider = _CustomEventStreamProvider();
html$._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
  new(opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    this.uriPolicy = uriPolicy != null ? uriPolicy : html$.UriPolicy.new();
    if (dart.test(html$._Html5NodeValidator._attributeValidators[dartx.isEmpty])) {
      for (let attr of html$._Html5NodeValidator._standardAttributes) {
        html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._standardAttributeValidator);
      }
      for (let attr of html$._Html5NodeValidator._uriAttributes) {
        html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._uriAttributeValidator);
      }
    }
  }
  allowsElement(element) {
    return html$._Html5NodeValidator._allowedElements.contains(html$.Element._safeTagName(element));
  }
  allowsAttribute(element, attributeName, value) {
    let tagName = html$.Element._safeTagName(element);
    let validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`${tagName}::${attributeName}`);
    if (validator == null) {
      validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`*::${attributeName}`);
    }
    if (validator == null) {
      return false;
    }
    return core.bool._check(dart.dcall(validator, element, attributeName, value, this));
  }
  static _standardAttributeValidator(element, attributeName, value, context) {
    return true;
  }
  static _uriAttributeValidator(element, attributeName, value, context) {
    return context.uriPolicy.allowsUri(value);
  }
};
html$._Html5NodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setSignature(html$._Html5NodeValidator, {
  constructors: () => ({new: dart.definiteFunctionType(html$._Html5NodeValidator, [], {uriPolicy: html$.UriPolicy})}),
  fields: () => ({uriPolicy: html$.UriPolicy}),
  methods: () => ({
    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
  }),
  sfields: () => ({
    _allowedElements: SetOfString(),
    _standardAttributes: ListOfString(),
    _uriAttributes: ListOfString(),
    _attributeValidators: MapOfString$Function()
  }),
  statics: () => ({
    _standardAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator]),
    _uriAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator])
  }),
  names: ['_standardAttributeValidator', '_uriAttributeValidator']
});
html$._Html5NodeValidator._standardAttributes = dart.constList(['*::class', '*::dir', '*::draggable', '*::hidden', '*::id', '*::inert', '*::itemprop', '*::itemref', '*::itemscope', '*::lang', '*::spellcheck', '*::title', '*::translate', 'A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'AREA::accesskey', 'AREA::alt', 'AREA::coords', 'AREA::nohref', 'AREA::shape', 'AREA::tabindex', 'AREA::target', 'AUDIO::controls', 'AUDIO::loop', 'AUDIO::mediagroup', 'AUDIO::muted', 'AUDIO::preload', 'BDO::dir', 'BODY::alink', 'BODY::bgcolor', 'BODY::link', 'BODY::text', 'BODY::vlink', 'BR::clear', 'BUTTON::accesskey', 'BUTTON::disabled', 'BUTTON::name', 'BUTTON::tabindex', 'BUTTON::type', 'BUTTON::value', 'CANVAS::height', 'CANVAS::width', 'CAPTION::align', 'COL::align', 'COL::char', 'COL::charoff', 'COL::span', 'COL::valign', 'COL::width', 'COLGROUP::align', 'COLGROUP::char', 'COLGROUP::charoff', 'COLGROUP::span', 'COLGROUP::valign', 'COLGROUP::width', 'COMMAND::checked', 'COMMAND::command', 'COMMAND::disabled', 'COMMAND::label', 'COMMAND::radiogroup', 'COMMAND::type', 'DATA::value', 'DEL::datetime', 'DETAILS::open', 'DIR::compact', 'DIV::align', 'DL::compact', 'FIELDSET::disabled', 'FONT::color', 'FONT::face', 'FONT::size', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target', 'FRAME::name', 'H1::align', 'H2::align', 'H3::align', 'H4::align', 'H5::align', 'H6::align', 'HR::align', 'HR::noshade', 'HR::size', 'HR::width', 'HTML::version', 'IFRAME::align', 'IFRAME::frameborder', 'IFRAME::height', 'IFRAME::marginheight', 'IFRAME::marginwidth', 'IFRAME::width', 'IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width', 'INPUT::accept', 'INPUT::accesskey', 'INPUT::align', 'INPUT::alt', 'INPUT::autocomplete', 'INPUT::autofocus', 'INPUT::checked', 'INPUT::disabled', 'INPUT::inputmode', 'INPUT::ismap', 'INPUT::list', 'INPUT::max', 'INPUT::maxlength', 'INPUT::min', 'INPUT::multiple', 'INPUT::name', 'INPUT::placeholder', 'INPUT::readonly', 'INPUT::required', 'INPUT::size', 'INPUT::step', 'INPUT::tabindex', 'INPUT::type', 'INPUT::usemap', 'INPUT::value', 'INS::datetime', 'KEYGEN::disabled', 'KEYGEN::keytype', 'KEYGEN::name', 'LABEL::accesskey', 'LABEL::for', 'LEGEND::accesskey', 'LEGEND::align', 'LI::type', 'LI::value', 'LINK::sizes', 'MAP::name', 'MENU::compact', 'MENU::label', 'MENU::type', 'METER::high', 'METER::low', 'METER::max', 'METER::min', 'METER::value', 'OBJECT::typemustmatch', 'OL::compact', 'OL::reversed', 'OL::start', 'OL::type', 'OPTGROUP::disabled', 'OPTGROUP::label', 'OPTION::disabled', 'OPTION::label', 'OPTION::selected', 'OPTION::value', 'OUTPUT::for', 'OUTPUT::name', 'P::align', 'PRE::width', 'PROGRESS::max', 'PROGRESS::min', 'PROGRESS::value', 'SELECT::autocomplete', 'SELECT::disabled', 'SELECT::multiple', 'SELECT::name', 'SELECT::required', 'SELECT::size', 'SELECT::tabindex', 'SOURCE::type', 'TABLE::align', 'TABLE::bgcolor', 'TABLE::border', 'TABLE::cellpadding', 'TABLE::cellspacing', 'TABLE::frame', 'TABLE::rules', 'TABLE::summary', 'TABLE::width', 'TBODY::align', 'TBODY::char', 'TBODY::charoff', 'TBODY::valign', 'TD::abbr', 'TD::align', 'TD::axis', 'TD::bgcolor', 'TD::char', 'TD::charoff', 'TD::colspan', 'TD::headers', 'TD::height', 'TD::nowrap', 'TD::rowspan', 'TD::scope', 'TD::valign', 'TD::width', 'TEXTAREA::accesskey', 'TEXTAREA::autocomplete', 'TEXTAREA::cols', 'TEXTAREA::disabled', 'TEXTAREA::inputmode', 'TEXTAREA::name', 'TEXTAREA::placeholder', 'TEXTAREA::readonly', 'TEXTAREA::required', 'TEXTAREA::rows', 'TEXTAREA::tabindex', 'TEXTAREA::wrap', 'TFOOT::align', 'TFOOT::char', 'TFOOT::charoff', 'TFOOT::valign', 'TH::abbr', 'TH::align', 'TH::axis', 'TH::bgcolor', 'TH::char', 'TH::charoff', 'TH::colspan', 'TH::headers', 'TH::height', 'TH::nowrap', 'TH::rowspan', 'TH::scope', 'TH::valign', 'TH::width', 'THEAD::align', 'THEAD::char', 'THEAD::charoff', 'THEAD::valign', 'TR::align', 'TR::bgcolor', 'TR::char', 'TR::charoff', 'TR::valign', 'TRACK::default', 'TRACK::kind', 'TRACK::label', 'TRACK::srclang', 'UL::compact', 'UL::type', 'VIDEO::controls', 'VIDEO::height', 'VIDEO::loop', 'VIDEO::mediagroup', 'VIDEO::muted', 'VIDEO::preload', 'VIDEO::width'], core.String);
html$._Html5NodeValidator._uriAttributes = dart.constList(['A::href', 'AREA::href', 'BLOCKQUOTE::cite', 'BODY::background', 'COMMAND::icon', 'DEL::cite', 'FORM::action', 'IMG::src', 'INPUT::src', 'INS::cite', 'Q::cite', 'VIDEO::poster'], core.String);
dart.defineLazy(html$._Html5NodeValidator, {
  get _allowedElements() {
    return SetOfString().from(JSArrayOfString().of(['A', 'ABBR', 'ACRONYM', 'ADDRESS', 'AREA', 'ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BDI', 'BDO', 'BIG', 'BLOCKQUOTE', 'BR', 'BUTTON', 'CANVAS', 'CAPTION', 'CENTER', 'CITE', 'CODE', 'COL', 'COLGROUP', 'COMMAND', 'DATA', 'DATALIST', 'DD', 'DEL', 'DETAILS', 'DFN', 'DIR', 'DIV', 'DL', 'DT', 'EM', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FONT', 'FOOTER', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HGROUP', 'HR', 'I', 'IFRAME', 'IMG', 'INPUT', 'INS', 'KBD', 'LABEL', 'LEGEND', 'LI', 'MAP', 'MARK', 'MENU', 'METER', 'NAV', 'NOBR', 'OL', 'OPTGROUP', 'OPTION', 'OUTPUT', 'P', 'PRE', 'PROGRESS', 'Q', 'S', 'SAMP', 'SECTION', 'SELECT', 'SMALL', 'SOURCE', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUMMARY', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TIME', 'TR', 'TRACK', 'TT', 'U', 'UL', 'VAR', 'VIDEO', 'WBR']));
  },
  get _attributeValidators() {
    return dart.map({}, core.String, core.Function);
  }
});
html$.KeyCode = class KeyCode extends core.Object {
  static isCharacterKey(keyCode) {
    if (dart.notNull(keyCode) >= html$.KeyCode.ZERO && dart.notNull(keyCode) <= html$.KeyCode.NINE || dart.notNull(keyCode) >= html$.KeyCode.NUM_ZERO && dart.notNull(keyCode) <= html$.KeyCode.NUM_MULTIPLY || dart.notNull(keyCode) >= html$.KeyCode.A && dart.notNull(keyCode) <= html$.KeyCode.Z) {
      return true;
    }
    if (dart.test(html_common.Device.isWebKit) && keyCode == 0) {
      return true;
    }
    return keyCode == html$.KeyCode.SPACE || keyCode == html$.KeyCode.QUESTION_MARK || keyCode == html$.KeyCode.NUM_PLUS || keyCode == html$.KeyCode.NUM_MINUS || keyCode == html$.KeyCode.NUM_PERIOD || keyCode == html$.KeyCode.NUM_DIVISION || keyCode == html$.KeyCode.SEMICOLON || keyCode == html$.KeyCode.FF_SEMICOLON || keyCode == html$.KeyCode.DASH || keyCode == html$.KeyCode.EQUALS || keyCode == html$.KeyCode.FF_EQUALS || keyCode == html$.KeyCode.COMMA || keyCode == html$.KeyCode.PERIOD || keyCode == html$.KeyCode.SLASH || keyCode == html$.KeyCode.APOSTROPHE || keyCode == html$.KeyCode.SINGLE_QUOTE || keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || keyCode == html$.KeyCode.BACKSLASH || keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET;
  }
  static _convertKeyCodeToKeyName(keyCode) {
    switch (keyCode) {
      case html$.KeyCode.ALT:
      {
        return html$._KeyName.ALT;
      }
      case html$.KeyCode.BACKSPACE:
      {
        return html$._KeyName.BACKSPACE;
      }
      case html$.KeyCode.CAPS_LOCK:
      {
        return html$._KeyName.CAPS_LOCK;
      }
      case html$.KeyCode.CTRL:
      {
        return html$._KeyName.CONTROL;
      }
      case html$.KeyCode.DELETE:
      {
        return html$._KeyName.DEL;
      }
      case html$.KeyCode.DOWN:
      {
        return html$._KeyName.DOWN;
      }
      case html$.KeyCode.END:
      {
        return html$._KeyName.END;
      }
      case html$.KeyCode.ENTER:
      {
        return html$._KeyName.ENTER;
      }
      case html$.KeyCode.ESC:
      {
        return html$._KeyName.ESC;
      }
      case html$.KeyCode.F1:
      {
        return html$._KeyName.F1;
      }
      case html$.KeyCode.F2:
      {
        return html$._KeyName.F2;
      }
      case html$.KeyCode.F3:
      {
        return html$._KeyName.F3;
      }
      case html$.KeyCode.F4:
      {
        return html$._KeyName.F4;
      }
      case html$.KeyCode.F5:
      {
        return html$._KeyName.F5;
      }
      case html$.KeyCode.F6:
      {
        return html$._KeyName.F6;
      }
      case html$.KeyCode.F7:
      {
        return html$._KeyName.F7;
      }
      case html$.KeyCode.F8:
      {
        return html$._KeyName.F8;
      }
      case html$.KeyCode.F9:
      {
        return html$._KeyName.F9;
      }
      case html$.KeyCode.F10:
      {
        return html$._KeyName.F10;
      }
      case html$.KeyCode.F11:
      {
        return html$._KeyName.F11;
      }
      case html$.KeyCode.F12:
      {
        return html$._KeyName.F12;
      }
      case html$.KeyCode.HOME:
      {
        return html$._KeyName.HOME;
      }
      case html$.KeyCode.INSERT:
      {
        return html$._KeyName.INSERT;
      }
      case html$.KeyCode.LEFT:
      {
        return html$._KeyName.LEFT;
      }
      case html$.KeyCode.META:
      {
        return html$._KeyName.META;
      }
      case html$.KeyCode.NUMLOCK:
      {
        return html$._KeyName.NUM_LOCK;
      }
      case html$.KeyCode.PAGE_DOWN:
      {
        return html$._KeyName.PAGE_DOWN;
      }
      case html$.KeyCode.PAGE_UP:
      {
        return html$._KeyName.PAGE_UP;
      }
      case html$.KeyCode.PAUSE:
      {
        return html$._KeyName.PAUSE;
      }
      case html$.KeyCode.PRINT_SCREEN:
      {
        return html$._KeyName.PRINT_SCREEN;
      }
      case html$.KeyCode.RIGHT:
      {
        return html$._KeyName.RIGHT;
      }
      case html$.KeyCode.SCROLL_LOCK:
      {
        return html$._KeyName.SCROLL;
      }
      case html$.KeyCode.SHIFT:
      {
        return html$._KeyName.SHIFT;
      }
      case html$.KeyCode.SPACE:
      {
        return html$._KeyName.SPACEBAR;
      }
      case html$.KeyCode.TAB:
      {
        return html$._KeyName.TAB;
      }
      case html$.KeyCode.UP:
      {
        return html$._KeyName.UP;
      }
      case html$.KeyCode.WIN_IME:
      case html$.KeyCode.WIN_KEY:
      case html$.KeyCode.WIN_KEY_LEFT:
      case html$.KeyCode.WIN_KEY_RIGHT:
      {
        return html$._KeyName.WIN;
      }
      default:
      {
        return html$._KeyName.UNIDENTIFIED;
      }
    }
    return html$._KeyName.UNIDENTIFIED;
  }
};
dart.setSignature(html$.KeyCode, {
  sfields: () => ({
    WIN_KEY_FF_LINUX: core.int,
    MAC_ENTER: core.int,
    BACKSPACE: core.int,
    TAB: core.int,
    NUM_CENTER: core.int,
    ENTER: core.int,
    SHIFT: core.int,
    CTRL: core.int,
    ALT: core.int,
    PAUSE: core.int,
    CAPS_LOCK: core.int,
    ESC: core.int,
    SPACE: core.int,
    PAGE_UP: core.int,
    PAGE_DOWN: core.int,
    END: core.int,
    HOME: core.int,
    LEFT: core.int,
    UP: core.int,
    RIGHT: core.int,
    DOWN: core.int,
    NUM_NORTH_EAST: core.int,
    NUM_SOUTH_EAST: core.int,
    NUM_SOUTH_WEST: core.int,
    NUM_NORTH_WEST: core.int,
    NUM_WEST: core.int,
    NUM_NORTH: core.int,
    NUM_EAST: core.int,
    NUM_SOUTH: core.int,
    PRINT_SCREEN: core.int,
    INSERT: core.int,
    NUM_INSERT: core.int,
    DELETE: core.int,
    NUM_DELETE: core.int,
    ZERO: core.int,
    ONE: core.int,
    TWO: core.int,
    THREE: core.int,
    FOUR: core.int,
    FIVE: core.int,
    SIX: core.int,
    SEVEN: core.int,
    EIGHT: core.int,
    NINE: core.int,
    FF_SEMICOLON: core.int,
    FF_EQUALS: core.int,
    QUESTION_MARK: core.int,
    A: core.int,
    B: core.int,
    C: core.int,
    D: core.int,
    E: core.int,
    F: core.int,
    G: core.int,
    H: core.int,
    I: core.int,
    J: core.int,
    K: core.int,
    L: core.int,
    M: core.int,
    N: core.int,
    O: core.int,
    P: core.int,
    Q: core.int,
    R: core.int,
    S: core.int,
    T: core.int,
    U: core.int,
    V: core.int,
    W: core.int,
    X: core.int,
    Y: core.int,
    Z: core.int,
    META: core.int,
    WIN_KEY_LEFT: core.int,
    WIN_KEY_RIGHT: core.int,
    CONTEXT_MENU: core.int,
    NUM_ZERO: core.int,
    NUM_ONE: core.int,
    NUM_TWO: core.int,
    NUM_THREE: core.int,
    NUM_FOUR: core.int,
    NUM_FIVE: core.int,
    NUM_SIX: core.int,
    NUM_SEVEN: core.int,
    NUM_EIGHT: core.int,
    NUM_NINE: core.int,
    NUM_MULTIPLY: core.int,
    NUM_PLUS: core.int,
    NUM_MINUS: core.int,
    NUM_PERIOD: core.int,
    NUM_DIVISION: core.int,
    F1: core.int,
    F2: core.int,
    F3: core.int,
    F4: core.int,
    F5: core.int,
    F6: core.int,
    F7: core.int,
    F8: core.int,
    F9: core.int,
    F10: core.int,
    F11: core.int,
    F12: core.int,
    NUMLOCK: core.int,
    SCROLL_LOCK: core.int,
    FIRST_MEDIA_KEY: core.int,
    LAST_MEDIA_KEY: core.int,
    SEMICOLON: core.int,
    DASH: core.int,
    EQUALS: core.int,
    COMMA: core.int,
    PERIOD: core.int,
    SLASH: core.int,
    APOSTROPHE: core.int,
    TILDE: core.int,
    SINGLE_QUOTE: core.int,
    OPEN_SQUARE_BRACKET: core.int,
    BACKSLASH: core.int,
    CLOSE_SQUARE_BRACKET: core.int,
    WIN_KEY: core.int,
    MAC_FF_META: core.int,
    WIN_IME: core.int,
    UNKNOWN: core.int
  }),
  statics: () => ({
    isCharacterKey: dart.definiteFunctionType(core.bool, [core.int]),
    _convertKeyCodeToKeyName: dart.definiteFunctionType(core.String, [core.int])
  }),
  names: ['isCharacterKey', '_convertKeyCodeToKeyName']
});
html$.KeyCode.WIN_KEY_FF_LINUX = 0;
html$.KeyCode.MAC_ENTER = 3;
html$.KeyCode.BACKSPACE = 8;
html$.KeyCode.TAB = 9;
html$.KeyCode.NUM_CENTER = 12;
html$.KeyCode.ENTER = 13;
html$.KeyCode.SHIFT = 16;
html$.KeyCode.CTRL = 17;
html$.KeyCode.ALT = 18;
html$.KeyCode.PAUSE = 19;
html$.KeyCode.CAPS_LOCK = 20;
html$.KeyCode.ESC = 27;
html$.KeyCode.SPACE = 32;
html$.KeyCode.PAGE_UP = 33;
html$.KeyCode.PAGE_DOWN = 34;
html$.KeyCode.END = 35;
html$.KeyCode.HOME = 36;
html$.KeyCode.LEFT = 37;
html$.KeyCode.UP = 38;
html$.KeyCode.RIGHT = 39;
html$.KeyCode.DOWN = 40;
html$.KeyCode.NUM_NORTH_EAST = 33;
html$.KeyCode.NUM_SOUTH_EAST = 34;
html$.KeyCode.NUM_SOUTH_WEST = 35;
html$.KeyCode.NUM_NORTH_WEST = 36;
html$.KeyCode.NUM_WEST = 37;
html$.KeyCode.NUM_NORTH = 38;
html$.KeyCode.NUM_EAST = 39;
html$.KeyCode.NUM_SOUTH = 40;
html$.KeyCode.PRINT_SCREEN = 44;
html$.KeyCode.INSERT = 45;
html$.KeyCode.NUM_INSERT = 45;
html$.KeyCode.DELETE = 46;
html$.KeyCode.NUM_DELETE = 46;
html$.KeyCode.ZERO = 48;
html$.KeyCode.ONE = 49;
html$.KeyCode.TWO = 50;
html$.KeyCode.THREE = 51;
html$.KeyCode.FOUR = 52;
html$.KeyCode.FIVE = 53;
html$.KeyCode.SIX = 54;
html$.KeyCode.SEVEN = 55;
html$.KeyCode.EIGHT = 56;
html$.KeyCode.NINE = 57;
html$.KeyCode.FF_SEMICOLON = 59;
html$.KeyCode.FF_EQUALS = 61;
html$.KeyCode.QUESTION_MARK = 63;
html$.KeyCode.A = 65;
html$.KeyCode.B = 66;
html$.KeyCode.C = 67;
html$.KeyCode.D = 68;
html$.KeyCode.E = 69;
html$.KeyCode.F = 70;
html$.KeyCode.G = 71;
html$.KeyCode.H = 72;
html$.KeyCode.I = 73;
html$.KeyCode.J = 74;
html$.KeyCode.K = 75;
html$.KeyCode.L = 76;
html$.KeyCode.M = 77;
html$.KeyCode.N = 78;
html$.KeyCode.O = 79;
html$.KeyCode.P = 80;
html$.KeyCode.Q = 81;
html$.KeyCode.R = 82;
html$.KeyCode.S = 83;
html$.KeyCode.T = 84;
html$.KeyCode.U = 85;
html$.KeyCode.V = 86;
html$.KeyCode.W = 87;
html$.KeyCode.X = 88;
html$.KeyCode.Y = 89;
html$.KeyCode.Z = 90;
html$.KeyCode.META = 91;
html$.KeyCode.WIN_KEY_LEFT = 91;
html$.KeyCode.WIN_KEY_RIGHT = 92;
html$.KeyCode.CONTEXT_MENU = 93;
html$.KeyCode.NUM_ZERO = 96;
html$.KeyCode.NUM_ONE = 97;
html$.KeyCode.NUM_TWO = 98;
html$.KeyCode.NUM_THREE = 99;
html$.KeyCode.NUM_FOUR = 100;
html$.KeyCode.NUM_FIVE = 101;
html$.KeyCode.NUM_SIX = 102;
html$.KeyCode.NUM_SEVEN = 103;
html$.KeyCode.NUM_EIGHT = 104;
html$.KeyCode.NUM_NINE = 105;
html$.KeyCode.NUM_MULTIPLY = 106;
html$.KeyCode.NUM_PLUS = 107;
html$.KeyCode.NUM_MINUS = 109;
html$.KeyCode.NUM_PERIOD = 110;
html$.KeyCode.NUM_DIVISION = 111;
html$.KeyCode.F1 = 112;
html$.KeyCode.F2 = 113;
html$.KeyCode.F3 = 114;
html$.KeyCode.F4 = 115;
html$.KeyCode.F5 = 116;
html$.KeyCode.F6 = 117;
html$.KeyCode.F7 = 118;
html$.KeyCode.F8 = 119;
html$.KeyCode.F9 = 120;
html$.KeyCode.F10 = 121;
html$.KeyCode.F11 = 122;
html$.KeyCode.F12 = 123;
html$.KeyCode.NUMLOCK = 144;
html$.KeyCode.SCROLL_LOCK = 145;
html$.KeyCode.FIRST_MEDIA_KEY = 166;
html$.KeyCode.LAST_MEDIA_KEY = 183;
html$.KeyCode.SEMICOLON = 186;
html$.KeyCode.DASH = 189;
html$.KeyCode.EQUALS = 187;
html$.KeyCode.COMMA = 188;
html$.KeyCode.PERIOD = 190;
html$.KeyCode.SLASH = 191;
html$.KeyCode.APOSTROPHE = 192;
html$.KeyCode.TILDE = 192;
html$.KeyCode.SINGLE_QUOTE = 222;
html$.KeyCode.OPEN_SQUARE_BRACKET = 219;
html$.KeyCode.BACKSLASH = 220;
html$.KeyCode.CLOSE_SQUARE_BRACKET = 221;
html$.KeyCode.WIN_KEY = 224;
html$.KeyCode.MAC_FF_META = 224;
html$.KeyCode.WIN_IME = 229;
html$.KeyCode.UNKNOWN = -1;
html$.KeyLocation = class KeyLocation extends core.Object {};
dart.setSignature(html$.KeyLocation, {
  sfields: () => ({
    STANDARD: core.int,
    LEFT: core.int,
    RIGHT: core.int,
    NUMPAD: core.int,
    MOBILE: core.int,
    JOYSTICK: core.int
  })
});
html$.KeyLocation.STANDARD = 0;
html$.KeyLocation.LEFT = 1;
html$.KeyLocation.RIGHT = 2;
html$.KeyLocation.NUMPAD = 3;
html$.KeyLocation.MOBILE = 4;
html$.KeyLocation.JOYSTICK = 5;
html$._KeyName = class _KeyName extends core.Object {};
dart.setSignature(html$._KeyName, {
  sfields: () => ({
    ACCEPT: core.String,
    ADD: core.String,
    AGAIN: core.String,
    ALL_CANDIDATES: core.String,
    ALPHANUMERIC: core.String,
    ALT: core.String,
    ALT_GRAPH: core.String,
    APPS: core.String,
    ATTN: core.String,
    BROWSER_BACK: core.String,
    BROWSER_FAVORTIES: core.String,
    BROWSER_FORWARD: core.String,
    BROWSER_NAME: core.String,
    BROWSER_REFRESH: core.String,
    BROWSER_SEARCH: core.String,
    BROWSER_STOP: core.String,
    CAMERA: core.String,
    CAPS_LOCK: core.String,
    CLEAR: core.String,
    CODE_INPUT: core.String,
    COMPOSE: core.String,
    CONTROL: core.String,
    CRSEL: core.String,
    CONVERT: core.String,
    COPY: core.String,
    CUT: core.String,
    DECIMAL: core.String,
    DIVIDE: core.String,
    DOWN: core.String,
    DOWN_LEFT: core.String,
    DOWN_RIGHT: core.String,
    EJECT: core.String,
    END: core.String,
    ENTER: core.String,
    ERASE_EOF: core.String,
    EXECUTE: core.String,
    EXSEL: core.String,
    FN: core.String,
    F1: core.String,
    F2: core.String,
    F3: core.String,
    F4: core.String,
    F5: core.String,
    F6: core.String,
    F7: core.String,
    F8: core.String,
    F9: core.String,
    F10: core.String,
    F11: core.String,
    F12: core.String,
    F13: core.String,
    F14: core.String,
    F15: core.String,
    F16: core.String,
    F17: core.String,
    F18: core.String,
    F19: core.String,
    F20: core.String,
    F21: core.String,
    F22: core.String,
    F23: core.String,
    F24: core.String,
    FINAL_MODE: core.String,
    FIND: core.String,
    FULL_WIDTH: core.String,
    HALF_WIDTH: core.String,
    HANGUL_MODE: core.String,
    HANJA_MODE: core.String,
    HELP: core.String,
    HIRAGANA: core.String,
    HOME: core.String,
    INSERT: core.String,
    JAPANESE_HIRAGANA: core.String,
    JAPANESE_KATAKANA: core.String,
    JAPANESE_ROMAJI: core.String,
    JUNJA_MODE: core.String,
    KANA_MODE: core.String,
    KANJI_MODE: core.String,
    KATAKANA: core.String,
    LAUNCH_APPLICATION_1: core.String,
    LAUNCH_APPLICATION_2: core.String,
    LAUNCH_MAIL: core.String,
    LEFT: core.String,
    MENU: core.String,
    META: core.String,
    MEDIA_NEXT_TRACK: core.String,
    MEDIA_PAUSE_PLAY: core.String,
    MEDIA_PREVIOUS_TRACK: core.String,
    MEDIA_STOP: core.String,
    MODE_CHANGE: core.String,
    NEXT_CANDIDATE: core.String,
    NON_CONVERT: core.String,
    NUM_LOCK: core.String,
    PAGE_DOWN: core.String,
    PAGE_UP: core.String,
    PASTE: core.String,
    PAUSE: core.String,
    PLAY: core.String,
    POWER: core.String,
    PREVIOUS_CANDIDATE: core.String,
    PRINT_SCREEN: core.String,
    PROCESS: core.String,
    PROPS: core.String,
    RIGHT: core.String,
    ROMAN_CHARACTERS: core.String,
    SCROLL: core.String,
    SELECT: core.String,
    SELECT_MEDIA: core.String,
    SEPARATOR: core.String,
    SHIFT: core.String,
    SOFT_1: core.String,
    SOFT_2: core.String,
    SOFT_3: core.String,
    SOFT_4: core.String,
    STOP: core.String,
    SUBTRACT: core.String,
    SYMBOL_LOCK: core.String,
    UP: core.String,
    UP_LEFT: core.String,
    UP_RIGHT: core.String,
    UNDO: core.String,
    VOLUME_DOWN: core.String,
    VOLUMN_MUTE: core.String,
    VOLUMN_UP: core.String,
    WIN: core.String,
    ZOOM: core.String,
    BACKSPACE: core.String,
    TAB: core.String,
    CANCEL: core.String,
    ESC: core.String,
    SPACEBAR: core.String,
    DEL: core.String,
    DEAD_GRAVE: core.String,
    DEAD_EACUTE: core.String,
    DEAD_CIRCUMFLEX: core.String,
    DEAD_TILDE: core.String,
    DEAD_MACRON: core.String,
    DEAD_BREVE: core.String,
    DEAD_ABOVE_DOT: core.String,
    DEAD_UMLAUT: core.String,
    DEAD_ABOVE_RING: core.String,
    DEAD_DOUBLEACUTE: core.String,
    DEAD_CARON: core.String,
    DEAD_CEDILLA: core.String,
    DEAD_OGONEK: core.String,
    DEAD_IOTA: core.String,
    DEAD_VOICED_SOUND: core.String,
    DEC_SEMIVOICED_SOUND: core.String,
    UNIDENTIFIED: core.String
  })
});
html$._KeyName.ACCEPT = "Accept";
html$._KeyName.ADD = "Add";
html$._KeyName.AGAIN = "Again";
html$._KeyName.ALL_CANDIDATES = "AllCandidates";
html$._KeyName.ALPHANUMERIC = "Alphanumeric";
html$._KeyName.ALT = "Alt";
html$._KeyName.ALT_GRAPH = "AltGraph";
html$._KeyName.APPS = "Apps";
html$._KeyName.ATTN = "Attn";
html$._KeyName.BROWSER_BACK = "BrowserBack";
html$._KeyName.BROWSER_FAVORTIES = "BrowserFavorites";
html$._KeyName.BROWSER_FORWARD = "BrowserForward";
html$._KeyName.BROWSER_NAME = "BrowserHome";
html$._KeyName.BROWSER_REFRESH = "BrowserRefresh";
html$._KeyName.BROWSER_SEARCH = "BrowserSearch";
html$._KeyName.BROWSER_STOP = "BrowserStop";
html$._KeyName.CAMERA = "Camera";
html$._KeyName.CAPS_LOCK = "CapsLock";
html$._KeyName.CLEAR = "Clear";
html$._KeyName.CODE_INPUT = "CodeInput";
html$._KeyName.COMPOSE = "Compose";
html$._KeyName.CONTROL = "Control";
html$._KeyName.CRSEL = "Crsel";
html$._KeyName.CONVERT = "Convert";
html$._KeyName.COPY = "Copy";
html$._KeyName.CUT = "Cut";
html$._KeyName.DECIMAL = "Decimal";
html$._KeyName.DIVIDE = "Divide";
html$._KeyName.DOWN = "Down";
html$._KeyName.DOWN_LEFT = "DownLeft";
html$._KeyName.DOWN_RIGHT = "DownRight";
html$._KeyName.EJECT = "Eject";
html$._KeyName.END = "End";
html$._KeyName.ENTER = "Enter";
html$._KeyName.ERASE_EOF = "EraseEof";
html$._KeyName.EXECUTE = "Execute";
html$._KeyName.EXSEL = "Exsel";
html$._KeyName.FN = "Fn";
html$._KeyName.F1 = "F1";
html$._KeyName.F2 = "F2";
html$._KeyName.F3 = "F3";
html$._KeyName.F4 = "F4";
html$._KeyName.F5 = "F5";
html$._KeyName.F6 = "F6";
html$._KeyName.F7 = "F7";
html$._KeyName.F8 = "F8";
html$._KeyName.F9 = "F9";
html$._KeyName.F10 = "F10";
html$._KeyName.F11 = "F11";
html$._KeyName.F12 = "F12";
html$._KeyName.F13 = "F13";
html$._KeyName.F14 = "F14";
html$._KeyName.F15 = "F15";
html$._KeyName.F16 = "F16";
html$._KeyName.F17 = "F17";
html$._KeyName.F18 = "F18";
html$._KeyName.F19 = "F19";
html$._KeyName.F20 = "F20";
html$._KeyName.F21 = "F21";
html$._KeyName.F22 = "F22";
html$._KeyName.F23 = "F23";
html$._KeyName.F24 = "F24";
html$._KeyName.FINAL_MODE = "FinalMode";
html$._KeyName.FIND = "Find";
html$._KeyName.FULL_WIDTH = "FullWidth";
html$._KeyName.HALF_WIDTH = "HalfWidth";
html$._KeyName.HANGUL_MODE = "HangulMode";
html$._KeyName.HANJA_MODE = "HanjaMode";
html$._KeyName.HELP = "Help";
html$._KeyName.HIRAGANA = "Hiragana";
html$._KeyName.HOME = "Home";
html$._KeyName.INSERT = "Insert";
html$._KeyName.JAPANESE_HIRAGANA = "JapaneseHiragana";
html$._KeyName.JAPANESE_KATAKANA = "JapaneseKatakana";
html$._KeyName.JAPANESE_ROMAJI = "JapaneseRomaji";
html$._KeyName.JUNJA_MODE = "JunjaMode";
html$._KeyName.KANA_MODE = "KanaMode";
html$._KeyName.KANJI_MODE = "KanjiMode";
html$._KeyName.KATAKANA = "Katakana";
html$._KeyName.LAUNCH_APPLICATION_1 = "LaunchApplication1";
html$._KeyName.LAUNCH_APPLICATION_2 = "LaunchApplication2";
html$._KeyName.LAUNCH_MAIL = "LaunchMail";
html$._KeyName.LEFT = "Left";
html$._KeyName.MENU = "Menu";
html$._KeyName.META = "Meta";
html$._KeyName.MEDIA_NEXT_TRACK = "MediaNextTrack";
html$._KeyName.MEDIA_PAUSE_PLAY = "MediaPlayPause";
html$._KeyName.MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
html$._KeyName.MEDIA_STOP = "MediaStop";
html$._KeyName.MODE_CHANGE = "ModeChange";
html$._KeyName.NEXT_CANDIDATE = "NextCandidate";
html$._KeyName.NON_CONVERT = "Nonconvert";
html$._KeyName.NUM_LOCK = "NumLock";
html$._KeyName.PAGE_DOWN = "PageDown";
html$._KeyName.PAGE_UP = "PageUp";
html$._KeyName.PASTE = "Paste";
html$._KeyName.PAUSE = "Pause";
html$._KeyName.PLAY = "Play";
html$._KeyName.POWER = "Power";
html$._KeyName.PREVIOUS_CANDIDATE = "PreviousCandidate";
html$._KeyName.PRINT_SCREEN = "PrintScreen";
html$._KeyName.PROCESS = "Process";
html$._KeyName.PROPS = "Props";
html$._KeyName.RIGHT = "Right";
html$._KeyName.ROMAN_CHARACTERS = "RomanCharacters";
html$._KeyName.SCROLL = "Scroll";
html$._KeyName.SELECT = "Select";
html$._KeyName.SELECT_MEDIA = "SelectMedia";
html$._KeyName.SEPARATOR = "Separator";
html$._KeyName.SHIFT = "Shift";
html$._KeyName.SOFT_1 = "Soft1";
html$._KeyName.SOFT_2 = "Soft2";
html$._KeyName.SOFT_3 = "Soft3";
html$._KeyName.SOFT_4 = "Soft4";
html$._KeyName.STOP = "Stop";
html$._KeyName.SUBTRACT = "Subtract";
html$._KeyName.SYMBOL_LOCK = "SymbolLock";
html$._KeyName.UP = "Up";
html$._KeyName.UP_LEFT = "UpLeft";
html$._KeyName.UP_RIGHT = "UpRight";
html$._KeyName.UNDO = "Undo";
html$._KeyName.VOLUME_DOWN = "VolumeDown";
html$._KeyName.VOLUMN_MUTE = "VolumeMute";
html$._KeyName.VOLUMN_UP = "VolumeUp";
html$._KeyName.WIN = "Win";
html$._KeyName.ZOOM = "Zoom";
html$._KeyName.BACKSPACE = "Backspace";
html$._KeyName.TAB = "Tab";
html$._KeyName.CANCEL = "Cancel";
html$._KeyName.ESC = "Esc";
html$._KeyName.SPACEBAR = "Spacebar";
html$._KeyName.DEL = "Del";
html$._KeyName.DEAD_GRAVE = "DeadGrave";
html$._KeyName.DEAD_EACUTE = "DeadEacute";
html$._KeyName.DEAD_CIRCUMFLEX = "DeadCircumflex";
html$._KeyName.DEAD_TILDE = "DeadTilde";
html$._KeyName.DEAD_MACRON = "DeadMacron";
html$._KeyName.DEAD_BREVE = "DeadBreve";
html$._KeyName.DEAD_ABOVE_DOT = "DeadAboveDot";
html$._KeyName.DEAD_UMLAUT = "DeadUmlaut";
html$._KeyName.DEAD_ABOVE_RING = "DeadAboveRing";
html$._KeyName.DEAD_DOUBLEACUTE = "DeadDoubleacute";
html$._KeyName.DEAD_CARON = "DeadCaron";
html$._KeyName.DEAD_CEDILLA = "DeadCedilla";
html$._KeyName.DEAD_OGONEK = "DeadOgonek";
html$._KeyName.DEAD_IOTA = "DeadIota";
html$._KeyName.DEAD_VOICED_SOUND = "DeadVoicedSound";
html$._KeyName.DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
html$._KeyName.UNIDENTIFIED = "Unidentified";
const _stream$0 = Symbol('_stream');
const _keyDownList = Symbol('_keyDownList');
const _capsLockOn = Symbol('_capsLockOn');
const _determineKeyCodeForKeypress = Symbol('_determineKeyCodeForKeypress');
const _findCharCodeKeyDown = Symbol('_findCharCodeKeyDown');
const _firesKeyPressEvent = Symbol('_firesKeyPressEvent');
const _normalizeKeyCodes = Symbol('_normalizeKeyCodes');
html$._KeyboardEventHandler = class _KeyboardEventHandler extends html$.EventStreamProvider$(html$.KeyEvent) {
  forTarget(e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    let handler = new html$._KeyboardEventHandler.initializeAllEventListeners(this[_type$], e);
    return handler[_stream$0];
  }
  new(type) {
    this[_keyDownList] = JSArrayOfKeyEvent().of([]);
    this[_type$] = type;
    this[_stream$0] = new html$._CustomKeyEventStreamImpl('event');
    this[_target$0] = null;
    super.new(html$._KeyboardEventHandler._EVENT_TYPE);
  }
  initializeAllEventListeners(type, target) {
    this[_keyDownList] = JSArrayOfKeyEvent().of([]);
    this[_type$] = type;
    this[_target$0] = target;
    this[_stream$0] = null;
    super.new(html$._KeyboardEventHandler._EVENT_TYPE);
    html$.Element.keyDownEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
    html$.Element.keyPressEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
    html$.Element.keyUpEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
    this[_stream$0] = new html$._CustomKeyEventStreamImpl(this[_type$]);
  }
  get [_capsLockOn]() {
    return this[_keyDownList][dartx.any](dart.fn(element => element.keyCode == html$.KeyCode.CAPS_LOCK, KeyEventTobool()));
  }
  [_determineKeyCodeForKeypress](event) {
    for (let prevEvent of this[_keyDownList]) {
      if (prevEvent[_shadowCharCode] == event[dartx.charCode]) {
        return prevEvent.keyCode;
      }
      if ((dart.test(event[dartx.shiftKey]) || dart.test(this[_capsLockOn])) && dart.notNull(event[dartx.charCode]) >= dart.notNull("A"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) <= dart.notNull("Z"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) == prevEvent[_shadowCharCode]) {
        return prevEvent.keyCode;
      }
    }
    return html$.KeyCode.UNKNOWN;
  }
  [_findCharCodeKeyDown](event) {
    if (event[dartx.keyLocation] == 3) {
      switch (event[dartx.keyCode]) {
        case html$.KeyCode.NUM_ZERO:
        {
          return html$.KeyCode.ZERO;
        }
        case html$.KeyCode.NUM_ONE:
        {
          return html$.KeyCode.ONE;
        }
        case html$.KeyCode.NUM_TWO:
        {
          return html$.KeyCode.TWO;
        }
        case html$.KeyCode.NUM_THREE:
        {
          return html$.KeyCode.THREE;
        }
        case html$.KeyCode.NUM_FOUR:
        {
          return html$.KeyCode.FOUR;
        }
        case html$.KeyCode.NUM_FIVE:
        {
          return html$.KeyCode.FIVE;
        }
        case html$.KeyCode.NUM_SIX:
        {
          return html$.KeyCode.SIX;
        }
        case html$.KeyCode.NUM_SEVEN:
        {
          return html$.KeyCode.SEVEN;
        }
        case html$.KeyCode.NUM_EIGHT:
        {
          return html$.KeyCode.EIGHT;
        }
        case html$.KeyCode.NUM_NINE:
        {
          return html$.KeyCode.NINE;
        }
        case html$.KeyCode.NUM_MULTIPLY:
        {
          return 42;
        }
        case html$.KeyCode.NUM_PLUS:
        {
          return 43;
        }
        case html$.KeyCode.NUM_MINUS:
        {
          return 45;
        }
        case html$.KeyCode.NUM_PERIOD:
        {
          return 46;
        }
        case html$.KeyCode.NUM_DIVISION:
        {
          return 47;
        }
      }
    } else if (dart.notNull(event[dartx.keyCode]) >= 65 && dart.notNull(event[dartx.keyCode]) <= 90) {
      return dart.notNull(event[dartx.keyCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
    }
    switch (event[dartx.keyCode]) {
      case html$.KeyCode.SEMICOLON:
      {
        return html$.KeyCode.FF_SEMICOLON;
      }
      case html$.KeyCode.EQUALS:
      {
        return html$.KeyCode.FF_EQUALS;
      }
      case html$.KeyCode.COMMA:
      {
        return 44;
      }
      case html$.KeyCode.DASH:
      {
        return 45;
      }
      case html$.KeyCode.PERIOD:
      {
        return 46;
      }
      case html$.KeyCode.SLASH:
      {
        return 47;
      }
      case html$.KeyCode.APOSTROPHE:
      {
        return 96;
      }
      case html$.KeyCode.OPEN_SQUARE_BRACKET:
      {
        return 91;
      }
      case html$.KeyCode.BACKSLASH:
      {
        return 92;
      }
      case html$.KeyCode.CLOSE_SQUARE_BRACKET:
      {
        return 93;
      }
      case html$.KeyCode.SINGLE_QUOTE:
      {
        return 39;
      }
    }
    return event[dartx.keyCode];
  }
  [_firesKeyPressEvent](event) {
    if (!dart.test(html_common.Device.isIE) && !dart.test(html_common.Device.isWebKit)) {
      return true;
    }
    if (dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && dart.test(event.altKey)) {
      return html$.KeyCode.isCharacterKey(event.keyCode);
    }
    if (dart.test(event.altKey) && !dart.test(event.ctrlKey)) {
      return false;
    }
    if (!dart.test(event.shiftKey) && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META)) {
      return false;
    }
    if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode == html$.KeyCode.BACKSLASH || event.keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode == html$.KeyCode.TILDE || event.keyCode == html$.KeyCode.SEMICOLON || event.keyCode == html$.KeyCode.DASH || event.keyCode == html$.KeyCode.EQUALS || event.keyCode == html$.KeyCode.COMMA || event.keyCode == html$.KeyCode.PERIOD || event.keyCode == html$.KeyCode.SLASH || event.keyCode == html$.KeyCode.APOSTROPHE || event.keyCode == html$.KeyCode.SINGLE_QUOTE)) {
      return false;
    }
    switch (event.keyCode) {
      case html$.KeyCode.ENTER:
      {
        return !dart.test(html_common.Device.isIE);
      }
      case html$.KeyCode.ESC:
      {
        return !dart.test(html_common.Device.isWebKit);
      }
    }
    return html$.KeyCode.isCharacterKey(event.keyCode);
  }
  [_normalizeKeyCodes](event) {
    if (dart.test(html_common.Device.isFirefox)) {
      switch (event[dartx.keyCode]) {
        case html$.KeyCode.FF_EQUALS:
        {
          return html$.KeyCode.EQUALS;
        }
        case html$.KeyCode.FF_SEMICOLON:
        {
          return html$.KeyCode.SEMICOLON;
        }
        case html$.KeyCode.MAC_FF_META:
        {
          return html$.KeyCode.META;
        }
        case html$.KeyCode.WIN_KEY_FF_LINUX:
        {
          return html$.KeyCode.WIN_KEY;
        }
      }
    }
    return event[dartx.keyCode];
  }
  processKeyDown(e) {
    if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL && !dart.test(e[dartx.ctrlKey]) || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT && !dart.test(e[dartx.altKey]) || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META && !dart.test(e[dartx.metaKey]))) {
      this[_keyDownList][dartx.clear]();
    }
    let event = new html$.KeyEvent.wrap(e);
    event[_shadowKeyCode] = this[_normalizeKeyCodes](event);
    event[_shadowCharCode] = this[_findCharCodeKeyDown](event);
    if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && event.keyCode != this[_keyDownList][dartx.last].keyCode && !dart.test(this[_firesKeyPressEvent](event))) {
      this.processKeyPress(e);
    }
    this[_keyDownList][dartx.add](event);
    this[_stream$0].add(event);
  }
  processKeyPress(event) {
    let e = new html$.KeyEvent.wrap(event);
    if (dart.test(html_common.Device.isIE)) {
      if (e.keyCode == html$.KeyCode.ENTER || e.keyCode == html$.KeyCode.ESC) {
        e[_shadowCharCode] = 0;
      } else {
        e[_shadowCharCode] = e.keyCode;
      }
    } else if (dart.test(html_common.Device.isOpera)) {
      e[_shadowCharCode] = dart.test(html$.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
    }
    e[_shadowKeyCode] = this[_determineKeyCodeForKeypress](e);
    if (e[_shadowKeyIdentifier] != null && dart.test(html$._KeyboardEventHandler._keyIdentifier[dartx.containsKey](e[_shadowKeyIdentifier]))) {
      e[_shadowKeyCode] = html$._KeyboardEventHandler._keyIdentifier[dartx._get](e[_shadowKeyIdentifier]);
    }
    e[_shadowAltKey] = this[_keyDownList][dartx.any](dart.fn(element => element.altKey, KeyEventTobool()));
    this[_stream$0].add(e);
  }
  processKeyUp(event) {
    let e = new html$.KeyEvent.wrap(event);
    let toRemove = null;
    for (let key of this[_keyDownList]) {
      if (key.keyCode == e.keyCode) {
        toRemove = key;
      }
    }
    if (toRemove != null) {
      this[_keyDownList][dartx.removeWhere](dart.fn(element => dart.equals(element, toRemove), KeyEventTobool()));
    } else if (dart.notNull(this[_keyDownList][dartx.length]) > 0) {
      this[_keyDownList][dartx.removeLast]();
    }
    this[_stream$0].add(e);
  }
};
dart.addSimpleTypeTests(html$._KeyboardEventHandler);
dart.defineNamedConstructor(html$._KeyboardEventHandler, 'initializeAllEventListeners');
dart.setSignature(html$._KeyboardEventHandler, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String]),
    initializeAllEventListeners: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String, html$.EventTarget])
  }),
  fields: () => ({
    [_keyDownList]: ListOfKeyEvent(),
    [_type$]: core.String,
    [_target$0]: html$.EventTarget,
    [_stream$0]: html$._CustomKeyEventStreamImpl
  }),
  getters: () => ({[_capsLockOn]: dart.definiteFunctionType(core.bool, [])}),
  methods: () => ({
    forTarget: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget], {useCapture: core.bool}),
    [_determineKeyCodeForKeypress]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
    [_findCharCodeKeyDown]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
    [_firesKeyPressEvent]: dart.definiteFunctionType(core.bool, [html$.KeyEvent]),
    [_normalizeKeyCodes]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
    processKeyDown: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
    processKeyPress: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
    processKeyUp: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent])
  }),
  sfields: () => ({
    _ROMAN_ALPHABET_OFFSET: core.int,
    _EVENT_TYPE: core.String,
    _keyIdentifier: MapOfString$int()
  })
});
html$._KeyboardEventHandler._EVENT_TYPE = 'KeyEvent';
html$._KeyboardEventHandler._keyIdentifier = dart.const(dart.map({Up: html$.KeyCode.UP, Down: html$.KeyCode.DOWN, Left: html$.KeyCode.LEFT, Right: html$.KeyCode.RIGHT, Enter: html$.KeyCode.ENTER, F1: html$.KeyCode.F1, F2: html$.KeyCode.F2, F3: html$.KeyCode.F3, F4: html$.KeyCode.F4, F5: html$.KeyCode.F5, F6: html$.KeyCode.F6, F7: html$.KeyCode.F7, F8: html$.KeyCode.F8, F9: html$.KeyCode.F9, F10: html$.KeyCode.F10, F11: html$.KeyCode.F11, F12: html$.KeyCode.F12, 'U+007F': html$.KeyCode.DELETE, Home: html$.KeyCode.HOME, End: html$.KeyCode.END, PageUp: html$.KeyCode.PAGE_UP, PageDown: html$.KeyCode.PAGE_DOWN, Insert: html$.KeyCode.INSERT}, core.String, core.int));
dart.defineLazy(html$._KeyboardEventHandler, {
  get _ROMAN_ALPHABET_OFFSET() {
    return dart.notNull("a"[dartx.codeUnits][dartx._get](0)) - dart.notNull("A"[dartx.codeUnits][dartx._get](0));
  }
});
html$.KeyboardEventStream = class KeyboardEventStream extends core.Object {
  static onKeyPress(target) {
    return new html$._KeyboardEventHandler('keypress').forTarget(target);
  }
  static onKeyUp(target) {
    return new html$._KeyboardEventHandler('keyup').forTarget(target);
  }
  static onKeyDown(target) {
    return new html$._KeyboardEventHandler('keydown').forTarget(target);
  }
};
dart.setSignature(html$.KeyboardEventStream, {
  statics: () => ({
    onKeyPress: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
    onKeyUp: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
    onKeyDown: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget])
  }),
  names: ['onKeyPress', 'onKeyUp', 'onKeyDown']
});
const _validators = Symbol('_validators');
html$.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
  new() {
    this[_validators] = JSArrayOfNodeValidator().of([]);
  }
  common() {
    this[_validators] = JSArrayOfNodeValidator().of([]);
    this.allowHtml5();
    this.allowTemplating();
  }
  allowNavigation(uriPolicy) {
    if (uriPolicy === void 0) uriPolicy = null;
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(html$._SimpleNodeValidator.allowNavigation(uriPolicy));
  }
  allowImages(uriPolicy) {
    if (uriPolicy === void 0) uriPolicy = null;
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(html$._SimpleNodeValidator.allowImages(uriPolicy));
  }
  allowTextElements() {
    this.add(html$._SimpleNodeValidator.allowTextElements());
  }
  allowInlineStyles(opts) {
    let tagName = opts && 'tagName' in opts ? opts.tagName : null;
    if (tagName == null) {
      tagName = '*';
    } else {
      tagName = tagName[dartx.toUpperCase]();
    }
    this.add(new html$._SimpleNodeValidator(null, {allowedAttributes: JSArrayOfString().of([dart.str`${tagName}::style`])}));
  }
  allowHtml5(opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    this.add(new html$._Html5NodeValidator({uriPolicy: uriPolicy}));
  }
  allowSvg() {
    this.add(new html$._SvgNodeValidator());
  }
  allowCustomElement(tagName, opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
    let tagNameUpper = tagName[dartx.toUpperCase]();
    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
  }
  allowTagExtension(tagName, baseName, opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
    let baseNameUpper = baseName[dartx.toUpperCase]();
    let tagNameUpper = tagName[dartx.toUpperCase]();
    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
  }
  allowElement(tagName, opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
    this.allowCustomElement(tagName, {uriPolicy: uriPolicy, attributes: attributes, uriAttributes: uriAttributes});
  }
  allowTemplating() {
    this.add(new html$._TemplatingNodeValidator());
  }
  add(validator) {
    this[_validators][dartx.add](validator);
  }
  allowsElement(element) {
    return this[_validators][dartx.any](dart.fn(v => v.allowsElement(element), NodeValidatorTobool()));
  }
  allowsAttribute(element, attributeName, value) {
    return this[_validators][dartx.any](dart.fn(v => v.allowsAttribute(element, attributeName, value), NodeValidatorTobool()));
  }
};
dart.defineNamedConstructor(html$.NodeValidatorBuilder, 'common');
html$.NodeValidatorBuilder[dart.implements] = () => [html$.NodeValidator];
dart.setSignature(html$.NodeValidatorBuilder, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.NodeValidatorBuilder, []),
    common: dart.definiteFunctionType(html$.NodeValidatorBuilder, [])
  }),
  fields: () => ({[_validators]: ListOfNodeValidator()}),
  methods: () => ({
    allowNavigation: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
    allowImages: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
    allowTextElements: dart.definiteFunctionType(dart.void, []),
    allowInlineStyles: dart.definiteFunctionType(dart.void, [], {tagName: core.String}),
    allowHtml5: dart.definiteFunctionType(dart.void, [], {uriPolicy: html$.UriPolicy}),
    allowSvg: dart.definiteFunctionType(dart.void, []),
    allowCustomElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
    allowTagExtension: dart.definiteFunctionType(dart.void, [core.String, core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
    allowElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
    allowTemplating: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [html$.NodeValidator]),
    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
  })
});
let const$83;
let const$84;
let const$85;
let const$86;
let const$87;
let const$88;
let const$89;
let const$90;
let const$91;
let const$92;
html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
  static allowNavigation(uriPolicy) {
    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
  }
  static allowImages(uriPolicy) {
    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
  }
  static allowTextElements() {
    return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
  }
  new(uriPolicy, opts) {
    let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
    let allowedAttributes = opts && 'allowedAttributes' in opts ? opts.allowedAttributes : null;
    let allowedUriAttributes = opts && 'allowedUriAttributes' in opts ? opts.allowedUriAttributes : null;
    this.allowedElements = SetOfString().new();
    this.allowedAttributes = SetOfString().new();
    this.allowedUriAttributes = SetOfString().new();
    this.uriPolicy = uriPolicy;
    this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
    allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
    let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
    let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
    this.allowedAttributes.addAll(legalAttributes);
    this.allowedUriAttributes.addAll(allowedUriAttributes);
    this.allowedUriAttributes.addAll(extraUriAttributes);
  }
  allowsElement(element) {
    return this.allowedElements.contains(html$.Element._safeTagName(element));
  }
  allowsAttribute(element, attributeName, value) {
    let tagName = html$.Element._safeTagName(element);
    if (dart.test(this.allowedUriAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
      return this.uriPolicy.allowsUri(value);
    } else if (dart.test(this.allowedUriAttributes.contains(dart.str`*::${attributeName}`))) {
      return this.uriPolicy.allowsUri(value);
    } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
      return true;
    } else if (dart.test(this.allowedAttributes.contains(dart.str`*::${attributeName}`))) {
      return true;
    } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::*`))) {
      return true;
    } else if (dart.test(this.allowedAttributes.contains('*::*'))) {
      return true;
    }
    return false;
  }
};
html$._SimpleNodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setSignature(html$._SimpleNodeValidator, {
  constructors: () => ({
    allowNavigation: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
    allowImages: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
    allowTextElements: dart.definiteFunctionType(html$._SimpleNodeValidator, []),
    new: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy], {allowedElements: IterableOfString(), allowedAttributes: IterableOfString(), allowedUriAttributes: IterableOfString()})
  }),
  fields: () => ({
    allowedElements: SetOfString(),
    allowedAttributes: SetOfString(),
    allowedUriAttributes: SetOfString(),
    uriPolicy: html$.UriPolicy
  }),
  methods: () => ({
    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
  })
});
html$._CustomElementNodeValidator = class _CustomElementNodeValidator extends html$._SimpleNodeValidator {
  new(uriPolicy, allowedElements, allowedAttributes, allowedUriAttributes, allowTypeExtension, allowCustomTag) {
    this.allowTypeExtension = allowTypeExtension == true;
    this.allowCustomTag = allowCustomTag == true;
    super.new(uriPolicy, {allowedElements: allowedElements, allowedAttributes: allowedAttributes, allowedUriAttributes: allowedUriAttributes});
  }
  allowsElement(element) {
    if (dart.test(this.allowTypeExtension)) {
      let isAttr = element[dartx.attributes][dartx._get]('is');
      if (isAttr != null) {
        return dart.test(this.allowedElements.contains(isAttr[dartx.toUpperCase]())) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
      }
    }
    return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
  }
  allowsAttribute(element, attributeName, value) {
    if (dart.test(this.allowsElement(element))) {
      if (dart.test(this.allowTypeExtension) && attributeName == 'is' && dart.test(this.allowedElements.contains(value[dartx.toUpperCase]()))) {
        return true;
      }
      return super.allowsAttribute(element, attributeName, value);
    }
    return false;
  }
};
dart.setSignature(html$._CustomElementNodeValidator, {
  constructors: () => ({new: dart.definiteFunctionType(html$._CustomElementNodeValidator, [html$.UriPolicy, IterableOfString(), IterableOfString(), IterableOfString(), core.bool, core.bool])}),
  fields: () => ({
    allowTypeExtension: core.bool,
    allowCustomTag: core.bool
  })
});
const _templateAttrs = Symbol('_templateAttrs');
html$._TemplatingNodeValidator = class _TemplatingNodeValidator extends html$._SimpleNodeValidator {
  new() {
    this[_templateAttrs] = SetOfString().from(html$._TemplatingNodeValidator._TEMPLATE_ATTRS);
    super.new(null, {allowedElements: JSArrayOfString().of(['TEMPLATE']), allowedAttributes: html$._TemplatingNodeValidator._TEMPLATE_ATTRS[dartx.map](core.String)(dart.fn(attr => dart.str`TEMPLATE::${attr}`, StringToString$()))});
  }
  allowsAttribute(element, attributeName, value) {
    if (dart.test(super.allowsAttribute(element, attributeName, value))) {
      return true;
    }
    if (attributeName == 'template' && value == "") {
      return true;
    }
    if (element[dartx.attributes][dartx._get]('template') == "") {
      return this[_templateAttrs].contains(attributeName);
    }
    return false;
  }
};
dart.setSignature(html$._TemplatingNodeValidator, {
  constructors: () => ({new: dart.definiteFunctionType(html$._TemplatingNodeValidator, [])}),
  fields: () => ({[_templateAttrs]: SetOfString()}),
  sfields: () => ({_TEMPLATE_ATTRS: ListOfString()})
});
html$._TemplatingNodeValidator._TEMPLATE_ATTRS = dart.constList(['bind', 'if', 'ref', 'repeat', 'syntax'], core.String);
html$._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
  allowsElement(element) {
    if (svg$.ScriptElement.is(element)) {
      return false;
    }
    if (svg$.SvgElement.is(element) && html$.Element._safeTagName(element) == 'foreignObject') {
      return false;
    }
    if (svg$.SvgElement.is(element)) {
      return true;
    }
    return false;
  }
  allowsAttribute(element, attributeName, value) {
    if (attributeName == 'is' || dart.test(attributeName[dartx.startsWith]('on'))) {
      return false;
    }
    return this.allowsElement(element);
  }
};
html$._SvgNodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setSignature(html$._SvgNodeValidator, {
  methods: () => ({
    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
  })
});
html$.ReadyState = class ReadyState extends core.Object {};
dart.setSignature(html$.ReadyState, {
  sfields: () => ({
    LOADING: core.String,
    INTERACTIVE: core.String,
    COMPLETE: core.String
  })
});
html$.ReadyState.LOADING = "loading";
html$.ReadyState.INTERACTIVE = "interactive";
html$.ReadyState.COMPLETE = "complete";
const _list$ = Symbol('_list');
html$._WrappedList$ = dart.generic(E => {
  let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html$._WrappedIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
  class _WrappedList extends collection.ListBase$(E) {
    new(list) {
      this[_list$] = list;
    }
    get iterator() {
      return new (_WrappedIteratorOfE())(this[_list$][dartx.iterator]);
    }
    get length() {
      return this[_list$][dartx.length];
    }
    add(element) {
      E._check(element);
      this[_list$][dartx.add](element);
    }
    remove(element) {
      return this[_list$][dartx.remove](element);
    }
    clear() {
      this[_list$][dartx.clear]();
    }
    _get(index) {
      return html$._downcast(html$.Node, E)(this[_list$][dartx._get](index));
    }
    _set(index, value) {
      E._check(value);
      this[_list$][dartx._set](index, value);
      return value;
    }
    set length(newLength) {
      this[_list$][dartx.length] = newLength;
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      this[_list$][dartx.sort](dart.fn((a, b) => compare(html$._downcast(html$.Node, E)(a), html$._downcast(html$.Node, E)(b)), NodeAndNodeToint()));
    }
    indexOf(element, start) {
      if (start === void 0) start = 0;
      return this[_list$][dartx.indexOf](html$.Node._check(element), start);
    }
    lastIndexOf(element, start) {
      if (start === void 0) start = null;
      return this[_list$][dartx.lastIndexOf](html$.Node._check(element), start);
    }
    insert(index, element) {
      E._check(element);
      return this[_list$][dartx.insert](index, element);
    }
    removeAt(index) {
      return html$._downcast(html$.Node, E)(this[_list$][dartx.removeAt](index));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      this[_list$][dartx.setRange](start, end, iterable, skipCount);
    }
    removeRange(start, end) {
      this[_list$][dartx.removeRange](start, end);
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      this[_list$][dartx.replaceRange](start, end, iterable);
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      this[_list$][dartx.fillRange](start, end, fillValue);
    }
    get rawList() {
      return this[_list$];
    }
  }
  _WrappedList[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setSignature(_WrappedList, {
    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedList$(E), [ListOfNode()])}),
    fields: () => ({[_list$]: ListOfNode()}),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      _get: dart.definiteFunctionType(E, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, E])
    })
  });
  dart.defineExtensionMembers(_WrappedList, [
    'add',
    'remove',
    'clear',
    '_get',
    '_set',
    'sort',
    'indexOf',
    'lastIndexOf',
    'insert',
    'removeAt',
    'setRange',
    'removeRange',
    'replaceRange',
    'fillRange',
    'iterator',
    'length',
    'length'
  ]);
  return _WrappedList;
});
html$._WrappedList = _WrappedList();
const _iterator$1 = Symbol('_iterator');
html$._WrappedIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class _WrappedIterator extends core.Object {
    new(iterator) {
      this[_iterator$1] = iterator;
    }
    moveNext() {
      return this[_iterator$1].moveNext();
    }
    get current() {
      return html$._downcast(html$.Node, E)(this[_iterator$1].current);
    }
  }
  dart.addTypeTests(_WrappedIterator);
  _WrappedIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_WrappedIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedIterator$(E), [IteratorOfNode()])}),
    fields: () => ({[_iterator$1]: IteratorOfNode()}),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _WrappedIterator;
});
html$._WrappedIterator = _WrappedIterator();
html$._downcast = function(From, To) {
  return x => {
    return To._check(x);
  };
};
dart.fn(html$._downcast, FromToTo());
html$._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
  static get(url, onComplete, withCredentials) {
    let request = html$.HttpRequest.new();
    request[dartx.open]('GET', url, {async: true});
    request[dartx.withCredentials] = withCredentials;
    request[dartx.onReadyStateChange].listen(dart.fn(e => {
      if (request[dartx.readyState] == html$.HttpRequest.DONE) {
        onComplete(request);
      }
    }, ProgressEventToNull()));
    request[dartx.send]();
    return request;
  }
};
dart.setSignature(html$._HttpRequestUtils, {
  statics: () => ({get: dart.definiteFunctionType(html$.HttpRequest, [core.String, HttpRequestTodynamic(), core.bool])}),
  names: ['get']
});
const _array = Symbol('_array');
const _current$4 = Symbol('_current');
html$.FixedSizeListIterator$ = dart.generic(T => {
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  class FixedSizeListIterator extends core.Object {
    new(array) {
      this[_array] = array;
      this[_position$1] = -1;
      this[_length$3] = array[dartx.length];
      this[_current$4] = null;
    }
    moveNext() {
      let nextPosition = dart.notNull(this[_position$1]) + 1;
      if (nextPosition < dart.notNull(this[_length$3])) {
        this[_current$4] = this[_array][dartx._get](nextPosition);
        this[_position$1] = nextPosition;
        return true;
      }
      this[_current$4] = null;
      this[_position$1] = this[_length$3];
      return false;
    }
    get current() {
      return this[_current$4];
    }
  }
  dart.addTypeTests(FixedSizeListIterator);
  FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(FixedSizeListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html$.FixedSizeListIterator$(T), [ListOfT()])}),
    fields: () => ({
      [_array]: ListOfT(),
      [_length$3]: core.int,
      [_position$1]: core.int,
      [_current$4]: T
    }),
    getters: () => ({current: dart.definiteFunctionType(T, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return FixedSizeListIterator;
});
html$.FixedSizeListIterator = FixedSizeListIterator();
html$._VariableSizeListIterator$ = dart.generic(T => {
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  class _VariableSizeListIterator extends core.Object {
    new(array) {
      this[_array] = array;
      this[_position$1] = -1;
      this[_current$4] = null;
    }
    moveNext() {
      let nextPosition = dart.notNull(this[_position$1]) + 1;
      if (nextPosition < dart.notNull(this[_array][dartx.length])) {
        this[_current$4] = this[_array][dartx._get](nextPosition);
        this[_position$1] = nextPosition;
        return true;
      }
      this[_current$4] = null;
      this[_position$1] = this[_array][dartx.length];
      return false;
    }
    get current() {
      return this[_current$4];
    }
  }
  dart.addTypeTests(_VariableSizeListIterator);
  _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(_VariableSizeListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._VariableSizeListIterator$(T), [ListOfT()])}),
    fields: () => ({
      [_array]: ListOfT(),
      [_position$1]: core.int,
      [_current$4]: T
    }),
    getters: () => ({current: dart.definiteFunctionType(T, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _VariableSizeListIterator;
});
html$._VariableSizeListIterator = _VariableSizeListIterator();
html$._convertNativeToDart_Window = function(win) {
  if (win == null) return null;
  return html$._DOMWindowCrossFrame._createSafe(win);
};
dart.fn(html$._convertNativeToDart_Window, dynamicToWindowBase());
html$._convertNativeToDart_EventTarget = function(e) {
  if (e == null) {
    return null;
  }
  if ("postMessage" in e) {
    let window = html$._DOMWindowCrossFrame._createSafe(e);
    if (html$.EventTarget.is(window)) {
      return window;
    }
    return null;
  } else
    return html$.EventTarget._check(e);
};
dart.fn(html$._convertNativeToDart_EventTarget, dynamicToEventTarget());
const _window = Symbol('_window');
html$._convertDartToNative_EventTarget = function(e) {
  if (html$._DOMWindowCrossFrame.is(e)) {
    return html$.EventTarget._check(e[_window]);
  } else {
    return html$.EventTarget._check(e);
  }
};
dart.fn(html$._convertDartToNative_EventTarget, dynamicToEventTarget());
html$._convertNativeToDart_XHR_Response = function(o) {
  if (html$.Document.is(o)) {
    return o;
  }
  return html_common.convertNativeToDart_SerializedScriptValue(o);
};
dart.fn(html$._convertNativeToDart_XHR_Response, dynamicTodynamic$());
html$._callConstructor = function(constructor, interceptor) {
  return dart.fn(receiver => {
    _js_helper.setNativeSubclassDispatchRecord(receiver, interceptor);
    receiver.constructor = receiver.__proto__.constructor;
    return constructor(receiver);
  }, dynamicTodynamic$());
};
dart.fn(html$._callConstructor, dynamicAnddynamicTodynamic$());
html$._callAttached = function(receiver) {
  return dart.dsend(receiver, 'attached');
};
dart.fn(html$._callAttached, dynamicTodynamic$());
html$._callDetached = function(receiver) {
  return dart.dsend(receiver, 'detached');
};
dart.fn(html$._callDetached, dynamicTodynamic$());
html$._callAttributeChanged = function(receiver, name, oldValue, newValue) {
  return dart.dsend(receiver, 'attributeChanged', name, oldValue, newValue);
};
dart.fn(html$._callAttributeChanged, dynamicAnddynamicAnddynamic__Todynamic());
html$._makeCallbackMethod = function(callback) {
  return (function(invokeCallback) {
    return function() {
      return invokeCallback(this);
    };
  })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 1));
};
dart.fn(html$._makeCallbackMethod, dynamicTodynamic$());
html$._makeCallbackMethod3 = function(callback) {
  return (function(invokeCallback) {
    return function(arg1, arg2, arg3) {
      return invokeCallback(this, arg1, arg2, arg3);
    };
  })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 4));
};
dart.fn(html$._makeCallbackMethod3, dynamicTodynamic$());
html$._registerCustomElement = function(context, document, tag, type, extendsTagName) {
  let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
  if (interceptorClass == null) {
    dart.throw(new core.ArgumentError(type));
  }
  let interceptor = interceptorClass.prototype;
  let constructor = _interceptors.findConstructorForNativeSubclassType(type, 'created');
  if (constructor == null) {
    dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
  }
  _interceptors.getNativeInterceptor(html$.Element.tag('article'));
  let baseClassName = core.String._check(_js_helper.findDispatchTagForInterceptorClass(interceptorClass));
  if (baseClassName == null) {
    dart.throw(new core.ArgumentError(type));
  }
  if (extendsTagName == null) {
    if (baseClassName != 'HTMLElement') {
      dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
    }
  } else {
    if (!(document.createElement(extendsTagName) instanceof window[baseClassName])) {
      dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
    }
  }
  let baseConstructor = context[baseClassName];
  let properties = {};
  properties.createdCallback = {value: html$._makeCallbackMethod(html$._callConstructor(constructor, interceptor))};
  properties.attachedCallback = {value: html$._makeCallbackMethod(html$._callAttached)};
  properties.detachedCallback = {value: html$._makeCallbackMethod(html$._callDetached)};
  properties.attributeChangedCallback = {value: html$._makeCallbackMethod3(html$._callAttributeChanged)};
  let baseProto = baseConstructor.prototype;
  let proto = Object.create(baseProto, properties);
  _js_helper.setNativeSubclassDispatchRecord(proto, interceptor);
  let options = {prototype: proto};
  if (extendsTagName != null) {
    options.extends = extendsTagName;
  }
  document.registerElement(tag, options);
};
dart.fn(html$._registerCustomElement, dynamicAnddynamicAndString__Tovoid());
html$._initializeCustomElement = function(e) {
};
dart.fn(html$._initializeCustomElement, ElementTovoid$());
const _interceptor = Symbol('_interceptor');
const _constructor = Symbol('_constructor');
const _nativeType = Symbol('_nativeType');
html$._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
  new(document, type, extendsTag) {
    this[_interceptor] = null;
    this[_constructor] = null;
    this[_nativeType] = null;
    let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
    if (interceptorClass == null) {
      dart.throw(new core.ArgumentError(type));
    }
    this[_constructor] = _interceptors.findConstructorForNativeSubclassType(type, 'created');
    if (this[_constructor] == null) {
      dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
    }
    _interceptors.getNativeInterceptor(html$.Element.tag('article'));
    let baseClassName = _js_helper.findDispatchTagForInterceptorClass(interceptorClass);
    if (baseClassName == null) {
      dart.throw(new core.ArgumentError(type));
    }
    if (extendsTag == null) {
      if (!dart.equals(baseClassName, 'HTMLElement')) {
        dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
      }
      this[_nativeType] = dart.wrapType(html$.HtmlElement);
    } else {
      let element = document[dartx.createElement](extendsTag);
      if (!(element instanceof window[baseClassName])) {
        dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
      }
      this[_nativeType] = dart.runtimeType(element);
    }
    this[_interceptor] = interceptorClass.prototype;
  }
  upgrade(element) {
    if (!dart.equals(dart.runtimeType(element), this[_nativeType])) {
      dart.throw(new core.ArgumentError(dart.str`element is not subclass of ${this[_nativeType]}`));
    }
    _js_helper.setNativeSubclassDispatchRecord(element, this[_interceptor]);
    this[_constructor](element);
    return element;
  }
};
html$._JSElementUpgrader[dart.implements] = () => [html$.ElementUpgrader];
dart.setSignature(html$._JSElementUpgrader, {
  constructors: () => ({new: dart.definiteFunctionType(html$._JSElementUpgrader, [html$.Document, core.Type, core.String])}),
  fields: () => ({
    [_interceptor]: dart.dynamic,
    [_constructor]: dart.dynamic,
    [_nativeType]: dart.dynamic
  }),
  methods: () => ({upgrade: dart.definiteFunctionType(html$.Element, [html$.Element])})
});
html$._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
  get history() {
    return html$._HistoryCrossFrame._createSafe(this[_window].history);
  }
  get location() {
    return html$._LocationCrossFrame._createSafe(this[_window].location);
  }
  get closed() {
    return this[_window].closed;
  }
  get opener() {
    return html$._DOMWindowCrossFrame._createSafe(this[_window].opener);
  }
  get parent() {
    return html$._DOMWindowCrossFrame._createSafe(this[_window].parent);
  }
  get top() {
    return html$._DOMWindowCrossFrame._createSafe(this[_window].top);
  }
  close() {
    return this[_window].close();
  }
  postMessage(message, targetOrigin, messagePorts) {
    if (messagePorts === void 0) messagePorts = null;
    if (messagePorts == null) {
      this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin);
    } else {
      this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
    }
  }
  new(window) {
    this[_window] = window;
  }
  static _createSafe(w) {
    if (core.identical(w, html$.window)) {
      return html$.WindowBase._check(w);
    } else {
      return new html$._DOMWindowCrossFrame(w);
    }
  }
  get on() {
    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
  }
  [_addEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
  }
  addEventListener(type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
  }
  dispatchEvent(event) {
    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
  }
  [_removeEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
  }
  removeEventListener(type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
  }
};
html$._DOMWindowCrossFrame[dart.implements] = () => [html$.WindowBase];
dart.setSignature(html$._DOMWindowCrossFrame, {
  constructors: () => ({new: dart.definiteFunctionType(html$._DOMWindowCrossFrame, [dart.dynamic])}),
  fields: () => ({[_window]: dart.dynamic}),
  getters: () => ({
    history: dart.definiteFunctionType(html$.HistoryBase, []),
    location: dart.definiteFunctionType(html$.LocationBase, []),
    closed: dart.definiteFunctionType(core.bool, []),
    opener: dart.definiteFunctionType(html$.WindowBase, []),
    parent: dart.definiteFunctionType(html$.WindowBase, []),
    top: dart.definiteFunctionType(html$.WindowBase, []),
    on: dart.definiteFunctionType(html$.Events, [])
  }),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [core.List]),
    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
    addEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
    dispatchEvent: dart.definiteFunctionType(core.bool, [html$.Event]),
    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
    removeEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
  }),
  statics: () => ({_createSafe: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])}),
  names: ['_createSafe']
});
dart.defineExtensionMembers(html$._DOMWindowCrossFrame, [
  'close',
  'postMessage',
  'history',
  'location',
  'closed',
  'opener',
  'parent',
  'top'
]);
html$._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
  set href(val) {
    return html$._LocationCrossFrame._setHref(this[_location], val);
  }
  static _setHref(location, val) {
    location.href = val;
  }
  new(location) {
    this[_location] = location;
  }
  static _createSafe(location) {
    if (core.identical(location, html$.window[dartx.location])) {
      return html$.LocationBase._check(location);
    } else {
      return new html$._LocationCrossFrame(location);
    }
  }
};
html$._LocationCrossFrame[dart.implements] = () => [html$.LocationBase];
dart.setSignature(html$._LocationCrossFrame, {
  constructors: () => ({new: dart.definiteFunctionType(html$._LocationCrossFrame, [dart.dynamic])}),
  fields: () => ({[_location]: dart.dynamic}),
  setters: () => ({href: dart.definiteFunctionType(dart.void, [core.String])}),
  statics: () => ({
    _setHref: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    _createSafe: dart.definiteFunctionType(html$.LocationBase, [dart.dynamic])
  }),
  names: ['_setHref', '_createSafe']
});
dart.defineExtensionMembers(html$._LocationCrossFrame, ['href']);
const _history = Symbol('_history');
html$._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
  back() {
    return this[_history].back();
  }
  forward() {
    return this[_history].forward();
  }
  go(distance) {
    return this[_history].go(distance);
  }
  new(history) {
    this[_history] = history;
  }
  static _createSafe(h) {
    if (core.identical(h, html$.window[dartx.history])) {
      return html$.HistoryBase._check(h);
    } else {
      return new html$._HistoryCrossFrame(h);
    }
  }
};
html$._HistoryCrossFrame[dart.implements] = () => [html$.HistoryBase];
dart.setSignature(html$._HistoryCrossFrame, {
  constructors: () => ({new: dart.definiteFunctionType(html$._HistoryCrossFrame, [dart.dynamic])}),
  fields: () => ({[_history]: dart.dynamic}),
  methods: () => ({
    back: dart.definiteFunctionType(dart.void, []),
    forward: dart.definiteFunctionType(dart.void, []),
    go: dart.definiteFunctionType(dart.void, [core.int])
  }),
  statics: () => ({_createSafe: dart.definiteFunctionType(html$.HistoryBase, [dart.dynamic])}),
  names: ['_createSafe']
});
dart.defineExtensionMembers(html$._HistoryCrossFrame, ['back', 'forward', 'go']);
html$.Platform = class Platform extends core.Object {};
dart.setSignature(html$.Platform, {
  sfields: () => ({
    supportsTypedData: core.bool,
    supportsSimd: core.bool
  })
});
html$.Platform.supportsSimd = false;
dart.defineLazy(html$.Platform, {
  get supportsTypedData() {
    return !!window.ArrayBuffer;
  }
});
html$._wrapZoneCallback$ = dart.generic((A, R) => {
  const _wrapZoneCallback = dart.typedef('_wrapZoneCallback', () => dart.functionType(R, [A]));
  return _wrapZoneCallback;
});
html$._wrapZoneCallback = _wrapZoneCallback();
html$._wrapZoneBinaryCallback$ = dart.generic((A, B, R) => {
  const _wrapZoneBinaryCallback = dart.typedef('_wrapZoneBinaryCallback', () => dart.functionType(R, [A, B]));
  return _wrapZoneBinaryCallback;
});
html$._wrapZoneBinaryCallback = _wrapZoneBinaryCallback();
html$._wrapZone = function(A, R) {
  return callback => {
    if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
    if (callback == null) return null;
    return async.Zone.current.bindUnaryCallback(R, A)(callback, {runGuarded: true});
  };
};
dart.fn(html$._wrapZone, _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R());
html$._wrapBinaryZone = function(A, B, R) {
  return callback => {
    if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
    if (callback == null) return null;
    return async.Zone.current.bindBinaryCallback(R, A, B)(callback, {runGuarded: true});
  };
};
dart.fn(html$._wrapBinaryZone, _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R());
html$.query = function(relativeSelectors) {
  return html$.document[dartx.query](relativeSelectors);
};
dart.fn(html$.query, StringToElement());
html$.queryAll = function(relativeSelectors) {
  return html$.document[dartx.queryAll](html$.Element)(relativeSelectors);
};
dart.fn(html$.queryAll, StringToElementListOfElement());
html$.querySelector = function(selectors) {
  return html$.document[dartx.querySelector](selectors);
};
dart.fn(html$.querySelector, StringToElement());
html$.querySelectorAll = function(selectors) {
  return html$.document[dartx.querySelectorAll](html$.Element)(selectors);
};
dart.fn(html$.querySelectorAll, StringToElementListOfElement());
html$.ElementUpgrader = class ElementUpgrader extends core.Object {};
html$.NodeValidator = class NodeValidator extends core.Object {
  static new(opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    return new html$._Html5NodeValidator({uriPolicy: uriPolicy});
  }
  static throws(base) {
    return new html$._ThrowsNodeValidator(base);
  }
};
dart.setSignature(html$.NodeValidator, {
  constructors: () => ({
    new: dart.definiteFunctionType(html$.NodeValidator, [], {uriPolicy: html$.UriPolicy}),
    throws: dart.definiteFunctionType(html$.NodeValidator, [html$.NodeValidator])
  })
});
html$.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
  static new(validator) {
    return new html$._ValidatingTreeSanitizer(validator);
  }
};
dart.setSignature(html$.NodeTreeSanitizer, {
  constructors: () => ({new: dart.definiteFunctionType(html$.NodeTreeSanitizer, [html$.NodeValidator])}),
  sfields: () => ({trusted: html$._TrustedHtmlTreeSanitizer})
});
dart.defineLazy(html$.NodeTreeSanitizer, {
  get trusted() {
    return dart.const(new html$._TrustedHtmlTreeSanitizer());
  }
});
html$._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
  new() {
  }
  sanitizeTree(node) {}
};
html$._TrustedHtmlTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
dart.setSignature(html$._TrustedHtmlTreeSanitizer, {
  constructors: () => ({new: dart.definiteFunctionType(html$._TrustedHtmlTreeSanitizer, [])}),
  methods: () => ({sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node])})
});
html$.UriPolicy = class UriPolicy extends core.Object {
  static new() {
    return new html$._SameOriginUriPolicy();
  }
};
dart.setSignature(html$.UriPolicy, {
  constructors: () => ({new: dart.definiteFunctionType(html$.UriPolicy, [])})
});
const _hiddenAnchor = Symbol('_hiddenAnchor');
const _loc = Symbol('_loc');
html$._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
  new() {
    this[_hiddenAnchor] = html$.AnchorElement.new();
    this[_loc] = html$.window[dartx.location];
  }
  allowsUri(uri) {
    this[_hiddenAnchor][dartx.href] = uri;
    return this[_hiddenAnchor][dartx.hostname] == this[_loc][dartx.hostname] && this[_hiddenAnchor][dartx.port] == this[_loc][dartx.port] && this[_hiddenAnchor][dartx.protocol] == this[_loc][dartx.protocol] || this[_hiddenAnchor][dartx.hostname] == '' && this[_hiddenAnchor][dartx.port] == '' && (this[_hiddenAnchor][dartx.protocol] == ':' || this[_hiddenAnchor][dartx.protocol] == '');
  }
};
html$._SameOriginUriPolicy[dart.implements] = () => [html$.UriPolicy];
dart.setSignature(html$._SameOriginUriPolicy, {
  fields: () => ({
    [_hiddenAnchor]: html$.AnchorElement,
    [_loc]: html$.Location
  }),
  methods: () => ({allowsUri: dart.definiteFunctionType(core.bool, [core.String])})
});
html$._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
  new(validator) {
    this.validator = validator;
  }
  allowsElement(element) {
    if (!dart.test(this.validator.allowsElement(element))) {
      dart.throw(new core.ArgumentError(html$.Element._safeTagName(element)));
    }
    return true;
  }
  allowsAttribute(element, attributeName, value) {
    if (!dart.test(this.validator.allowsAttribute(element, attributeName, value))) {
      dart.throw(new core.ArgumentError(dart.str`${html$.Element._safeTagName(element)}[${attributeName}="${value}"]`));
    }
  }
};
html$._ThrowsNodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setSignature(html$._ThrowsNodeValidator, {
  constructors: () => ({new: dart.definiteFunctionType(html$._ThrowsNodeValidator, [html$.NodeValidator])}),
  fields: () => ({validator: html$.NodeValidator}),
  methods: () => ({
    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
  })
});
const _removeNode = Symbol('_removeNode');
const _sanitizeElement = Symbol('_sanitizeElement');
const _sanitizeUntrustedElement = Symbol('_sanitizeUntrustedElement');
html$._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
  new(validator) {
    this.validator = validator;
  }
  sanitizeTree(node) {
    const walk = (function(node, parent) {
      this.sanitizeNode(node, parent);
      let child = node[dartx.lastChild];
      while (child != null) {
        let nextChild = child[dartx.previousNode];
        walk(child, node);
        child = nextChild;
      }
    }).bind(this);
    dart.fn(walk, NodeAndNodeTovoid());
    walk(node, null);
  }
  [_removeNode](node, parent) {
    if (parent == null) {
      node[dartx.remove]();
    } else {
      parent[_removeChild](node);
    }
  }
  [_sanitizeUntrustedElement](element, parent) {
    let corrupted = true;
    let attrs = null;
    let isAttr = null;
    try {
      attrs = dart.dload(element, 'attributes');
      isAttr = dart.dindex(attrs, 'is');
      let corruptedTest1 = html$.Element._hasCorruptedAttributes(html$.Element._check(element));
      corrupted = dart.test(corruptedTest1) ? true : html$.Element._hasCorruptedAttributesAdditionalCheck(html$.Element._check(element));
    } catch (e) {
    }

    let elementText = 'element unprintable';
    try {
      elementText = dart.toString(element);
    } catch (e) {
    }

    try {
      let elementTagName = html$.Element._safeTagName(element);
      this[_sanitizeElement](html$.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
    } catch (e$) {
      if (core.ArgumentError.is(e$)) {
        throw e$;
      } else {
        let e = e$;
        this[_removeNode](html$.Node._check(element), parent);
        html$.window[dartx.console].warn(dart.str`Removing corrupted element ${elementText}`);
      }
    }

  }
  [_sanitizeElement](element, parent, corrupted, text, tag, attrs, isAttr) {
    if (false != corrupted) {
      this[_removeNode](element, parent);
      html$.window[dartx.console].warn(dart.str`Removing element due to corrupted attributes on <${text}>`);
      return;
    }
    if (!dart.test(this.validator.allowsElement(element))) {
      this[_removeNode](element, parent);
      html$.window[dartx.console].warn(dart.str`Removing disallowed element <${tag}> from ${parent}`);
      return;
    }
    if (isAttr != null) {
      if (!dart.test(this.validator.allowsAttribute(element, 'is', isAttr))) {
        this[_removeNode](element, parent);
        html$.window[dartx.console].warn('Removing disallowed type extension ' + dart.str`<${tag} is="${isAttr}">`);
        return;
      }
    }
    let keys = attrs[dartx.keys][dartx.toList]();
    for (let i = dart.notNull(attrs[dartx.length]) - 1; i >= 0; --i) {
      let name = keys[dartx._get](i);
      if (!dart.test(this.validator.allowsAttribute(element, core.String._check(dart.dsend(name, 'toLowerCase')), core.String._check(attrs[dartx._get](name))))) {
        html$.window[dartx.console].warn('Removing disallowed attribute ' + dart.str`<${tag} ${name}="${attrs[dartx._get](name)}">`);
        attrs[dartx.remove](name);
      }
    }
    if (html$.TemplateElement.is(element)) {
      let template = element;
      this.sanitizeTree(template[dartx.content]);
    }
  }
  sanitizeNode(node, parent) {
    switch (node[dartx.nodeType]) {
      case html$.Node.ELEMENT_NODE:
      {
        this[_sanitizeUntrustedElement](node, parent);
        break;
      }
      case html$.Node.COMMENT_NODE:
      case html$.Node.DOCUMENT_FRAGMENT_NODE:
      case html$.Node.TEXT_NODE:
      case html$.Node.CDATA_SECTION_NODE:
      {
        break;
      }
      default:
      {
        this[_removeNode](node, parent);
      }
    }
  }
};
html$._ValidatingTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
dart.setSignature(html$._ValidatingTreeSanitizer, {
  constructors: () => ({new: dart.definiteFunctionType(html$._ValidatingTreeSanitizer, [html$.NodeValidator])}),
  fields: () => ({validator: html$.NodeValidator}),
  methods: () => ({
    sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node]),
    [_removeNode]: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node]),
    [_sanitizeUntrustedElement]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
    [_sanitizeElement]: dart.definiteFunctionType(dart.void, [html$.Element, html$.Node, core.bool, core.String, core.String, core.Map, core.String]),
    sanitizeNode: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])
  })
});
html_common.convertDartToNative_SerializedScriptValue = function(value) {
  return html_common.convertDartToNative_PrepareForStructuredClone(value);
};
dart.fn(html_common.convertDartToNative_SerializedScriptValue, dynamicTodynamic$());
html_common.convertNativeToDart_SerializedScriptValue = function(object) {
  return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: true});
};
dart.fn(html_common.convertNativeToDart_SerializedScriptValue, dynamicTodynamic$());
html_common._StructuredClone = class _StructuredClone extends core.Object {
  new() {
    this.values = [];
    this.copies = [];
  }
  findSlot(value) {
    let length = this.values[dartx.length];
    for (let i = 0; i < dart.notNull(length); i++) {
      if (core.identical(this.values[dartx._get](i), value)) return i;
    }
    this.values[dartx.add](value);
    this.copies[dartx.add](null);
    return length;
  }
  readSlot(i) {
    return this.copies[dartx._get](i);
  }
  writeSlot(i, x) {
    this.copies[dartx._set](i, x);
  }
  cleanupSlots() {}
  walk(e) {
    if (e == null) return e;
    if (typeof e == 'boolean') return e;
    if (typeof e == 'number') return e;
    if (typeof e == 'string') return e;
    if (core.DateTime.is(e)) {
      return html_common.convertDartToNative_DateTime(e);
    }
    if (core.RegExp.is(e)) {
      dart.throw(new core.UnimplementedError('structured clone of RegExp'));
    }
    if (html$.File.is(e)) return e;
    if (html$.Blob.is(e)) return e;
    if (html$.FileList.is(e)) return e;
    if (html$.ImageData.is(e)) return e;
    if (dart.test(this.cloneNotRequired(e))) return e;
    if (core.Map.is(e)) {
      let slot = this.findSlot(e);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      copy = this.newJsMap();
      this.writeSlot(slot, copy);
      e[dartx.forEach](dart.fn((key, value) => {
        this.putIntoMap(copy, key, this.walk(value));
      }, dynamicAnddynamicToNull()));
      return copy;
    }
    if (core.List.is(e)) {
      let slot = this.findSlot(e);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      copy = this.copyList(e, slot);
      return copy;
    }
    dart.throw(new core.UnimplementedError('structured clone of other type'));
  }
  copyList(e, slot) {
    let i = 0;
    let length = e[dartx.length];
    let copy = this.newJsList(length);
    this.writeSlot(slot, copy);
    for (; i < dart.notNull(length); i++) {
      copy[dartx._set](i, this.walk(e[dartx._get](i)));
    }
    return copy;
  }
  convertDartToNative_PrepareForStructuredClone(value) {
    let copy = this.walk(value);
    this.cleanupSlots();
    return copy;
  }
};
dart.setSignature(html_common._StructuredClone, {
  fields: () => ({
    values: core.List,
    copies: core.List
  }),
  methods: () => ({
    findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
    readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
    writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
    cleanupSlots: dart.definiteFunctionType(dart.dynamic, []),
    walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    copyList: dart.definiteFunctionType(core.List, [core.List, core.int]),
    convertDartToNative_PrepareForStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
  })
});
html_common._AcceptStructuredClone = class _AcceptStructuredClone extends core.Object {
  new() {
    this.values = [];
    this.copies = [];
    this.mustCopy = false;
  }
  findSlot(value) {
    let length = this.values[dartx.length];
    for (let i = 0; i < dart.notNull(length); i++) {
      if (dart.test(this.identicalInJs(this.values[dartx._get](i), value))) return i;
    }
    this.values[dartx.add](value);
    this.copies[dartx.add](null);
    return length;
  }
  readSlot(i) {
    return this.copies[dartx._get](i);
  }
  writeSlot(i, x) {
    this.copies[dartx._set](i, x);
  }
  walk(e) {
    if (e == null) return e;
    if (typeof e == 'boolean') return e;
    if (typeof e == 'number') return e;
    if (typeof e == 'string') return e;
    if (dart.test(html_common.isJavaScriptDate(e))) {
      return html_common.convertNativeToDart_DateTime(e);
    }
    if (dart.test(html_common.isJavaScriptRegExp(e))) {
      dart.throw(new core.UnimplementedError('structured clone of RegExp'));
    }
    if (dart.test(html_common.isJavaScriptPromise(e))) {
      return html_common.convertNativePromiseToDartFuture(e);
    }
    if (dart.test(html_common.isJavaScriptSimpleObject(e))) {
      let slot = this.findSlot(e);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      copy = dart.map();
      this.writeSlot(slot, copy);
      this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic$()));
      return copy;
    }
    if (dart.test(html_common.isJavaScriptArray(e))) {
      let l = e;
      let slot = this.findSlot(l);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      let length = l[dartx.length];
      copy = dart.test(this.mustCopy) ? this.newDartList(length) : l;
      this.writeSlot(slot, copy);
      for (let i = 0; i < dart.notNull(length); i++) {
        copy[dartx._set](i, this.walk(l[dartx._get](i)));
      }
      return copy;
    }
    return e;
  }
  convertNativeToDart_AcceptStructuredClone(object, opts) {
    let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
    this.mustCopy = core.bool._check(mustCopy);
    let copy = this.walk(object);
    return copy;
  }
};
dart.setSignature(html_common._AcceptStructuredClone, {
  fields: () => ({
    values: core.List,
    copies: core.List,
    mustCopy: core.bool
  }),
  methods: () => ({
    findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
    readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
    writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
    walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    convertNativeToDart_AcceptStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})
  })
});
html_common.ContextAttributes = class ContextAttributes extends core.Object {
  new(alpha, antialias, depth, failIfMajorPerformanceCaveat, premultipliedAlpha, preserveDrawingBuffer, stencil) {
    this.alpha = alpha;
    this.antialias = antialias;
    this.depth = depth;
    this.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
    this.premultipliedAlpha = premultipliedAlpha;
    this.preserveDrawingBuffer = preserveDrawingBuffer;
    this.stencil = stencil;
  }
};
dart.setSignature(html_common.ContextAttributes, {
  constructors: () => ({new: dart.definiteFunctionType(html_common.ContextAttributes, [core.bool, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool])}),
  fields: () => ({
    alpha: core.bool,
    antialias: core.bool,
    depth: core.bool,
    premultipliedAlpha: core.bool,
    preserveDrawingBuffer: core.bool,
    stencil: core.bool,
    failIfMajorPerformanceCaveat: core.bool
  })
});
html_common.convertNativeToDart_ContextAttributes = function(nativeContextAttributes) {
  return new html_common.ContextAttributes(nativeContextAttributes.alpha, nativeContextAttributes.antialias, nativeContextAttributes.depth, nativeContextAttributes.failIfMajorPerformanceCaveat, nativeContextAttributes.premultipliedAlpha, nativeContextAttributes.preserveDrawingBuffer, nativeContextAttributes.stencil);
};
dart.fn(html_common.convertNativeToDart_ContextAttributes, dynamicTodynamic$());
html_common._TypedImageData = class _TypedImageData extends core.Object {
  new(data, height, width) {
    this.data = data;
    this.height = height;
    this.width = width;
  }
};
html_common._TypedImageData[dart.implements] = () => [html$.ImageData];
dart.setSignature(html_common._TypedImageData, {
  constructors: () => ({new: dart.definiteFunctionType(html_common._TypedImageData, [typed_data.Uint8ClampedList, core.int, core.int])}),
  fields: () => ({
    data: typed_data.Uint8ClampedList,
    height: core.int,
    width: core.int
  })
});
html_common.convertNativeToDart_ImageData = function(nativeImageData) {
  0;
  if (html$.ImageData.is(nativeImageData)) {
    let data = nativeImageData[dartx.data];
    if (data.constructor === Array) {
      if (typeof CanvasPixelArray !== "undefined") {
        data.constructor = CanvasPixelArray;
        data.BYTES_PER_ELEMENT = 1;
      }
    }
    return nativeImageData;
  }
  return new html_common._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
};
dart.fn(html_common.convertNativeToDart_ImageData, dynamicToImageData());
html_common.convertDartToNative_ImageData = function(imageData) {
  if (html_common._TypedImageData.is(imageData)) {
    return {data: imageData.data, height: imageData.height, width: imageData.width};
  }
  return imageData;
};
dart.fn(html_common.convertDartToNative_ImageData, ImageDataTodynamic());
html_common._serializedScriptValue = 'num|String|bool|' + 'JSExtendableArray|=Object|' + 'Blob|File|NativeByteBuffer|NativeTypedData';
html_common.annotation_Creates_SerializedScriptValue = dart.const(new _js_helper.Creates(html_common._serializedScriptValue));
html_common.annotation_Returns_SerializedScriptValue = dart.const(new _js_helper.Returns(html_common._serializedScriptValue));
html_common.convertNativeToDart_Dictionary = function(object) {
  if (object == null) return null;
  let dict = dart.map();
  let keys = Object.getOwnPropertyNames(object);
  for (let key of core.Iterable._check(keys)) {
    dict[dartx._set](key, object[key]);
  }
  return dict;
};
dart.fn(html_common.convertNativeToDart_Dictionary, dynamicToMap());
html_common.convertDartToNative_Dictionary = function(dict, postCreate) {
  if (postCreate === void 0) postCreate = null;
  if (dict == null) return null;
  let object = {};
  if (postCreate != null) {
    dart.dcall(postCreate, object);
  }
  dict[dartx.forEach](dart.fn((key, value) => {
    object[key] = value;
  }, StringAnddynamicToNull()));
  return object;
};
dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
html_common.convertDartToNative_StringArray = function(input) {
  return input;
};
dart.fn(html_common.convertDartToNative_StringArray, ListOfStringToList());
html_common.convertNativeToDart_DateTime = function(date) {
  let millisSinceEpoch = date.getTime();
  return new core.DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, {isUtc: true});
};
dart.fn(html_common.convertNativeToDart_DateTime, dynamicToDateTime());
html_common.convertDartToNative_DateTime = function(date) {
  return new Date(date.millisecondsSinceEpoch);
};
dart.fn(html_common.convertDartToNative_DateTime, DateTimeTodynamic());
html_common.convertDartToNative_PrepareForStructuredClone = function(value) {
  return new html_common._StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
};
dart.fn(html_common.convertDartToNative_PrepareForStructuredClone, dynamicTodynamic$());
html_common.convertNativeToDart_AcceptStructuredClone = function(object, opts) {
  let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
  return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
};
dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic());
html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
  new() {
    super.new();
  }
  newJsMap() {
    return {};
  }
  putIntoMap(map, key, value) {
    return map[key] = value;
  }
  newJsList(length) {
    return new Array(length);
  }
  cloneNotRequired(e) {
    return _native_typed_data.NativeByteBuffer.is(e) || _native_typed_data.NativeTypedData.is(e);
  }
};
dart.setSignature(html_common._StructuredCloneDart2Js, {
  methods: () => ({
    newJsMap: dart.definiteFunctionType(dart.dynamic, []),
    putIntoMap: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
    newJsList: dart.definiteFunctionType(core.List, [dart.dynamic]),
    cloneNotRequired: dart.definiteFunctionType(core.bool, [dart.dynamic])
  })
});
html_common._AcceptStructuredCloneDart2Js = class _AcceptStructuredCloneDart2Js extends html_common._AcceptStructuredClone {
  new() {
    super.new();
  }
  newJsList(length) {
    return new Array(length);
  }
  newDartList(length) {
    return this.newJsList(length);
  }
  identicalInJs(a, b) {
    return core.identical(a, b);
  }
  forEachJsField(object, action) {
    for (let key of Object.keys(object)) {
      dart.dcall(action, key, object[key]);
    }
  }
};
dart.setSignature(html_common._AcceptStructuredCloneDart2Js, {
  methods: () => ({
    newJsList: dart.definiteFunctionType(core.List, [dart.dynamic]),
    newDartList: dart.definiteFunctionType(core.List, [dart.dynamic]),
    identicalInJs: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    forEachJsField: dart.definiteFunctionType(dart.void, [dart.dynamic, dynamicAnddynamicTodynamic()])
  })
});
html_common.isJavaScriptDate = function(value) {
  return value instanceof Date;
};
dart.fn(html_common.isJavaScriptDate, dynamicTobool$());
html_common.isJavaScriptRegExp = function(value) {
  return value instanceof RegExp;
};
dart.fn(html_common.isJavaScriptRegExp, dynamicTobool$());
html_common.isJavaScriptArray = function(value) {
  return value instanceof Array;
};
dart.fn(html_common.isJavaScriptArray, dynamicTobool$());
html_common.isJavaScriptSimpleObject = function(value) {
  let proto = Object.getPrototypeOf(value);
  return proto === Object.prototype || proto === null;
};
dart.fn(html_common.isJavaScriptSimpleObject, dynamicTobool$());
html_common.isImmutableJavaScriptArray = function(value) {
  return !!value.immutable$list;
};
dart.fn(html_common.isImmutableJavaScriptArray, dynamicTobool$());
html_common.isJavaScriptPromise = function(value) {
  return typeof Promise != "undefined" && value instanceof Promise;
};
dart.fn(html_common.isJavaScriptPromise, dynamicTobool$());
html_common.convertNativePromiseToDartFuture = function(promise) {
  let completer = async.Completer.new();
  let then = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.complete(result), dynamicTovoid$()), 1);
  let error = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.completeError(result), dynamicTovoid$()), 1);
  let newPromise = promise.then(then).catch(error);
  return completer.future;
};
dart.fn(html_common.convertNativePromiseToDartFuture, dynamicToFuture());
html_common.Device = class Device extends core.Object {
  static get userAgent() {
    return html$.window[dartx.navigator][dartx.userAgent];
  }
  static get isOpera() {
    if (html_common.Device._isOpera == null) {
      html_common.Device._isOpera = html_common.Device.userAgent[dartx.contains]("Opera", 0);
    }
    return html_common.Device._isOpera;
  }
  static get isIE() {
    if (html_common.Device._isIE == null) {
      html_common.Device._isIE = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("Trident/", 0));
    }
    return html_common.Device._isIE;
  }
  static get isFirefox() {
    if (html_common.Device._isFirefox == null) {
      html_common.Device._isFirefox = html_common.Device.userAgent[dartx.contains]("Firefox", 0);
    }
    return html_common.Device._isFirefox;
  }
  static get isWebKit() {
    if (html_common.Device._isWebKit == null) {
      html_common.Device._isWebKit = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("WebKit", 0));
    }
    return html_common.Device._isWebKit;
  }
  static get cssPrefix() {
    let prefix = html_common.Device._cachedCssPrefix;
    if (prefix != null) return prefix;
    if (dart.test(html_common.Device.isFirefox)) {
      prefix = '-moz-';
    } else if (dart.test(html_common.Device.isIE)) {
      prefix = '-ms-';
    } else if (dart.test(html_common.Device.isOpera)) {
      prefix = '-o-';
    } else {
      prefix = '-webkit-';
    }
    return html_common.Device._cachedCssPrefix = prefix;
  }
  static get propertyPrefix() {
    let prefix = html_common.Device._cachedPropertyPrefix;
    if (prefix != null) return prefix;
    if (dart.test(html_common.Device.isFirefox)) {
      prefix = 'moz';
    } else if (dart.test(html_common.Device.isIE)) {
      prefix = 'ms';
    } else if (dart.test(html_common.Device.isOpera)) {
      prefix = 'o';
    } else {
      prefix = 'webkit';
    }
    return html_common.Device._cachedPropertyPrefix = prefix;
  }
  static isEventTypeSupported(eventType) {
    try {
      let e = html$.Event.eventType(eventType, '');
      return html$.Event.is(e);
    } catch (_) {
    }

    return false;
  }
};
dart.setSignature(html_common.Device, {
  sfields: () => ({
    _isOpera: core.bool,
    _isIE: core.bool,
    _isFirefox: core.bool,
    _isWebKit: core.bool,
    _cachedCssPrefix: core.String,
    _cachedPropertyPrefix: core.String
  }),
  sgetters: () => ({
    userAgent: dart.definiteFunctionType(core.String, []),
    isOpera: dart.definiteFunctionType(core.bool, []),
    isIE: dart.definiteFunctionType(core.bool, []),
    isFirefox: dart.definiteFunctionType(core.bool, []),
    isWebKit: dart.definiteFunctionType(core.bool, []),
    cssPrefix: dart.definiteFunctionType(core.String, []),
    propertyPrefix: dart.definiteFunctionType(core.String, [])
  }),
  statics: () => ({isEventTypeSupported: dart.definiteFunctionType(core.bool, [core.String])}),
  names: ['isEventTypeSupported']
});
html_common.Device._isOpera = null;
html_common.Device._isIE = null;
html_common.Device._isFirefox = null;
html_common.Device._isWebKit = null;
html_common.Device._cachedCssPrefix = null;
html_common.Device._cachedPropertyPrefix = null;
const _childNodes = Symbol('_childNodes');
const _node = Symbol('_node');
const _iterable$0 = Symbol('_iterable');
const _filtered = Symbol('_filtered');
html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html$.Element) {
  new(node) {
    this[_childNodes] = node[dartx.nodes];
    this[_node] = node;
  }
  get [_iterable$0]() {
    return this[_childNodes][dartx.where](dart.fn(n => html$.Element.is(n), NodeTobool$()))[dartx.map](html$.Element)(dart.fn(n => html$.Element.as(n), NodeToElement()));
  }
  get [_filtered]() {
    return ListOfElement().from(this[_iterable$0], {growable: false});
  }
  forEach(f) {
    this[_filtered][dartx.forEach](f);
  }
  _set(index, value) {
    this._get(index)[dartx.replaceWith](value);
    return value;
  }
  set length(newLength) {
    let len = this.length;
    if (dart.notNull(newLength) >= dart.notNull(len)) {
      return;
    } else if (dart.notNull(newLength) < 0) {
      dart.throw(new core.ArgumentError("Invalid list length"));
    }
    this.removeRange(newLength, len);
  }
  add(value) {
    this[_childNodes][dartx.add](value);
  }
  addAll(iterable) {
    for (let element of iterable) {
      this.add(element);
    }
  }
  contains(needle) {
    if (!html$.Element.is(needle)) return false;
    let element = html$.Element._check(needle);
    return dart.equals(element[dartx.parentNode], this[_node]);
  }
  get reversed() {
    return this[_filtered][dartx.reversed];
  }
  sort(compare) {
    if (compare === void 0) compare = null;
    dart.throw(new core.UnsupportedError('Cannot sort filtered list'));
  }
  setRange(start, end, iterable, skipCount) {
    if (skipCount === void 0) skipCount = 0;
    dart.throw(new core.UnsupportedError('Cannot setRange on filtered list'));
  }
  fillRange(start, end, fillValue) {
    if (fillValue === void 0) fillValue = null;
    dart.throw(new core.UnsupportedError('Cannot fillRange on filtered list'));
  }
  replaceRange(start, end, iterable) {
    dart.throw(new core.UnsupportedError('Cannot replaceRange on filtered list'));
  }
  removeRange(start, end) {
    core.List.from(this[_iterable$0][dartx.skip](start)[dartx.take](dart.notNull(end) - dart.notNull(start)))[dartx.forEach](dart.fn(el => dart.dsend(el, 'remove'), dynamicTovoid$()));
  }
  clear() {
    this[_childNodes][dartx.clear]();
  }
  removeLast() {
    let result = this[_iterable$0][dartx.last];
    if (result != null) {
      result[dartx.remove]();
    }
    return result;
  }
  insert(index, value) {
    if (index == this.length) {
      this.add(value);
    } else {
      let element = this[_iterable$0][dartx.elementAt](index);
      element[dartx.parentNode][dartx.insertBefore](value, element);
    }
  }
  insertAll(index, iterable) {
    if (index == this.length) {
      this.addAll(iterable);
    } else {
      let element = this[_iterable$0][dartx.elementAt](index);
      element[dartx.parentNode][dartx.insertAllBefore](iterable, element);
    }
  }
  removeAt(index) {
    let result = this._get(index);
    result[dartx.remove]();
    return result;
  }
  remove(element) {
    if (!html$.Element.is(element)) return false;
    if (dart.test(this.contains(element))) {
      html$.Element.as(element)[dartx.remove]();
      return true;
    } else {
      return false;
    }
  }
  get length() {
    return this[_iterable$0][dartx.length];
  }
  _get(index) {
    return this[_iterable$0][dartx.elementAt](index);
  }
  get iterator() {
    return this[_filtered][dartx.iterator];
  }
  get rawList() {
    return this[_node][dartx.childNodes];
  }
};
dart.addSimpleTypeTests(html_common.FilteredElementList);
html_common.FilteredElementList[dart.implements] = () => [html_common.NodeListWrapper];
dart.setSignature(html_common.FilteredElementList, {
  constructors: () => ({new: dart.definiteFunctionType(html_common.FilteredElementList, [html$.Node])}),
  fields: () => ({
    [_node]: html$.Node,
    [_childNodes]: ListOfNode()
  }),
  getters: () => ({
    [_iterable$0]: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
    [_filtered]: dart.definiteFunctionType(core.List$(html$.Element), []),
    length: dart.definiteFunctionType(core.int, []),
    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
  }),
  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
    _get: dart.definiteFunctionType(html$.Element, [core.int])
  })
});
dart.defineExtensionMembers(html_common.FilteredElementList, [
  'forEach',
  '_set',
  'add',
  'addAll',
  'contains',
  'sort',
  'setRange',
  'fillRange',
  'replaceRange',
  'removeRange',
  'clear',
  'removeLast',
  'insert',
  'insertAll',
  'removeAt',
  'remove',
  '_get',
  'length',
  'reversed',
  'length',
  'iterator'
]);
html_common.Lists = class Lists extends core.Object {
  static indexOf(a, element, startIndex, endIndex) {
    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
      return -1;
    }
    if (dart.notNull(startIndex) < 0) {
      startIndex = 0;
    }
    for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
      if (dart.equals(a[dartx._get](i), element)) {
        return i;
      }
    }
    return -1;
  }
  static lastIndexOf(a, element, startIndex) {
    if (dart.notNull(startIndex) < 0) {
      return -1;
    }
    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
      startIndex = dart.notNull(a[dartx.length]) - 1;
    }
    for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
      if (dart.equals(a[dartx._get](i), element)) {
        return i;
      }
    }
    return -1;
  }
  static getRange(a, start, end, accumulator) {
    if (dart.notNull(start) < 0) dart.throw(new core.RangeError.value(start));
    if (dart.notNull(end) < dart.notNull(start)) dart.throw(new core.RangeError.value(end));
    if (dart.notNull(end) > dart.notNull(a[dartx.length])) dart.throw(new core.RangeError.value(end));
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      accumulator[dartx.add](a[dartx._get](i));
    }
    return accumulator;
  }
};
dart.setSignature(html_common.Lists, {
  statics: () => ({
    indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
    lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
    getRange: dart.definiteFunctionType(core.List, [core.List, core.int, core.int, core.List])
  }),
  names: ['indexOf', 'lastIndexOf', 'getRange']
});
html_common.NodeListWrapper = class NodeListWrapper extends core.Object {};
svg$._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
  static createSvgElement_tag(tag) {
    let temp = html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag);
    return svg$.SvgElement._check(temp);
  }
};
dart.setSignature(svg$._SvgElementFactoryProvider, {
  statics: () => ({createSvgElement_tag: dart.definiteFunctionType(svg$.SvgElement, [core.String])}),
  names: ['createSvgElement_tag']
});
const _children$ = Symbol('_children');
const _svgClassName = Symbol('_svgClassName');
dart.defineExtensionNames([
  'classes',
  'children',
  'children',
  'outerHtml',
  'innerHtml',
  'innerHtml',
  'createFragment',
  'insertAdjacentText',
  'insertAdjacentHtml',
  'insertAdjacentElement',
  'isContentEditable',
  'click',
  'blur',
  'focus',
  'onAbort',
  'onBlur',
  'onCanPlay',
  'onCanPlayThrough',
  'onChange',
  'onClick',
  'onContextMenu',
  'onDoubleClick',
  'onDrag',
  'onDragEnd',
  'onDragEnter',
  'onDragLeave',
  'onDragOver',
  'onDragStart',
  'onDrop',
  'onDurationChange',
  'onEmptied',
  'onEnded',
  'onError',
  'onFocus',
  'onInput',
  'onInvalid',
  'onKeyDown',
  'onKeyPress',
  'onKeyUp',
  'onLoad',
  'onLoadedData',
  'onLoadedMetadata',
  'onMouseDown',
  'onMouseEnter',
  'onMouseLeave',
  'onMouseMove',
  'onMouseOut',
  'onMouseOver',
  'onMouseUp',
  'onMouseWheel',
  'onPause',
  'onPlay',
  'onPlaying',
  'onRateChange',
  'onReset',
  'onResize',
  'onScroll',
  'onSeeked',
  'onSeeking',
  'onSelect',
  'onStalled',
  'onSubmit',
  'onSuspend',
  'onTimeUpdate',
  'onVolumeChange',
  'onWaiting',
  'ownerSvgElement',
  'viewportElement'
]);
svg$.SvgElement = class SvgElement extends html$.Element {
  static tag(tag) {
    return svg$.SvgElement._check(html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag));
  }
  static svg(svg, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (validator == null && treeSanitizer == null) {
      validator = new html$.NodeValidatorBuilder.common();
      validator.allowSvg();
    }
    let match = svg$.SvgElement._START_TAG_REGEXP.firstMatch(svg);
    let parentElement = null;
    if (match != null && match.group(1)[dartx.toLowerCase]() == 'svg') {
      parentElement = html$.document[dartx.body];
    } else {
      parentElement = svg$.SvgSvgElement.new();
    }
    let fragment = dart.dsend(parentElement, 'createFragment', svg, {validator: validator, treeSanitizer: treeSanitizer});
    return svg$.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', dart.fn(e => svg$.SvgElement.is(e), dynamicTobool$())), 'single'));
  }
  get [dartx.classes]() {
    return new svg$._AttributeClassSet(this);
  }
  set [dartx.classes](value) {
    super[dartx.classes] = value;
  }
  get [dartx.children]() {
    return new html_common.FilteredElementList(this);
  }
  set [dartx.children](value) {
    let children = this[dartx.children];
    children[dartx.clear]();
    children[dartx.addAll](value);
  }
  get [dartx.outerHtml]() {
    let container = html$.Element.tag("div");
    let cloned = svg$.SvgElement._check(this[dartx.clone](true));
    container[dartx.children][dartx.add](cloned);
    return container[dartx.innerHtml];
  }
  get [dartx.innerHtml]() {
    let container = html$.Element.tag("div");
    let cloned = svg$.SvgElement._check(this[dartx.clone](true));
    container[dartx.children][dartx.addAll](cloned[dartx.children]);
    return container[dartx.innerHtml];
  }
  set [dartx.innerHtml](value) {
    this[dartx.setInnerHtml](value);
  }
  [dartx.createFragment](svg, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (treeSanitizer == null) {
      if (validator == null) {
        validator = new html$.NodeValidatorBuilder.common();
        validator.allowSvg();
      }
      treeSanitizer = html$.NodeTreeSanitizer.new(validator);
    }
    let html = dart.str`<svg version="1.1">${svg}</svg>`;
    let fragment = html$.document[dartx.body][dartx.createFragment](html, {treeSanitizer: treeSanitizer});
    let svgFragment = html$.DocumentFragment.new();
    let root = fragment[dartx.nodes][dartx.single];
    while (root[dartx.firstChild] != null) {
      svgFragment[dartx.append](root[dartx.firstChild]);
    }
    return svgFragment;
  }
  [dartx.insertAdjacentText](where, text) {
    dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentText on SVG."));
  }
  [dartx.insertAdjacentHtml](where, text, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentHtml on SVG."));
  }
  [dartx.insertAdjacentElement](where, element) {
    dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentElement on SVG."));
  }
  get [_children$]() {
    dart.throw(new core.UnsupportedError("Cannot get _children on SVG."));
  }
  get [dartx.isContentEditable]() {
    return false;
  }
  [dartx.click]() {
    dart.throw(new core.UnsupportedError("Cannot invoke click SVG."));
  }
  static isTagSupported(tag) {
    let e = svg$.SvgElement.tag(tag);
    return svg$.SvgElement.is(e) && !html$.UnknownElement.is(e);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.ownerSvgElement] = null;
    this[dartx.viewportElement] = null;
    super.created();
  }
  get [_svgClassName]() {
    return this.className;
  }
  get [dartx.ownerSvgElement]() {
    return this.ownerSVGElement;
  }
  get [dartx.viewportElement]() {
    return this.viewportElement;
  }
  [dartx.blur](...args) {
    return this.blur.apply(this, args);
  }
  [dartx.focus](...args) {
    return this.focus.apply(this, args);
  }
  get [dartx.onAbort]() {
    return svg$.SvgElement.abortEvent.forElement(this);
  }
  get [dartx.onBlur]() {
    return svg$.SvgElement.blurEvent.forElement(this);
  }
  get [dartx.onCanPlay]() {
    return svg$.SvgElement.canPlayEvent.forElement(this);
  }
  get [dartx.onCanPlayThrough]() {
    return svg$.SvgElement.canPlayThroughEvent.forElement(this);
  }
  get [dartx.onChange]() {
    return svg$.SvgElement.changeEvent.forElement(this);
  }
  get [dartx.onClick]() {
    return svg$.SvgElement.clickEvent.forElement(this);
  }
  get [dartx.onContextMenu]() {
    return svg$.SvgElement.contextMenuEvent.forElement(this);
  }
  get [dartx.onDoubleClick]() {
    return svg$.SvgElement.doubleClickEvent.forElement(this);
  }
  get [dartx.onDrag]() {
    return svg$.SvgElement.dragEvent.forElement(this);
  }
  get [dartx.onDragEnd]() {
    return svg$.SvgElement.dragEndEvent.forElement(this);
  }
  get [dartx.onDragEnter]() {
    return svg$.SvgElement.dragEnterEvent.forElement(this);
  }
  get [dartx.onDragLeave]() {
    return svg$.SvgElement.dragLeaveEvent.forElement(this);
  }
  get [dartx.onDragOver]() {
    return svg$.SvgElement.dragOverEvent.forElement(this);
  }
  get [dartx.onDragStart]() {
    return svg$.SvgElement.dragStartEvent.forElement(this);
  }
  get [dartx.onDrop]() {
    return svg$.SvgElement.dropEvent.forElement(this);
  }
  get [dartx.onDurationChange]() {
    return svg$.SvgElement.durationChangeEvent.forElement(this);
  }
  get [dartx.onEmptied]() {
    return svg$.SvgElement.emptiedEvent.forElement(this);
  }
  get [dartx.onEnded]() {
    return svg$.SvgElement.endedEvent.forElement(this);
  }
  get [dartx.onError]() {
    return svg$.SvgElement.errorEvent.forElement(this);
  }
  get [dartx.onFocus]() {
    return svg$.SvgElement.focusEvent.forElement(this);
  }
  get [dartx.onInput]() {
    return svg$.SvgElement.inputEvent.forElement(this);
  }
  get [dartx.onInvalid]() {
    return svg$.SvgElement.invalidEvent.forElement(this);
  }
  get [dartx.onKeyDown]() {
    return svg$.SvgElement.keyDownEvent.forElement(this);
  }
  get [dartx.onKeyPress]() {
    return svg$.SvgElement.keyPressEvent.forElement(this);
  }
  get [dartx.onKeyUp]() {
    return svg$.SvgElement.keyUpEvent.forElement(this);
  }
  get [dartx.onLoad]() {
    return svg$.SvgElement.loadEvent.forElement(this);
  }
  get [dartx.onLoadedData]() {
    return svg$.SvgElement.loadedDataEvent.forElement(this);
  }
  get [dartx.onLoadedMetadata]() {
    return svg$.SvgElement.loadedMetadataEvent.forElement(this);
  }
  get [dartx.onMouseDown]() {
    return svg$.SvgElement.mouseDownEvent.forElement(this);
  }
  get [dartx.onMouseEnter]() {
    return svg$.SvgElement.mouseEnterEvent.forElement(this);
  }
  get [dartx.onMouseLeave]() {
    return svg$.SvgElement.mouseLeaveEvent.forElement(this);
  }
  get [dartx.onMouseMove]() {
    return svg$.SvgElement.mouseMoveEvent.forElement(this);
  }
  get [dartx.onMouseOut]() {
    return svg$.SvgElement.mouseOutEvent.forElement(this);
  }
  get [dartx.onMouseOver]() {
    return svg$.SvgElement.mouseOverEvent.forElement(this);
  }
  get [dartx.onMouseUp]() {
    return svg$.SvgElement.mouseUpEvent.forElement(this);
  }
  get [dartx.onMouseWheel]() {
    return svg$.SvgElement.mouseWheelEvent.forElement(this);
  }
  get [dartx.onPause]() {
    return svg$.SvgElement.pauseEvent.forElement(this);
  }
  get [dartx.onPlay]() {
    return svg$.SvgElement.playEvent.forElement(this);
  }
  get [dartx.onPlaying]() {
    return svg$.SvgElement.playingEvent.forElement(this);
  }
  get [dartx.onRateChange]() {
    return svg$.SvgElement.rateChangeEvent.forElement(this);
  }
  get [dartx.onReset]() {
    return svg$.SvgElement.resetEvent.forElement(this);
  }
  get [dartx.onResize]() {
    return svg$.SvgElement.resizeEvent.forElement(this);
  }
  get [dartx.onScroll]() {
    return svg$.SvgElement.scrollEvent.forElement(this);
  }
  get [dartx.onSeeked]() {
    return svg$.SvgElement.seekedEvent.forElement(this);
  }
  get [dartx.onSeeking]() {
    return svg$.SvgElement.seekingEvent.forElement(this);
  }
  get [dartx.onSelect]() {
    return svg$.SvgElement.selectEvent.forElement(this);
  }
  get [dartx.onStalled]() {
    return svg$.SvgElement.stalledEvent.forElement(this);
  }
  get [dartx.onSubmit]() {
    return svg$.SvgElement.submitEvent.forElement(this);
  }
  get [dartx.onSuspend]() {
    return svg$.SvgElement.suspendEvent.forElement(this);
  }
  get [dartx.onTimeUpdate]() {
    return svg$.SvgElement.timeUpdateEvent.forElement(this);
  }
  get [dartx.onVolumeChange]() {
    return svg$.SvgElement.volumeChangeEvent.forElement(this);
  }
  get [dartx.onWaiting]() {
    return svg$.SvgElement.waitingEvent.forElement(this);
  }
};
dart.defineNamedConstructor(svg$.SvgElement, 'created');
svg$.SvgElement[dart.implements] = () => [html$.GlobalEventHandlers];
dart.setSignature(svg$.SvgElement, {
  constructors: () => ({
    tag: dart.definiteFunctionType(svg$.SvgElement, [core.String]),
    svg: dart.definiteFunctionType(svg$.SvgElement, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
    _: dart.definiteFunctionType(svg$.SvgElement, []),
    created: dart.definiteFunctionType(svg$.SvgElement, [])
  }),
  fields: () => ({
    [dartx.ownerSvgElement]: svg$.SvgSvgElement,
    [dartx.viewportElement]: svg$.SvgElement
  }),
  getters: () => ({
    [_children$]: dart.definiteFunctionType(html$.HtmlCollection, []),
    [_svgClassName]: dart.definiteFunctionType(svg$.AnimatedString, [])
  }),
  sfields: () => ({
    _START_TAG_REGEXP: core.RegExp,
    abortEvent: EventStreamProviderOfEvent(),
    blurEvent: EventStreamProviderOfEvent(),
    canPlayEvent: EventStreamProviderOfEvent(),
    canPlayThroughEvent: EventStreamProviderOfEvent(),
    changeEvent: EventStreamProviderOfEvent(),
    clickEvent: EventStreamProviderOfMouseEvent(),
    contextMenuEvent: EventStreamProviderOfMouseEvent(),
    doubleClickEvent: EventStreamProviderOfEvent(),
    dragEvent: EventStreamProviderOfMouseEvent(),
    dragEndEvent: EventStreamProviderOfMouseEvent(),
    dragEnterEvent: EventStreamProviderOfMouseEvent(),
    dragLeaveEvent: EventStreamProviderOfMouseEvent(),
    dragOverEvent: EventStreamProviderOfMouseEvent(),
    dragStartEvent: EventStreamProviderOfMouseEvent(),
    dropEvent: EventStreamProviderOfMouseEvent(),
    durationChangeEvent: EventStreamProviderOfEvent(),
    emptiedEvent: EventStreamProviderOfEvent(),
    endedEvent: EventStreamProviderOfEvent(),
    errorEvent: EventStreamProviderOfEvent(),
    focusEvent: EventStreamProviderOfEvent(),
    inputEvent: EventStreamProviderOfEvent(),
    invalidEvent: EventStreamProviderOfEvent(),
    keyDownEvent: EventStreamProviderOfKeyboardEvent(),
    keyPressEvent: EventStreamProviderOfKeyboardEvent(),
    keyUpEvent: EventStreamProviderOfKeyboardEvent(),
    loadEvent: EventStreamProviderOfEvent(),
    loadedDataEvent: EventStreamProviderOfEvent(),
    loadedMetadataEvent: EventStreamProviderOfEvent(),
    mouseDownEvent: EventStreamProviderOfMouseEvent(),
    mouseEnterEvent: EventStreamProviderOfMouseEvent(),
    mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
    mouseMoveEvent: EventStreamProviderOfMouseEvent(),
    mouseOutEvent: EventStreamProviderOfMouseEvent(),
    mouseOverEvent: EventStreamProviderOfMouseEvent(),
    mouseUpEvent: EventStreamProviderOfMouseEvent(),
    mouseWheelEvent: EventStreamProviderOfWheelEvent(),
    pauseEvent: EventStreamProviderOfEvent(),
    playEvent: EventStreamProviderOfEvent(),
    playingEvent: EventStreamProviderOfEvent(),
    rateChangeEvent: EventStreamProviderOfEvent(),
    resetEvent: EventStreamProviderOfEvent(),
    resizeEvent: EventStreamProviderOfEvent(),
    scrollEvent: EventStreamProviderOfEvent(),
    seekedEvent: EventStreamProviderOfEvent(),
    seekingEvent: EventStreamProviderOfEvent(),
    selectEvent: EventStreamProviderOfEvent(),
    stalledEvent: EventStreamProviderOfEvent(),
    submitEvent: EventStreamProviderOfEvent(),
    suspendEvent: EventStreamProviderOfEvent(),
    timeUpdateEvent: EventStreamProviderOfEvent(),
    volumeChangeEvent: EventStreamProviderOfEvent(),
    waitingEvent: EventStreamProviderOfEvent()
  })
});
dart.defineLazy(svg$.SvgElement, {
  get _START_TAG_REGEXP() {
    return core.RegExp.new('<(\\w+)');
  },
  get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('abort'));
  },
  get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('blur'));
  },
  get canPlayEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('canplay'));
  },
  get canPlayThroughEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
  },
  get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('change'));
  },
  get clickEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
  },
  get contextMenuEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
  },
  get doubleClickEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
  },
  get dragEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
  },
  get dragEndEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
  },
  get dragEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
  },
  get dragLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
  },
  get dragOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
  },
  get dragStartEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
  },
  get dropEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
  },
  get durationChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
  },
  get emptiedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('emptied'));
  },
  get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ended'));
  },
  get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('error'));
  },
  get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('focus'));
  },
  get inputEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('input'));
  },
  get invalidEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('invalid'));
  },
  get keyDownEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
  },
  get keyPressEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
  },
  get keyUpEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
  },
  get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('load'));
  },
  get loadedDataEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
  },
  get loadedMetadataEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
  },
  get mouseDownEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
  },
  get mouseEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
  },
  get mouseLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
  },
  get mouseMoveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
  },
  get mouseOutEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
  },
  get mouseOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
  },
  get mouseUpEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
  },
  get mouseWheelEvent() {
    return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
  },
  get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('pause'));
  },
  get playEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('play'));
  },
  get playingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('playing'));
  },
  get rateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
  },
  get resetEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('reset'));
  },
  get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('resize'));
  },
  get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
  },
  get seekedEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('seeked'));
  },
  get seekingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('seeking'));
  },
  get selectEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('select'));
  },
  get stalledEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('stalled'));
  },
  get submitEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('submit'));
  },
  get suspendEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('suspend'));
  },
  get timeUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
  },
  get volumeChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
  },
  get waitingEvent() {
    return dart.const(new (EventStreamProviderOfEvent())('waiting'));
  }
});
dart.registerExtension(dart.global.SVGElement, svg$.SvgElement);
dart.defineExtensionNames([
  'getBBox',
  'getCtm',
  'getScreenCtm',
  'getTransformToElement',
  'hasExtension',
  'farthestViewportElement',
  'nearestViewportElement',
  'transform',
  'requiredExtensions',
  'requiredFeatures',
  'systemLanguage'
]);
svg$.GraphicsElement = class GraphicsElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.farthestViewportElement] = null;
    this[dartx.nearestViewportElement] = null;
    this[dartx.transform] = null;
    this[dartx.requiredExtensions] = null;
    this[dartx.requiredFeatures] = null;
    this[dartx.systemLanguage] = null;
    super.created();
  }
  get [dartx.farthestViewportElement]() {
    return this.farthestViewportElement;
  }
  get [dartx.nearestViewportElement]() {
    return this.nearestViewportElement;
  }
  get [dartx.transform]() {
    return this.transform;
  }
  [dartx.getBBox](...args) {
    return this.getBBox.apply(this, args);
  }
  [dartx.getCtm](...args) {
    return this.getCTM.apply(this, args);
  }
  [dartx.getScreenCtm](...args) {
    return this.getScreenCTM.apply(this, args);
  }
  [dartx.getTransformToElement](...args) {
    return this.getTransformToElement.apply(this, args);
  }
  get [dartx.requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [dartx.requiredFeatures]() {
    return this.requiredFeatures;
  }
  get [dartx.systemLanguage]() {
    return this.systemLanguage;
  }
  [dartx.hasExtension](...args) {
    return this.hasExtension.apply(this, args);
  }
};
dart.defineNamedConstructor(svg$.GraphicsElement, 'created');
svg$.GraphicsElement[dart.implements] = () => [svg$.Tests];
dart.setSignature(svg$.GraphicsElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.GraphicsElement, []),
    created: dart.definiteFunctionType(svg$.GraphicsElement, [])
  }),
  fields: () => ({
    [dartx.farthestViewportElement]: svg$.SvgElement,
    [dartx.nearestViewportElement]: svg$.SvgElement,
    [dartx.transform]: svg$.AnimatedTransformList,
    [dartx.requiredExtensions]: svg$.StringList,
    [dartx.requiredFeatures]: svg$.StringList,
    [dartx.systemLanguage]: svg$.StringList
  }),
  methods: () => ({
    [dartx.getBBox]: dart.definiteFunctionType(svg$.Rect, []),
    [dartx.getCtm]: dart.definiteFunctionType(svg$.Matrix, []),
    [dartx.getScreenCtm]: dart.definiteFunctionType(svg$.Matrix, []),
    [dartx.getTransformToElement]: dart.definiteFunctionType(svg$.Matrix, [svg$.SvgElement]),
    [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
  })
});
dart.registerExtension(dart.global.SVGGraphicsElement, svg$.GraphicsElement);
dart.defineExtensionNames([
  'target',
  'href'
]);
svg$.AElement = class AElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.AElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("a"));
  }
  created() {
    this[dartx.target] = null;
    this[dartx.href] = null;
    super.created();
  }
  get [dartx.target]() {
    return this.target;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.AElement, 'created');
svg$.AElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$.AElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.AElement, []),
    new: dart.definiteFunctionType(svg$.AElement, []),
    created: dart.definiteFunctionType(svg$.AElement, [])
  }),
  fields: () => ({
    [dartx.target]: svg$.AnimatedString,
    [dartx.href]: svg$.AnimatedString
  })
});
dart.registerExtension(dart.global.SVGAElement, svg$.AElement);
dart.defineExtensionNames([
  'convertToSpecifiedUnits',
  'newValueSpecifiedUnits',
  'unitType',
  'value',
  'valueAsString',
  'valueInSpecifiedUnits'
]);
svg$.Angle = class Angle extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.unitType]() {
    return this.unitType;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  get [dartx.valueAsString]() {
    return this.valueAsString;
  }
  set [dartx.valueAsString](value) {
    this.valueAsString = value;
  }
  get [dartx.valueInSpecifiedUnits]() {
    return this.valueInSpecifiedUnits;
  }
  set [dartx.valueInSpecifiedUnits](value) {
    this.valueInSpecifiedUnits = value;
  }
  [dartx.convertToSpecifiedUnits](...args) {
    return this.convertToSpecifiedUnits.apply(this, args);
  }
  [dartx.newValueSpecifiedUnits](...args) {
    return this.newValueSpecifiedUnits.apply(this, args);
  }
};
dart.setSignature(svg$.Angle, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Angle, [])}),
  fields: () => ({
    [dartx.unitType]: core.int,
    [dartx.value]: core.num,
    [dartx.valueAsString]: core.String,
    [dartx.valueInSpecifiedUnits]: core.num
  }),
  methods: () => ({
    [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
  }),
  sfields: () => ({
    SVG_ANGLETYPE_DEG: core.int,
    SVG_ANGLETYPE_GRAD: core.int,
    SVG_ANGLETYPE_RAD: core.int,
    SVG_ANGLETYPE_UNKNOWN: core.int,
    SVG_ANGLETYPE_UNSPECIFIED: core.int
  })
});
svg$.Angle.SVG_ANGLETYPE_DEG = 2;
svg$.Angle.SVG_ANGLETYPE_GRAD = 4;
svg$.Angle.SVG_ANGLETYPE_RAD = 3;
svg$.Angle.SVG_ANGLETYPE_UNKNOWN = 0;
svg$.Angle.SVG_ANGLETYPE_UNSPECIFIED = 1;
dart.registerExtension(dart.global.SVGAngle, svg$.Angle);
dart.defineExtensionNames([
  'beginElement',
  'beginElementAt',
  'endElement',
  'endElementAt',
  'getCurrentTime',
  'getSimpleDuration',
  'getStartTime',
  'hasExtension',
  'targetElement',
  'requiredExtensions',
  'requiredFeatures',
  'systemLanguage'
]);
svg$.AnimationElement = class AnimationElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.AnimationElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animation"));
  }
  created() {
    this[dartx.targetElement] = null;
    this[dartx.requiredExtensions] = null;
    this[dartx.requiredFeatures] = null;
    this[dartx.systemLanguage] = null;
    super.created();
  }
  get [dartx.targetElement]() {
    return this.targetElement;
  }
  [dartx.beginElement](...args) {
    return this.beginElement.apply(this, args);
  }
  [dartx.beginElementAt](...args) {
    return this.beginElementAt.apply(this, args);
  }
  [dartx.endElement](...args) {
    return this.endElement.apply(this, args);
  }
  [dartx.endElementAt](...args) {
    return this.endElementAt.apply(this, args);
  }
  [dartx.getCurrentTime](...args) {
    return this.getCurrentTime.apply(this, args);
  }
  [dartx.getSimpleDuration](...args) {
    return this.getSimpleDuration.apply(this, args);
  }
  [dartx.getStartTime](...args) {
    return this.getStartTime.apply(this, args);
  }
  get [dartx.requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [dartx.requiredFeatures]() {
    return this.requiredFeatures;
  }
  get [dartx.systemLanguage]() {
    return this.systemLanguage;
  }
  [dartx.hasExtension](...args) {
    return this.hasExtension.apply(this, args);
  }
};
dart.defineNamedConstructor(svg$.AnimationElement, 'created');
svg$.AnimationElement[dart.implements] = () => [svg$.Tests];
dart.setSignature(svg$.AnimationElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.AnimationElement, []),
    new: dart.definiteFunctionType(svg$.AnimationElement, []),
    created: dart.definiteFunctionType(svg$.AnimationElement, [])
  }),
  fields: () => ({
    [dartx.targetElement]: svg$.SvgElement,
    [dartx.requiredExtensions]: svg$.StringList,
    [dartx.requiredFeatures]: svg$.StringList,
    [dartx.systemLanguage]: svg$.StringList
  }),
  methods: () => ({
    [dartx.beginElement]: dart.definiteFunctionType(dart.void, []),
    [dartx.beginElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.endElement]: dart.definiteFunctionType(dart.void, []),
    [dartx.endElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
    [dartx.getSimpleDuration]: dart.definiteFunctionType(core.double, []),
    [dartx.getStartTime]: dart.definiteFunctionType(core.double, []),
    [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
  })
});
dart.registerExtension(dart.global.SVGAnimationElement, svg$.AnimationElement);
svg$.AnimateElement = class AnimateElement extends svg$.AnimationElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.AnimateElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animate"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('animate')) && svg$.AnimateElement.is(svg$.SvgElement.tag('animate'));
  }
};
dart.defineNamedConstructor(svg$.AnimateElement, 'created');
dart.setSignature(svg$.AnimateElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.AnimateElement, []),
    new: dart.definiteFunctionType(svg$.AnimateElement, []),
    created: dart.definiteFunctionType(svg$.AnimateElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGAnimateElement, svg$.AnimateElement);
svg$.AnimateMotionElement = class AnimateMotionElement extends svg$.AnimationElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.AnimateMotionElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('animateMotion')) && svg$.AnimateMotionElement.is(svg$.SvgElement.tag('animateMotion'));
  }
};
dart.defineNamedConstructor(svg$.AnimateMotionElement, 'created');
dart.setSignature(svg$.AnimateMotionElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
    new: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
    created: dart.definiteFunctionType(svg$.AnimateMotionElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGAnimateMotionElement, svg$.AnimateMotionElement);
svg$.AnimateTransformElement = class AnimateTransformElement extends svg$.AnimationElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.AnimateTransformElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('animateTransform')) && svg$.AnimateTransformElement.is(svg$.SvgElement.tag('animateTransform'));
  }
};
dart.defineNamedConstructor(svg$.AnimateTransformElement, 'created');
dart.setSignature(svg$.AnimateTransformElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
    new: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
    created: dart.definiteFunctionType(svg$.AnimateTransformElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGAnimateTransformElement, svg$.AnimateTransformElement);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
};
dart.setSignature(svg$.AnimatedAngle, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedAngle, [])}),
  fields: () => ({
    [dartx.animVal]: svg$.Angle,
    [dartx.baseVal]: svg$.Angle
  })
});
dart.registerExtension(dart.global.SVGAnimatedAngle, svg$.AnimatedAngle);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
  set [dartx.baseVal](value) {
    this.baseVal = value;
  }
};
dart.setSignature(svg$.AnimatedBoolean, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedBoolean, [])}),
  fields: () => ({
    [dartx.animVal]: core.bool,
    [dartx.baseVal]: core.bool
  })
});
dart.registerExtension(dart.global.SVGAnimatedBoolean, svg$.AnimatedBoolean);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
  set [dartx.baseVal](value) {
    this.baseVal = value;
  }
};
dart.setSignature(svg$.AnimatedEnumeration, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedEnumeration, [])}),
  fields: () => ({
    [dartx.animVal]: core.int,
    [dartx.baseVal]: core.int
  })
});
dart.registerExtension(dart.global.SVGAnimatedEnumeration, svg$.AnimatedEnumeration);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
  set [dartx.baseVal](value) {
    this.baseVal = value;
  }
};
dart.setSignature(svg$.AnimatedInteger, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedInteger, [])}),
  fields: () => ({
    [dartx.animVal]: core.int,
    [dartx.baseVal]: core.int
  })
});
dart.registerExtension(dart.global.SVGAnimatedInteger, svg$.AnimatedInteger);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
};
dart.setSignature(svg$.AnimatedLength, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLength, [])}),
  fields: () => ({
    [dartx.animVal]: svg$.Length,
    [dartx.baseVal]: svg$.Length
  })
});
dart.registerExtension(dart.global.SVGAnimatedLength, svg$.AnimatedLength);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
};
dart.setSignature(svg$.AnimatedLengthList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLengthList, [])}),
  fields: () => ({
    [dartx.animVal]: svg$.LengthList,
    [dartx.baseVal]: svg$.LengthList
  })
});
dart.registerExtension(dart.global.SVGAnimatedLengthList, svg$.AnimatedLengthList);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
  set [dartx.baseVal](value) {
    this.baseVal = value;
  }
};
dart.setSignature(svg$.AnimatedNumber, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumber, [])}),
  fields: () => ({
    [dartx.animVal]: core.double,
    [dartx.baseVal]: core.num
  })
});
dart.registerExtension(dart.global.SVGAnimatedNumber, svg$.AnimatedNumber);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
};
dart.setSignature(svg$.AnimatedNumberList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumberList, [])}),
  fields: () => ({
    [dartx.animVal]: svg$.NumberList,
    [dartx.baseVal]: svg$.NumberList
  })
});
dart.registerExtension(dart.global.SVGAnimatedNumberList, svg$.AnimatedNumberList);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
};
dart.setSignature(svg$.AnimatedPreserveAspectRatio, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedPreserveAspectRatio, [])}),
  fields: () => ({
    [dartx.animVal]: svg$.PreserveAspectRatio,
    [dartx.baseVal]: svg$.PreserveAspectRatio
  })
});
dart.registerExtension(dart.global.SVGAnimatedPreserveAspectRatio, svg$.AnimatedPreserveAspectRatio);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
};
dart.setSignature(svg$.AnimatedRect, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedRect, [])}),
  fields: () => ({
    [dartx.animVal]: svg$.Rect,
    [dartx.baseVal]: svg$.Rect
  })
});
dart.registerExtension(dart.global.SVGAnimatedRect, svg$.AnimatedRect);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
  set [dartx.baseVal](value) {
    this.baseVal = value;
  }
};
dart.setSignature(svg$.AnimatedString, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedString, [])}),
  fields: () => ({
    [dartx.animVal]: core.String,
    [dartx.baseVal]: core.String
  })
});
dart.registerExtension(dart.global.SVGAnimatedString, svg$.AnimatedString);
dart.defineExtensionNames([
  'animVal',
  'baseVal'
]);
svg$.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.animVal]() {
    return this.animVal;
  }
  get [dartx.baseVal]() {
    return this.baseVal;
  }
};
dart.setSignature(svg$.AnimatedTransformList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedTransformList, [])}),
  fields: () => ({
    [dartx.animVal]: svg$.TransformList,
    [dartx.baseVal]: svg$.TransformList
  })
});
dart.registerExtension(dart.global.SVGAnimatedTransformList, svg$.AnimatedTransformList);
dart.defineExtensionNames([
  'isPointInFill',
  'isPointInStroke'
]);
svg$.GeometryElement = class GeometryElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
  [dartx.isPointInFill](...args) {
    return this.isPointInFill.apply(this, args);
  }
  [dartx.isPointInStroke](...args) {
    return this.isPointInStroke.apply(this, args);
  }
};
dart.defineNamedConstructor(svg$.GeometryElement, 'created');
dart.setSignature(svg$.GeometryElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.GeometryElement, []),
    created: dart.definiteFunctionType(svg$.GeometryElement, [])
  }),
  methods: () => ({
    [dartx.isPointInFill]: dart.definiteFunctionType(core.bool, [svg$.Point]),
    [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [svg$.Point])
  })
});
dart.registerExtension(dart.global.SVGGeometryElement, svg$.GeometryElement);
dart.defineExtensionNames([
  'cx',
  'cy',
  'r'
]);
svg$.CircleElement = class CircleElement extends svg$.GeometryElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.CircleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("circle"));
  }
  created() {
    this[dartx.cx] = null;
    this[dartx.cy] = null;
    this[dartx.r] = null;
    super.created();
  }
  get [dartx.cx]() {
    return this.cx;
  }
  get [dartx.cy]() {
    return this.cy;
  }
  get [dartx.r]() {
    return this.r;
  }
};
dart.defineNamedConstructor(svg$.CircleElement, 'created');
dart.setSignature(svg$.CircleElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.CircleElement, []),
    new: dart.definiteFunctionType(svg$.CircleElement, []),
    created: dart.definiteFunctionType(svg$.CircleElement, [])
  }),
  fields: () => ({
    [dartx.cx]: svg$.AnimatedLength,
    [dartx.cy]: svg$.AnimatedLength,
    [dartx.r]: svg$.AnimatedLength
  })
});
dart.registerExtension(dart.global.SVGCircleElement, svg$.CircleElement);
dart.defineExtensionNames([
  'clipPathUnits'
]);
svg$.ClipPathElement = class ClipPathElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.ClipPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
  }
  created() {
    this[dartx.clipPathUnits] = null;
    super.created();
  }
  get [dartx.clipPathUnits]() {
    return this.clipPathUnits;
  }
};
dart.defineNamedConstructor(svg$.ClipPathElement, 'created');
dart.setSignature(svg$.ClipPathElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.ClipPathElement, []),
    new: dart.definiteFunctionType(svg$.ClipPathElement, []),
    created: dart.definiteFunctionType(svg$.ClipPathElement, [])
  }),
  fields: () => ({[dartx.clipPathUnits]: svg$.AnimatedEnumeration})
});
dart.registerExtension(dart.global.SVGClipPathElement, svg$.ClipPathElement);
svg$.DefsElement = class DefsElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.DefsElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("defs"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.DefsElement, 'created');
dart.setSignature(svg$.DefsElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.DefsElement, []),
    new: dart.definiteFunctionType(svg$.DefsElement, []),
    created: dart.definiteFunctionType(svg$.DefsElement, [])
  })
});
dart.registerExtension(dart.global.SVGDefsElement, svg$.DefsElement);
svg$.DescElement = class DescElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.DescElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("desc"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.DescElement, 'created');
dart.setSignature(svg$.DescElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.DescElement, []),
    new: dart.definiteFunctionType(svg$.DescElement, []),
    created: dart.definiteFunctionType(svg$.DescElement, [])
  })
});
dart.registerExtension(dart.global.SVGDescElement, svg$.DescElement);
svg$.DiscardElement = class DiscardElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.DiscardElement, 'created');
dart.setSignature(svg$.DiscardElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.DiscardElement, []),
    created: dart.definiteFunctionType(svg$.DiscardElement, [])
  })
});
dart.registerExtension(dart.global.SVGDiscardElement, svg$.DiscardElement);
dart.defineExtensionNames([
  'cx',
  'cy',
  'rx',
  'ry'
]);
svg$.EllipseElement = class EllipseElement extends svg$.GeometryElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.EllipseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
  }
  created() {
    this[dartx.cx] = null;
    this[dartx.cy] = null;
    this[dartx.rx] = null;
    this[dartx.ry] = null;
    super.created();
  }
  get [dartx.cx]() {
    return this.cx;
  }
  get [dartx.cy]() {
    return this.cy;
  }
  get [dartx.rx]() {
    return this.rx;
  }
  get [dartx.ry]() {
    return this.ry;
  }
};
dart.defineNamedConstructor(svg$.EllipseElement, 'created');
dart.setSignature(svg$.EllipseElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.EllipseElement, []),
    new: dart.definiteFunctionType(svg$.EllipseElement, []),
    created: dart.definiteFunctionType(svg$.EllipseElement, [])
  }),
  fields: () => ({
    [dartx.cx]: svg$.AnimatedLength,
    [dartx.cy]: svg$.AnimatedLength,
    [dartx.rx]: svg$.AnimatedLength,
    [dartx.ry]: svg$.AnimatedLength
  })
});
dart.registerExtension(dart.global.SVGEllipseElement, svg$.EllipseElement);
dart.defineExtensionNames([
  'in1',
  'in2',
  'mode',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEBlendElement = class FEBlendElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEBlendElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.in2] = null;
    this[dartx.mode] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feBlend')) && svg$.FEBlendElement.is(svg$.SvgElement.tag('feBlend'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.in2]() {
    return this.in2;
  }
  get [dartx.mode]() {
    return this.mode;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEBlendElement, 'created');
svg$.FEBlendElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEBlendElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEBlendElement, []),
    new: dart.definiteFunctionType(svg$.FEBlendElement, []),
    created: dart.definiteFunctionType(svg$.FEBlendElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.in2]: svg$.AnimatedString,
    [dartx.mode]: svg$.AnimatedEnumeration,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sfields: () => ({
    SVG_FEBLEND_MODE_DARKEN: core.int,
    SVG_FEBLEND_MODE_LIGHTEN: core.int,
    SVG_FEBLEND_MODE_MULTIPLY: core.int,
    SVG_FEBLEND_MODE_NORMAL: core.int,
    SVG_FEBLEND_MODE_SCREEN: core.int,
    SVG_FEBLEND_MODE_UNKNOWN: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
svg$.FEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
svg$.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;
svg$.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
svg$.FEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
svg$.FEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
svg$.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGFEBlendElement, svg$.FEBlendElement);
dart.defineExtensionNames([
  'in1',
  'type',
  'values',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEColorMatrixElement = class FEColorMatrixElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEColorMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.type] = null;
    this[dartx.values] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feColorMatrix')) && svg$.FEColorMatrixElement.is(svg$.SvgElement.tag('feColorMatrix'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.values]() {
    return this.values;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEColorMatrixElement, 'created');
svg$.FEColorMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEColorMatrixElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
    new: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
    created: dart.definiteFunctionType(svg$.FEColorMatrixElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.type]: svg$.AnimatedEnumeration,
    [dartx.values]: svg$.AnimatedNumberList,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sfields: () => ({
    SVG_FECOLORMATRIX_TYPE_HUEROTATE: core.int,
    SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: core.int,
    SVG_FECOLORMATRIX_TYPE_MATRIX: core.int,
    SVG_FECOLORMATRIX_TYPE_SATURATE: core.int,
    SVG_FECOLORMATRIX_TYPE_UNKNOWN: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGFEColorMatrixElement, svg$.FEColorMatrixElement);
dart.defineExtensionNames([
  'in1',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEComponentTransferElement = class FEComponentTransferElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEComponentTransferElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feComponentTransfer')) && svg$.FEComponentTransferElement.is(svg$.SvgElement.tag('feComponentTransfer'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEComponentTransferElement, 'created');
svg$.FEComponentTransferElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEComponentTransferElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
    new: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
    created: dart.definiteFunctionType(svg$.FEComponentTransferElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEComponentTransferElement, svg$.FEComponentTransferElement);
dart.defineExtensionNames([
  'in1',
  'in2',
  'k1',
  'k2',
  'k3',
  'k4',
  'operator',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FECompositeElement = class FECompositeElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.in2] = null;
    this[dartx.k1] = null;
    this[dartx.k2] = null;
    this[dartx.k3] = null;
    this[dartx.k4] = null;
    this[dartx.operator] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.in2]() {
    return this.in2;
  }
  get [dartx.k1]() {
    return this.k1;
  }
  get [dartx.k2]() {
    return this.k2;
  }
  get [dartx.k3]() {
    return this.k3;
  }
  get [dartx.k4]() {
    return this.k4;
  }
  get [dartx.operator]() {
    return this.operator;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FECompositeElement, 'created');
svg$.FECompositeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FECompositeElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FECompositeElement, []),
    created: dart.definiteFunctionType(svg$.FECompositeElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.in2]: svg$.AnimatedString,
    [dartx.k1]: svg$.AnimatedNumber,
    [dartx.k2]: svg$.AnimatedNumber,
    [dartx.k3]: svg$.AnimatedNumber,
    [dartx.k4]: svg$.AnimatedNumber,
    [dartx.operator]: svg$.AnimatedEnumeration,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sfields: () => ({
    SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: core.int,
    SVG_FECOMPOSITE_OPERATOR_ATOP: core.int,
    SVG_FECOMPOSITE_OPERATOR_IN: core.int,
    SVG_FECOMPOSITE_OPERATOR_OUT: core.int,
    SVG_FECOMPOSITE_OPERATOR_OVER: core.int,
    SVG_FECOMPOSITE_OPERATOR_UNKNOWN: core.int,
    SVG_FECOMPOSITE_OPERATOR_XOR: core.int
  })
});
svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN = 2;
svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT = 3;
svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER = 1;
svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR = 5;
dart.registerExtension(dart.global.SVGFECompositeElement, svg$.FECompositeElement);
dart.defineExtensionNames([
  'bias',
  'divisor',
  'edgeMode',
  'in1',
  'kernelMatrix',
  'kernelUnitLengthX',
  'kernelUnitLengthY',
  'orderX',
  'orderY',
  'preserveAlpha',
  'targetX',
  'targetY',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEConvolveMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
  }
  created() {
    this[dartx.bias] = null;
    this[dartx.divisor] = null;
    this[dartx.edgeMode] = null;
    this[dartx.in1] = null;
    this[dartx.kernelMatrix] = null;
    this[dartx.kernelUnitLengthX] = null;
    this[dartx.kernelUnitLengthY] = null;
    this[dartx.orderX] = null;
    this[dartx.orderY] = null;
    this[dartx.preserveAlpha] = null;
    this[dartx.targetX] = null;
    this[dartx.targetY] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feConvolveMatrix')) && svg$.FEConvolveMatrixElement.is(svg$.SvgElement.tag('feConvolveMatrix'));
  }
  get [dartx.bias]() {
    return this.bias;
  }
  get [dartx.divisor]() {
    return this.divisor;
  }
  get [dartx.edgeMode]() {
    return this.edgeMode;
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.kernelMatrix]() {
    return this.kernelMatrix;
  }
  get [dartx.kernelUnitLengthX]() {
    return this.kernelUnitLengthX;
  }
  get [dartx.kernelUnitLengthY]() {
    return this.kernelUnitLengthY;
  }
  get [dartx.orderX]() {
    return this.orderX;
  }
  get [dartx.orderY]() {
    return this.orderY;
  }
  get [dartx.preserveAlpha]() {
    return this.preserveAlpha;
  }
  get [dartx.targetX]() {
    return this.targetX;
  }
  get [dartx.targetY]() {
    return this.targetY;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEConvolveMatrixElement, 'created');
svg$.FEConvolveMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEConvolveMatrixElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
    new: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
    created: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, [])
  }),
  fields: () => ({
    [dartx.bias]: svg$.AnimatedNumber,
    [dartx.divisor]: svg$.AnimatedNumber,
    [dartx.edgeMode]: svg$.AnimatedEnumeration,
    [dartx.in1]: svg$.AnimatedString,
    [dartx.kernelMatrix]: svg$.AnimatedNumberList,
    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
    [dartx.orderX]: svg$.AnimatedInteger,
    [dartx.orderY]: svg$.AnimatedInteger,
    [dartx.preserveAlpha]: svg$.AnimatedBoolean,
    [dartx.targetX]: svg$.AnimatedInteger,
    [dartx.targetY]: svg$.AnimatedInteger,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sfields: () => ({
    SVG_EDGEMODE_DUPLICATE: core.int,
    SVG_EDGEMODE_NONE: core.int,
    SVG_EDGEMODE_UNKNOWN: core.int,
    SVG_EDGEMODE_WRAP: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
svg$.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE = 1;
svg$.FEConvolveMatrixElement.SVG_EDGEMODE_NONE = 3;
svg$.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN = 0;
svg$.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP = 2;
dart.registerExtension(dart.global.SVGFEConvolveMatrixElement, svg$.FEConvolveMatrixElement);
dart.defineExtensionNames([
  'diffuseConstant',
  'in1',
  'kernelUnitLengthX',
  'kernelUnitLengthY',
  'surfaceScale',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEDiffuseLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
  }
  created() {
    this[dartx.diffuseConstant] = null;
    this[dartx.in1] = null;
    this[dartx.kernelUnitLengthX] = null;
    this[dartx.kernelUnitLengthY] = null;
    this[dartx.surfaceScale] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feDiffuseLighting')) && svg$.FEDiffuseLightingElement.is(svg$.SvgElement.tag('feDiffuseLighting'));
  }
  get [dartx.diffuseConstant]() {
    return this.diffuseConstant;
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.kernelUnitLengthX]() {
    return this.kernelUnitLengthX;
  }
  get [dartx.kernelUnitLengthY]() {
    return this.kernelUnitLengthY;
  }
  get [dartx.surfaceScale]() {
    return this.surfaceScale;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEDiffuseLightingElement, 'created');
svg$.FEDiffuseLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEDiffuseLightingElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
    new: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
    created: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, [])
  }),
  fields: () => ({
    [dartx.diffuseConstant]: svg$.AnimatedNumber,
    [dartx.in1]: svg$.AnimatedString,
    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
    [dartx.surfaceScale]: svg$.AnimatedNumber,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEDiffuseLightingElement, svg$.FEDiffuseLightingElement);
dart.defineExtensionNames([
  'in1',
  'in2',
  'scale',
  'xChannelSelector',
  'yChannelSelector',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEDisplacementMapElement = class FEDisplacementMapElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEDisplacementMapElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.in2] = null;
    this[dartx.scale] = null;
    this[dartx.xChannelSelector] = null;
    this[dartx.yChannelSelector] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feDisplacementMap')) && svg$.FEDisplacementMapElement.is(svg$.SvgElement.tag('feDisplacementMap'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.in2]() {
    return this.in2;
  }
  get [dartx.scale]() {
    return this.scale;
  }
  get [dartx.xChannelSelector]() {
    return this.xChannelSelector;
  }
  get [dartx.yChannelSelector]() {
    return this.yChannelSelector;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEDisplacementMapElement, 'created');
svg$.FEDisplacementMapElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEDisplacementMapElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
    new: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
    created: dart.definiteFunctionType(svg$.FEDisplacementMapElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.in2]: svg$.AnimatedString,
    [dartx.scale]: svg$.AnimatedNumber,
    [dartx.xChannelSelector]: svg$.AnimatedEnumeration,
    [dartx.yChannelSelector]: svg$.AnimatedEnumeration,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sfields: () => ({
    SVG_CHANNEL_A: core.int,
    SVG_CHANNEL_B: core.int,
    SVG_CHANNEL_G: core.int,
    SVG_CHANNEL_R: core.int,
    SVG_CHANNEL_UNKNOWN: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
svg$.FEDisplacementMapElement.SVG_CHANNEL_A = 4;
svg$.FEDisplacementMapElement.SVG_CHANNEL_B = 3;
svg$.FEDisplacementMapElement.SVG_CHANNEL_G = 2;
svg$.FEDisplacementMapElement.SVG_CHANNEL_R = 1;
svg$.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGFEDisplacementMapElement, svg$.FEDisplacementMapElement);
dart.defineExtensionNames([
  'azimuth',
  'elevation'
]);
svg$.FEDistantLightElement = class FEDistantLightElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEDistantLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
  }
  created() {
    this[dartx.azimuth] = null;
    this[dartx.elevation] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feDistantLight')) && svg$.FEDistantLightElement.is(svg$.SvgElement.tag('feDistantLight'));
  }
  get [dartx.azimuth]() {
    return this.azimuth;
  }
  get [dartx.elevation]() {
    return this.elevation;
  }
};
dart.defineNamedConstructor(svg$.FEDistantLightElement, 'created');
dart.setSignature(svg$.FEDistantLightElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
    new: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
    created: dart.definiteFunctionType(svg$.FEDistantLightElement, [])
  }),
  fields: () => ({
    [dartx.azimuth]: svg$.AnimatedNumber,
    [dartx.elevation]: svg$.AnimatedNumber
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEDistantLightElement, svg$.FEDistantLightElement);
dart.defineExtensionNames([
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEFloodElement = class FEFloodElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEFloodElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feFlood')) && svg$.FEFloodElement.is(svg$.SvgElement.tag('feFlood'));
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEFloodElement, 'created');
svg$.FEFloodElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEFloodElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEFloodElement, []),
    new: dart.definiteFunctionType(svg$.FEFloodElement, []),
    created: dart.definiteFunctionType(svg$.FEFloodElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEFloodElement, svg$.FEFloodElement);
svg$._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$._SVGComponentTransferFunctionElement, 'created');
dart.setSignature(svg$._SVGComponentTransferFunctionElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, []),
    created: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, [])
  })
});
dart.registerExtension(dart.global.SVGComponentTransferFunctionElement, svg$._SVGComponentTransferFunctionElement);
svg$.FEFuncAElement = class FEFuncAElement extends svg$._SVGComponentTransferFunctionElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEFuncAElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feFuncA')) && svg$.FEFuncAElement.is(svg$.SvgElement.tag('feFuncA'));
  }
};
dart.defineNamedConstructor(svg$.FEFuncAElement, 'created');
dart.setSignature(svg$.FEFuncAElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEFuncAElement, []),
    new: dart.definiteFunctionType(svg$.FEFuncAElement, []),
    created: dart.definiteFunctionType(svg$.FEFuncAElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEFuncAElement, svg$.FEFuncAElement);
svg$.FEFuncBElement = class FEFuncBElement extends svg$._SVGComponentTransferFunctionElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEFuncBElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feFuncB')) && svg$.FEFuncBElement.is(svg$.SvgElement.tag('feFuncB'));
  }
};
dart.defineNamedConstructor(svg$.FEFuncBElement, 'created');
dart.setSignature(svg$.FEFuncBElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEFuncBElement, []),
    new: dart.definiteFunctionType(svg$.FEFuncBElement, []),
    created: dart.definiteFunctionType(svg$.FEFuncBElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEFuncBElement, svg$.FEFuncBElement);
svg$.FEFuncGElement = class FEFuncGElement extends svg$._SVGComponentTransferFunctionElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEFuncGElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feFuncG')) && svg$.FEFuncGElement.is(svg$.SvgElement.tag('feFuncG'));
  }
};
dart.defineNamedConstructor(svg$.FEFuncGElement, 'created');
dart.setSignature(svg$.FEFuncGElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEFuncGElement, []),
    new: dart.definiteFunctionType(svg$.FEFuncGElement, []),
    created: dart.definiteFunctionType(svg$.FEFuncGElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEFuncGElement, svg$.FEFuncGElement);
svg$.FEFuncRElement = class FEFuncRElement extends svg$._SVGComponentTransferFunctionElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEFuncRElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feFuncR')) && svg$.FEFuncRElement.is(svg$.SvgElement.tag('feFuncR'));
  }
};
dart.defineNamedConstructor(svg$.FEFuncRElement, 'created');
dart.setSignature(svg$.FEFuncRElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEFuncRElement, []),
    new: dart.definiteFunctionType(svg$.FEFuncRElement, []),
    created: dart.definiteFunctionType(svg$.FEFuncRElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEFuncRElement, svg$.FEFuncRElement);
dart.defineExtensionNames([
  'setStdDeviation',
  'in1',
  'stdDeviationX',
  'stdDeviationY',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEGaussianBlurElement = class FEGaussianBlurElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEGaussianBlurElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.stdDeviationX] = null;
    this[dartx.stdDeviationY] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feGaussianBlur')) && svg$.FEGaussianBlurElement.is(svg$.SvgElement.tag('feGaussianBlur'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.stdDeviationX]() {
    return this.stdDeviationX;
  }
  get [dartx.stdDeviationY]() {
    return this.stdDeviationY;
  }
  [dartx.setStdDeviation](...args) {
    return this.setStdDeviation.apply(this, args);
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEGaussianBlurElement, 'created');
svg$.FEGaussianBlurElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEGaussianBlurElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
    new: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
    created: dart.definiteFunctionType(svg$.FEGaussianBlurElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.stdDeviationX]: svg$.AnimatedNumber,
    [dartx.stdDeviationY]: svg$.AnimatedNumber,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  methods: () => ({[dartx.setStdDeviation]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEGaussianBlurElement, svg$.FEGaussianBlurElement);
dart.defineExtensionNames([
  'preserveAspectRatio',
  'height',
  'result',
  'width',
  'x',
  'y',
  'href'
]);
svg$.FEImageElement = class FEImageElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
  }
  created() {
    this[dartx.preserveAspectRatio] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.href] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feImage')) && svg$.FEImageElement.is(svg$.SvgElement.tag('feImage'));
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.FEImageElement, 'created');
svg$.FEImageElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes, svg$.UriReference];
dart.setSignature(svg$.FEImageElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEImageElement, []),
    new: dart.definiteFunctionType(svg$.FEImageElement, []),
    created: dart.definiteFunctionType(svg$.FEImageElement, [])
  }),
  fields: () => ({
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength,
    [dartx.href]: svg$.AnimatedString
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEImageElement, svg$.FEImageElement);
dart.defineExtensionNames([
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEMergeElement = class FEMergeElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEMergeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feMerge')) && svg$.FEMergeElement.is(svg$.SvgElement.tag('feMerge'));
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEMergeElement, 'created');
svg$.FEMergeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEMergeElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEMergeElement, []),
    new: dart.definiteFunctionType(svg$.FEMergeElement, []),
    created: dart.definiteFunctionType(svg$.FEMergeElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEMergeElement, svg$.FEMergeElement);
dart.defineExtensionNames([
  'in1'
]);
svg$.FEMergeNodeElement = class FEMergeNodeElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEMergeNodeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
  }
  created() {
    this[dartx.in1] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feMergeNode')) && svg$.FEMergeNodeElement.is(svg$.SvgElement.tag('feMergeNode'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
};
dart.defineNamedConstructor(svg$.FEMergeNodeElement, 'created');
dart.setSignature(svg$.FEMergeNodeElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
    new: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
    created: dart.definiteFunctionType(svg$.FEMergeNodeElement, [])
  }),
  fields: () => ({[dartx.in1]: svg$.AnimatedString}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEMergeNodeElement, svg$.FEMergeNodeElement);
dart.defineExtensionNames([
  'in1',
  'operator',
  'radiusX',
  'radiusY',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEMorphologyElement = class FEMorphologyElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.operator] = null;
    this[dartx.radiusX] = null;
    this[dartx.radiusY] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.operator]() {
    return this.operator;
  }
  get [dartx.radiusX]() {
    return this.radiusX;
  }
  get [dartx.radiusY]() {
    return this.radiusY;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEMorphologyElement, 'created');
svg$.FEMorphologyElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEMorphologyElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEMorphologyElement, []),
    created: dart.definiteFunctionType(svg$.FEMorphologyElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.operator]: svg$.AnimatedEnumeration,
    [dartx.radiusX]: svg$.AnimatedNumber,
    [dartx.radiusY]: svg$.AnimatedNumber,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sfields: () => ({
    SVG_MORPHOLOGY_OPERATOR_DILATE: core.int,
    SVG_MORPHOLOGY_OPERATOR_ERODE: core.int,
    SVG_MORPHOLOGY_OPERATOR_UNKNOWN: core.int
  })
});
svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGFEMorphologyElement, svg$.FEMorphologyElement);
dart.defineExtensionNames([
  'dx',
  'dy',
  'in1',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FEOffsetElement = class FEOffsetElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEOffsetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
  }
  created() {
    this[dartx.dx] = null;
    this[dartx.dy] = null;
    this[dartx.in1] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feOffset')) && svg$.FEOffsetElement.is(svg$.SvgElement.tag('feOffset'));
  }
  get [dartx.dx]() {
    return this.dx;
  }
  get [dartx.dy]() {
    return this.dy;
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FEOffsetElement, 'created');
svg$.FEOffsetElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FEOffsetElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEOffsetElement, []),
    new: dart.definiteFunctionType(svg$.FEOffsetElement, []),
    created: dart.definiteFunctionType(svg$.FEOffsetElement, [])
  }),
  fields: () => ({
    [dartx.dx]: svg$.AnimatedNumber,
    [dartx.dy]: svg$.AnimatedNumber,
    [dartx.in1]: svg$.AnimatedString,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEOffsetElement, svg$.FEOffsetElement);
dart.defineExtensionNames([
  'x',
  'y',
  'z'
]);
svg$.FEPointLightElement = class FEPointLightElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FEPointLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
  }
  created() {
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.z] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('fePointLight')) && svg$.FEPointLightElement.is(svg$.SvgElement.tag('fePointLight'));
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.z]() {
    return this.z;
  }
};
dart.defineNamedConstructor(svg$.FEPointLightElement, 'created');
dart.setSignature(svg$.FEPointLightElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FEPointLightElement, []),
    new: dart.definiteFunctionType(svg$.FEPointLightElement, []),
    created: dart.definiteFunctionType(svg$.FEPointLightElement, [])
  }),
  fields: () => ({
    [dartx.x]: svg$.AnimatedNumber,
    [dartx.y]: svg$.AnimatedNumber,
    [dartx.z]: svg$.AnimatedNumber
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFEPointLightElement, svg$.FEPointLightElement);
dart.defineExtensionNames([
  'in1',
  'kernelUnitLengthX',
  'kernelUnitLengthY',
  'specularConstant',
  'specularExponent',
  'surfaceScale',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FESpecularLightingElement = class FESpecularLightingElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FESpecularLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.kernelUnitLengthX] = null;
    this[dartx.kernelUnitLengthY] = null;
    this[dartx.specularConstant] = null;
    this[dartx.specularExponent] = null;
    this[dartx.surfaceScale] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feSpecularLighting')) && svg$.FESpecularLightingElement.is(svg$.SvgElement.tag('feSpecularLighting'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.kernelUnitLengthX]() {
    return this.kernelUnitLengthX;
  }
  get [dartx.kernelUnitLengthY]() {
    return this.kernelUnitLengthY;
  }
  get [dartx.specularConstant]() {
    return this.specularConstant;
  }
  get [dartx.specularExponent]() {
    return this.specularExponent;
  }
  get [dartx.surfaceScale]() {
    return this.surfaceScale;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FESpecularLightingElement, 'created');
svg$.FESpecularLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FESpecularLightingElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
    new: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
    created: dart.definiteFunctionType(svg$.FESpecularLightingElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
    [dartx.specularConstant]: svg$.AnimatedNumber,
    [dartx.specularExponent]: svg$.AnimatedNumber,
    [dartx.surfaceScale]: svg$.AnimatedNumber,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFESpecularLightingElement, svg$.FESpecularLightingElement);
dart.defineExtensionNames([
  'limitingConeAngle',
  'pointsAtX',
  'pointsAtY',
  'pointsAtZ',
  'specularExponent',
  'x',
  'y',
  'z'
]);
svg$.FESpotLightElement = class FESpotLightElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FESpotLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
  }
  created() {
    this[dartx.limitingConeAngle] = null;
    this[dartx.pointsAtX] = null;
    this[dartx.pointsAtY] = null;
    this[dartx.pointsAtZ] = null;
    this[dartx.specularExponent] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.z] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feSpotLight')) && svg$.FESpotLightElement.is(svg$.SvgElement.tag('feSpotLight'));
  }
  get [dartx.limitingConeAngle]() {
    return this.limitingConeAngle;
  }
  get [dartx.pointsAtX]() {
    return this.pointsAtX;
  }
  get [dartx.pointsAtY]() {
    return this.pointsAtY;
  }
  get [dartx.pointsAtZ]() {
    return this.pointsAtZ;
  }
  get [dartx.specularExponent]() {
    return this.specularExponent;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.z]() {
    return this.z;
  }
};
dart.defineNamedConstructor(svg$.FESpotLightElement, 'created');
dart.setSignature(svg$.FESpotLightElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FESpotLightElement, []),
    new: dart.definiteFunctionType(svg$.FESpotLightElement, []),
    created: dart.definiteFunctionType(svg$.FESpotLightElement, [])
  }),
  fields: () => ({
    [dartx.limitingConeAngle]: svg$.AnimatedNumber,
    [dartx.pointsAtX]: svg$.AnimatedNumber,
    [dartx.pointsAtY]: svg$.AnimatedNumber,
    [dartx.pointsAtZ]: svg$.AnimatedNumber,
    [dartx.specularExponent]: svg$.AnimatedNumber,
    [dartx.x]: svg$.AnimatedNumber,
    [dartx.y]: svg$.AnimatedNumber,
    [dartx.z]: svg$.AnimatedNumber
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFESpotLightElement, svg$.FESpotLightElement);
dart.defineExtensionNames([
  'in1',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FETileElement = class FETileElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FETileElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
  }
  created() {
    this[dartx.in1] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feTile')) && svg$.FETileElement.is(svg$.SvgElement.tag('feTile'));
  }
  get [dartx.in1]() {
    return this.in1;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FETileElement, 'created');
svg$.FETileElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FETileElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FETileElement, []),
    new: dart.definiteFunctionType(svg$.FETileElement, []),
    created: dart.definiteFunctionType(svg$.FETileElement, [])
  }),
  fields: () => ({
    [dartx.in1]: svg$.AnimatedString,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFETileElement, svg$.FETileElement);
dart.defineExtensionNames([
  'baseFrequencyX',
  'baseFrequencyY',
  'numOctaves',
  'seed',
  'stitchTiles',
  'type',
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FETurbulenceElement = class FETurbulenceElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FETurbulenceElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
  }
  created() {
    this[dartx.baseFrequencyX] = null;
    this[dartx.baseFrequencyY] = null;
    this[dartx.numOctaves] = null;
    this[dartx.seed] = null;
    this[dartx.stitchTiles] = null;
    this[dartx.type] = null;
    this[dartx.height] = null;
    this[dartx.result] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('feTurbulence')) && svg$.FETurbulenceElement.is(svg$.SvgElement.tag('feTurbulence'));
  }
  get [dartx.baseFrequencyX]() {
    return this.baseFrequencyX;
  }
  get [dartx.baseFrequencyY]() {
    return this.baseFrequencyY;
  }
  get [dartx.numOctaves]() {
    return this.numOctaves;
  }
  get [dartx.seed]() {
    return this.seed;
  }
  get [dartx.stitchTiles]() {
    return this.stitchTiles;
  }
  get [dartx.type]() {
    return this.type;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.result]() {
    return this.result;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.FETurbulenceElement, 'created');
svg$.FETurbulenceElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$.FETurbulenceElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
    new: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
    created: dart.definiteFunctionType(svg$.FETurbulenceElement, [])
  }),
  fields: () => ({
    [dartx.baseFrequencyX]: svg$.AnimatedNumber,
    [dartx.baseFrequencyY]: svg$.AnimatedNumber,
    [dartx.numOctaves]: svg$.AnimatedInteger,
    [dartx.seed]: svg$.AnimatedNumber,
    [dartx.stitchTiles]: svg$.AnimatedEnumeration,
    [dartx.type]: svg$.AnimatedEnumeration,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.result]: svg$.AnimatedString,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sfields: () => ({
    SVG_STITCHTYPE_NOSTITCH: core.int,
    SVG_STITCHTYPE_STITCH: core.int,
    SVG_STITCHTYPE_UNKNOWN: core.int,
    SVG_TURBULENCE_TYPE_FRACTALNOISE: core.int,
    SVG_TURBULENCE_TYPE_TURBULENCE: core.int,
    SVG_TURBULENCE_TYPE_UNKNOWN: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
svg$.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH = 2;
svg$.FETurbulenceElement.SVG_STITCHTYPE_STITCH = 1;
svg$.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN = 0;
svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE = 2;
svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGFETurbulenceElement, svg$.FETurbulenceElement);
dart.defineExtensionNames([
  'filterUnits',
  'height',
  'primitiveUnits',
  'width',
  'x',
  'y',
  'href'
]);
svg$.FilterElement = class FilterElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.FilterElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("filter"));
  }
  created() {
    this[dartx.filterUnits] = null;
    this[dartx.height] = null;
    this[dartx.primitiveUnits] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.href] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('filter')) && svg$.FilterElement.is(svg$.SvgElement.tag('filter'));
  }
  get [dartx.filterUnits]() {
    return this.filterUnits;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.primitiveUnits]() {
    return this.primitiveUnits;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.FilterElement, 'created');
svg$.FilterElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$.FilterElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.FilterElement, []),
    new: dart.definiteFunctionType(svg$.FilterElement, []),
    created: dart.definiteFunctionType(svg$.FilterElement, [])
  }),
  fields: () => ({
    [dartx.filterUnits]: svg$.AnimatedEnumeration,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.primitiveUnits]: svg$.AnimatedEnumeration,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength,
    [dartx.href]: svg$.AnimatedString
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGFilterElement, svg$.FilterElement);
dart.defineExtensionNames([
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get height() {
    return this[height$];
  }
  set height(value) {
    super.height = value;
  }
  get result() {
    return this[result];
  }
  set result(value) {
    super.result = value;
  }
  get width() {
    return this[width$];
  }
  set width(value) {
    super.width = value;
  }
  get x() {
    return this[x];
  }
  set x(value) {
    super.x = value;
  }
  get y() {
    return this[y];
  }
  set y(value) {
    super.y = value;
  }
};
const height$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'height'.toString());
const result = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'result'.toString());
const width$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'width'.toString());
const x = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'x'.toString());
const y = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'y'.toString());
dart.setSignature(svg$.FilterPrimitiveStandardAttributes, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.FilterPrimitiveStandardAttributes, [])}),
  fields: () => ({
    height: svg$.AnimatedLength,
    result: svg$.AnimatedString,
    width: svg$.AnimatedLength,
    x: svg$.AnimatedLength,
    y: svg$.AnimatedLength
  })
});
dart.defineExtensionMembers(svg$.FilterPrimitiveStandardAttributes, [
  'height',
  'result',
  'width',
  'x',
  'y'
]);
dart.defineExtensionNames([
  'preserveAspectRatio',
  'viewBox'
]);
svg$.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get preserveAspectRatio() {
    return this[preserveAspectRatio];
  }
  set preserveAspectRatio(value) {
    super.preserveAspectRatio = value;
  }
  get viewBox() {
    return this[viewBox];
  }
  set viewBox(value) {
    super.viewBox = value;
  }
};
const preserveAspectRatio = Symbol(svg$.FitToViewBox.name + "." + 'preserveAspectRatio'.toString());
const viewBox = Symbol(svg$.FitToViewBox.name + "." + 'viewBox'.toString());
dart.setSignature(svg$.FitToViewBox, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.FitToViewBox, [])}),
  fields: () => ({
    preserveAspectRatio: svg$.AnimatedPreserveAspectRatio,
    viewBox: svg$.AnimatedRect
  })
});
dart.defineExtensionMembers(svg$.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
dart.defineExtensionNames([
  'height',
  'width',
  'x',
  'y'
]);
svg$.ForeignObjectElement = class ForeignObjectElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.ForeignObjectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('foreignObject')) && svg$.ForeignObjectElement.is(svg$.SvgElement.tag('foreignObject'));
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.ForeignObjectElement, 'created');
dart.setSignature(svg$.ForeignObjectElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
    new: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
    created: dart.definiteFunctionType(svg$.ForeignObjectElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGForeignObjectElement, svg$.ForeignObjectElement);
svg$.GElement = class GElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.GElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("g"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.GElement, 'created');
dart.setSignature(svg$.GElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.GElement, []),
    new: dart.definiteFunctionType(svg$.GElement, []),
    created: dart.definiteFunctionType(svg$.GElement, [])
  })
});
dart.registerExtension(dart.global.SVGGElement, svg$.GElement);
dart.defineExtensionNames([
  'height',
  'preserveAspectRatio',
  'width',
  'x',
  'y',
  'href'
]);
svg$.ImageElement = class ImageElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.ImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("image"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.preserveAspectRatio] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.href] = null;
    super.created();
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.ImageElement, 'created');
svg$.ImageElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$.ImageElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.ImageElement, []),
    new: dart.definiteFunctionType(svg$.ImageElement, []),
    created: dart.definiteFunctionType(svg$.ImageElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength,
    [dartx.href]: svg$.AnimatedString
  })
});
dart.registerExtension(dart.global.SVGImageElement, svg$.ImageElement);
dart.defineExtensionNames([
  'convertToSpecifiedUnits',
  'newValueSpecifiedUnits',
  'unitType',
  'value',
  'valueAsString',
  'valueInSpecifiedUnits'
]);
svg$.Length = class Length extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.unitType]() {
    return this.unitType;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  get [dartx.valueAsString]() {
    return this.valueAsString;
  }
  set [dartx.valueAsString](value) {
    this.valueAsString = value;
  }
  get [dartx.valueInSpecifiedUnits]() {
    return this.valueInSpecifiedUnits;
  }
  set [dartx.valueInSpecifiedUnits](value) {
    this.valueInSpecifiedUnits = value;
  }
  [dartx.convertToSpecifiedUnits](...args) {
    return this.convertToSpecifiedUnits.apply(this, args);
  }
  [dartx.newValueSpecifiedUnits](...args) {
    return this.newValueSpecifiedUnits.apply(this, args);
  }
};
dart.setSignature(svg$.Length, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Length, [])}),
  fields: () => ({
    [dartx.unitType]: core.int,
    [dartx.value]: core.num,
    [dartx.valueAsString]: core.String,
    [dartx.valueInSpecifiedUnits]: core.num
  }),
  methods: () => ({
    [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
  }),
  sfields: () => ({
    SVG_LENGTHTYPE_CM: core.int,
    SVG_LENGTHTYPE_EMS: core.int,
    SVG_LENGTHTYPE_EXS: core.int,
    SVG_LENGTHTYPE_IN: core.int,
    SVG_LENGTHTYPE_MM: core.int,
    SVG_LENGTHTYPE_NUMBER: core.int,
    SVG_LENGTHTYPE_PC: core.int,
    SVG_LENGTHTYPE_PERCENTAGE: core.int,
    SVG_LENGTHTYPE_PT: core.int,
    SVG_LENGTHTYPE_PX: core.int,
    SVG_LENGTHTYPE_UNKNOWN: core.int
  })
});
svg$.Length.SVG_LENGTHTYPE_CM = 6;
svg$.Length.SVG_LENGTHTYPE_EMS = 3;
svg$.Length.SVG_LENGTHTYPE_EXS = 4;
svg$.Length.SVG_LENGTHTYPE_IN = 8;
svg$.Length.SVG_LENGTHTYPE_MM = 7;
svg$.Length.SVG_LENGTHTYPE_NUMBER = 1;
svg$.Length.SVG_LENGTHTYPE_PC = 10;
svg$.Length.SVG_LENGTHTYPE_PERCENTAGE = 2;
svg$.Length.SVG_LENGTHTYPE_PT = 9;
svg$.Length.SVG_LENGTHTYPE_PX = 5;
svg$.Length.SVG_LENGTHTYPE_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGLength, svg$.Length);
const __setter__$ = Symbol('__setter__');
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'appendItem',
  'clear',
  'getItem',
  'initialize',
  'insertItemBefore',
  'removeItem',
  'replaceItem',
  'numberOfItems'
]);
svg$.LengthList = class LengthList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Length), html$.ImmutableListMixin$(svg$.Length)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.numberOfItems]() {
    return this.numberOfItems;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.getItem](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [dartx.initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [dartx.insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [dartx.removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [dartx.replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.LengthList[dart.implements] = () => [ListOfLength()];
dart.setSignature(svg$.LengthList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.LengthList, [])}),
  fields: () => ({[dartx.numberOfItems]: core.int}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(svg$.Length, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
    [dartx.appendItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
    [dartx.getItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
    [dartx.initialize]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int]),
    [dartx.removeItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int])
  })
});
dart.registerExtension(dart.global.SVGLengthList, svg$.LengthList);
dart.defineExtensionNames([
  'x1',
  'x2',
  'y1',
  'y2'
]);
svg$.LineElement = class LineElement extends svg$.GeometryElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.LineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("line"));
  }
  created() {
    this[dartx.x1] = null;
    this[dartx.x2] = null;
    this[dartx.y1] = null;
    this[dartx.y2] = null;
    super.created();
  }
  get [dartx.x1]() {
    return this.x1;
  }
  get [dartx.x2]() {
    return this.x2;
  }
  get [dartx.y1]() {
    return this.y1;
  }
  get [dartx.y2]() {
    return this.y2;
  }
};
dart.defineNamedConstructor(svg$.LineElement, 'created');
dart.setSignature(svg$.LineElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.LineElement, []),
    new: dart.definiteFunctionType(svg$.LineElement, []),
    created: dart.definiteFunctionType(svg$.LineElement, [])
  }),
  fields: () => ({
    [dartx.x1]: svg$.AnimatedLength,
    [dartx.x2]: svg$.AnimatedLength,
    [dartx.y1]: svg$.AnimatedLength,
    [dartx.y2]: svg$.AnimatedLength
  })
});
dart.registerExtension(dart.global.SVGLineElement, svg$.LineElement);
dart.defineExtensionNames([
  'gradientTransform',
  'gradientUnits',
  'spreadMethod',
  'href'
]);
svg$._GradientElement = class _GradientElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.gradientTransform] = null;
    this[dartx.gradientUnits] = null;
    this[dartx.spreadMethod] = null;
    this[dartx.href] = null;
    super.created();
  }
  get [dartx.gradientTransform]() {
    return this.gradientTransform;
  }
  get [dartx.gradientUnits]() {
    return this.gradientUnits;
  }
  get [dartx.spreadMethod]() {
    return this.spreadMethod;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$._GradientElement, 'created');
svg$._GradientElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$._GradientElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$._GradientElement, []),
    created: dart.definiteFunctionType(svg$._GradientElement, [])
  }),
  fields: () => ({
    [dartx.gradientTransform]: svg$.AnimatedTransformList,
    [dartx.gradientUnits]: svg$.AnimatedEnumeration,
    [dartx.spreadMethod]: svg$.AnimatedEnumeration,
    [dartx.href]: svg$.AnimatedString
  }),
  sfields: () => ({
    SVG_SPREADMETHOD_PAD: core.int,
    SVG_SPREADMETHOD_REFLECT: core.int,
    SVG_SPREADMETHOD_REPEAT: core.int,
    SVG_SPREADMETHOD_UNKNOWN: core.int
  })
});
svg$._GradientElement.SVG_SPREADMETHOD_PAD = 1;
svg$._GradientElement.SVG_SPREADMETHOD_REFLECT = 2;
svg$._GradientElement.SVG_SPREADMETHOD_REPEAT = 3;
svg$._GradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGGradientElement, svg$._GradientElement);
dart.defineExtensionNames([
  'x1',
  'x2',
  'y1',
  'y2'
]);
svg$.LinearGradientElement = class LinearGradientElement extends svg$._GradientElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.LinearGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
  }
  created() {
    this[dartx.x1] = null;
    this[dartx.x2] = null;
    this[dartx.y1] = null;
    this[dartx.y2] = null;
    super.created();
  }
  get [dartx.x1]() {
    return this.x1;
  }
  get [dartx.x2]() {
    return this.x2;
  }
  get [dartx.y1]() {
    return this.y1;
  }
  get [dartx.y2]() {
    return this.y2;
  }
};
dart.defineNamedConstructor(svg$.LinearGradientElement, 'created');
dart.setSignature(svg$.LinearGradientElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.LinearGradientElement, []),
    new: dart.definiteFunctionType(svg$.LinearGradientElement, []),
    created: dart.definiteFunctionType(svg$.LinearGradientElement, [])
  }),
  fields: () => ({
    [dartx.x1]: svg$.AnimatedLength,
    [dartx.x2]: svg$.AnimatedLength,
    [dartx.y1]: svg$.AnimatedLength,
    [dartx.y2]: svg$.AnimatedLength
  })
});
dart.registerExtension(dart.global.SVGLinearGradientElement, svg$.LinearGradientElement);
dart.defineExtensionNames([
  'setOrientToAngle',
  'setOrientToAuto',
  'markerHeight',
  'markerUnits',
  'markerWidth',
  'orientAngle',
  'orientType',
  'refX',
  'refY',
  'preserveAspectRatio',
  'viewBox'
]);
svg$.MarkerElement = class MarkerElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.MarkerElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("marker"));
  }
  created() {
    this[dartx.markerHeight] = null;
    this[dartx.markerUnits] = null;
    this[dartx.markerWidth] = null;
    this[dartx.orientAngle] = null;
    this[dartx.orientType] = null;
    this[dartx.refX] = null;
    this[dartx.refY] = null;
    this[dartx.preserveAspectRatio] = null;
    this[dartx.viewBox] = null;
    super.created();
  }
  get [dartx.markerHeight]() {
    return this.markerHeight;
  }
  get [dartx.markerUnits]() {
    return this.markerUnits;
  }
  get [dartx.markerWidth]() {
    return this.markerWidth;
  }
  get [dartx.orientAngle]() {
    return this.orientAngle;
  }
  get [dartx.orientType]() {
    return this.orientType;
  }
  get [dartx.refX]() {
    return this.refX;
  }
  get [dartx.refY]() {
    return this.refY;
  }
  [dartx.setOrientToAngle](...args) {
    return this.setOrientToAngle.apply(this, args);
  }
  [dartx.setOrientToAuto](...args) {
    return this.setOrientToAuto.apply(this, args);
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.viewBox]() {
    return this.viewBox;
  }
};
dart.defineNamedConstructor(svg$.MarkerElement, 'created');
svg$.MarkerElement[dart.implements] = () => [svg$.FitToViewBox];
dart.setSignature(svg$.MarkerElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.MarkerElement, []),
    new: dart.definiteFunctionType(svg$.MarkerElement, []),
    created: dart.definiteFunctionType(svg$.MarkerElement, [])
  }),
  fields: () => ({
    [dartx.markerHeight]: svg$.AnimatedLength,
    [dartx.markerUnits]: svg$.AnimatedEnumeration,
    [dartx.markerWidth]: svg$.AnimatedLength,
    [dartx.orientAngle]: svg$.AnimatedAngle,
    [dartx.orientType]: svg$.AnimatedEnumeration,
    [dartx.refX]: svg$.AnimatedLength,
    [dartx.refY]: svg$.AnimatedLength,
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.viewBox]: svg$.AnimatedRect
  }),
  methods: () => ({
    [dartx.setOrientToAngle]: dart.definiteFunctionType(dart.void, [svg$.Angle]),
    [dartx.setOrientToAuto]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    SVG_MARKERUNITS_STROKEWIDTH: core.int,
    SVG_MARKERUNITS_UNKNOWN: core.int,
    SVG_MARKERUNITS_USERSPACEONUSE: core.int,
    SVG_MARKER_ORIENT_ANGLE: core.int,
    SVG_MARKER_ORIENT_AUTO: core.int,
    SVG_MARKER_ORIENT_UNKNOWN: core.int
  })
});
svg$.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH = 2;
svg$.MarkerElement.SVG_MARKERUNITS_UNKNOWN = 0;
svg$.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE = 1;
svg$.MarkerElement.SVG_MARKER_ORIENT_ANGLE = 2;
svg$.MarkerElement.SVG_MARKER_ORIENT_AUTO = 1;
svg$.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGMarkerElement, svg$.MarkerElement);
dart.defineExtensionNames([
  'hasExtension',
  'height',
  'maskContentUnits',
  'maskUnits',
  'width',
  'x',
  'y',
  'requiredExtensions',
  'requiredFeatures',
  'systemLanguage'
]);
svg$.MaskElement = class MaskElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.MaskElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mask"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.maskContentUnits] = null;
    this[dartx.maskUnits] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.requiredExtensions] = null;
    this[dartx.requiredFeatures] = null;
    this[dartx.systemLanguage] = null;
    super.created();
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.maskContentUnits]() {
    return this.maskContentUnits;
  }
  get [dartx.maskUnits]() {
    return this.maskUnits;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [dartx.requiredFeatures]() {
    return this.requiredFeatures;
  }
  get [dartx.systemLanguage]() {
    return this.systemLanguage;
  }
  [dartx.hasExtension](...args) {
    return this.hasExtension.apply(this, args);
  }
};
dart.defineNamedConstructor(svg$.MaskElement, 'created');
svg$.MaskElement[dart.implements] = () => [svg$.Tests];
dart.setSignature(svg$.MaskElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.MaskElement, []),
    new: dart.definiteFunctionType(svg$.MaskElement, []),
    created: dart.definiteFunctionType(svg$.MaskElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.maskContentUnits]: svg$.AnimatedEnumeration,
    [dartx.maskUnits]: svg$.AnimatedEnumeration,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength,
    [dartx.requiredExtensions]: svg$.StringList,
    [dartx.requiredFeatures]: svg$.StringList,
    [dartx.systemLanguage]: svg$.StringList
  }),
  methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
});
dart.registerExtension(dart.global.SVGMaskElement, svg$.MaskElement);
dart.defineExtensionNames([
  'flipX',
  'flipY',
  'inverse',
  'multiply',
  'rotate',
  'rotateFromVector',
  'scale',
  'scaleNonUniform',
  'skewX',
  'skewY',
  'translate',
  'a',
  'b',
  'c',
  'd',
  'e',
  'f'
]);
svg$.Matrix = class Matrix extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.a]() {
    return this.a;
  }
  set [dartx.a](value) {
    this.a = value;
  }
  get [dartx.b]() {
    return this.b;
  }
  set [dartx.b](value) {
    this.b = value;
  }
  get [dartx.c]() {
    return this.c;
  }
  set [dartx.c](value) {
    this.c = value;
  }
  get [dartx.d]() {
    return this.d;
  }
  set [dartx.d](value) {
    this.d = value;
  }
  get [dartx.e]() {
    return this.e;
  }
  set [dartx.e](value) {
    this.e = value;
  }
  get [dartx.f]() {
    return this.f;
  }
  set [dartx.f](value) {
    this.f = value;
  }
  [dartx.flipX](...args) {
    return this.flipX.apply(this, args);
  }
  [dartx.flipY](...args) {
    return this.flipY.apply(this, args);
  }
  [dartx.inverse](...args) {
    return this.inverse.apply(this, args);
  }
  [dartx.multiply](...args) {
    return this.multiply.apply(this, args);
  }
  [dartx.rotate](...args) {
    return this.rotate.apply(this, args);
  }
  [dartx.rotateFromVector](...args) {
    return this.rotateFromVector.apply(this, args);
  }
  [dartx.scale](...args) {
    return this.scale.apply(this, args);
  }
  [dartx.scaleNonUniform](...args) {
    return this.scaleNonUniform.apply(this, args);
  }
  [dartx.skewX](...args) {
    return this.skewX.apply(this, args);
  }
  [dartx.skewY](...args) {
    return this.skewY.apply(this, args);
  }
  [dartx.translate](...args) {
    return this.translate.apply(this, args);
  }
};
dart.setSignature(svg$.Matrix, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Matrix, [])}),
  fields: () => ({
    [dartx.a]: core.num,
    [dartx.b]: core.num,
    [dartx.c]: core.num,
    [dartx.d]: core.num,
    [dartx.e]: core.num,
    [dartx.f]: core.num
  }),
  methods: () => ({
    [dartx.flipX]: dart.definiteFunctionType(svg$.Matrix, []),
    [dartx.flipY]: dart.definiteFunctionType(svg$.Matrix, []),
    [dartx.inverse]: dart.definiteFunctionType(svg$.Matrix, []),
    [dartx.multiply]: dart.definiteFunctionType(svg$.Matrix, [svg$.Matrix]),
    [dartx.rotate]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
    [dartx.rotateFromVector]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
    [dartx.scale]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
    [dartx.scaleNonUniform]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
    [dartx.skewX]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
    [dartx.skewY]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
    [dartx.translate]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num])
  })
});
dart.registerExtension(dart.global.SVGMatrix, svg$.Matrix);
svg$.MetadataElement = class MetadataElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.MetadataElement, 'created');
dart.setSignature(svg$.MetadataElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.MetadataElement, []),
    created: dart.definiteFunctionType(svg$.MetadataElement, [])
  })
});
dart.registerExtension(dart.global.SVGMetadataElement, svg$.MetadataElement);
dart.defineExtensionNames([
  'value'
]);
svg$.Number = class Number extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
};
dart.setSignature(svg$.Number, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Number, [])}),
  fields: () => ({[dartx.value]: core.num})
});
dart.registerExtension(dart.global.SVGNumber, svg$.Number);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'appendItem',
  'clear',
  'getItem',
  'initialize',
  'insertItemBefore',
  'removeItem',
  'replaceItem',
  'numberOfItems'
]);
svg$.NumberList = class NumberList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Number), html$.ImmutableListMixin$(svg$.Number)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.numberOfItems]() {
    return this.numberOfItems;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.getItem](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [dartx.initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [dartx.insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [dartx.removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [dartx.replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.NumberList[dart.implements] = () => [ListOfNumber()];
dart.setSignature(svg$.NumberList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.NumberList, [])}),
  fields: () => ({[dartx.numberOfItems]: core.int}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(svg$.Number, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
    [dartx.appendItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
    [dartx.getItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
    [dartx.initialize]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int]),
    [dartx.removeItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int])
  })
});
dart.registerExtension(dart.global.SVGNumberList, svg$.NumberList);
dart.defineExtensionNames([
  'createSvgPathSegArcAbs',
  'createSvgPathSegArcRel',
  'createSvgPathSegClosePath',
  'createSvgPathSegCurvetoCubicAbs',
  'createSvgPathSegCurvetoCubicRel',
  'createSvgPathSegCurvetoCubicSmoothAbs',
  'createSvgPathSegCurvetoCubicSmoothRel',
  'createSvgPathSegCurvetoQuadraticAbs',
  'createSvgPathSegCurvetoQuadraticRel',
  'createSvgPathSegCurvetoQuadraticSmoothAbs',
  'createSvgPathSegCurvetoQuadraticSmoothRel',
  'createSvgPathSegLinetoAbs',
  'createSvgPathSegLinetoHorizontalAbs',
  'createSvgPathSegLinetoHorizontalRel',
  'createSvgPathSegLinetoRel',
  'createSvgPathSegLinetoVerticalAbs',
  'createSvgPathSegLinetoVerticalRel',
  'createSvgPathSegMovetoAbs',
  'createSvgPathSegMovetoRel',
  'getPathSegAtLength',
  'getPointAtLength',
  'getTotalLength',
  'animatedNormalizedPathSegList',
  'animatedPathSegList',
  'normalizedPathSegList',
  'pathLength',
  'pathSegList'
]);
svg$.PathElement = class PathElement extends svg$.GeometryElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.PathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("path"));
  }
  created() {
    this[dartx.animatedNormalizedPathSegList] = null;
    this[dartx.animatedPathSegList] = null;
    this[dartx.normalizedPathSegList] = null;
    this[dartx.pathLength] = null;
    this[dartx.pathSegList] = null;
    super.created();
  }
  get [dartx.animatedNormalizedPathSegList]() {
    return this.animatedNormalizedPathSegList;
  }
  get [dartx.animatedPathSegList]() {
    return this.animatedPathSegList;
  }
  get [dartx.normalizedPathSegList]() {
    return this.normalizedPathSegList;
  }
  get [dartx.pathLength]() {
    return this.pathLength;
  }
  get [dartx.pathSegList]() {
    return this.pathSegList;
  }
  [dartx.createSvgPathSegArcAbs](...args) {
    return this.createSVGPathSegArcAbs.apply(this, args);
  }
  [dartx.createSvgPathSegArcRel](...args) {
    return this.createSVGPathSegArcRel.apply(this, args);
  }
  [dartx.createSvgPathSegClosePath](...args) {
    return this.createSVGPathSegClosePath.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoCubicAbs](...args) {
    return this.createSVGPathSegCurvetoCubicAbs.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoCubicRel](...args) {
    return this.createSVGPathSegCurvetoCubicRel.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoCubicSmoothAbs](...args) {
    return this.createSVGPathSegCurvetoCubicSmoothAbs.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoCubicSmoothRel](...args) {
    return this.createSVGPathSegCurvetoCubicSmoothRel.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoQuadraticAbs](...args) {
    return this.createSVGPathSegCurvetoQuadraticAbs.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoQuadraticRel](...args) {
    return this.createSVGPathSegCurvetoQuadraticRel.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs](...args) {
    return this.createSVGPathSegCurvetoQuadraticSmoothAbs.apply(this, args);
  }
  [dartx.createSvgPathSegCurvetoQuadraticSmoothRel](...args) {
    return this.createSVGPathSegCurvetoQuadraticSmoothRel.apply(this, args);
  }
  [dartx.createSvgPathSegLinetoAbs](...args) {
    return this.createSVGPathSegLinetoAbs.apply(this, args);
  }
  [dartx.createSvgPathSegLinetoHorizontalAbs](...args) {
    return this.createSVGPathSegLinetoHorizontalAbs.apply(this, args);
  }
  [dartx.createSvgPathSegLinetoHorizontalRel](...args) {
    return this.createSVGPathSegLinetoHorizontalRel.apply(this, args);
  }
  [dartx.createSvgPathSegLinetoRel](...args) {
    return this.createSVGPathSegLinetoRel.apply(this, args);
  }
  [dartx.createSvgPathSegLinetoVerticalAbs](...args) {
    return this.createSVGPathSegLinetoVerticalAbs.apply(this, args);
  }
  [dartx.createSvgPathSegLinetoVerticalRel](...args) {
    return this.createSVGPathSegLinetoVerticalRel.apply(this, args);
  }
  [dartx.createSvgPathSegMovetoAbs](...args) {
    return this.createSVGPathSegMovetoAbs.apply(this, args);
  }
  [dartx.createSvgPathSegMovetoRel](...args) {
    return this.createSVGPathSegMovetoRel.apply(this, args);
  }
  [dartx.getPathSegAtLength](...args) {
    return this.getPathSegAtLength.apply(this, args);
  }
  [dartx.getPointAtLength](...args) {
    return this.getPointAtLength.apply(this, args);
  }
  [dartx.getTotalLength](...args) {
    return this.getTotalLength.apply(this, args);
  }
};
dart.defineNamedConstructor(svg$.PathElement, 'created');
dart.setSignature(svg$.PathElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.PathElement, []),
    new: dart.definiteFunctionType(svg$.PathElement, []),
    created: dart.definiteFunctionType(svg$.PathElement, [])
  }),
  fields: () => ({
    [dartx.animatedNormalizedPathSegList]: svg$.PathSegList,
    [dartx.animatedPathSegList]: svg$.PathSegList,
    [dartx.normalizedPathSegList]: svg$.PathSegList,
    [dartx.pathLength]: svg$.AnimatedNumber,
    [dartx.pathSegList]: svg$.PathSegList
  }),
  methods: () => ({
    [dartx.createSvgPathSegArcAbs]: dart.definiteFunctionType(svg$.PathSegArcAbs, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
    [dartx.createSvgPathSegArcRel]: dart.definiteFunctionType(svg$.PathSegArcRel, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
    [dartx.createSvgPathSegClosePath]: dart.definiteFunctionType(svg$.PathSegClosePath, []),
    [dartx.createSvgPathSegCurvetoCubicAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.createSvgPathSegCurvetoCubicRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.createSvgPathSegCurvetoCubicSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [core.num, core.num, core.num, core.num]),
    [dartx.createSvgPathSegCurvetoCubicSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [core.num, core.num, core.num, core.num]),
    [dartx.createSvgPathSegCurvetoQuadraticAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [core.num, core.num, core.num, core.num]),
    [dartx.createSvgPathSegCurvetoQuadraticRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [core.num, core.num, core.num, core.num]),
    [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [core.num, core.num]),
    [dartx.createSvgPathSegCurvetoQuadraticSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [core.num, core.num]),
    [dartx.createSvgPathSegLinetoAbs]: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [core.num, core.num]),
    [dartx.createSvgPathSegLinetoHorizontalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [core.num]),
    [dartx.createSvgPathSegLinetoHorizontalRel]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [core.num]),
    [dartx.createSvgPathSegLinetoRel]: dart.definiteFunctionType(svg$.PathSegLinetoRel, [core.num, core.num]),
    [dartx.createSvgPathSegLinetoVerticalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [core.num]),
    [dartx.createSvgPathSegLinetoVerticalRel]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [core.num]),
    [dartx.createSvgPathSegMovetoAbs]: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [core.num, core.num]),
    [dartx.createSvgPathSegMovetoRel]: dart.definiteFunctionType(svg$.PathSegMovetoRel, [core.num, core.num]),
    [dartx.getPathSegAtLength]: dart.definiteFunctionType(core.int, [core.num]),
    [dartx.getPointAtLength]: dart.definiteFunctionType(svg$.Point, [core.num]),
    [dartx.getTotalLength]: dart.definiteFunctionType(core.double, [])
  })
});
dart.registerExtension(dart.global.SVGPathElement, svg$.PathElement);
dart.defineExtensionNames([
  'pathSegType',
  'pathSegTypeAsLetter'
]);
svg$.PathSeg = class PathSeg extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.pathSegType]() {
    return this.pathSegType;
  }
  get [dartx.pathSegTypeAsLetter]() {
    return this.pathSegTypeAsLetter;
  }
};
dart.setSignature(svg$.PathSeg, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSeg, [])}),
  fields: () => ({
    [dartx.pathSegType]: core.int,
    [dartx.pathSegTypeAsLetter]: core.String
  }),
  sfields: () => ({
    PATHSEG_ARC_ABS: core.int,
    PATHSEG_ARC_REL: core.int,
    PATHSEG_CLOSEPATH: core.int,
    PATHSEG_CURVETO_CUBIC_ABS: core.int,
    PATHSEG_CURVETO_CUBIC_REL: core.int,
    PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: core.int,
    PATHSEG_CURVETO_CUBIC_SMOOTH_REL: core.int,
    PATHSEG_CURVETO_QUADRATIC_ABS: core.int,
    PATHSEG_CURVETO_QUADRATIC_REL: core.int,
    PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: core.int,
    PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: core.int,
    PATHSEG_LINETO_ABS: core.int,
    PATHSEG_LINETO_HORIZONTAL_ABS: core.int,
    PATHSEG_LINETO_HORIZONTAL_REL: core.int,
    PATHSEG_LINETO_REL: core.int,
    PATHSEG_LINETO_VERTICAL_ABS: core.int,
    PATHSEG_LINETO_VERTICAL_REL: core.int,
    PATHSEG_MOVETO_ABS: core.int,
    PATHSEG_MOVETO_REL: core.int,
    PATHSEG_UNKNOWN: core.int
  })
});
svg$.PathSeg.PATHSEG_ARC_ABS = 10;
svg$.PathSeg.PATHSEG_ARC_REL = 11;
svg$.PathSeg.PATHSEG_CLOSEPATH = 1;
svg$.PathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
svg$.PathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
svg$.PathSeg.PATHSEG_LINETO_ABS = 4;
svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
svg$.PathSeg.PATHSEG_LINETO_REL = 5;
svg$.PathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
svg$.PathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
svg$.PathSeg.PATHSEG_MOVETO_ABS = 2;
svg$.PathSeg.PATHSEG_MOVETO_REL = 3;
svg$.PathSeg.PATHSEG_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGPathSeg, svg$.PathSeg);
dart.defineExtensionNames([
  'angle',
  'largeArcFlag',
  'r1',
  'r2',
  'sweepFlag',
  'x',
  'y'
]);
svg$.PathSegArcAbs = class PathSegArcAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.angle]() {
    return this.angle;
  }
  set [dartx.angle](value) {
    this.angle = value;
  }
  get [dartx.largeArcFlag]() {
    return this.largeArcFlag;
  }
  set [dartx.largeArcFlag](value) {
    this.largeArcFlag = value;
  }
  get [dartx.r1]() {
    return this.r1;
  }
  set [dartx.r1](value) {
    this.r1 = value;
  }
  get [dartx.r2]() {
    return this.r2;
  }
  set [dartx.r2](value) {
    this.r2 = value;
  }
  get [dartx.sweepFlag]() {
    return this.sweepFlag;
  }
  set [dartx.sweepFlag](value) {
    this.sweepFlag = value;
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegArcAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcAbs, [])}),
  fields: () => ({
    [dartx.angle]: core.num,
    [dartx.largeArcFlag]: core.bool,
    [dartx.r1]: core.num,
    [dartx.r2]: core.num,
    [dartx.sweepFlag]: core.bool,
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegArcAbs, svg$.PathSegArcAbs);
dart.defineExtensionNames([
  'angle',
  'largeArcFlag',
  'r1',
  'r2',
  'sweepFlag',
  'x',
  'y'
]);
svg$.PathSegArcRel = class PathSegArcRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.angle]() {
    return this.angle;
  }
  set [dartx.angle](value) {
    this.angle = value;
  }
  get [dartx.largeArcFlag]() {
    return this.largeArcFlag;
  }
  set [dartx.largeArcFlag](value) {
    this.largeArcFlag = value;
  }
  get [dartx.r1]() {
    return this.r1;
  }
  set [dartx.r1](value) {
    this.r1 = value;
  }
  get [dartx.r2]() {
    return this.r2;
  }
  set [dartx.r2](value) {
    this.r2 = value;
  }
  get [dartx.sweepFlag]() {
    return this.sweepFlag;
  }
  set [dartx.sweepFlag](value) {
    this.sweepFlag = value;
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegArcRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcRel, [])}),
  fields: () => ({
    [dartx.angle]: core.num,
    [dartx.largeArcFlag]: core.bool,
    [dartx.r1]: core.num,
    [dartx.r2]: core.num,
    [dartx.sweepFlag]: core.bool,
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegArcRel, svg$.PathSegArcRel);
svg$.PathSegClosePath = class PathSegClosePath extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(svg$.PathSegClosePath, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegClosePath, [])})
});
dart.registerExtension(dart.global.SVGPathSegClosePath, svg$.PathSegClosePath);
dart.defineExtensionNames([
  'x',
  'x1',
  'x2',
  'y',
  'y1',
  'y2'
]);
svg$.PathSegCurvetoCubicAbs = class PathSegCurvetoCubicAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.x1]() {
    return this.x1;
  }
  set [dartx.x1](value) {
    this.x1 = value;
  }
  get [dartx.x2]() {
    return this.x2;
  }
  set [dartx.x2](value) {
    this.x2 = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  get [dartx.y1]() {
    return this.y1;
  }
  set [dartx.y1](value) {
    this.y1 = value;
  }
  get [dartx.y2]() {
    return this.y2;
  }
  set [dartx.y2](value) {
    this.y2 = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoCubicAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.x1]: core.num,
    [dartx.x2]: core.num,
    [dartx.y]: core.num,
    [dartx.y1]: core.num,
    [dartx.y2]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoCubicAbs, svg$.PathSegCurvetoCubicAbs);
dart.defineExtensionNames([
  'x',
  'x1',
  'x2',
  'y',
  'y1',
  'y2'
]);
svg$.PathSegCurvetoCubicRel = class PathSegCurvetoCubicRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.x1]() {
    return this.x1;
  }
  set [dartx.x1](value) {
    this.x1 = value;
  }
  get [dartx.x2]() {
    return this.x2;
  }
  set [dartx.x2](value) {
    this.x2 = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  get [dartx.y1]() {
    return this.y1;
  }
  set [dartx.y1](value) {
    this.y1 = value;
  }
  get [dartx.y2]() {
    return this.y2;
  }
  set [dartx.y2](value) {
    this.y2 = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoCubicRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.x1]: core.num,
    [dartx.x2]: core.num,
    [dartx.y]: core.num,
    [dartx.y1]: core.num,
    [dartx.y2]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoCubicRel, svg$.PathSegCurvetoCubicRel);
dart.defineExtensionNames([
  'x',
  'x2',
  'y',
  'y2'
]);
svg$.PathSegCurvetoCubicSmoothAbs = class PathSegCurvetoCubicSmoothAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.x2]() {
    return this.x2;
  }
  set [dartx.x2](value) {
    this.x2 = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  get [dartx.y2]() {
    return this.y2;
  }
  set [dartx.y2](value) {
    this.y2 = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoCubicSmoothAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.x2]: core.num,
    [dartx.y]: core.num,
    [dartx.y2]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothAbs, svg$.PathSegCurvetoCubicSmoothAbs);
dart.defineExtensionNames([
  'x',
  'x2',
  'y',
  'y2'
]);
svg$.PathSegCurvetoCubicSmoothRel = class PathSegCurvetoCubicSmoothRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.x2]() {
    return this.x2;
  }
  set [dartx.x2](value) {
    this.x2 = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  get [dartx.y2]() {
    return this.y2;
  }
  set [dartx.y2](value) {
    this.y2 = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoCubicSmoothRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.x2]: core.num,
    [dartx.y]: core.num,
    [dartx.y2]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothRel, svg$.PathSegCurvetoCubicSmoothRel);
dart.defineExtensionNames([
  'x',
  'x1',
  'y',
  'y1'
]);
svg$.PathSegCurvetoQuadraticAbs = class PathSegCurvetoQuadraticAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.x1]() {
    return this.x1;
  }
  set [dartx.x1](value) {
    this.x1 = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  get [dartx.y1]() {
    return this.y1;
  }
  set [dartx.y1](value) {
    this.y1 = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoQuadraticAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.x1]: core.num,
    [dartx.y]: core.num,
    [dartx.y1]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticAbs, svg$.PathSegCurvetoQuadraticAbs);
dart.defineExtensionNames([
  'x',
  'x1',
  'y',
  'y1'
]);
svg$.PathSegCurvetoQuadraticRel = class PathSegCurvetoQuadraticRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.x1]() {
    return this.x1;
  }
  set [dartx.x1](value) {
    this.x1 = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  get [dartx.y1]() {
    return this.y1;
  }
  set [dartx.y1](value) {
    this.y1 = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoQuadraticRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.x1]: core.num,
    [dartx.y]: core.num,
    [dartx.y1]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticRel, svg$.PathSegCurvetoQuadraticRel);
dart.defineExtensionNames([
  'x',
  'y'
]);
svg$.PathSegCurvetoQuadraticSmoothAbs = class PathSegCurvetoQuadraticSmoothAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothAbs, svg$.PathSegCurvetoQuadraticSmoothAbs);
dart.defineExtensionNames([
  'x',
  'y'
]);
svg$.PathSegCurvetoQuadraticSmoothRel = class PathSegCurvetoQuadraticSmoothRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothRel, svg$.PathSegCurvetoQuadraticSmoothRel);
dart.defineExtensionNames([
  'x',
  'y'
]);
svg$.PathSegLinetoAbs = class PathSegLinetoAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegLinetoAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegLinetoAbs, svg$.PathSegLinetoAbs);
dart.defineExtensionNames([
  'x'
]);
svg$.PathSegLinetoHorizontalAbs = class PathSegLinetoHorizontalAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
};
dart.setSignature(svg$.PathSegLinetoHorizontalAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [])}),
  fields: () => ({[dartx.x]: core.num})
});
dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalAbs, svg$.PathSegLinetoHorizontalAbs);
dart.defineExtensionNames([
  'x'
]);
svg$.PathSegLinetoHorizontalRel = class PathSegLinetoHorizontalRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
};
dart.setSignature(svg$.PathSegLinetoHorizontalRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [])}),
  fields: () => ({[dartx.x]: core.num})
});
dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalRel, svg$.PathSegLinetoHorizontalRel);
dart.defineExtensionNames([
  'x',
  'y'
]);
svg$.PathSegLinetoRel = class PathSegLinetoRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegLinetoRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoRel, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegLinetoRel, svg$.PathSegLinetoRel);
dart.defineExtensionNames([
  'y'
]);
svg$.PathSegLinetoVerticalAbs = class PathSegLinetoVerticalAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegLinetoVerticalAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [])}),
  fields: () => ({[dartx.y]: core.num})
});
dart.registerExtension(dart.global.SVGPathSegLinetoVerticalAbs, svg$.PathSegLinetoVerticalAbs);
dart.defineExtensionNames([
  'y'
]);
svg$.PathSegLinetoVerticalRel = class PathSegLinetoVerticalRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegLinetoVerticalRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [])}),
  fields: () => ({[dartx.y]: core.num})
});
dart.registerExtension(dart.global.SVGPathSegLinetoVerticalRel, svg$.PathSegLinetoVerticalRel);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'appendItem',
  'clear',
  'getItem',
  'initialize',
  'insertItemBefore',
  'removeItem',
  'replaceItem',
  'numberOfItems'
]);
svg$.PathSegList = class PathSegList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.PathSeg), html$.ImmutableListMixin$(svg$.PathSeg)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.numberOfItems]() {
    return this.numberOfItems;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.getItem](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [dartx.initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [dartx.insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [dartx.removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [dartx.replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.PathSegList[dart.implements] = () => [ListOfPathSeg()];
dart.setSignature(svg$.PathSegList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegList, [])}),
  fields: () => ({[dartx.numberOfItems]: core.int}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
    [dartx.appendItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
    [dartx.getItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
    [dartx.initialize]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int]),
    [dartx.removeItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
    [dartx.replaceItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int])
  })
});
dart.registerExtension(dart.global.SVGPathSegList, svg$.PathSegList);
dart.defineExtensionNames([
  'x',
  'y'
]);
svg$.PathSegMovetoAbs = class PathSegMovetoAbs extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegMovetoAbs, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegMovetoAbs, svg$.PathSegMovetoAbs);
dart.defineExtensionNames([
  'x',
  'y'
]);
svg$.PathSegMovetoRel = class PathSegMovetoRel extends svg$.PathSeg {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.PathSegMovetoRel, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoRel, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGPathSegMovetoRel, svg$.PathSegMovetoRel);
dart.defineExtensionNames([
  'hasExtension',
  'height',
  'patternContentUnits',
  'patternTransform',
  'patternUnits',
  'width',
  'x',
  'y',
  'preserveAspectRatio',
  'viewBox',
  'requiredExtensions',
  'requiredFeatures',
  'systemLanguage',
  'href'
]);
svg$.PatternElement = class PatternElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.PatternElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.patternContentUnits] = null;
    this[dartx.patternTransform] = null;
    this[dartx.patternUnits] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.preserveAspectRatio] = null;
    this[dartx.viewBox] = null;
    this[dartx.requiredExtensions] = null;
    this[dartx.requiredFeatures] = null;
    this[dartx.systemLanguage] = null;
    this[dartx.href] = null;
    super.created();
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.patternContentUnits]() {
    return this.patternContentUnits;
  }
  get [dartx.patternTransform]() {
    return this.patternTransform;
  }
  get [dartx.patternUnits]() {
    return this.patternUnits;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.viewBox]() {
    return this.viewBox;
  }
  get [dartx.requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [dartx.requiredFeatures]() {
    return this.requiredFeatures;
  }
  get [dartx.systemLanguage]() {
    return this.systemLanguage;
  }
  [dartx.hasExtension](...args) {
    return this.hasExtension.apply(this, args);
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.PatternElement, 'created');
svg$.PatternElement[dart.implements] = () => [svg$.FitToViewBox, svg$.UriReference, svg$.Tests];
dart.setSignature(svg$.PatternElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.PatternElement, []),
    new: dart.definiteFunctionType(svg$.PatternElement, []),
    created: dart.definiteFunctionType(svg$.PatternElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.patternContentUnits]: svg$.AnimatedEnumeration,
    [dartx.patternTransform]: svg$.AnimatedTransformList,
    [dartx.patternUnits]: svg$.AnimatedEnumeration,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength,
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.viewBox]: svg$.AnimatedRect,
    [dartx.requiredExtensions]: svg$.StringList,
    [dartx.requiredFeatures]: svg$.StringList,
    [dartx.systemLanguage]: svg$.StringList,
    [dartx.href]: svg$.AnimatedString
  }),
  methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
});
dart.registerExtension(dart.global.SVGPatternElement, svg$.PatternElement);
dart.defineExtensionNames([
  'matrixTransform',
  'x',
  'y'
]);
svg$.Point = class Point extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
  [dartx.matrixTransform](...args) {
    return this.matrixTransform.apply(this, args);
  }
};
dart.setSignature(svg$.Point, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Point, [])}),
  fields: () => ({
    [dartx.x]: core.num,
    [dartx.y]: core.num
  }),
  methods: () => ({[dartx.matrixTransform]: dart.definiteFunctionType(svg$.Point, [svg$.Matrix])})
});
dart.registerExtension(dart.global.SVGPoint, svg$.Point);
dart.defineExtensionNames([
  'appendItem',
  'clear',
  'getItem',
  'initialize',
  'insertItemBefore',
  'removeItem',
  'replaceItem',
  'length',
  'numberOfItems'
]);
svg$.PointList = class PointList extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.numberOfItems]() {
    return this.numberOfItems;
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [dartx.initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [dartx.insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [dartx.removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [dartx.replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
dart.setSignature(svg$.PointList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PointList, [])}),
  fields: () => ({
    [dartx.length]: core.int,
    [dartx.numberOfItems]: core.int
  }),
  methods: () => ({
    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Point]),
    [dartx.appendItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
    [dartx.getItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
    [dartx.initialize]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int]),
    [dartx.removeItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int])
  })
});
dart.registerExtension(dart.global.SVGPointList, svg$.PointList);
dart.defineExtensionNames([
  'animatedPoints',
  'points'
]);
svg$.PolygonElement = class PolygonElement extends svg$.GeometryElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.PolygonElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
  }
  created() {
    this[dartx.animatedPoints] = null;
    this[dartx.points] = null;
    super.created();
  }
  get [dartx.animatedPoints]() {
    return this.animatedPoints;
  }
  get [dartx.points]() {
    return this.points;
  }
};
dart.defineNamedConstructor(svg$.PolygonElement, 'created');
dart.setSignature(svg$.PolygonElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.PolygonElement, []),
    new: dart.definiteFunctionType(svg$.PolygonElement, []),
    created: dart.definiteFunctionType(svg$.PolygonElement, [])
  }),
  fields: () => ({
    [dartx.animatedPoints]: svg$.PointList,
    [dartx.points]: svg$.PointList
  })
});
dart.registerExtension(dart.global.SVGPolygonElement, svg$.PolygonElement);
dart.defineExtensionNames([
  'animatedPoints',
  'points'
]);
svg$.PolylineElement = class PolylineElement extends svg$.GeometryElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.PolylineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
  }
  created() {
    this[dartx.animatedPoints] = null;
    this[dartx.points] = null;
    super.created();
  }
  get [dartx.animatedPoints]() {
    return this.animatedPoints;
  }
  get [dartx.points]() {
    return this.points;
  }
};
dart.defineNamedConstructor(svg$.PolylineElement, 'created');
dart.setSignature(svg$.PolylineElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.PolylineElement, []),
    new: dart.definiteFunctionType(svg$.PolylineElement, []),
    created: dart.definiteFunctionType(svg$.PolylineElement, [])
  }),
  fields: () => ({
    [dartx.animatedPoints]: svg$.PointList,
    [dartx.points]: svg$.PointList
  })
});
dart.registerExtension(dart.global.SVGPolylineElement, svg$.PolylineElement);
dart.defineExtensionNames([
  'align',
  'meetOrSlice'
]);
svg$.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.align]() {
    return this.align;
  }
  set [dartx.align](value) {
    this.align = value;
  }
  get [dartx.meetOrSlice]() {
    return this.meetOrSlice;
  }
  set [dartx.meetOrSlice](value) {
    this.meetOrSlice = value;
  }
};
dart.setSignature(svg$.PreserveAspectRatio, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.PreserveAspectRatio, [])}),
  fields: () => ({
    [dartx.align]: core.int,
    [dartx.meetOrSlice]: core.int
  }),
  sfields: () => ({
    SVG_MEETORSLICE_MEET: core.int,
    SVG_MEETORSLICE_SLICE: core.int,
    SVG_MEETORSLICE_UNKNOWN: core.int,
    SVG_PRESERVEASPECTRATIO_NONE: core.int,
    SVG_PRESERVEASPECTRATIO_UNKNOWN: core.int,
    SVG_PRESERVEASPECTRATIO_XMAXYMAX: core.int,
    SVG_PRESERVEASPECTRATIO_XMAXYMID: core.int,
    SVG_PRESERVEASPECTRATIO_XMAXYMIN: core.int,
    SVG_PRESERVEASPECTRATIO_XMIDYMAX: core.int,
    SVG_PRESERVEASPECTRATIO_XMIDYMID: core.int,
    SVG_PRESERVEASPECTRATIO_XMIDYMIN: core.int,
    SVG_PRESERVEASPECTRATIO_XMINYMAX: core.int,
    SVG_PRESERVEASPECTRATIO_XMINYMID: core.int,
    SVG_PRESERVEASPECTRATIO_XMINYMIN: core.int
  })
});
svg$.PreserveAspectRatio.SVG_MEETORSLICE_MEET = 1;
svg$.PreserveAspectRatio.SVG_MEETORSLICE_SLICE = 2;
svg$.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN = 0;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE = 1;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
dart.registerExtension(dart.global.SVGPreserveAspectRatio, svg$.PreserveAspectRatio);
dart.defineExtensionNames([
  'cx',
  'cy',
  'fr',
  'fx',
  'fy',
  'r'
]);
svg$.RadialGradientElement = class RadialGradientElement extends svg$._GradientElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.RadialGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
  }
  created() {
    this[dartx.cx] = null;
    this[dartx.cy] = null;
    this[dartx.fr] = null;
    this[dartx.fx] = null;
    this[dartx.fy] = null;
    this[dartx.r] = null;
    super.created();
  }
  get [dartx.cx]() {
    return this.cx;
  }
  get [dartx.cy]() {
    return this.cy;
  }
  get [dartx.fr]() {
    return this.fr;
  }
  get [dartx.fx]() {
    return this.fx;
  }
  get [dartx.fy]() {
    return this.fy;
  }
  get [dartx.r]() {
    return this.r;
  }
};
dart.defineNamedConstructor(svg$.RadialGradientElement, 'created');
dart.setSignature(svg$.RadialGradientElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.RadialGradientElement, []),
    new: dart.definiteFunctionType(svg$.RadialGradientElement, []),
    created: dart.definiteFunctionType(svg$.RadialGradientElement, [])
  }),
  fields: () => ({
    [dartx.cx]: svg$.AnimatedLength,
    [dartx.cy]: svg$.AnimatedLength,
    [dartx.fr]: svg$.AnimatedLength,
    [dartx.fx]: svg$.AnimatedLength,
    [dartx.fy]: svg$.AnimatedLength,
    [dartx.r]: svg$.AnimatedLength
  })
});
dart.registerExtension(dart.global.SVGRadialGradientElement, svg$.RadialGradientElement);
dart.defineExtensionNames([
  'height',
  'width',
  'x',
  'y'
]);
svg$.Rect = class Rect extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.height]() {
    return this.height;
  }
  set [dartx.height](value) {
    this.height = value;
  }
  get [dartx.width]() {
    return this.width;
  }
  set [dartx.width](value) {
    this.width = value;
  }
  get [dartx.x]() {
    return this.x;
  }
  set [dartx.x](value) {
    this.x = value;
  }
  get [dartx.y]() {
    return this.y;
  }
  set [dartx.y](value) {
    this.y = value;
  }
};
dart.setSignature(svg$.Rect, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Rect, [])}),
  fields: () => ({
    [dartx.height]: core.num,
    [dartx.width]: core.num,
    [dartx.x]: core.num,
    [dartx.y]: core.num
  })
});
dart.registerExtension(dart.global.SVGRect, svg$.Rect);
dart.defineExtensionNames([
  'height',
  'rx',
  'ry',
  'width',
  'x',
  'y'
]);
svg$.RectElement = class RectElement extends svg$.GeometryElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.RectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("rect"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.rx] = null;
    this[dartx.ry] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.rx]() {
    return this.rx;
  }
  get [dartx.ry]() {
    return this.ry;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.RectElement, 'created');
dart.setSignature(svg$.RectElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.RectElement, []),
    new: dart.definiteFunctionType(svg$.RectElement, []),
    created: dart.definiteFunctionType(svg$.RectElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.rx]: svg$.AnimatedLength,
    [dartx.ry]: svg$.AnimatedLength,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength
  })
});
dart.registerExtension(dart.global.SVGRectElement, svg$.RectElement);
dart.defineExtensionNames([
  'type',
  'href'
]);
svg$.ScriptElement = class ScriptElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.ScriptElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("script"));
  }
  created() {
    this[dartx.type] = null;
    this[dartx.href] = null;
    super.created();
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.ScriptElement, 'created');
svg$.ScriptElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$.ScriptElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.ScriptElement, []),
    new: dart.definiteFunctionType(svg$.ScriptElement, []),
    created: dart.definiteFunctionType(svg$.ScriptElement, [])
  }),
  fields: () => ({
    [dartx.type]: core.String,
    [dartx.href]: svg$.AnimatedString
  })
});
dart.registerExtension(dart.global.SVGScriptElement, svg$.ScriptElement);
svg$.SetElement = class SetElement extends svg$.AnimationElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.SetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("set"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('set')) && svg$.SetElement.is(svg$.SvgElement.tag('set'));
  }
};
dart.defineNamedConstructor(svg$.SetElement, 'created');
dart.setSignature(svg$.SetElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.SetElement, []),
    new: dart.definiteFunctionType(svg$.SetElement, []),
    created: dart.definiteFunctionType(svg$.SetElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGSetElement, svg$.SetElement);
dart.defineExtensionNames([
  'gradientOffset'
]);
svg$.StopElement = class StopElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.StopElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("stop"));
  }
  created() {
    this[dartx.gradientOffset] = null;
    super.created();
  }
  get [dartx.gradientOffset]() {
    return this.offset;
  }
};
dart.defineNamedConstructor(svg$.StopElement, 'created');
dart.setSignature(svg$.StopElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.StopElement, []),
    new: dart.definiteFunctionType(svg$.StopElement, []),
    created: dart.definiteFunctionType(svg$.StopElement, [])
  }),
  fields: () => ({[dartx.gradientOffset]: svg$.AnimatedNumber})
});
dart.registerExtension(dart.global.SVGStopElement, svg$.StopElement);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'appendItem',
  'clear',
  'getItem',
  'initialize',
  'insertItemBefore',
  'removeItem',
  'replaceItem',
  'numberOfItems'
]);
svg$.StringList = class StringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.numberOfItems]() {
    return this.numberOfItems;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.getItem](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [dartx.initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [dartx.insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [dartx.removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [dartx.replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.StringList[dart.implements] = () => [ListOfString()];
dart.setSignature(svg$.StringList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.StringList, [])}),
  fields: () => ({[dartx.numberOfItems]: core.int}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
    [dartx.appendItem]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.getItem]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.initialize]: dart.definiteFunctionType(core.String, [core.String]),
    [dartx.insertItemBefore]: dart.definiteFunctionType(core.String, [core.String, core.int]),
    [dartx.removeItem]: dart.definiteFunctionType(core.String, [core.int]),
    [dartx.replaceItem]: dart.definiteFunctionType(core.String, [core.String, core.int])
  })
});
dart.registerExtension(dart.global.SVGStringList, svg$.StringList);
dart.defineExtensionNames([
  'disabled',
  'media',
  'sheet',
  'type'
]);
svg$.StyleElement = class StyleElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.StyleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("style"));
  }
  created() {
    this[dartx.disabled] = null;
    this[dartx.media] = null;
    this[dartx.sheet] = null;
    this[dartx.type] = null;
    super.created();
  }
  get [dartx.disabled]() {
    return this.disabled;
  }
  set [dartx.disabled](value) {
    this.disabled = value;
  }
  get [dartx.media]() {
    return this.media;
  }
  set [dartx.media](value) {
    this.media = value;
  }
  get [dartx.sheet]() {
    return this.sheet;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
};
dart.defineNamedConstructor(svg$.StyleElement, 'created');
dart.setSignature(svg$.StyleElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.StyleElement, []),
    new: dart.definiteFunctionType(svg$.StyleElement, []),
    created: dart.definiteFunctionType(svg$.StyleElement, [])
  }),
  fields: () => ({
    [dartx.disabled]: core.bool,
    [dartx.media]: core.String,
    [dartx.sheet]: html$.StyleSheet,
    [dartx.type]: core.String
  })
});
dart.registerExtension(dart.global.SVGStyleElement, svg$.StyleElement);
const _element$0 = Symbol('_element');
svg$._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
  new(element) {
    this[_element$0] = element;
  }
  readClasses() {
    let classname = this[_element$0][dartx.attributes][dartx._get]('class');
    let s = LinkedHashSetOfString().new();
    if (classname == null) {
      return s;
    }
    for (let name of classname[dartx.split](' ')) {
      let trimmed = name[dartx.trim]();
      if (!dart.test(trimmed[dartx.isEmpty])) {
        s.add(trimmed);
      }
    }
    return s;
  }
  writeClasses(s) {
    this[_element$0][dartx.attributes][dartx._set]('class', s.join(' '));
  }
};
dart.setSignature(svg$._AttributeClassSet, {
  constructors: () => ({new: dart.definiteFunctionType(svg$._AttributeClassSet, [html$.Element])}),
  fields: () => ({[_element$0]: html$.Element}),
  methods: () => ({
    readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
    writeClasses: dart.definiteFunctionType(dart.void, [core.Set])
  })
});
dart.defineExtensionNames([
  'animationsPaused',
  'checkEnclosure',
  'checkIntersection',
  'createSvgAngle',
  'createSvgLength',
  'createSvgMatrix',
  'createSvgNumber',
  'createSvgPoint',
  'createSvgRect',
  'createSvgTransform',
  'createSvgTransformFromMatrix',
  'deselectAll',
  'forceRedraw',
  'getCurrentTime',
  'getElementById',
  'getEnclosureList',
  'getIntersectionList',
  'pauseAnimations',
  'setCurrentTime',
  'suspendRedraw',
  'unpauseAnimations',
  'unsuspendRedraw',
  'unsuspendRedrawAll',
  'currentScale',
  'currentTranslate',
  'currentView',
  'height',
  'pixelUnitToMillimeterX',
  'pixelUnitToMillimeterY',
  'screenPixelToMillimeterX',
  'screenPixelToMillimeterY',
  'useCurrentView',
  'viewport',
  'width',
  'x',
  'y',
  'preserveAspectRatio',
  'viewBox',
  'zoomAndPan'
]);
svg$.SvgSvgElement = class SvgSvgElement extends svg$.GraphicsElement {
  static new() {
    let el = svg$.SvgElement.tag("svg");
    el[dartx.attributes][dartx._set]('version', "1.1");
    return svg$.SvgSvgElement._check(el);
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.currentScale] = null;
    this[dartx.currentTranslate] = null;
    this[dartx.currentView] = null;
    this[dartx.height] = null;
    this[dartx.pixelUnitToMillimeterX] = null;
    this[dartx.pixelUnitToMillimeterY] = null;
    this[dartx.screenPixelToMillimeterX] = null;
    this[dartx.screenPixelToMillimeterY] = null;
    this[dartx.useCurrentView] = null;
    this[dartx.viewport] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.preserveAspectRatio] = null;
    this[dartx.viewBox] = null;
    this[dartx.zoomAndPan] = null;
    super.created();
  }
  get [dartx.currentScale]() {
    return this.currentScale;
  }
  set [dartx.currentScale](value) {
    this.currentScale = value;
  }
  get [dartx.currentTranslate]() {
    return this.currentTranslate;
  }
  get [dartx.currentView]() {
    return this.currentView;
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.pixelUnitToMillimeterX]() {
    return this.pixelUnitToMillimeterX;
  }
  get [dartx.pixelUnitToMillimeterY]() {
    return this.pixelUnitToMillimeterY;
  }
  get [dartx.screenPixelToMillimeterX]() {
    return this.screenPixelToMillimeterX;
  }
  get [dartx.screenPixelToMillimeterY]() {
    return this.screenPixelToMillimeterY;
  }
  get [dartx.useCurrentView]() {
    return this.useCurrentView;
  }
  get [dartx.viewport]() {
    return this.viewport;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  [dartx.animationsPaused](...args) {
    return this.animationsPaused.apply(this, args);
  }
  [dartx.checkEnclosure](...args) {
    return this.checkEnclosure.apply(this, args);
  }
  [dartx.checkIntersection](...args) {
    return this.checkIntersection.apply(this, args);
  }
  [dartx.createSvgAngle](...args) {
    return this.createSVGAngle.apply(this, args);
  }
  [dartx.createSvgLength](...args) {
    return this.createSVGLength.apply(this, args);
  }
  [dartx.createSvgMatrix](...args) {
    return this.createSVGMatrix.apply(this, args);
  }
  [dartx.createSvgNumber](...args) {
    return this.createSVGNumber.apply(this, args);
  }
  [dartx.createSvgPoint](...args) {
    return this.createSVGPoint.apply(this, args);
  }
  [dartx.createSvgRect](...args) {
    return this.createSVGRect.apply(this, args);
  }
  [dartx.createSvgTransform](...args) {
    return this.createSVGTransform.apply(this, args);
  }
  [dartx.createSvgTransformFromMatrix](...args) {
    return this.createSVGTransformFromMatrix.apply(this, args);
  }
  [dartx.deselectAll](...args) {
    return this.deselectAll.apply(this, args);
  }
  [dartx.forceRedraw](...args) {
    return this.forceRedraw.apply(this, args);
  }
  [dartx.getCurrentTime](...args) {
    return this.getCurrentTime.apply(this, args);
  }
  [dartx.getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
  [dartx.getEnclosureList](...args) {
    return this.getEnclosureList.apply(this, args);
  }
  [dartx.getIntersectionList](...args) {
    return this.getIntersectionList.apply(this, args);
  }
  [dartx.pauseAnimations](...args) {
    return this.pauseAnimations.apply(this, args);
  }
  [dartx.setCurrentTime](...args) {
    return this.setCurrentTime.apply(this, args);
  }
  [dartx.suspendRedraw](...args) {
    return this.suspendRedraw.apply(this, args);
  }
  [dartx.unpauseAnimations](...args) {
    return this.unpauseAnimations.apply(this, args);
  }
  [dartx.unsuspendRedraw](...args) {
    return this.unsuspendRedraw.apply(this, args);
  }
  [dartx.unsuspendRedrawAll](...args) {
    return this.unsuspendRedrawAll.apply(this, args);
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.viewBox]() {
    return this.viewBox;
  }
  get [dartx.zoomAndPan]() {
    return this.zoomAndPan;
  }
  set [dartx.zoomAndPan](value) {
    this.zoomAndPan = value;
  }
};
dart.defineNamedConstructor(svg$.SvgSvgElement, 'created');
svg$.SvgSvgElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
dart.setSignature(svg$.SvgSvgElement, {
  constructors: () => ({
    new: dart.definiteFunctionType(svg$.SvgSvgElement, []),
    _: dart.definiteFunctionType(svg$.SvgSvgElement, []),
    created: dart.definiteFunctionType(svg$.SvgSvgElement, [])
  }),
  fields: () => ({
    [dartx.currentScale]: core.num,
    [dartx.currentTranslate]: svg$.Point,
    [dartx.currentView]: svg$.ViewSpec,
    [dartx.height]: svg$.AnimatedLength,
    [dartx.pixelUnitToMillimeterX]: core.double,
    [dartx.pixelUnitToMillimeterY]: core.double,
    [dartx.screenPixelToMillimeterX]: core.double,
    [dartx.screenPixelToMillimeterY]: core.double,
    [dartx.useCurrentView]: core.bool,
    [dartx.viewport]: svg$.Rect,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength,
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.viewBox]: svg$.AnimatedRect,
    [dartx.zoomAndPan]: core.int
  }),
  methods: () => ({
    [dartx.animationsPaused]: dart.definiteFunctionType(core.bool, []),
    [dartx.checkEnclosure]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
    [dartx.checkIntersection]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
    [dartx.createSvgAngle]: dart.definiteFunctionType(svg$.Angle, []),
    [dartx.createSvgLength]: dart.definiteFunctionType(svg$.Length, []),
    [dartx.createSvgMatrix]: dart.definiteFunctionType(svg$.Matrix, []),
    [dartx.createSvgNumber]: dart.definiteFunctionType(svg$.Number, []),
    [dartx.createSvgPoint]: dart.definiteFunctionType(svg$.Point, []),
    [dartx.createSvgRect]: dart.definiteFunctionType(svg$.Rect, []),
    [dartx.createSvgTransform]: dart.definiteFunctionType(svg$.Transform, []),
    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
    [dartx.deselectAll]: dart.definiteFunctionType(dart.void, []),
    [dartx.forceRedraw]: dart.definiteFunctionType(dart.void, []),
    [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
    [dartx.getEnclosureList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
    [dartx.getIntersectionList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
    [dartx.pauseAnimations]: dart.definiteFunctionType(dart.void, []),
    [dartx.setCurrentTime]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.suspendRedraw]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.unpauseAnimations]: dart.definiteFunctionType(dart.void, []),
    [dartx.unsuspendRedraw]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.unsuspendRedrawAll]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.SVGSVGElement, svg$.SvgSvgElement);
svg$.SwitchElement = class SwitchElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.SwitchElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("switch"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.SwitchElement, 'created');
dart.setSignature(svg$.SwitchElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.SwitchElement, []),
    new: dart.definiteFunctionType(svg$.SwitchElement, []),
    created: dart.definiteFunctionType(svg$.SwitchElement, [])
  })
});
dart.registerExtension(dart.global.SVGSwitchElement, svg$.SwitchElement);
dart.defineExtensionNames([
  'preserveAspectRatio',
  'viewBox'
]);
svg$.SymbolElement = class SymbolElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.SymbolElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
  }
  created() {
    this[dartx.preserveAspectRatio] = null;
    this[dartx.viewBox] = null;
    super.created();
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.viewBox]() {
    return this.viewBox;
  }
};
dart.defineNamedConstructor(svg$.SymbolElement, 'created');
svg$.SymbolElement[dart.implements] = () => [svg$.FitToViewBox];
dart.setSignature(svg$.SymbolElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.SymbolElement, []),
    new: dart.definiteFunctionType(svg$.SymbolElement, []),
    created: dart.definiteFunctionType(svg$.SymbolElement, [])
  }),
  fields: () => ({
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.viewBox]: svg$.AnimatedRect
  })
});
dart.registerExtension(dart.global.SVGSymbolElement, svg$.SymbolElement);
dart.defineExtensionNames([
  'getCharNumAtPosition',
  'getComputedTextLength',
  'getEndPositionOfChar',
  'getExtentOfChar',
  'getNumberOfChars',
  'getRotationOfChar',
  'getStartPositionOfChar',
  'getSubStringLength',
  'selectSubString',
  'lengthAdjust',
  'textLength'
]);
svg$.TextContentElement = class TextContentElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.lengthAdjust] = null;
    this[dartx.textLength] = null;
    super.created();
  }
  get [dartx.lengthAdjust]() {
    return this.lengthAdjust;
  }
  get [dartx.textLength]() {
    return this.textLength;
  }
  [dartx.getCharNumAtPosition](...args) {
    return this.getCharNumAtPosition.apply(this, args);
  }
  [dartx.getComputedTextLength](...args) {
    return this.getComputedTextLength.apply(this, args);
  }
  [dartx.getEndPositionOfChar](...args) {
    return this.getEndPositionOfChar.apply(this, args);
  }
  [dartx.getExtentOfChar](...args) {
    return this.getExtentOfChar.apply(this, args);
  }
  [dartx.getNumberOfChars](...args) {
    return this.getNumberOfChars.apply(this, args);
  }
  [dartx.getRotationOfChar](...args) {
    return this.getRotationOfChar.apply(this, args);
  }
  [dartx.getStartPositionOfChar](...args) {
    return this.getStartPositionOfChar.apply(this, args);
  }
  [dartx.getSubStringLength](...args) {
    return this.getSubStringLength.apply(this, args);
  }
  [dartx.selectSubString](...args) {
    return this.selectSubString.apply(this, args);
  }
};
dart.defineNamedConstructor(svg$.TextContentElement, 'created');
dart.setSignature(svg$.TextContentElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.TextContentElement, []),
    created: dart.definiteFunctionType(svg$.TextContentElement, [])
  }),
  fields: () => ({
    [dartx.lengthAdjust]: svg$.AnimatedEnumeration,
    [dartx.textLength]: svg$.AnimatedLength
  }),
  methods: () => ({
    [dartx.getCharNumAtPosition]: dart.definiteFunctionType(core.int, [svg$.Point]),
    [dartx.getComputedTextLength]: dart.definiteFunctionType(core.double, []),
    [dartx.getEndPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
    [dartx.getExtentOfChar]: dart.definiteFunctionType(svg$.Rect, [core.int]),
    [dartx.getNumberOfChars]: dart.definiteFunctionType(core.int, []),
    [dartx.getRotationOfChar]: dart.definiteFunctionType(core.double, [core.int]),
    [dartx.getStartPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
    [dartx.getSubStringLength]: dart.definiteFunctionType(core.double, [core.int, core.int]),
    [dartx.selectSubString]: dart.definiteFunctionType(dart.void, [core.int, core.int])
  }),
  sfields: () => ({
    LENGTHADJUST_SPACING: core.int,
    LENGTHADJUST_SPACINGANDGLYPHS: core.int,
    LENGTHADJUST_UNKNOWN: core.int
  })
});
svg$.TextContentElement.LENGTHADJUST_SPACING = 1;
svg$.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
svg$.TextContentElement.LENGTHADJUST_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGTextContentElement, svg$.TextContentElement);
dart.defineExtensionNames([
  'dx',
  'dy',
  'rotate',
  'x',
  'y'
]);
svg$.TextPositioningElement = class TextPositioningElement extends svg$.TextContentElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.dx] = null;
    this[dartx.dy] = null;
    this[dartx.rotate] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    super.created();
  }
  get [dartx.dx]() {
    return this.dx;
  }
  get [dartx.dy]() {
    return this.dy;
  }
  get [dartx.rotate]() {
    return this.rotate;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
};
dart.defineNamedConstructor(svg$.TextPositioningElement, 'created');
dart.setSignature(svg$.TextPositioningElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.TextPositioningElement, []),
    created: dart.definiteFunctionType(svg$.TextPositioningElement, [])
  }),
  fields: () => ({
    [dartx.dx]: svg$.AnimatedLengthList,
    [dartx.dy]: svg$.AnimatedLengthList,
    [dartx.rotate]: svg$.AnimatedNumberList,
    [dartx.x]: svg$.AnimatedLengthList,
    [dartx.y]: svg$.AnimatedLengthList
  })
});
dart.registerExtension(dart.global.SVGTextPositioningElement, svg$.TextPositioningElement);
svg$.TSpanElement = class TSpanElement extends svg$.TextPositioningElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.TSpanElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.TSpanElement, 'created');
dart.setSignature(svg$.TSpanElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.TSpanElement, []),
    new: dart.definiteFunctionType(svg$.TSpanElement, []),
    created: dart.definiteFunctionType(svg$.TSpanElement, [])
  })
});
dart.registerExtension(dart.global.SVGTSpanElement, svg$.TSpanElement);
dart.defineExtensionNames([
  'requiredExtensions',
  'requiredFeatures',
  'systemLanguage'
]);
svg$.Tests = class Tests extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get requiredExtensions() {
    return this[requiredExtensions];
  }
  set requiredExtensions(value) {
    super.requiredExtensions = value;
  }
  get requiredFeatures() {
    return this[requiredFeatures];
  }
  set requiredFeatures(value) {
    super.requiredFeatures = value;
  }
  get systemLanguage() {
    return this[systemLanguage];
  }
  set systemLanguage(value) {
    super.systemLanguage = value;
  }
};
const requiredExtensions = Symbol(svg$.Tests.name + "." + 'requiredExtensions'.toString());
const requiredFeatures = Symbol(svg$.Tests.name + "." + 'requiredFeatures'.toString());
const systemLanguage = Symbol(svg$.Tests.name + "." + 'systemLanguage'.toString());
dart.setSignature(svg$.Tests, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Tests, [])}),
  fields: () => ({
    requiredExtensions: svg$.StringList,
    requiredFeatures: svg$.StringList,
    systemLanguage: svg$.StringList
  })
});
dart.defineExtensionMembers(svg$.Tests, ['requiredExtensions', 'requiredFeatures', 'systemLanguage']);
svg$.TextElement = class TextElement extends svg$.TextPositioningElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.TextElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("text"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.TextElement, 'created');
dart.setSignature(svg$.TextElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.TextElement, []),
    new: dart.definiteFunctionType(svg$.TextElement, []),
    created: dart.definiteFunctionType(svg$.TextElement, [])
  })
});
dart.registerExtension(dart.global.SVGTextElement, svg$.TextElement);
dart.defineExtensionNames([
  'method',
  'spacing',
  'startOffset',
  'href'
]);
svg$.TextPathElement = class TextPathElement extends svg$.TextContentElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    this[dartx.method] = null;
    this[dartx.spacing] = null;
    this[dartx.startOffset] = null;
    this[dartx.href] = null;
    super.created();
  }
  get [dartx.method]() {
    return this.method;
  }
  get [dartx.spacing]() {
    return this.spacing;
  }
  get [dartx.startOffset]() {
    return this.startOffset;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.TextPathElement, 'created');
svg$.TextPathElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$.TextPathElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.TextPathElement, []),
    created: dart.definiteFunctionType(svg$.TextPathElement, [])
  }),
  fields: () => ({
    [dartx.method]: svg$.AnimatedEnumeration,
    [dartx.spacing]: svg$.AnimatedEnumeration,
    [dartx.startOffset]: svg$.AnimatedLength,
    [dartx.href]: svg$.AnimatedString
  }),
  sfields: () => ({
    TEXTPATH_METHODTYPE_ALIGN: core.int,
    TEXTPATH_METHODTYPE_STRETCH: core.int,
    TEXTPATH_METHODTYPE_UNKNOWN: core.int,
    TEXTPATH_SPACINGTYPE_AUTO: core.int,
    TEXTPATH_SPACINGTYPE_EXACT: core.int,
    TEXTPATH_SPACINGTYPE_UNKNOWN: core.int
  })
});
svg$.TextPathElement.TEXTPATH_METHODTYPE_ALIGN = 1;
svg$.TextPathElement.TEXTPATH_METHODTYPE_STRETCH = 2;
svg$.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN = 0;
svg$.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO = 1;
svg$.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT = 2;
svg$.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGTextPathElement, svg$.TextPathElement);
svg$.TitleElement = class TitleElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.TitleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("title"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$.TitleElement, 'created');
dart.setSignature(svg$.TitleElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.TitleElement, []),
    new: dart.definiteFunctionType(svg$.TitleElement, []),
    created: dart.definiteFunctionType(svg$.TitleElement, [])
  })
});
dart.registerExtension(dart.global.SVGTitleElement, svg$.TitleElement);
dart.defineExtensionNames([
  'setMatrix',
  'setRotate',
  'setScale',
  'setSkewX',
  'setSkewY',
  'setTranslate',
  'angle',
  'matrix',
  'type'
]);
svg$.Transform = class Transform extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.angle]() {
    return this.angle;
  }
  get [dartx.matrix]() {
    return this.matrix;
  }
  get [dartx.type]() {
    return this.type;
  }
  [dartx.setMatrix](...args) {
    return this.setMatrix.apply(this, args);
  }
  [dartx.setRotate](...args) {
    return this.setRotate.apply(this, args);
  }
  [dartx.setScale](...args) {
    return this.setScale.apply(this, args);
  }
  [dartx.setSkewX](...args) {
    return this.setSkewX.apply(this, args);
  }
  [dartx.setSkewY](...args) {
    return this.setSkewY.apply(this, args);
  }
  [dartx.setTranslate](...args) {
    return this.setTranslate.apply(this, args);
  }
};
dart.setSignature(svg$.Transform, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.Transform, [])}),
  fields: () => ({
    [dartx.angle]: core.double,
    [dartx.matrix]: svg$.Matrix,
    [dartx.type]: core.int
  }),
  methods: () => ({
    [dartx.setMatrix]: dart.definiteFunctionType(dart.void, [svg$.Matrix]),
    [dartx.setRotate]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
    [dartx.setScale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.setSkewX]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.setSkewY]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.setTranslate]: dart.definiteFunctionType(dart.void, [core.num, core.num])
  }),
  sfields: () => ({
    SVG_TRANSFORM_MATRIX: core.int,
    SVG_TRANSFORM_ROTATE: core.int,
    SVG_TRANSFORM_SCALE: core.int,
    SVG_TRANSFORM_SKEWX: core.int,
    SVG_TRANSFORM_SKEWY: core.int,
    SVG_TRANSFORM_TRANSLATE: core.int,
    SVG_TRANSFORM_UNKNOWN: core.int
  })
});
svg$.Transform.SVG_TRANSFORM_MATRIX = 1;
svg$.Transform.SVG_TRANSFORM_ROTATE = 4;
svg$.Transform.SVG_TRANSFORM_SCALE = 3;
svg$.Transform.SVG_TRANSFORM_SKEWX = 5;
svg$.Transform.SVG_TRANSFORM_SKEWY = 6;
svg$.Transform.SVG_TRANSFORM_TRANSLATE = 2;
svg$.Transform.SVG_TRANSFORM_UNKNOWN = 0;
dart.registerExtension(dart.global.SVGTransform, svg$.Transform);
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'appendItem',
  'clear',
  'consolidate',
  'createSvgTransformFromMatrix',
  'getItem',
  'initialize',
  'insertItemBefore',
  'removeItem',
  'replaceItem',
  'numberOfItems'
]);
svg$.TransformList = class TransformList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Transform), html$.ImmutableListMixin$(svg$.Transform)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.numberOfItems]() {
    return this.numberOfItems;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.getItem](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [dartx.appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.consolidate](...args) {
    return this.consolidate.apply(this, args);
  }
  [dartx.createSvgTransformFromMatrix](...args) {
    return this.createSVGTransformFromMatrix.apply(this, args);
  }
  [dartx.getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [dartx.initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [dartx.insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [dartx.removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [dartx.replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.TransformList[dart.implements] = () => [ListOfTransform()];
dart.setSignature(svg$.TransformList, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.TransformList, [])}),
  fields: () => ({[dartx.numberOfItems]: core.int}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(svg$.Transform, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
    [dartx.appendItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
    [dartx.consolidate]: dart.definiteFunctionType(svg$.Transform, []),
    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
    [dartx.getItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
    [dartx.initialize]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int]),
    [dartx.removeItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int])
  })
});
dart.registerExtension(dart.global.SVGTransformList, svg$.TransformList);
svg$.UnitTypes = class UnitTypes extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(svg$.UnitTypes, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.UnitTypes, [])}),
  sfields: () => ({
    SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: core.int,
    SVG_UNIT_TYPE_UNKNOWN: core.int,
    SVG_UNIT_TYPE_USERSPACEONUSE: core.int
  })
});
svg$.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
svg$.UnitTypes.SVG_UNIT_TYPE_UNKNOWN = 0;
svg$.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE = 1;
dart.registerExtension(dart.global.SVGUnitTypes, svg$.UnitTypes);
dart.defineExtensionNames([
  'href'
]);
svg$.UriReference = class UriReference extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get href() {
    return this[href$0];
  }
  set href(value) {
    super.href = value;
  }
};
const href$0 = Symbol(svg$.UriReference.name + "." + 'href'.toString());
dart.setSignature(svg$.UriReference, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.UriReference, [])}),
  fields: () => ({href: svg$.AnimatedString})
});
dart.defineExtensionMembers(svg$.UriReference, ['href']);
dart.defineExtensionNames([
  'height',
  'width',
  'x',
  'y',
  'href'
]);
svg$.UseElement = class UseElement extends svg$.GraphicsElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.UseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("use"));
  }
  created() {
    this[dartx.height] = null;
    this[dartx.width] = null;
    this[dartx.x] = null;
    this[dartx.y] = null;
    this[dartx.href] = null;
    super.created();
  }
  get [dartx.height]() {
    return this.height;
  }
  get [dartx.width]() {
    return this.width;
  }
  get [dartx.x]() {
    return this.x;
  }
  get [dartx.y]() {
    return this.y;
  }
  get [dartx.href]() {
    return this.href;
  }
};
dart.defineNamedConstructor(svg$.UseElement, 'created');
svg$.UseElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$.UseElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.UseElement, []),
    new: dart.definiteFunctionType(svg$.UseElement, []),
    created: dart.definiteFunctionType(svg$.UseElement, [])
  }),
  fields: () => ({
    [dartx.height]: svg$.AnimatedLength,
    [dartx.width]: svg$.AnimatedLength,
    [dartx.x]: svg$.AnimatedLength,
    [dartx.y]: svg$.AnimatedLength,
    [dartx.href]: svg$.AnimatedString
  })
});
dart.registerExtension(dart.global.SVGUseElement, svg$.UseElement);
dart.defineExtensionNames([
  'viewTarget',
  'preserveAspectRatio',
  'viewBox',
  'zoomAndPan'
]);
svg$.ViewElement = class ViewElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$.ViewElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("view"));
  }
  created() {
    this[dartx.viewTarget] = null;
    this[dartx.preserveAspectRatio] = null;
    this[dartx.viewBox] = null;
    this[dartx.zoomAndPan] = null;
    super.created();
  }
  get [dartx.viewTarget]() {
    return this.viewTarget;
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.viewBox]() {
    return this.viewBox;
  }
  get [dartx.zoomAndPan]() {
    return this.zoomAndPan;
  }
  set [dartx.zoomAndPan](value) {
    this.zoomAndPan = value;
  }
};
dart.defineNamedConstructor(svg$.ViewElement, 'created');
svg$.ViewElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
dart.setSignature(svg$.ViewElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$.ViewElement, []),
    new: dart.definiteFunctionType(svg$.ViewElement, []),
    created: dart.definiteFunctionType(svg$.ViewElement, [])
  }),
  fields: () => ({
    [dartx.viewTarget]: svg$.StringList,
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.viewBox]: svg$.AnimatedRect,
    [dartx.zoomAndPan]: core.int
  })
});
dart.registerExtension(dart.global.SVGViewElement, svg$.ViewElement);
dart.defineExtensionNames([
  'preserveAspectRatioString',
  'transform',
  'transformString',
  'viewBoxString',
  'viewTarget',
  'viewTargetString',
  'preserveAspectRatio',
  'viewBox',
  'zoomAndPan'
]);
svg$.ViewSpec = class ViewSpec extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.preserveAspectRatioString]() {
    return this.preserveAspectRatioString;
  }
  get [dartx.transform]() {
    return this.transform;
  }
  get [dartx.transformString]() {
    return this.transformString;
  }
  get [dartx.viewBoxString]() {
    return this.viewBoxString;
  }
  get [dartx.viewTarget]() {
    return this.viewTarget;
  }
  get [dartx.viewTargetString]() {
    return this.viewTargetString;
  }
  get [dartx.preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [dartx.viewBox]() {
    return this.viewBox;
  }
  get [dartx.zoomAndPan]() {
    return this.zoomAndPan;
  }
  set [dartx.zoomAndPan](value) {
    this.zoomAndPan = value;
  }
};
svg$.ViewSpec[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
dart.setSignature(svg$.ViewSpec, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.ViewSpec, [])}),
  fields: () => ({
    [dartx.preserveAspectRatioString]: core.String,
    [dartx.transform]: svg$.TransformList,
    [dartx.transformString]: core.String,
    [dartx.viewBoxString]: core.String,
    [dartx.viewTarget]: svg$.SvgElement,
    [dartx.viewTargetString]: core.String,
    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
    [dartx.viewBox]: svg$.AnimatedRect,
    [dartx.zoomAndPan]: core.int
  })
});
dart.registerExtension(dart.global.SVGViewSpec, svg$.ViewSpec);
dart.defineExtensionNames([
  'zoomAndPan'
]);
svg$.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get zoomAndPan() {
    return this[zoomAndPan];
  }
  set zoomAndPan(value) {
    this[zoomAndPan] = value;
  }
};
const zoomAndPan = Symbol(svg$.ZoomAndPan.name + "." + 'zoomAndPan'.toString());
dart.setSignature(svg$.ZoomAndPan, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomAndPan, [])}),
  fields: () => ({zoomAndPan: core.int}),
  sfields: () => ({
    SVG_ZOOMANDPAN_DISABLE: core.int,
    SVG_ZOOMANDPAN_MAGNIFY: core.int,
    SVG_ZOOMANDPAN_UNKNOWN: core.int
  })
});
dart.defineExtensionMembers(svg$.ZoomAndPan, ['zoomAndPan', 'zoomAndPan']);
svg$.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE = 1;
svg$.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY = 2;
svg$.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN = 0;
dart.defineExtensionNames([
  'newScale',
  'newTranslate',
  'previousScale',
  'previousTranslate',
  'zoomRectScreen'
]);
svg$.ZoomEvent = class ZoomEvent extends html$.UIEvent {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.newScale]() {
    return this.newScale;
  }
  get [dartx.newTranslate]() {
    return this.newTranslate;
  }
  get [dartx.previousScale]() {
    return this.previousScale;
  }
  get [dartx.previousTranslate]() {
    return this.previousTranslate;
  }
  get [dartx.zoomRectScreen]() {
    return this.zoomRectScreen;
  }
};
dart.setSignature(svg$.ZoomEvent, {
  constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomEvent, [])}),
  fields: () => ({
    [dartx.newScale]: core.double,
    [dartx.newTranslate]: svg$.Point,
    [dartx.previousScale]: core.double,
    [dartx.previousTranslate]: svg$.Point,
    [dartx.zoomRectScreen]: svg$.Rect
  })
});
dart.registerExtension(dart.global.SVGZoomEvent, svg$.ZoomEvent);
svg$._SVGCursorElement = class _SVGCursorElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$._SVGCursorElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("cursor"));
  }
  created() {
    super.created();
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported('cursor')) && svg$._SVGCursorElement.is(svg$.SvgElement.tag('cursor'));
  }
};
dart.defineNamedConstructor(svg$._SVGCursorElement, 'created');
svg$._SVGCursorElement[dart.implements] = () => [svg$.UriReference, svg$.Tests];
dart.setSignature(svg$._SVGCursorElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$._SVGCursorElement, []),
    new: dart.definiteFunctionType(svg$._SVGCursorElement, []),
    created: dart.definiteFunctionType(svg$._SVGCursorElement, [])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.SVGCursorElement, svg$._SVGCursorElement);
svg$._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$._SVGFEDropShadowElement, 'created');
svg$._SVGFEDropShadowElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setSignature(svg$._SVGFEDropShadowElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, []),
    created: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, [])
  })
});
dart.registerExtension(dart.global.SVGFEDropShadowElement, svg$._SVGFEDropShadowElement);
svg$._SVGMPathElement = class _SVGMPathElement extends svg$.SvgElement {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new() {
    return svg$._SVGMPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
  }
  created() {
    super.created();
  }
};
dart.defineNamedConstructor(svg$._SVGMPathElement, 'created');
svg$._SVGMPathElement[dart.implements] = () => [svg$.UriReference];
dart.setSignature(svg$._SVGMPathElement, {
  constructors: () => ({
    _: dart.definiteFunctionType(svg$._SVGMPathElement, []),
    new: dart.definiteFunctionType(svg$._SVGMPathElement, []),
    created: dart.definiteFunctionType(svg$._SVGMPathElement, [])
  })
});
dart.registerExtension(dart.global.SVGMPathElement, svg$._SVGMPathElement);
const _connect = Symbol('_connect');
dart.defineExtensionNames([
  'disconnect',
  'connectNode',
  'connectParam',
  'channelCount',
  'channelCountMode',
  'channelInterpretation',
  'context',
  'numberOfInputs',
  'numberOfOutputs'
]);
web_audio.AudioNode = class AudioNode extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.channelCount]() {
    return this.channelCount;
  }
  set [dartx.channelCount](value) {
    this.channelCount = value;
  }
  get [dartx.channelCountMode]() {
    return this.channelCountMode;
  }
  set [dartx.channelCountMode](value) {
    this.channelCountMode = value;
  }
  get [dartx.channelInterpretation]() {
    return this.channelInterpretation;
  }
  set [dartx.channelInterpretation](value) {
    this.channelInterpretation = value;
  }
  get [dartx.context]() {
    return this.context;
  }
  get [dartx.numberOfInputs]() {
    return this.numberOfInputs;
  }
  get [dartx.numberOfOutputs]() {
    return this.numberOfOutputs;
  }
  [_connect](...args) {
    return this.connect.apply(this, args);
  }
  [dartx.disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [dartx.connectNode](destination, output, input) {
    if (output === void 0) output = 0;
    if (input === void 0) input = 0;
    return this[_connect](destination, output, input);
  }
  [dartx.connectParam](destination, output) {
    if (output === void 0) output = 0;
    return this[_connect](destination, output);
  }
};
dart.setSignature(web_audio.AudioNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioNode, [])}),
  fields: () => ({
    [dartx.channelCount]: core.int,
    [dartx.channelCountMode]: core.String,
    [dartx.channelInterpretation]: core.String,
    [dartx.context]: web_audio.AudioContext,
    [dartx.numberOfInputs]: core.int,
    [dartx.numberOfOutputs]: core.int
  }),
  methods: () => ({
    [_connect]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int], [core.int]),
    [dartx.disconnect]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.connectNode]: dart.definiteFunctionType(dart.void, [web_audio.AudioNode], [core.int, core.int]),
    [dartx.connectParam]: dart.definiteFunctionType(dart.void, [web_audio.AudioParam], [core.int])
  })
});
dart.registerExtension(dart.global.AudioNode, web_audio.AudioNode);
dart.defineExtensionNames([
  'getByteFrequencyData',
  'getByteTimeDomainData',
  'getFloatFrequencyData',
  'getFloatTimeDomainData',
  'fftSize',
  'frequencyBinCount',
  'maxDecibels',
  'minDecibels',
  'smoothingTimeConstant'
]);
web_audio.AnalyserNode = class AnalyserNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.fftSize]() {
    return this.fftSize;
  }
  set [dartx.fftSize](value) {
    this.fftSize = value;
  }
  get [dartx.frequencyBinCount]() {
    return this.frequencyBinCount;
  }
  get [dartx.maxDecibels]() {
    return this.maxDecibels;
  }
  set [dartx.maxDecibels](value) {
    this.maxDecibels = value;
  }
  get [dartx.minDecibels]() {
    return this.minDecibels;
  }
  set [dartx.minDecibels](value) {
    this.minDecibels = value;
  }
  get [dartx.smoothingTimeConstant]() {
    return this.smoothingTimeConstant;
  }
  set [dartx.smoothingTimeConstant](value) {
    this.smoothingTimeConstant = value;
  }
  [dartx.getByteFrequencyData](...args) {
    return this.getByteFrequencyData.apply(this, args);
  }
  [dartx.getByteTimeDomainData](...args) {
    return this.getByteTimeDomainData.apply(this, args);
  }
  [dartx.getFloatFrequencyData](...args) {
    return this.getFloatFrequencyData.apply(this, args);
  }
  [dartx.getFloatTimeDomainData](...args) {
    return this.getFloatTimeDomainData.apply(this, args);
  }
};
dart.setSignature(web_audio.AnalyserNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AnalyserNode, [])}),
  fields: () => ({
    [dartx.fftSize]: core.int,
    [dartx.frequencyBinCount]: core.int,
    [dartx.maxDecibels]: core.num,
    [dartx.minDecibels]: core.num,
    [dartx.smoothingTimeConstant]: core.num
  }),
  methods: () => ({
    [dartx.getByteFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
    [dartx.getByteTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
    [dartx.getFloatFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List]),
    [dartx.getFloatTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List])
  })
});
dart.registerExtension(dart.global.AnalyserNode, web_audio.AnalyserNode);
dart.registerExtension(dart.global.RealtimeAnalyserNode, web_audio.AnalyserNode);
dart.defineExtensionNames([
  'getChannelData',
  'duration',
  'length',
  'numberOfChannels',
  'sampleRate'
]);
web_audio.AudioBuffer = class AudioBuffer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.duration]() {
    return this.duration;
  }
  get [dartx.length]() {
    return this.length;
  }
  get [dartx.numberOfChannels]() {
    return this.numberOfChannels;
  }
  get [dartx.sampleRate]() {
    return this.sampleRate;
  }
  [dartx.getChannelData](...args) {
    return this.getChannelData.apply(this, args);
  }
};
dart.setSignature(web_audio.AudioBuffer, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBuffer, [])}),
  fields: () => ({
    [dartx.duration]: core.double,
    [dartx.length]: core.int,
    [dartx.numberOfChannels]: core.int,
    [dartx.sampleRate]: core.double
  }),
  methods: () => ({[dartx.getChannelData]: dart.definiteFunctionType(typed_data.Float32List, [core.int])})
});
dart.registerExtension(dart.global.AudioBuffer, web_audio.AudioBuffer);
web_audio.AudioBufferCallback = dart.typedef('AudioBufferCallback', () => dart.functionType(dart.void, [web_audio.AudioBuffer]));
web_audio.AudioSourceNode = class AudioSourceNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_audio.AudioSourceNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioSourceNode, [])})
});
dart.registerExtension(dart.global.AudioSourceNode, web_audio.AudioSourceNode);
dart.defineExtensionNames([
  'start',
  'stop',
  'onEnded',
  'buffer',
  'loop',
  'loopEnd',
  'loopStart',
  'playbackRate'
]);
web_audio.AudioBufferSourceNode = class AudioBufferSourceNode extends web_audio.AudioSourceNode {
  [dartx.start](when, grainOffset, grainDuration) {
    if (grainOffset === void 0) grainOffset = null;
    if (grainDuration === void 0) grainDuration = null;
    if (!!this.start) {
      if (grainDuration != null) {
        this.start(when, grainOffset, grainDuration);
      } else if (grainOffset != null) {
        this.start(when, grainOffset);
      } else {
        this.start(when);
      }
    } else {
      if (grainDuration != null) {
        this.noteOn(when, grainOffset, grainDuration);
      } else if (grainOffset != null) {
        this.noteOn(when, grainOffset);
      } else {
        this.noteOn(when);
      }
    }
  }
  [dartx.stop](when) {
    if (!!this.stop) {
      this.stop(when);
    } else {
      this.noteOff(when);
    }
  }
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.buffer]() {
    return this.buffer;
  }
  set [dartx.buffer](value) {
    this.buffer = value;
  }
  get [dartx.loop]() {
    return this.loop;
  }
  set [dartx.loop](value) {
    this.loop = value;
  }
  get [dartx.loopEnd]() {
    return this.loopEnd;
  }
  set [dartx.loopEnd](value) {
    this.loopEnd = value;
  }
  get [dartx.loopStart]() {
    return this.loopStart;
  }
  set [dartx.loopStart](value) {
    this.loopStart = value;
  }
  get [dartx.playbackRate]() {
    return this.playbackRate;
  }
  get [dartx.onEnded]() {
    return web_audio.AudioBufferSourceNode.endedEvent.forTarget(this);
  }
};
dart.setSignature(web_audio.AudioBufferSourceNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, [])}),
  fields: () => ({
    [dartx.buffer]: web_audio.AudioBuffer,
    [dartx.loop]: core.bool,
    [dartx.loopEnd]: core.num,
    [dartx.loopStart]: core.num,
    [dartx.playbackRate]: web_audio.AudioParam
  }),
  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.start]: dart.definiteFunctionType(dart.void, [core.num], [core.num, core.num]),
    [dartx.stop]: dart.definiteFunctionType(dart.void, [core.num])
  }),
  sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
});
web_audio.AudioBufferSourceNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
dart.registerExtension(dart.global.AudioBufferSourceNode, web_audio.AudioBufferSourceNode);
const _decodeAudioData = Symbol('_decodeAudioData');
dart.defineExtensionNames([
  'createAnalyser',
  'createBiquadFilter',
  'createBuffer',
  'createBufferSource',
  'createChannelMerger',
  'createChannelSplitter',
  'createConvolver',
  'createDelay',
  'createDynamicsCompressor',
  'createMediaElementSource',
  'createMediaStreamDestination',
  'createMediaStreamSource',
  'createOscillator',
  'createPanner',
  'createPeriodicWave',
  'createWaveShaper',
  'startRendering',
  'onComplete',
  'createGain',
  'createScriptProcessor',
  'decodeAudioData',
  'currentTime',
  'destination',
  'listener',
  'sampleRate'
]);
web_audio.AudioContext = class AudioContext extends html$.EventTarget {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!(window.AudioContext || window.webkitAudioContext);
  }
  get [dartx.currentTime]() {
    return this.currentTime;
  }
  get [dartx.destination]() {
    return this.destination;
  }
  get [dartx.listener]() {
    return this.listener;
  }
  get [dartx.sampleRate]() {
    return this.sampleRate;
  }
  [dartx.createAnalyser](...args) {
    return this.createAnalyser.apply(this, args);
  }
  [dartx.createBiquadFilter](...args) {
    return this.createBiquadFilter.apply(this, args);
  }
  [dartx.createBuffer](...args) {
    return this.createBuffer.apply(this, args);
  }
  [dartx.createBufferSource](...args) {
    return this.createBufferSource.apply(this, args);
  }
  [dartx.createChannelMerger](...args) {
    return this.createChannelMerger.apply(this, args);
  }
  [dartx.createChannelSplitter](...args) {
    return this.createChannelSplitter.apply(this, args);
  }
  [dartx.createConvolver](...args) {
    return this.createConvolver.apply(this, args);
  }
  [dartx.createDelay](...args) {
    return this.createDelay.apply(this, args);
  }
  [dartx.createDynamicsCompressor](...args) {
    return this.createDynamicsCompressor.apply(this, args);
  }
  [dartx.createMediaElementSource](...args) {
    return this.createMediaElementSource.apply(this, args);
  }
  [dartx.createMediaStreamDestination](...args) {
    return this.createMediaStreamDestination.apply(this, args);
  }
  [dartx.createMediaStreamSource](...args) {
    return this.createMediaStreamSource.apply(this, args);
  }
  [dartx.createOscillator](...args) {
    return this.createOscillator.apply(this, args);
  }
  [dartx.createPanner](...args) {
    return this.createPanner.apply(this, args);
  }
  [dartx.createPeriodicWave](...args) {
    return this.createPeriodicWave.apply(this, args);
  }
  [dartx.createWaveShaper](...args) {
    return this.createWaveShaper.apply(this, args);
  }
  [_decodeAudioData](...args) {
    return this.decodeAudioData.apply(this, args);
  }
  [dartx.startRendering](...args) {
    return this.startRendering.apply(this, args);
  }
  get [dartx.onComplete]() {
    return web_audio.AudioContext.completeEvent.forTarget(this);
  }
  static new() {
    return new (window.AudioContext || window.webkitAudioContext)();
  }
  [dartx.createGain]() {
    if (this.createGain !== undefined) {
      return this.createGain();
    } else {
      return this.createGainNode();
    }
  }
  [dartx.createScriptProcessor](bufferSize, numberOfInputChannels, numberOfOutputChannels) {
    if (numberOfInputChannels === void 0) numberOfInputChannels = null;
    if (numberOfOutputChannels === void 0) numberOfOutputChannels = null;
    let func = this.createScriptProcessor || this.createJavaScriptNode;
    if (numberOfOutputChannels != null) {
      return func.call(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
    } else if (numberOfInputChannels != null) {
      return func.call(this, bufferSize, numberOfInputChannels);
    } else {
      return func.call(this, bufferSize);
    }
  }
  [dartx.decodeAudioData](audioData) {
    let completer = CompleterOfAudioBuffer().new();
    this[_decodeAudioData](audioData, dart.fn(value => {
      completer.complete(value);
    }, AudioBufferToNull()), dart.fn(error => {
      if (error == null) {
        completer.completeError('');
      } else {
        completer.completeError(error);
      }
    }, AudioBufferToNull()));
    return completer.future;
  }
};
dart.setSignature(web_audio.AudioContext, {
  constructors: () => ({
    _: dart.definiteFunctionType(web_audio.AudioContext, []),
    new: dart.definiteFunctionType(web_audio.AudioContext, [])
  }),
  fields: () => ({
    [dartx.currentTime]: core.double,
    [dartx.destination]: web_audio.AudioDestinationNode,
    [dartx.listener]: web_audio.AudioListener,
    [dartx.sampleRate]: core.double
  }),
  getters: () => ({[dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.createAnalyser]: dart.definiteFunctionType(web_audio.AnalyserNode, []),
    [dartx.createBiquadFilter]: dart.definiteFunctionType(web_audio.BiquadFilterNode, []),
    [dartx.createBuffer]: dart.definiteFunctionType(web_audio.AudioBuffer, [core.int, core.int, core.num]),
    [dartx.createBufferSource]: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, []),
    [dartx.createChannelMerger]: dart.definiteFunctionType(web_audio.ChannelMergerNode, [], [core.int]),
    [dartx.createChannelSplitter]: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [], [core.int]),
    [dartx.createConvolver]: dart.definiteFunctionType(web_audio.ConvolverNode, []),
    [dartx.createDelay]: dart.definiteFunctionType(web_audio.DelayNode, [], [core.num]),
    [dartx.createDynamicsCompressor]: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, []),
    [dartx.createMediaElementSource]: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [html$.MediaElement]),
    [dartx.createMediaStreamDestination]: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, []),
    [dartx.createMediaStreamSource]: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [html$.MediaStream]),
    [dartx.createOscillator]: dart.definiteFunctionType(web_audio.OscillatorNode, []),
    [dartx.createPanner]: dart.definiteFunctionType(web_audio.PannerNode, []),
    [dartx.createPeriodicWave]: dart.definiteFunctionType(web_audio.PeriodicWave, [typed_data.Float32List, typed_data.Float32List]),
    [dartx.createWaveShaper]: dart.definiteFunctionType(web_audio.WaveShaperNode, []),
    [_decodeAudioData]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer, web_audio.AudioBufferCallback], [web_audio.AudioBufferCallback]),
    [dartx.startRendering]: dart.definiteFunctionType(dart.void, []),
    [dartx.createGain]: dart.definiteFunctionType(web_audio.GainNode, []),
    [dartx.createScriptProcessor]: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [core.int], [core.int, core.int]),
    [dartx.decodeAudioData]: dart.definiteFunctionType(async.Future$(web_audio.AudioBuffer), [typed_data.ByteBuffer])
  }),
  sfields: () => ({completeEvent: EventStreamProviderOfEvent()}),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
web_audio.AudioContext.completeEvent = dart.const(new (EventStreamProviderOfEvent())('complete'));
dart.registerExtension(dart.global.AudioContext, web_audio.AudioContext);
dart.registerExtension(dart.global.webkitAudioContext, web_audio.AudioContext);
dart.defineExtensionNames([
  'maxChannelCount'
]);
web_audio.AudioDestinationNode = class AudioDestinationNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.maxChannelCount]() {
    return this.maxChannelCount;
  }
};
dart.setSignature(web_audio.AudioDestinationNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioDestinationNode, [])}),
  fields: () => ({[dartx.maxChannelCount]: core.int})
});
dart.registerExtension(dart.global.AudioDestinationNode, web_audio.AudioDestinationNode);
dart.defineExtensionNames([
  'setOrientation',
  'setPosition',
  'setVelocity',
  'dopplerFactor',
  'speedOfSound'
]);
web_audio.AudioListener = class AudioListener extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.dopplerFactor]() {
    return this.dopplerFactor;
  }
  set [dartx.dopplerFactor](value) {
    this.dopplerFactor = value;
  }
  get [dartx.speedOfSound]() {
    return this.speedOfSound;
  }
  set [dartx.speedOfSound](value) {
    this.speedOfSound = value;
  }
  [dartx.setOrientation](...args) {
    return this.setOrientation.apply(this, args);
  }
  [dartx.setPosition](...args) {
    return this.setPosition.apply(this, args);
  }
  [dartx.setVelocity](...args) {
    return this.setVelocity.apply(this, args);
  }
};
dart.setSignature(web_audio.AudioListener, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioListener, [])}),
  fields: () => ({
    [dartx.dopplerFactor]: core.num,
    [dartx.speedOfSound]: core.num
  }),
  methods: () => ({
    [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
    [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
  })
});
dart.registerExtension(dart.global.AudioListener, web_audio.AudioListener);
dart.defineExtensionNames([
  'cancelScheduledValues',
  'exponentialRampToValueAtTime',
  'linearRampToValueAtTime',
  'setTargetAtTime',
  'setValueAtTime',
  'setValueCurveAtTime',
  'defaultValue',
  'value'
]);
web_audio.AudioParam = class AudioParam extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.defaultValue]() {
    return this.defaultValue;
  }
  get [dartx.value]() {
    return this.value;
  }
  set [dartx.value](value) {
    this.value = value;
  }
  [dartx.cancelScheduledValues](...args) {
    return this.cancelScheduledValues.apply(this, args);
  }
  [dartx.exponentialRampToValueAtTime](...args) {
    return this.exponentialRampToValueAtTime.apply(this, args);
  }
  [dartx.linearRampToValueAtTime](...args) {
    return this.linearRampToValueAtTime.apply(this, args);
  }
  [dartx.setTargetAtTime](...args) {
    return this.setTargetAtTime.apply(this, args);
  }
  [dartx.setValueAtTime](...args) {
    return this.setValueAtTime.apply(this, args);
  }
  [dartx.setValueCurveAtTime](...args) {
    return this.setValueCurveAtTime.apply(this, args);
  }
};
dart.setSignature(web_audio.AudioParam, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioParam, [])}),
  fields: () => ({
    [dartx.defaultValue]: core.double,
    [dartx.value]: core.num
  }),
  methods: () => ({
    [dartx.cancelScheduledValues]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.exponentialRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.linearRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.setTargetAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
    [dartx.setValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.setValueCurveAtTime]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, core.num, core.num])
  })
});
dart.registerExtension(dart.global.AudioParam, web_audio.AudioParam);
dart.defineExtensionNames([
  'inputBuffer',
  'outputBuffer',
  'playbackTime'
]);
web_audio.AudioProcessingEvent = class AudioProcessingEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.inputBuffer]() {
    return this.inputBuffer;
  }
  get [dartx.outputBuffer]() {
    return this.outputBuffer;
  }
  get [dartx.playbackTime]() {
    return this.playbackTime;
  }
};
dart.setSignature(web_audio.AudioProcessingEvent, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioProcessingEvent, [])}),
  fields: () => ({
    [dartx.inputBuffer]: web_audio.AudioBuffer,
    [dartx.outputBuffer]: web_audio.AudioBuffer,
    [dartx.playbackTime]: core.double
  })
});
dart.registerExtension(dart.global.AudioProcessingEvent, web_audio.AudioProcessingEvent);
dart.defineExtensionNames([
  'getFrequencyResponse',
  'Q',
  'detune',
  'frequency',
  'gain',
  'type'
]);
web_audio.BiquadFilterNode = class BiquadFilterNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.Q]() {
    return this.Q;
  }
  get [dartx.detune]() {
    return this.detune;
  }
  get [dartx.frequency]() {
    return this.frequency;
  }
  get [dartx.gain]() {
    return this.gain;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  [dartx.getFrequencyResponse](...args) {
    return this.getFrequencyResponse.apply(this, args);
  }
};
dart.setSignature(web_audio.BiquadFilterNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.BiquadFilterNode, [])}),
  fields: () => ({
    [dartx.Q]: web_audio.AudioParam,
    [dartx.detune]: web_audio.AudioParam,
    [dartx.frequency]: web_audio.AudioParam,
    [dartx.gain]: web_audio.AudioParam,
    [dartx.type]: core.String
  }),
  methods: () => ({[dartx.getFrequencyResponse]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, typed_data.Float32List, typed_data.Float32List])})
});
dart.registerExtension(dart.global.BiquadFilterNode, web_audio.BiquadFilterNode);
web_audio.ChannelMergerNode = class ChannelMergerNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_audio.ChannelMergerNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelMergerNode, [])})
});
dart.registerExtension(dart.global.ChannelMergerNode, web_audio.ChannelMergerNode);
dart.registerExtension(dart.global.AudioChannelMerger, web_audio.ChannelMergerNode);
web_audio.ChannelSplitterNode = class ChannelSplitterNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_audio.ChannelSplitterNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [])})
});
dart.registerExtension(dart.global.ChannelSplitterNode, web_audio.ChannelSplitterNode);
dart.registerExtension(dart.global.AudioChannelSplitter, web_audio.ChannelSplitterNode);
dart.defineExtensionNames([
  'buffer',
  'normalize'
]);
web_audio.ConvolverNode = class ConvolverNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.buffer]() {
    return this.buffer;
  }
  set [dartx.buffer](value) {
    this.buffer = value;
  }
  get [dartx.normalize]() {
    return this.normalize;
  }
  set [dartx.normalize](value) {
    this.normalize = value;
  }
};
dart.setSignature(web_audio.ConvolverNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.ConvolverNode, [])}),
  fields: () => ({
    [dartx.buffer]: web_audio.AudioBuffer,
    [dartx.normalize]: core.bool
  })
});
dart.registerExtension(dart.global.ConvolverNode, web_audio.ConvolverNode);
dart.defineExtensionNames([
  'delayTime'
]);
web_audio.DelayNode = class DelayNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.delayTime]() {
    return this.delayTime;
  }
};
dart.setSignature(web_audio.DelayNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.DelayNode, [])}),
  fields: () => ({[dartx.delayTime]: web_audio.AudioParam})
});
dart.registerExtension(dart.global.DelayNode, web_audio.DelayNode);
dart.defineExtensionNames([
  'attack',
  'knee',
  'ratio',
  'reduction',
  'release',
  'threshold'
]);
web_audio.DynamicsCompressorNode = class DynamicsCompressorNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.attack]() {
    return this.attack;
  }
  get [dartx.knee]() {
    return this.knee;
  }
  get [dartx.ratio]() {
    return this.ratio;
  }
  get [dartx.reduction]() {
    return this.reduction;
  }
  get [dartx.release]() {
    return this.release;
  }
  get [dartx.threshold]() {
    return this.threshold;
  }
};
dart.setSignature(web_audio.DynamicsCompressorNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, [])}),
  fields: () => ({
    [dartx.attack]: web_audio.AudioParam,
    [dartx.knee]: web_audio.AudioParam,
    [dartx.ratio]: web_audio.AudioParam,
    [dartx.reduction]: web_audio.AudioParam,
    [dartx.release]: web_audio.AudioParam,
    [dartx.threshold]: web_audio.AudioParam
  })
});
dart.registerExtension(dart.global.DynamicsCompressorNode, web_audio.DynamicsCompressorNode);
dart.defineExtensionNames([
  'gain'
]);
web_audio.GainNode = class GainNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.gain]() {
    return this.gain;
  }
};
dart.setSignature(web_audio.GainNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.GainNode, [])}),
  fields: () => ({[dartx.gain]: web_audio.AudioParam})
});
dart.registerExtension(dart.global.GainNode, web_audio.GainNode);
dart.registerExtension(dart.global.AudioGainNode, web_audio.GainNode);
dart.defineExtensionNames([
  'mediaElement'
]);
web_audio.MediaElementAudioSourceNode = class MediaElementAudioSourceNode extends web_audio.AudioSourceNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.mediaElement]() {
    return this.mediaElement;
  }
};
dart.setSignature(web_audio.MediaElementAudioSourceNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [])}),
  fields: () => ({[dartx.mediaElement]: html$.MediaElement})
});
dart.registerExtension(dart.global.MediaElementAudioSourceNode, web_audio.MediaElementAudioSourceNode);
dart.defineExtensionNames([
  'stream'
]);
web_audio.MediaStreamAudioDestinationNode = class MediaStreamAudioDestinationNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.stream]() {
    return this.stream;
  }
};
dart.setSignature(web_audio.MediaStreamAudioDestinationNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, [])}),
  fields: () => ({[dartx.stream]: html$.MediaStream})
});
dart.registerExtension(dart.global.MediaStreamAudioDestinationNode, web_audio.MediaStreamAudioDestinationNode);
dart.defineExtensionNames([
  'mediaStream'
]);
web_audio.MediaStreamAudioSourceNode = class MediaStreamAudioSourceNode extends web_audio.AudioSourceNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.mediaStream]() {
    return this.mediaStream;
  }
};
dart.setSignature(web_audio.MediaStreamAudioSourceNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [])}),
  fields: () => ({[dartx.mediaStream]: html$.MediaStream})
});
dart.registerExtension(dart.global.MediaStreamAudioSourceNode, web_audio.MediaStreamAudioSourceNode);
dart.defineExtensionNames([
  'renderedBuffer'
]);
web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.renderedBuffer]() {
    return this.renderedBuffer;
  }
};
dart.setSignature(web_audio.OfflineAudioCompletionEvent, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.OfflineAudioCompletionEvent, [])}),
  fields: () => ({[dartx.renderedBuffer]: web_audio.AudioBuffer})
});
dart.registerExtension(dart.global.OfflineAudioCompletionEvent, web_audio.OfflineAudioCompletionEvent);
web_audio.OfflineAudioContext = class OfflineAudioContext extends web_audio.AudioContext {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static new(numberOfChannels, numberOfFrames, sampleRate) {
    return web_audio.OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
  }
  static _create_1(numberOfChannels, numberOfFrames, sampleRate) {
    return new self.OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
  }
};
dart.setSignature(web_audio.OfflineAudioContext, {
  constructors: () => ({
    _: dart.definiteFunctionType(web_audio.OfflineAudioContext, []),
    new: dart.definiteFunctionType(web_audio.OfflineAudioContext, [core.int, core.int, core.num])
  }),
  statics: () => ({_create_1: dart.definiteFunctionType(web_audio.OfflineAudioContext, [dart.dynamic, dart.dynamic, dart.dynamic])}),
  names: ['_create_1']
});
dart.registerExtension(dart.global.OfflineAudioContext, web_audio.OfflineAudioContext);
dart.defineExtensionNames([
  'noteOff',
  'noteOn',
  'setPeriodicWave',
  'start',
  'stop',
  'onEnded',
  'detune',
  'frequency',
  'type'
]);
web_audio.OscillatorNode = class OscillatorNode extends web_audio.AudioSourceNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.detune]() {
    return this.detune;
  }
  get [dartx.frequency]() {
    return this.frequency;
  }
  get [dartx.type]() {
    return this.type;
  }
  set [dartx.type](value) {
    this.type = value;
  }
  [dartx.noteOff](...args) {
    return this.noteOff.apply(this, args);
  }
  [dartx.noteOn](...args) {
    return this.noteOn.apply(this, args);
  }
  [dartx.setPeriodicWave](...args) {
    return this.setPeriodicWave.apply(this, args);
  }
  [dartx.start](...args) {
    return this.start.apply(this, args);
  }
  [dartx.stop](...args) {
    return this.stop.apply(this, args);
  }
  get [dartx.onEnded]() {
    return web_audio.OscillatorNode.endedEvent.forTarget(this);
  }
};
dart.setSignature(web_audio.OscillatorNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.OscillatorNode, [])}),
  fields: () => ({
    [dartx.detune]: web_audio.AudioParam,
    [dartx.frequency]: web_audio.AudioParam,
    [dartx.type]: core.String
  }),
  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
  methods: () => ({
    [dartx.noteOff]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.noteOn]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.setPeriodicWave]: dart.definiteFunctionType(dart.void, [web_audio.PeriodicWave]),
    [dartx.start]: dart.definiteFunctionType(dart.void, [], [core.num]),
    [dartx.stop]: dart.definiteFunctionType(dart.void, [], [core.num])
  }),
  sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
});
web_audio.OscillatorNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
dart.registerExtension(dart.global.OscillatorNode, web_audio.OscillatorNode);
dart.registerExtension(dart.global.Oscillator, web_audio.OscillatorNode);
dart.defineExtensionNames([
  'setOrientation',
  'setPosition',
  'setVelocity',
  'coneInnerAngle',
  'coneOuterAngle',
  'coneOuterGain',
  'distanceModel',
  'maxDistance',
  'panningModel',
  'refDistance',
  'rolloffFactor'
]);
web_audio.PannerNode = class PannerNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.coneInnerAngle]() {
    return this.coneInnerAngle;
  }
  set [dartx.coneInnerAngle](value) {
    this.coneInnerAngle = value;
  }
  get [dartx.coneOuterAngle]() {
    return this.coneOuterAngle;
  }
  set [dartx.coneOuterAngle](value) {
    this.coneOuterAngle = value;
  }
  get [dartx.coneOuterGain]() {
    return this.coneOuterGain;
  }
  set [dartx.coneOuterGain](value) {
    this.coneOuterGain = value;
  }
  get [dartx.distanceModel]() {
    return this.distanceModel;
  }
  set [dartx.distanceModel](value) {
    this.distanceModel = value;
  }
  get [dartx.maxDistance]() {
    return this.maxDistance;
  }
  set [dartx.maxDistance](value) {
    this.maxDistance = value;
  }
  get [dartx.panningModel]() {
    return this.panningModel;
  }
  set [dartx.panningModel](value) {
    this.panningModel = value;
  }
  get [dartx.refDistance]() {
    return this.refDistance;
  }
  set [dartx.refDistance](value) {
    this.refDistance = value;
  }
  get [dartx.rolloffFactor]() {
    return this.rolloffFactor;
  }
  set [dartx.rolloffFactor](value) {
    this.rolloffFactor = value;
  }
  [dartx.setOrientation](...args) {
    return this.setOrientation.apply(this, args);
  }
  [dartx.setPosition](...args) {
    return this.setPosition.apply(this, args);
  }
  [dartx.setVelocity](...args) {
    return this.setVelocity.apply(this, args);
  }
};
dart.setSignature(web_audio.PannerNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.PannerNode, [])}),
  fields: () => ({
    [dartx.coneInnerAngle]: core.num,
    [dartx.coneOuterAngle]: core.num,
    [dartx.coneOuterGain]: core.num,
    [dartx.distanceModel]: core.String,
    [dartx.maxDistance]: core.num,
    [dartx.panningModel]: core.String,
    [dartx.refDistance]: core.num,
    [dartx.rolloffFactor]: core.num
  }),
  methods: () => ({
    [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
    [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
  })
});
dart.registerExtension(dart.global.PannerNode, web_audio.PannerNode);
dart.registerExtension(dart.global.AudioPannerNode, web_audio.PannerNode);
dart.registerExtension(dart.global.webkitAudioPannerNode, web_audio.PannerNode);
web_audio.PeriodicWave = class PeriodicWave extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_audio.PeriodicWave, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.PeriodicWave, [])})
});
dart.registerExtension(dart.global.PeriodicWave, web_audio.PeriodicWave);
dart.defineExtensionNames([
  'setEventListener',
  'onAudioProcess',
  'bufferSize'
]);
web_audio.ScriptProcessorNode = class ScriptProcessorNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.bufferSize]() {
    return this.bufferSize;
  }
  [dartx.setEventListener](...args) {
    return this.setEventListener.apply(this, args);
  }
  get [dartx.onAudioProcess]() {
    return web_audio.ScriptProcessorNode.audioProcessEvent.forTarget(this);
  }
};
dart.setSignature(web_audio.ScriptProcessorNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [])}),
  fields: () => ({[dartx.bufferSize]: core.int}),
  getters: () => ({[dartx.onAudioProcess]: dart.definiteFunctionType(async.Stream$(web_audio.AudioProcessingEvent), [])}),
  methods: () => ({[dartx.setEventListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])}),
  sfields: () => ({audioProcessEvent: EventStreamProviderOfAudioProcessingEvent()})
});
web_audio.ScriptProcessorNode.audioProcessEvent = dart.const(new (EventStreamProviderOfAudioProcessingEvent())('audioprocess'));
dart.registerExtension(dart.global.ScriptProcessorNode, web_audio.ScriptProcessorNode);
dart.registerExtension(dart.global.JavaScriptAudioNode, web_audio.ScriptProcessorNode);
dart.defineExtensionNames([
  'curve',
  'oversample'
]);
web_audio.WaveShaperNode = class WaveShaperNode extends web_audio.AudioNode {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.curve]() {
    return this.curve;
  }
  set [dartx.curve](value) {
    this.curve = value;
  }
  get [dartx.oversample]() {
    return this.oversample;
  }
  set [dartx.oversample](value) {
    this.oversample = value;
  }
};
dart.setSignature(web_audio.WaveShaperNode, {
  constructors: () => ({_: dart.definiteFunctionType(web_audio.WaveShaperNode, [])}),
  fields: () => ({
    [dartx.curve]: typed_data.Float32List,
    [dartx.oversample]: core.String
  })
});
dart.registerExtension(dart.global.WaveShaperNode, web_audio.WaveShaperNode);
const _getContextAttributes_1$ = Symbol('_getContextAttributes_1');
const _texImage2D_1 = Symbol('_texImage2D_1');
const _texImage2D_2 = Symbol('_texImage2D_2');
const _texImage2D_3 = Symbol('_texImage2D_3');
const _texImage2D_4 = Symbol('_texImage2D_4');
const _texImage2D_5 = Symbol('_texImage2D_5');
const _texImage2DImageData_1 = Symbol('_texImage2DImageData_1');
const _texSubImage2D_1 = Symbol('_texSubImage2D_1');
const _texSubImage2D_2 = Symbol('_texSubImage2D_2');
const _texSubImage2D_3 = Symbol('_texSubImage2D_3');
const _texSubImage2D_4 = Symbol('_texSubImage2D_4');
const _texSubImage2D_5 = Symbol('_texSubImage2D_5');
const _texSubImage2DImageData_1 = Symbol('_texSubImage2DImageData_1');
dart.defineExtensionNames([
  'activeTexture',
  'attachShader',
  'bindAttribLocation',
  'bindBuffer',
  'bindFramebuffer',
  'bindRenderbuffer',
  'bindTexture',
  'blendColor',
  'blendEquation',
  'blendEquationSeparate',
  'blendFunc',
  'blendFuncSeparate',
  'bufferByteData',
  'bufferData',
  'bufferDataTyped',
  'bufferSubByteData',
  'bufferSubData',
  'bufferSubDataTyped',
  'checkFramebufferStatus',
  'clear',
  'clearColor',
  'clearDepth',
  'clearStencil',
  'colorMask',
  'compileShader',
  'compressedTexImage2D',
  'compressedTexSubImage2D',
  'copyTexImage2D',
  'copyTexSubImage2D',
  'createBuffer',
  'createFramebuffer',
  'createProgram',
  'createRenderbuffer',
  'createShader',
  'createTexture',
  'cullFace',
  'deleteBuffer',
  'deleteFramebuffer',
  'deleteProgram',
  'deleteRenderbuffer',
  'deleteShader',
  'deleteTexture',
  'depthFunc',
  'depthMask',
  'depthRange',
  'detachShader',
  'disable',
  'disableVertexAttribArray',
  'drawArrays',
  'drawElements',
  'enable',
  'enableVertexAttribArray',
  'finish',
  'flush',
  'framebufferRenderbuffer',
  'framebufferTexture2D',
  'frontFace',
  'generateMipmap',
  'getActiveAttrib',
  'getActiveUniform',
  'getAttachedShaders',
  'getAttribLocation',
  'getBufferParameter',
  'getContextAttributes',
  'getError',
  'getExtension',
  'getFramebufferAttachmentParameter',
  'getParameter',
  'getProgramInfoLog',
  'getProgramParameter',
  'getRenderbufferParameter',
  'getShaderInfoLog',
  'getShaderParameter',
  'getShaderPrecisionFormat',
  'getShaderSource',
  'getSupportedExtensions',
  'getTexParameter',
  'getUniform',
  'getUniformLocation',
  'getVertexAttrib',
  'getVertexAttribOffset',
  'hint',
  'isBuffer',
  'isContextLost',
  'isEnabled',
  'isFramebuffer',
  'isProgram',
  'isRenderbuffer',
  'isShader',
  'isTexture',
  'lineWidth',
  'linkProgram',
  'pixelStorei',
  'polygonOffset',
  'readPixels',
  'renderbufferStorage',
  'sampleCoverage',
  'scissor',
  'shaderSource',
  'stencilFunc',
  'stencilFuncSeparate',
  'stencilMask',
  'stencilMaskSeparate',
  'stencilOp',
  'stencilOpSeparate',
  'texImage2D',
  'texImage2DCanvas',
  'texImage2DImage',
  'texImage2DImageData',
  'texImage2DVideo',
  'texParameterf',
  'texParameteri',
  'texSubImage2D',
  'texSubImage2DCanvas',
  'texSubImage2DImage',
  'texSubImage2DImageData',
  'texSubImage2DVideo',
  'uniform1f',
  'uniform1fv',
  'uniform1i',
  'uniform1iv',
  'uniform2f',
  'uniform2fv',
  'uniform2i',
  'uniform2iv',
  'uniform3f',
  'uniform3fv',
  'uniform3i',
  'uniform3iv',
  'uniform4f',
  'uniform4fv',
  'uniform4i',
  'uniform4iv',
  'uniformMatrix2fv',
  'uniformMatrix3fv',
  'uniformMatrix4fv',
  'useProgram',
  'validateProgram',
  'vertexAttrib1f',
  'vertexAttrib1fv',
  'vertexAttrib2f',
  'vertexAttrib2fv',
  'vertexAttrib3f',
  'vertexAttrib3fv',
  'vertexAttrib4f',
  'vertexAttrib4fv',
  'vertexAttribPointer',
  'viewport',
  'texImage2DUntyped',
  'texImage2DTyped',
  'texSubImage2DUntyped',
  'texSubImage2DTyped',
  'canvas',
  'drawingBufferHeight',
  'drawingBufferWidth'
]);
web_gl.RenderingContext = class RenderingContext extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!window.WebGLRenderingContext;
  }
  get [dartx.canvas]() {
    return this.canvas;
  }
  get [dartx.drawingBufferHeight]() {
    return this.drawingBufferHeight;
  }
  get [dartx.drawingBufferWidth]() {
    return this.drawingBufferWidth;
  }
  [dartx.activeTexture](...args) {
    return this.activeTexture.apply(this, args);
  }
  [dartx.attachShader](...args) {
    return this.attachShader.apply(this, args);
  }
  [dartx.bindAttribLocation](...args) {
    return this.bindAttribLocation.apply(this, args);
  }
  [dartx.bindBuffer](...args) {
    return this.bindBuffer.apply(this, args);
  }
  [dartx.bindFramebuffer](...args) {
    return this.bindFramebuffer.apply(this, args);
  }
  [dartx.bindRenderbuffer](...args) {
    return this.bindRenderbuffer.apply(this, args);
  }
  [dartx.bindTexture](...args) {
    return this.bindTexture.apply(this, args);
  }
  [dartx.blendColor](...args) {
    return this.blendColor.apply(this, args);
  }
  [dartx.blendEquation](...args) {
    return this.blendEquation.apply(this, args);
  }
  [dartx.blendEquationSeparate](...args) {
    return this.blendEquationSeparate.apply(this, args);
  }
  [dartx.blendFunc](...args) {
    return this.blendFunc.apply(this, args);
  }
  [dartx.blendFuncSeparate](...args) {
    return this.blendFuncSeparate.apply(this, args);
  }
  [dartx.bufferByteData](...args) {
    return this.bufferData.apply(this, args);
  }
  [dartx.bufferData](...args) {
    return this.bufferData.apply(this, args);
  }
  [dartx.bufferDataTyped](...args) {
    return this.bufferData.apply(this, args);
  }
  [dartx.bufferSubByteData](...args) {
    return this.bufferSubData.apply(this, args);
  }
  [dartx.bufferSubData](...args) {
    return this.bufferSubData.apply(this, args);
  }
  [dartx.bufferSubDataTyped](...args) {
    return this.bufferSubData.apply(this, args);
  }
  [dartx.checkFramebufferStatus](...args) {
    return this.checkFramebufferStatus.apply(this, args);
  }
  [dartx.clear](...args) {
    return this.clear.apply(this, args);
  }
  [dartx.clearColor](...args) {
    return this.clearColor.apply(this, args);
  }
  [dartx.clearDepth](...args) {
    return this.clearDepth.apply(this, args);
  }
  [dartx.clearStencil](...args) {
    return this.clearStencil.apply(this, args);
  }
  [dartx.colorMask](...args) {
    return this.colorMask.apply(this, args);
  }
  [dartx.compileShader](...args) {
    return this.compileShader.apply(this, args);
  }
  [dartx.compressedTexImage2D](...args) {
    return this.compressedTexImage2D.apply(this, args);
  }
  [dartx.compressedTexSubImage2D](...args) {
    return this.compressedTexSubImage2D.apply(this, args);
  }
  [dartx.copyTexImage2D](...args) {
    return this.copyTexImage2D.apply(this, args);
  }
  [dartx.copyTexSubImage2D](...args) {
    return this.copyTexSubImage2D.apply(this, args);
  }
  [dartx.createBuffer](...args) {
    return this.createBuffer.apply(this, args);
  }
  [dartx.createFramebuffer](...args) {
    return this.createFramebuffer.apply(this, args);
  }
  [dartx.createProgram](...args) {
    return this.createProgram.apply(this, args);
  }
  [dartx.createRenderbuffer](...args) {
    return this.createRenderbuffer.apply(this, args);
  }
  [dartx.createShader](...args) {
    return this.createShader.apply(this, args);
  }
  [dartx.createTexture](...args) {
    return this.createTexture.apply(this, args);
  }
  [dartx.cullFace](...args) {
    return this.cullFace.apply(this, args);
  }
  [dartx.deleteBuffer](...args) {
    return this.deleteBuffer.apply(this, args);
  }
  [dartx.deleteFramebuffer](...args) {
    return this.deleteFramebuffer.apply(this, args);
  }
  [dartx.deleteProgram](...args) {
    return this.deleteProgram.apply(this, args);
  }
  [dartx.deleteRenderbuffer](...args) {
    return this.deleteRenderbuffer.apply(this, args);
  }
  [dartx.deleteShader](...args) {
    return this.deleteShader.apply(this, args);
  }
  [dartx.deleteTexture](...args) {
    return this.deleteTexture.apply(this, args);
  }
  [dartx.depthFunc](...args) {
    return this.depthFunc.apply(this, args);
  }
  [dartx.depthMask](...args) {
    return this.depthMask.apply(this, args);
  }
  [dartx.depthRange](...args) {
    return this.depthRange.apply(this, args);
  }
  [dartx.detachShader](...args) {
    return this.detachShader.apply(this, args);
  }
  [dartx.disable](...args) {
    return this.disable.apply(this, args);
  }
  [dartx.disableVertexAttribArray](...args) {
    return this.disableVertexAttribArray.apply(this, args);
  }
  [dartx.drawArrays](...args) {
    return this.drawArrays.apply(this, args);
  }
  [dartx.drawElements](...args) {
    return this.drawElements.apply(this, args);
  }
  [dartx.enable](...args) {
    return this.enable.apply(this, args);
  }
  [dartx.enableVertexAttribArray](...args) {
    return this.enableVertexAttribArray.apply(this, args);
  }
  [dartx.finish](...args) {
    return this.finish.apply(this, args);
  }
  [dartx.flush](...args) {
    return this.flush.apply(this, args);
  }
  [dartx.framebufferRenderbuffer](...args) {
    return this.framebufferRenderbuffer.apply(this, args);
  }
  [dartx.framebufferTexture2D](...args) {
    return this.framebufferTexture2D.apply(this, args);
  }
  [dartx.frontFace](...args) {
    return this.frontFace.apply(this, args);
  }
  [dartx.generateMipmap](...args) {
    return this.generateMipmap.apply(this, args);
  }
  [dartx.getActiveAttrib](...args) {
    return this.getActiveAttrib.apply(this, args);
  }
  [dartx.getActiveUniform](...args) {
    return this.getActiveUniform.apply(this, args);
  }
  [dartx.getAttachedShaders](...args) {
    return this.getAttachedShaders.apply(this, args);
  }
  [dartx.getAttribLocation](...args) {
    return this.getAttribLocation.apply(this, args);
  }
  [dartx.getBufferParameter](...args) {
    return this.getBufferParameter.apply(this, args);
  }
  [dartx.getContextAttributes]() {
    return web_gl.ContextAttributes._check(html_common.convertNativeToDart_ContextAttributes(this[_getContextAttributes_1$]()));
  }
  [_getContextAttributes_1$](...args) {
    return this.getContextAttributes.apply(this, args);
  }
  [dartx.getError](...args) {
    return this.getError.apply(this, args);
  }
  [dartx.getExtension](...args) {
    return this.getExtension.apply(this, args);
  }
  [dartx.getFramebufferAttachmentParameter](...args) {
    return this.getFramebufferAttachmentParameter.apply(this, args);
  }
  [dartx.getParameter](...args) {
    return this.getParameter.apply(this, args);
  }
  [dartx.getProgramInfoLog](...args) {
    return this.getProgramInfoLog.apply(this, args);
  }
  [dartx.getProgramParameter](...args) {
    return this.getProgramParameter.apply(this, args);
  }
  [dartx.getRenderbufferParameter](...args) {
    return this.getRenderbufferParameter.apply(this, args);
  }
  [dartx.getShaderInfoLog](...args) {
    return this.getShaderInfoLog.apply(this, args);
  }
  [dartx.getShaderParameter](...args) {
    return this.getShaderParameter.apply(this, args);
  }
  [dartx.getShaderPrecisionFormat](...args) {
    return this.getShaderPrecisionFormat.apply(this, args);
  }
  [dartx.getShaderSource](...args) {
    return this.getShaderSource.apply(this, args);
  }
  [dartx.getSupportedExtensions](...args) {
    return this.getSupportedExtensions.apply(this, args);
  }
  [dartx.getTexParameter](...args) {
    return this.getTexParameter.apply(this, args);
  }
  [dartx.getUniform](...args) {
    return this.getUniform.apply(this, args);
  }
  [dartx.getUniformLocation](...args) {
    return this.getUniformLocation.apply(this, args);
  }
  [dartx.getVertexAttrib](...args) {
    return this.getVertexAttrib.apply(this, args);
  }
  [dartx.getVertexAttribOffset](...args) {
    return this.getVertexAttribOffset.apply(this, args);
  }
  [dartx.hint](...args) {
    return this.hint.apply(this, args);
  }
  [dartx.isBuffer](...args) {
    return this.isBuffer.apply(this, args);
  }
  [dartx.isContextLost](...args) {
    return this.isContextLost.apply(this, args);
  }
  [dartx.isEnabled](...args) {
    return this.isEnabled.apply(this, args);
  }
  [dartx.isFramebuffer](...args) {
    return this.isFramebuffer.apply(this, args);
  }
  [dartx.isProgram](...args) {
    return this.isProgram.apply(this, args);
  }
  [dartx.isRenderbuffer](...args) {
    return this.isRenderbuffer.apply(this, args);
  }
  [dartx.isShader](...args) {
    return this.isShader.apply(this, args);
  }
  [dartx.isTexture](...args) {
    return this.isTexture.apply(this, args);
  }
  [dartx.lineWidth](...args) {
    return this.lineWidth.apply(this, args);
  }
  [dartx.linkProgram](...args) {
    return this.linkProgram.apply(this, args);
  }
  [dartx.pixelStorei](...args) {
    return this.pixelStorei.apply(this, args);
  }
  [dartx.polygonOffset](...args) {
    return this.polygonOffset.apply(this, args);
  }
  [dartx.readPixels](...args) {
    return this.readPixels.apply(this, args);
  }
  [dartx.renderbufferStorage](...args) {
    return this.renderbufferStorage.apply(this, args);
  }
  [dartx.sampleCoverage](...args) {
    return this.sampleCoverage.apply(this, args);
  }
  [dartx.scissor](...args) {
    return this.scissor.apply(this, args);
  }
  [dartx.shaderSource](...args) {
    return this.shaderSource.apply(this, args);
  }
  [dartx.stencilFunc](...args) {
    return this.stencilFunc.apply(this, args);
  }
  [dartx.stencilFuncSeparate](...args) {
    return this.stencilFuncSeparate.apply(this, args);
  }
  [dartx.stencilMask](...args) {
    return this.stencilMask.apply(this, args);
  }
  [dartx.stencilMaskSeparate](...args) {
    return this.stencilMaskSeparate.apply(this, args);
  }
  [dartx.stencilOp](...args) {
    return this.stencilOp.apply(this, args);
  }
  [dartx.stencilOpSeparate](...args) {
    return this.stencilOpSeparate.apply(this, args);
  }
  [dartx.texImage2D](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
    if (format === void 0) format = null;
    if (type === void 0) type = null;
    if (pixels === void 0) pixels = null;
    if (pixels != null && type != null && format != null && typeof border_OR_canvas_OR_image_OR_pixels_OR_video == 'number') {
      this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
      return;
    }
    if ((html$.ImageData.is(border_OR_canvas_OR_image_OR_pixels_OR_video) || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
      let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(border_OR_canvas_OR_image_OR_pixels_OR_video));
      this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
      return;
    }
    if (html$.ImageElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_texImage2D_1](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_2](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_3](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_4](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_5](...args) {
    return this.texImage2D.apply(this, args);
  }
  [dartx.texImage2DCanvas](...args) {
    return this.texImage2D.apply(this, args);
  }
  [dartx.texImage2DImage](...args) {
    return this.texImage2D.apply(this, args);
  }
  [dartx.texImage2DImageData](target, level, internalformat, format, type, pixels) {
    let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
    this[_texImage2DImageData_1](target, level, internalformat, format, type, pixels_1);
    return;
  }
  [_texImage2DImageData_1](...args) {
    return this.texImage2D.apply(this, args);
  }
  [dartx.texImage2DVideo](...args) {
    return this.texImage2D.apply(this, args);
  }
  [dartx.texParameterf](...args) {
    return this.texParameterf.apply(this, args);
  }
  [dartx.texParameteri](...args) {
    return this.texParameteri.apply(this, args);
  }
  [dartx.texSubImage2D](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
    if (type === void 0) type = null;
    if (pixels === void 0) pixels = null;
    if (pixels != null && type != null && typeof canvas_OR_format_OR_image_OR_pixels_OR_video == 'number') {
      this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
      return;
    }
    if ((html$.ImageData.is(canvas_OR_format_OR_image_OR_pixels_OR_video) || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
      let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(canvas_OR_format_OR_image_OR_pixels_OR_video));
      this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
      return;
    }
    if (html$.ImageElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
  }
  [_texSubImage2D_1](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_2](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_3](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_4](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_5](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [dartx.texSubImage2DCanvas](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [dartx.texSubImage2DImage](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [dartx.texSubImage2DImageData](target, level, xoffset, yoffset, format, type, pixels) {
    let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
    this[_texSubImage2DImageData_1](target, level, xoffset, yoffset, format, type, pixels_1);
    return;
  }
  [_texSubImage2DImageData_1](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [dartx.texSubImage2DVideo](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [dartx.uniform1f](...args) {
    return this.uniform1f.apply(this, args);
  }
  [dartx.uniform1fv](...args) {
    return this.uniform1fv.apply(this, args);
  }
  [dartx.uniform1i](...args) {
    return this.uniform1i.apply(this, args);
  }
  [dartx.uniform1iv](...args) {
    return this.uniform1iv.apply(this, args);
  }
  [dartx.uniform2f](...args) {
    return this.uniform2f.apply(this, args);
  }
  [dartx.uniform2fv](...args) {
    return this.uniform2fv.apply(this, args);
  }
  [dartx.uniform2i](...args) {
    return this.uniform2i.apply(this, args);
  }
  [dartx.uniform2iv](...args) {
    return this.uniform2iv.apply(this, args);
  }
  [dartx.uniform3f](...args) {
    return this.uniform3f.apply(this, args);
  }
  [dartx.uniform3fv](...args) {
    return this.uniform3fv.apply(this, args);
  }
  [dartx.uniform3i](...args) {
    return this.uniform3i.apply(this, args);
  }
  [dartx.uniform3iv](...args) {
    return this.uniform3iv.apply(this, args);
  }
  [dartx.uniform4f](...args) {
    return this.uniform4f.apply(this, args);
  }
  [dartx.uniform4fv](...args) {
    return this.uniform4fv.apply(this, args);
  }
  [dartx.uniform4i](...args) {
    return this.uniform4i.apply(this, args);
  }
  [dartx.uniform4iv](...args) {
    return this.uniform4iv.apply(this, args);
  }
  [dartx.uniformMatrix2fv](...args) {
    return this.uniformMatrix2fv.apply(this, args);
  }
  [dartx.uniformMatrix3fv](...args) {
    return this.uniformMatrix3fv.apply(this, args);
  }
  [dartx.uniformMatrix4fv](...args) {
    return this.uniformMatrix4fv.apply(this, args);
  }
  [dartx.useProgram](...args) {
    return this.useProgram.apply(this, args);
  }
  [dartx.validateProgram](...args) {
    return this.validateProgram.apply(this, args);
  }
  [dartx.vertexAttrib1f](...args) {
    return this.vertexAttrib1f.apply(this, args);
  }
  [dartx.vertexAttrib1fv](...args) {
    return this.vertexAttrib1fv.apply(this, args);
  }
  [dartx.vertexAttrib2f](...args) {
    return this.vertexAttrib2f.apply(this, args);
  }
  [dartx.vertexAttrib2fv](...args) {
    return this.vertexAttrib2fv.apply(this, args);
  }
  [dartx.vertexAttrib3f](...args) {
    return this.vertexAttrib3f.apply(this, args);
  }
  [dartx.vertexAttrib3fv](...args) {
    return this.vertexAttrib3fv.apply(this, args);
  }
  [dartx.vertexAttrib4f](...args) {
    return this.vertexAttrib4f.apply(this, args);
  }
  [dartx.vertexAttrib4fv](...args) {
    return this.vertexAttrib4fv.apply(this, args);
  }
  [dartx.vertexAttribPointer](...args) {
    return this.vertexAttribPointer.apply(this, args);
  }
  [dartx.viewport](...args) {
    return this.viewport.apply(this, args);
  }
  [dartx.texImage2DUntyped](...args) {
    return this.texImage2D.apply(this, args);
  }
  [dartx.texImage2DTyped](...args) {
    return this.texImage2D.apply(this, args);
  }
  [dartx.texSubImage2DUntyped](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [dartx.texSubImage2DTyped](...args) {
    return this.texSubImage2D.apply(this, args);
  }
};
web_gl.RenderingContext[dart.implements] = () => [html$.CanvasRenderingContext];
dart.setSignature(web_gl.RenderingContext, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.RenderingContext, [])}),
  fields: () => ({
    [dartx.canvas]: html$.CanvasElement,
    [dartx.drawingBufferHeight]: core.int,
    [dartx.drawingBufferWidth]: core.int
  }),
  methods: () => ({
    [dartx.activeTexture]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.attachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
    [dartx.bindAttribLocation]: dart.definiteFunctionType(dart.void, [web_gl.Program, core.int, core.String]),
    [dartx.bindBuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Buffer]),
    [dartx.bindFramebuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Framebuffer]),
    [dartx.bindRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Renderbuffer]),
    [dartx.bindTexture]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Texture]),
    [dartx.blendColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.blendEquation]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.blendEquationSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.blendFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.blendFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.bufferByteData]: dart.definiteFunctionType(dart.void, [core.int, typed_data.ByteBuffer, core.int]),
    [dartx.bufferData]: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic, core.int]),
    [dartx.bufferDataTyped]: dart.definiteFunctionType(dart.void, [core.int, typed_data.TypedData, core.int]),
    [dartx.bufferSubByteData]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.ByteBuffer]),
    [dartx.bufferSubData]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
    [dartx.bufferSubDataTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.TypedData]),
    [dartx.checkFramebufferStatus]: dart.definiteFunctionType(core.int, [core.int]),
    [dartx.clear]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.clearColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
    [dartx.clearDepth]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.clearStencil]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.colorMask]: dart.definiteFunctionType(dart.void, [core.bool, core.bool, core.bool, core.bool]),
    [dartx.compileShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
    [dartx.compressedTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
    [dartx.compressedTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
    [dartx.copyTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
    [dartx.copyTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
    [dartx.createBuffer]: dart.definiteFunctionType(web_gl.Buffer, []),
    [dartx.createFramebuffer]: dart.definiteFunctionType(web_gl.Framebuffer, []),
    [dartx.createProgram]: dart.definiteFunctionType(web_gl.Program, []),
    [dartx.createRenderbuffer]: dart.definiteFunctionType(web_gl.Renderbuffer, []),
    [dartx.createShader]: dart.definiteFunctionType(web_gl.Shader, [core.int]),
    [dartx.createTexture]: dart.definiteFunctionType(web_gl.Texture, []),
    [dartx.cullFace]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.deleteBuffer]: dart.definiteFunctionType(dart.void, [web_gl.Buffer]),
    [dartx.deleteFramebuffer]: dart.definiteFunctionType(dart.void, [web_gl.Framebuffer]),
    [dartx.deleteProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
    [dartx.deleteRenderbuffer]: dart.definiteFunctionType(dart.void, [web_gl.Renderbuffer]),
    [dartx.deleteShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
    [dartx.deleteTexture]: dart.definiteFunctionType(dart.void, [web_gl.Texture]),
    [dartx.depthFunc]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.depthMask]: dart.definiteFunctionType(dart.void, [core.bool]),
    [dartx.depthRange]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.detachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
    [dartx.disable]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.disableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.drawArrays]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
    [dartx.drawElements]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.enable]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.enableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.finish]: dart.definiteFunctionType(dart.void, []),
    [dartx.flush]: dart.definiteFunctionType(dart.void, []),
    [dartx.framebufferRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Renderbuffer]),
    [dartx.framebufferTexture2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Texture, core.int]),
    [dartx.frontFace]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.generateMipmap]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.getActiveAttrib]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
    [dartx.getActiveUniform]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
    [dartx.getAttachedShaders]: dart.definiteFunctionType(core.List$(web_gl.Shader), [web_gl.Program]),
    [dartx.getAttribLocation]: dart.definiteFunctionType(core.int, [web_gl.Program, core.String]),
    [dartx.getBufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
    [dartx.getContextAttributes]: dart.definiteFunctionType(web_gl.ContextAttributes, []),
    [_getContextAttributes_1$]: dart.definiteFunctionType(dart.dynamic, []),
    [dartx.getError]: dart.definiteFunctionType(core.int, []),
    [dartx.getExtension]: dart.definiteFunctionType(core.Object, [core.String]),
    [dartx.getFramebufferAttachmentParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int, core.int]),
    [dartx.getParameter]: dart.definiteFunctionType(core.Object, [core.int]),
    [dartx.getProgramInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Program]),
    [dartx.getProgramParameter]: dart.definiteFunctionType(core.Object, [web_gl.Program, core.int]),
    [dartx.getRenderbufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
    [dartx.getShaderInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
    [dartx.getShaderParameter]: dart.definiteFunctionType(core.Object, [web_gl.Shader, core.int]),
    [dartx.getShaderPrecisionFormat]: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [core.int, core.int]),
    [dartx.getShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
    [dartx.getSupportedExtensions]: dart.definiteFunctionType(core.List$(core.String), []),
    [dartx.getTexParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
    [dartx.getUniform]: dart.definiteFunctionType(core.Object, [web_gl.Program, web_gl.UniformLocation]),
    [dartx.getUniformLocation]: dart.definiteFunctionType(web_gl.UniformLocation, [web_gl.Program, core.String]),
    [dartx.getVertexAttrib]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
    [dartx.getVertexAttribOffset]: dart.definiteFunctionType(core.int, [core.int, core.int]),
    [dartx.hint]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.isBuffer]: dart.definiteFunctionType(core.bool, [web_gl.Buffer]),
    [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
    [dartx.isEnabled]: dart.definiteFunctionType(core.bool, [core.int]),
    [dartx.isFramebuffer]: dart.definiteFunctionType(core.bool, [web_gl.Framebuffer]),
    [dartx.isProgram]: dart.definiteFunctionType(core.bool, [web_gl.Program]),
    [dartx.isRenderbuffer]: dart.definiteFunctionType(core.bool, [web_gl.Renderbuffer]),
    [dartx.isShader]: dart.definiteFunctionType(core.bool, [web_gl.Shader]),
    [dartx.isTexture]: dart.definiteFunctionType(core.bool, [web_gl.Texture]),
    [dartx.lineWidth]: dart.definiteFunctionType(dart.void, [core.num]),
    [dartx.linkProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
    [dartx.pixelStorei]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.polygonOffset]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
    [dartx.readPixels]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
    [dartx.renderbufferStorage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.sampleCoverage]: dart.definiteFunctionType(dart.void, [core.num, core.bool]),
    [dartx.scissor]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.shaderSource]: dart.definiteFunctionType(dart.void, [web_gl.Shader, core.String]),
    [dartx.stencilFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
    [dartx.stencilFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.stencilMask]: dart.definiteFunctionType(dart.void, [core.int]),
    [dartx.stencilMaskSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
    [dartx.stencilOp]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
    [dartx.stencilOpSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.texImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
    [_texImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
    [_texImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [_texImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
    [_texImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
    [_texImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
    [dartx.texImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
    [dartx.texImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
    [dartx.texImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
    [_texImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [dartx.texImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
    [dartx.texParameterf]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.num]),
    [dartx.texParameteri]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
    [dartx.texSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
    [_texSubImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
    [_texSubImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [_texSubImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
    [_texSubImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
    [_texSubImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
    [dartx.texSubImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
    [dartx.texSubImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
    [dartx.texSubImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
    [_texSubImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    [dartx.texSubImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
    [dartx.uniform1f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num]),
    [dartx.uniform1fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
    [dartx.uniform1i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int]),
    [dartx.uniform1iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
    [dartx.uniform2f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num]),
    [dartx.uniform2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
    [dartx.uniform2i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
    [dartx.uniform2iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
    [dartx.uniform3f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num]),
    [dartx.uniform3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
    [dartx.uniform3i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
    [dartx.uniform3iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
    [dartx.uniform4f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num, core.num]),
    [dartx.uniform4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
    [dartx.uniform4i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
    [dartx.uniform4iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
    [dartx.uniformMatrix2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
    [dartx.uniformMatrix3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
    [dartx.uniformMatrix4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
    [dartx.useProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
    [dartx.validateProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
    [dartx.vertexAttrib1f]: dart.definiteFunctionType(dart.void, [core.int, core.num]),
    [dartx.vertexAttrib1fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
    [dartx.vertexAttrib2f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num]),
    [dartx.vertexAttrib2fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
    [dartx.vertexAttrib3f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num]),
    [dartx.vertexAttrib3fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
    [dartx.vertexAttrib4f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num, core.num]),
    [dartx.vertexAttrib4fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
    [dartx.vertexAttribPointer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.bool, core.int, core.int]),
    [dartx.viewport]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.texImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
    [dartx.texImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
    [dartx.texSubImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
    [dartx.texSubImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData])
  }),
  sfields: () => ({
    ACTIVE_ATTRIBUTES: core.int,
    ACTIVE_TEXTURE: core.int,
    ACTIVE_UNIFORMS: core.int,
    ALIASED_LINE_WIDTH_RANGE: core.int,
    ALIASED_POINT_SIZE_RANGE: core.int,
    ALPHA: core.int,
    ALPHA_BITS: core.int,
    ALWAYS: core.int,
    ARRAY_BUFFER: core.int,
    ARRAY_BUFFER_BINDING: core.int,
    ATTACHED_SHADERS: core.int,
    BACK: core.int,
    BLEND: core.int,
    BLEND_COLOR: core.int,
    BLEND_DST_ALPHA: core.int,
    BLEND_DST_RGB: core.int,
    BLEND_EQUATION: core.int,
    BLEND_EQUATION_ALPHA: core.int,
    BLEND_EQUATION_RGB: core.int,
    BLEND_SRC_ALPHA: core.int,
    BLEND_SRC_RGB: core.int,
    BLUE_BITS: core.int,
    BOOL: core.int,
    BOOL_VEC2: core.int,
    BOOL_VEC3: core.int,
    BOOL_VEC4: core.int,
    BROWSER_DEFAULT_WEBGL: core.int,
    BUFFER_SIZE: core.int,
    BUFFER_USAGE: core.int,
    BYTE: core.int,
    CCW: core.int,
    CLAMP_TO_EDGE: core.int,
    COLOR_ATTACHMENT0: core.int,
    COLOR_BUFFER_BIT: core.int,
    COLOR_CLEAR_VALUE: core.int,
    COLOR_WRITEMASK: core.int,
    COMPILE_STATUS: core.int,
    COMPRESSED_TEXTURE_FORMATS: core.int,
    CONSTANT_ALPHA: core.int,
    CONSTANT_COLOR: core.int,
    CONTEXT_LOST_WEBGL: core.int,
    CULL_FACE: core.int,
    CULL_FACE_MODE: core.int,
    CURRENT_PROGRAM: core.int,
    CURRENT_VERTEX_ATTRIB: core.int,
    CW: core.int,
    DECR: core.int,
    DECR_WRAP: core.int,
    DELETE_STATUS: core.int,
    DEPTH_ATTACHMENT: core.int,
    DEPTH_BITS: core.int,
    DEPTH_BUFFER_BIT: core.int,
    DEPTH_CLEAR_VALUE: core.int,
    DEPTH_COMPONENT: core.int,
    DEPTH_COMPONENT16: core.int,
    DEPTH_FUNC: core.int,
    DEPTH_RANGE: core.int,
    DEPTH_STENCIL: core.int,
    DEPTH_STENCIL_ATTACHMENT: core.int,
    DEPTH_TEST: core.int,
    DEPTH_WRITEMASK: core.int,
    DITHER: core.int,
    DONT_CARE: core.int,
    DST_ALPHA: core.int,
    DST_COLOR: core.int,
    DYNAMIC_DRAW: core.int,
    ELEMENT_ARRAY_BUFFER: core.int,
    ELEMENT_ARRAY_BUFFER_BINDING: core.int,
    EQUAL: core.int,
    FASTEST: core.int,
    FLOAT: core.int,
    FLOAT_MAT2: core.int,
    FLOAT_MAT3: core.int,
    FLOAT_MAT4: core.int,
    FLOAT_VEC2: core.int,
    FLOAT_VEC3: core.int,
    FLOAT_VEC4: core.int,
    FRAGMENT_SHADER: core.int,
    FRAMEBUFFER: core.int,
    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: core.int,
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: core.int,
    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: core.int,
    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: core.int,
    FRAMEBUFFER_BINDING: core.int,
    FRAMEBUFFER_COMPLETE: core.int,
    FRAMEBUFFER_INCOMPLETE_ATTACHMENT: core.int,
    FRAMEBUFFER_INCOMPLETE_DIMENSIONS: core.int,
    FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: core.int,
    FRAMEBUFFER_UNSUPPORTED: core.int,
    FRONT: core.int,
    FRONT_AND_BACK: core.int,
    FRONT_FACE: core.int,
    FUNC_ADD: core.int,
    FUNC_REVERSE_SUBTRACT: core.int,
    FUNC_SUBTRACT: core.int,
    GENERATE_MIPMAP_HINT: core.int,
    GEQUAL: core.int,
    GREATER: core.int,
    GREEN_BITS: core.int,
    HIGH_FLOAT: core.int,
    HIGH_INT: core.int,
    IMPLEMENTATION_COLOR_READ_FORMAT: core.int,
    IMPLEMENTATION_COLOR_READ_TYPE: core.int,
    INCR: core.int,
    INCR_WRAP: core.int,
    INT: core.int,
    INT_VEC2: core.int,
    INT_VEC3: core.int,
    INT_VEC4: core.int,
    INVALID_ENUM: core.int,
    INVALID_FRAMEBUFFER_OPERATION: core.int,
    INVALID_OPERATION: core.int,
    INVALID_VALUE: core.int,
    INVERT: core.int,
    KEEP: core.int,
    LEQUAL: core.int,
    LESS: core.int,
    LINEAR: core.int,
    LINEAR_MIPMAP_LINEAR: core.int,
    LINEAR_MIPMAP_NEAREST: core.int,
    LINES: core.int,
    LINE_LOOP: core.int,
    LINE_STRIP: core.int,
    LINE_WIDTH: core.int,
    LINK_STATUS: core.int,
    LOW_FLOAT: core.int,
    LOW_INT: core.int,
    LUMINANCE: core.int,
    LUMINANCE_ALPHA: core.int,
    MAX_COMBINED_TEXTURE_IMAGE_UNITS: core.int,
    MAX_CUBE_MAP_TEXTURE_SIZE: core.int,
    MAX_FRAGMENT_UNIFORM_VECTORS: core.int,
    MAX_RENDERBUFFER_SIZE: core.int,
    MAX_TEXTURE_IMAGE_UNITS: core.int,
    MAX_TEXTURE_SIZE: core.int,
    MAX_VARYING_VECTORS: core.int,
    MAX_VERTEX_ATTRIBS: core.int,
    MAX_VERTEX_TEXTURE_IMAGE_UNITS: core.int,
    MAX_VERTEX_UNIFORM_VECTORS: core.int,
    MAX_VIEWPORT_DIMS: core.int,
    MEDIUM_FLOAT: core.int,
    MEDIUM_INT: core.int,
    MIRRORED_REPEAT: core.int,
    NEAREST: core.int,
    NEAREST_MIPMAP_LINEAR: core.int,
    NEAREST_MIPMAP_NEAREST: core.int,
    NEVER: core.int,
    NICEST: core.int,
    NONE: core.int,
    NOTEQUAL: core.int,
    NO_ERROR: core.int,
    ONE: core.int,
    ONE_MINUS_CONSTANT_ALPHA: core.int,
    ONE_MINUS_CONSTANT_COLOR: core.int,
    ONE_MINUS_DST_ALPHA: core.int,
    ONE_MINUS_DST_COLOR: core.int,
    ONE_MINUS_SRC_ALPHA: core.int,
    ONE_MINUS_SRC_COLOR: core.int,
    OUT_OF_MEMORY: core.int,
    PACK_ALIGNMENT: core.int,
    POINTS: core.int,
    POLYGON_OFFSET_FACTOR: core.int,
    POLYGON_OFFSET_FILL: core.int,
    POLYGON_OFFSET_UNITS: core.int,
    RED_BITS: core.int,
    RENDERBUFFER: core.int,
    RENDERBUFFER_ALPHA_SIZE: core.int,
    RENDERBUFFER_BINDING: core.int,
    RENDERBUFFER_BLUE_SIZE: core.int,
    RENDERBUFFER_DEPTH_SIZE: core.int,
    RENDERBUFFER_GREEN_SIZE: core.int,
    RENDERBUFFER_HEIGHT: core.int,
    RENDERBUFFER_INTERNAL_FORMAT: core.int,
    RENDERBUFFER_RED_SIZE: core.int,
    RENDERBUFFER_STENCIL_SIZE: core.int,
    RENDERBUFFER_WIDTH: core.int,
    RENDERER: core.int,
    REPEAT: core.int,
    REPLACE: core.int,
    RGB: core.int,
    RGB565: core.int,
    RGB5_A1: core.int,
    RGBA: core.int,
    RGBA4: core.int,
    SAMPLER_2D: core.int,
    SAMPLER_CUBE: core.int,
    SAMPLES: core.int,
    SAMPLE_ALPHA_TO_COVERAGE: core.int,
    SAMPLE_BUFFERS: core.int,
    SAMPLE_COVERAGE: core.int,
    SAMPLE_COVERAGE_INVERT: core.int,
    SAMPLE_COVERAGE_VALUE: core.int,
    SCISSOR_BOX: core.int,
    SCISSOR_TEST: core.int,
    SHADER_TYPE: core.int,
    SHADING_LANGUAGE_VERSION: core.int,
    SHORT: core.int,
    SRC_ALPHA: core.int,
    SRC_ALPHA_SATURATE: core.int,
    SRC_COLOR: core.int,
    STATIC_DRAW: core.int,
    STENCIL_ATTACHMENT: core.int,
    STENCIL_BACK_FAIL: core.int,
    STENCIL_BACK_FUNC: core.int,
    STENCIL_BACK_PASS_DEPTH_FAIL: core.int,
    STENCIL_BACK_PASS_DEPTH_PASS: core.int,
    STENCIL_BACK_REF: core.int,
    STENCIL_BACK_VALUE_MASK: core.int,
    STENCIL_BACK_WRITEMASK: core.int,
    STENCIL_BITS: core.int,
    STENCIL_BUFFER_BIT: core.int,
    STENCIL_CLEAR_VALUE: core.int,
    STENCIL_FAIL: core.int,
    STENCIL_FUNC: core.int,
    STENCIL_INDEX: core.int,
    STENCIL_INDEX8: core.int,
    STENCIL_PASS_DEPTH_FAIL: core.int,
    STENCIL_PASS_DEPTH_PASS: core.int,
    STENCIL_REF: core.int,
    STENCIL_TEST: core.int,
    STENCIL_VALUE_MASK: core.int,
    STENCIL_WRITEMASK: core.int,
    STREAM_DRAW: core.int,
    SUBPIXEL_BITS: core.int,
    TEXTURE: core.int,
    TEXTURE0: core.int,
    TEXTURE1: core.int,
    TEXTURE10: core.int,
    TEXTURE11: core.int,
    TEXTURE12: core.int,
    TEXTURE13: core.int,
    TEXTURE14: core.int,
    TEXTURE15: core.int,
    TEXTURE16: core.int,
    TEXTURE17: core.int,
    TEXTURE18: core.int,
    TEXTURE19: core.int,
    TEXTURE2: core.int,
    TEXTURE20: core.int,
    TEXTURE21: core.int,
    TEXTURE22: core.int,
    TEXTURE23: core.int,
    TEXTURE24: core.int,
    TEXTURE25: core.int,
    TEXTURE26: core.int,
    TEXTURE27: core.int,
    TEXTURE28: core.int,
    TEXTURE29: core.int,
    TEXTURE3: core.int,
    TEXTURE30: core.int,
    TEXTURE31: core.int,
    TEXTURE4: core.int,
    TEXTURE5: core.int,
    TEXTURE6: core.int,
    TEXTURE7: core.int,
    TEXTURE8: core.int,
    TEXTURE9: core.int,
    TEXTURE_2D: core.int,
    TEXTURE_BINDING_2D: core.int,
    TEXTURE_BINDING_CUBE_MAP: core.int,
    TEXTURE_CUBE_MAP: core.int,
    TEXTURE_CUBE_MAP_NEGATIVE_X: core.int,
    TEXTURE_CUBE_MAP_NEGATIVE_Y: core.int,
    TEXTURE_CUBE_MAP_NEGATIVE_Z: core.int,
    TEXTURE_CUBE_MAP_POSITIVE_X: core.int,
    TEXTURE_CUBE_MAP_POSITIVE_Y: core.int,
    TEXTURE_CUBE_MAP_POSITIVE_Z: core.int,
    TEXTURE_MAG_FILTER: core.int,
    TEXTURE_MIN_FILTER: core.int,
    TEXTURE_WRAP_S: core.int,
    TEXTURE_WRAP_T: core.int,
    TRIANGLES: core.int,
    TRIANGLE_FAN: core.int,
    TRIANGLE_STRIP: core.int,
    UNPACK_ALIGNMENT: core.int,
    UNPACK_COLORSPACE_CONVERSION_WEBGL: core.int,
    UNPACK_FLIP_Y_WEBGL: core.int,
    UNPACK_PREMULTIPLY_ALPHA_WEBGL: core.int,
    UNSIGNED_BYTE: core.int,
    UNSIGNED_INT: core.int,
    UNSIGNED_SHORT: core.int,
    UNSIGNED_SHORT_4_4_4_4: core.int,
    UNSIGNED_SHORT_5_5_5_1: core.int,
    UNSIGNED_SHORT_5_6_5: core.int,
    VALIDATE_STATUS: core.int,
    VENDOR: core.int,
    VERSION: core.int,
    VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: core.int,
    VERTEX_ATTRIB_ARRAY_ENABLED: core.int,
    VERTEX_ATTRIB_ARRAY_NORMALIZED: core.int,
    VERTEX_ATTRIB_ARRAY_POINTER: core.int,
    VERTEX_ATTRIB_ARRAY_SIZE: core.int,
    VERTEX_ATTRIB_ARRAY_STRIDE: core.int,
    VERTEX_ATTRIB_ARRAY_TYPE: core.int,
    VERTEX_SHADER: core.int,
    VIEWPORT: core.int,
    ZERO: core.int
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
web_gl.RenderingContext.ACTIVE_ATTRIBUTES = 35721;
web_gl.RenderingContext.ACTIVE_TEXTURE = 34016;
web_gl.RenderingContext.ACTIVE_UNIFORMS = 35718;
web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE = 33902;
web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE = 33901;
web_gl.RenderingContext.ALPHA = 6406;
web_gl.RenderingContext.ALPHA_BITS = 3413;
web_gl.RenderingContext.ALWAYS = 519;
web_gl.RenderingContext.ARRAY_BUFFER = 34962;
web_gl.RenderingContext.ARRAY_BUFFER_BINDING = 34964;
web_gl.RenderingContext.ATTACHED_SHADERS = 35717;
web_gl.RenderingContext.BACK = 1029;
web_gl.RenderingContext.BLEND = 3042;
web_gl.RenderingContext.BLEND_COLOR = 32773;
web_gl.RenderingContext.BLEND_DST_ALPHA = 32970;
web_gl.RenderingContext.BLEND_DST_RGB = 32968;
web_gl.RenderingContext.BLEND_EQUATION = 32777;
web_gl.RenderingContext.BLEND_EQUATION_ALPHA = 34877;
web_gl.RenderingContext.BLEND_EQUATION_RGB = 32777;
web_gl.RenderingContext.BLEND_SRC_ALPHA = 32971;
web_gl.RenderingContext.BLEND_SRC_RGB = 32969;
web_gl.RenderingContext.BLUE_BITS = 3412;
web_gl.RenderingContext.BOOL = 35670;
web_gl.RenderingContext.BOOL_VEC2 = 35671;
web_gl.RenderingContext.BOOL_VEC3 = 35672;
web_gl.RenderingContext.BOOL_VEC4 = 35673;
web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL = 37444;
web_gl.RenderingContext.BUFFER_SIZE = 34660;
web_gl.RenderingContext.BUFFER_USAGE = 34661;
web_gl.RenderingContext.BYTE = 5120;
web_gl.RenderingContext.CCW = 2305;
web_gl.RenderingContext.CLAMP_TO_EDGE = 33071;
web_gl.RenderingContext.COLOR_ATTACHMENT0 = 36064;
web_gl.RenderingContext.COLOR_BUFFER_BIT = 16384;
web_gl.RenderingContext.COLOR_CLEAR_VALUE = 3106;
web_gl.RenderingContext.COLOR_WRITEMASK = 3107;
web_gl.RenderingContext.COMPILE_STATUS = 35713;
web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS = 34467;
web_gl.RenderingContext.CONSTANT_ALPHA = 32771;
web_gl.RenderingContext.CONSTANT_COLOR = 32769;
web_gl.RenderingContext.CONTEXT_LOST_WEBGL = 37442;
web_gl.RenderingContext.CULL_FACE = 2884;
web_gl.RenderingContext.CULL_FACE_MODE = 2885;
web_gl.RenderingContext.CURRENT_PROGRAM = 35725;
web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB = 34342;
web_gl.RenderingContext.CW = 2304;
web_gl.RenderingContext.DECR = 7683;
web_gl.RenderingContext.DECR_WRAP = 34056;
web_gl.RenderingContext.DELETE_STATUS = 35712;
web_gl.RenderingContext.DEPTH_ATTACHMENT = 36096;
web_gl.RenderingContext.DEPTH_BITS = 3414;
web_gl.RenderingContext.DEPTH_BUFFER_BIT = 256;
web_gl.RenderingContext.DEPTH_CLEAR_VALUE = 2931;
web_gl.RenderingContext.DEPTH_COMPONENT = 6402;
web_gl.RenderingContext.DEPTH_COMPONENT16 = 33189;
web_gl.RenderingContext.DEPTH_FUNC = 2932;
web_gl.RenderingContext.DEPTH_RANGE = 2928;
web_gl.RenderingContext.DEPTH_STENCIL = 34041;
web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT = 33306;
web_gl.RenderingContext.DEPTH_TEST = 2929;
web_gl.RenderingContext.DEPTH_WRITEMASK = 2930;
web_gl.RenderingContext.DITHER = 3024;
web_gl.RenderingContext.DONT_CARE = 4352;
web_gl.RenderingContext.DST_ALPHA = 772;
web_gl.RenderingContext.DST_COLOR = 774;
web_gl.RenderingContext.DYNAMIC_DRAW = 35048;
web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER = 34963;
web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING = 34965;
web_gl.RenderingContext.EQUAL = 514;
web_gl.RenderingContext.FASTEST = 4353;
web_gl.RenderingContext.FLOAT = 5126;
web_gl.RenderingContext.FLOAT_MAT2 = 35674;
web_gl.RenderingContext.FLOAT_MAT3 = 35675;
web_gl.RenderingContext.FLOAT_MAT4 = 35676;
web_gl.RenderingContext.FLOAT_VEC2 = 35664;
web_gl.RenderingContext.FLOAT_VEC3 = 35665;
web_gl.RenderingContext.FLOAT_VEC4 = 35666;
web_gl.RenderingContext.FRAGMENT_SHADER = 35632;
web_gl.RenderingContext.FRAMEBUFFER = 36160;
web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 36049;
web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 36048;
web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 36051;
web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 36050;
web_gl.RenderingContext.FRAMEBUFFER_BINDING = 36006;
web_gl.RenderingContext.FRAMEBUFFER_COMPLETE = 36053;
web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 36054;
web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 36057;
web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 36055;
web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED = 36061;
web_gl.RenderingContext.FRONT = 1028;
web_gl.RenderingContext.FRONT_AND_BACK = 1032;
web_gl.RenderingContext.FRONT_FACE = 2886;
web_gl.RenderingContext.FUNC_ADD = 32774;
web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT = 32779;
web_gl.RenderingContext.FUNC_SUBTRACT = 32778;
web_gl.RenderingContext.GENERATE_MIPMAP_HINT = 33170;
web_gl.RenderingContext.GEQUAL = 518;
web_gl.RenderingContext.GREATER = 516;
web_gl.RenderingContext.GREEN_BITS = 3411;
web_gl.RenderingContext.HIGH_FLOAT = 36338;
web_gl.RenderingContext.HIGH_INT = 36341;
web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT = 35739;
web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE = 35738;
web_gl.RenderingContext.INCR = 7682;
web_gl.RenderingContext.INCR_WRAP = 34055;
web_gl.RenderingContext.INT = 5124;
web_gl.RenderingContext.INT_VEC2 = 35667;
web_gl.RenderingContext.INT_VEC3 = 35668;
web_gl.RenderingContext.INT_VEC4 = 35669;
web_gl.RenderingContext.INVALID_ENUM = 1280;
web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION = 1286;
web_gl.RenderingContext.INVALID_OPERATION = 1282;
web_gl.RenderingContext.INVALID_VALUE = 1281;
web_gl.RenderingContext.INVERT = 5386;
web_gl.RenderingContext.KEEP = 7680;
web_gl.RenderingContext.LEQUAL = 515;
web_gl.RenderingContext.LESS = 513;
web_gl.RenderingContext.LINEAR = 9729;
web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR = 9987;
web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST = 9985;
web_gl.RenderingContext.LINES = 1;
web_gl.RenderingContext.LINE_LOOP = 2;
web_gl.RenderingContext.LINE_STRIP = 3;
web_gl.RenderingContext.LINE_WIDTH = 2849;
web_gl.RenderingContext.LINK_STATUS = 35714;
web_gl.RenderingContext.LOW_FLOAT = 36336;
web_gl.RenderingContext.LOW_INT = 36339;
web_gl.RenderingContext.LUMINANCE = 6409;
web_gl.RenderingContext.LUMINANCE_ALPHA = 6410;
web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661;
web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE = 34076;
web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS = 36349;
web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE = 34024;
web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS = 34930;
web_gl.RenderingContext.MAX_TEXTURE_SIZE = 3379;
web_gl.RenderingContext.MAX_VARYING_VECTORS = 36348;
web_gl.RenderingContext.MAX_VERTEX_ATTRIBS = 34921;
web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660;
web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS = 36347;
web_gl.RenderingContext.MAX_VIEWPORT_DIMS = 3386;
web_gl.RenderingContext.MEDIUM_FLOAT = 36337;
web_gl.RenderingContext.MEDIUM_INT = 36340;
web_gl.RenderingContext.MIRRORED_REPEAT = 33648;
web_gl.RenderingContext.NEAREST = 9728;
web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR = 9986;
web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST = 9984;
web_gl.RenderingContext.NEVER = 512;
web_gl.RenderingContext.NICEST = 4354;
web_gl.RenderingContext.NONE = 0;
web_gl.RenderingContext.NOTEQUAL = 517;
web_gl.RenderingContext.NO_ERROR = 0;
web_gl.RenderingContext.ONE = 1;
web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA = 32772;
web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR = 32770;
web_gl.RenderingContext.ONE_MINUS_DST_ALPHA = 773;
web_gl.RenderingContext.ONE_MINUS_DST_COLOR = 775;
web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA = 771;
web_gl.RenderingContext.ONE_MINUS_SRC_COLOR = 769;
web_gl.RenderingContext.OUT_OF_MEMORY = 1285;
web_gl.RenderingContext.PACK_ALIGNMENT = 3333;
web_gl.RenderingContext.POINTS = 0;
web_gl.RenderingContext.POLYGON_OFFSET_FACTOR = 32824;
web_gl.RenderingContext.POLYGON_OFFSET_FILL = 32823;
web_gl.RenderingContext.POLYGON_OFFSET_UNITS = 10752;
web_gl.RenderingContext.RED_BITS = 3410;
web_gl.RenderingContext.RENDERBUFFER = 36161;
web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE = 36179;
web_gl.RenderingContext.RENDERBUFFER_BINDING = 36007;
web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE = 36178;
web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE = 36180;
web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE = 36177;
web_gl.RenderingContext.RENDERBUFFER_HEIGHT = 36163;
web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT = 36164;
web_gl.RenderingContext.RENDERBUFFER_RED_SIZE = 36176;
web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE = 36181;
web_gl.RenderingContext.RENDERBUFFER_WIDTH = 36162;
web_gl.RenderingContext.RENDERER = 7937;
web_gl.RenderingContext.REPEAT = 10497;
web_gl.RenderingContext.REPLACE = 7681;
web_gl.RenderingContext.RGB = 6407;
web_gl.RenderingContext.RGB565 = 36194;
web_gl.RenderingContext.RGB5_A1 = 32855;
web_gl.RenderingContext.RGBA = 6408;
web_gl.RenderingContext.RGBA4 = 32854;
web_gl.RenderingContext.SAMPLER_2D = 35678;
web_gl.RenderingContext.SAMPLER_CUBE = 35680;
web_gl.RenderingContext.SAMPLES = 32937;
web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE = 32926;
web_gl.RenderingContext.SAMPLE_BUFFERS = 32936;
web_gl.RenderingContext.SAMPLE_COVERAGE = 32928;
web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT = 32939;
web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE = 32938;
web_gl.RenderingContext.SCISSOR_BOX = 3088;
web_gl.RenderingContext.SCISSOR_TEST = 3089;
web_gl.RenderingContext.SHADER_TYPE = 35663;
web_gl.RenderingContext.SHADING_LANGUAGE_VERSION = 35724;
web_gl.RenderingContext.SHORT = 5122;
web_gl.RenderingContext.SRC_ALPHA = 770;
web_gl.RenderingContext.SRC_ALPHA_SATURATE = 776;
web_gl.RenderingContext.SRC_COLOR = 768;
web_gl.RenderingContext.STATIC_DRAW = 35044;
web_gl.RenderingContext.STENCIL_ATTACHMENT = 36128;
web_gl.RenderingContext.STENCIL_BACK_FAIL = 34817;
web_gl.RenderingContext.STENCIL_BACK_FUNC = 34816;
web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL = 34818;
web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS = 34819;
web_gl.RenderingContext.STENCIL_BACK_REF = 36003;
web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK = 36004;
web_gl.RenderingContext.STENCIL_BACK_WRITEMASK = 36005;
web_gl.RenderingContext.STENCIL_BITS = 3415;
web_gl.RenderingContext.STENCIL_BUFFER_BIT = 1024;
web_gl.RenderingContext.STENCIL_CLEAR_VALUE = 2961;
web_gl.RenderingContext.STENCIL_FAIL = 2964;
web_gl.RenderingContext.STENCIL_FUNC = 2962;
web_gl.RenderingContext.STENCIL_INDEX = 6401;
web_gl.RenderingContext.STENCIL_INDEX8 = 36168;
web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL = 2965;
web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS = 2966;
web_gl.RenderingContext.STENCIL_REF = 2967;
web_gl.RenderingContext.STENCIL_TEST = 2960;
web_gl.RenderingContext.STENCIL_VALUE_MASK = 2963;
web_gl.RenderingContext.STENCIL_WRITEMASK = 2968;
web_gl.RenderingContext.STREAM_DRAW = 35040;
web_gl.RenderingContext.SUBPIXEL_BITS = 3408;
web_gl.RenderingContext.TEXTURE = 5890;
web_gl.RenderingContext.TEXTURE0 = 33984;
web_gl.RenderingContext.TEXTURE1 = 33985;
web_gl.RenderingContext.TEXTURE10 = 33994;
web_gl.RenderingContext.TEXTURE11 = 33995;
web_gl.RenderingContext.TEXTURE12 = 33996;
web_gl.RenderingContext.TEXTURE13 = 33997;
web_gl.RenderingContext.TEXTURE14 = 33998;
web_gl.RenderingContext.TEXTURE15 = 33999;
web_gl.RenderingContext.TEXTURE16 = 34000;
web_gl.RenderingContext.TEXTURE17 = 34001;
web_gl.RenderingContext.TEXTURE18 = 34002;
web_gl.RenderingContext.TEXTURE19 = 34003;
web_gl.RenderingContext.TEXTURE2 = 33986;
web_gl.RenderingContext.TEXTURE20 = 34004;
web_gl.RenderingContext.TEXTURE21 = 34005;
web_gl.RenderingContext.TEXTURE22 = 34006;
web_gl.RenderingContext.TEXTURE23 = 34007;
web_gl.RenderingContext.TEXTURE24 = 34008;
web_gl.RenderingContext.TEXTURE25 = 34009;
web_gl.RenderingContext.TEXTURE26 = 34010;
web_gl.RenderingContext.TEXTURE27 = 34011;
web_gl.RenderingContext.TEXTURE28 = 34012;
web_gl.RenderingContext.TEXTURE29 = 34013;
web_gl.RenderingContext.TEXTURE3 = 33987;
web_gl.RenderingContext.TEXTURE30 = 34014;
web_gl.RenderingContext.TEXTURE31 = 34015;
web_gl.RenderingContext.TEXTURE4 = 33988;
web_gl.RenderingContext.TEXTURE5 = 33989;
web_gl.RenderingContext.TEXTURE6 = 33990;
web_gl.RenderingContext.TEXTURE7 = 33991;
web_gl.RenderingContext.TEXTURE8 = 33992;
web_gl.RenderingContext.TEXTURE9 = 33993;
web_gl.RenderingContext.TEXTURE_2D = 3553;
web_gl.RenderingContext.TEXTURE_BINDING_2D = 32873;
web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP = 34068;
web_gl.RenderingContext.TEXTURE_CUBE_MAP = 34067;
web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070;
web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072;
web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074;
web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071;
web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073;
web_gl.RenderingContext.TEXTURE_MAG_FILTER = 10240;
web_gl.RenderingContext.TEXTURE_MIN_FILTER = 10241;
web_gl.RenderingContext.TEXTURE_WRAP_S = 10242;
web_gl.RenderingContext.TEXTURE_WRAP_T = 10243;
web_gl.RenderingContext.TRIANGLES = 4;
web_gl.RenderingContext.TRIANGLE_FAN = 6;
web_gl.RenderingContext.TRIANGLE_STRIP = 5;
web_gl.RenderingContext.UNPACK_ALIGNMENT = 3317;
web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL = 37443;
web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL = 37440;
web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL = 37441;
web_gl.RenderingContext.UNSIGNED_BYTE = 5121;
web_gl.RenderingContext.UNSIGNED_INT = 5125;
web_gl.RenderingContext.UNSIGNED_SHORT = 5123;
web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4 = 32819;
web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1 = 32820;
web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5 = 33635;
web_gl.RenderingContext.VALIDATE_STATUS = 35715;
web_gl.RenderingContext.VENDOR = 7936;
web_gl.RenderingContext.VERSION = 7938;
web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975;
web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED = 34338;
web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922;
web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER = 34373;
web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE = 34339;
web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE = 34340;
web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE = 34341;
web_gl.RenderingContext.VERTEX_SHADER = 35633;
web_gl.RenderingContext.VIEWPORT = 2978;
web_gl.RenderingContext.ZERO = 0;
dart.registerExtension(dart.global.WebGLRenderingContext, web_gl.RenderingContext);
web_gl.ACTIVE_ATTRIBUTES = web_gl.RenderingContext.ACTIVE_ATTRIBUTES;
web_gl.ACTIVE_TEXTURE = web_gl.RenderingContext.ACTIVE_TEXTURE;
web_gl.ACTIVE_UNIFORMS = web_gl.RenderingContext.ACTIVE_UNIFORMS;
web_gl.ALIASED_LINE_WIDTH_RANGE = web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE;
web_gl.ALIASED_POINT_SIZE_RANGE = web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE;
web_gl.ALPHA = web_gl.RenderingContext.ALPHA;
web_gl.ALPHA_BITS = web_gl.RenderingContext.ALPHA_BITS;
web_gl.ALWAYS = web_gl.RenderingContext.ALWAYS;
web_gl.ARRAY_BUFFER = web_gl.RenderingContext.ARRAY_BUFFER;
web_gl.ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ARRAY_BUFFER_BINDING;
web_gl.ATTACHED_SHADERS = web_gl.RenderingContext.ATTACHED_SHADERS;
web_gl.BACK = web_gl.RenderingContext.BACK;
web_gl.BLEND = web_gl.RenderingContext.BLEND;
web_gl.BLEND_COLOR = web_gl.RenderingContext.BLEND_COLOR;
web_gl.BLEND_DST_ALPHA = web_gl.RenderingContext.BLEND_DST_ALPHA;
web_gl.BLEND_DST_RGB = web_gl.RenderingContext.BLEND_DST_RGB;
web_gl.BLEND_EQUATION = web_gl.RenderingContext.BLEND_EQUATION;
web_gl.BLEND_EQUATION_ALPHA = web_gl.RenderingContext.BLEND_EQUATION_ALPHA;
web_gl.BLEND_EQUATION_RGB = web_gl.RenderingContext.BLEND_EQUATION_RGB;
web_gl.BLEND_SRC_ALPHA = web_gl.RenderingContext.BLEND_SRC_ALPHA;
web_gl.BLEND_SRC_RGB = web_gl.RenderingContext.BLEND_SRC_RGB;
web_gl.BLUE_BITS = web_gl.RenderingContext.BLUE_BITS;
web_gl.BOOL = web_gl.RenderingContext.BOOL;
web_gl.BOOL_VEC2 = web_gl.RenderingContext.BOOL_VEC2;
web_gl.BOOL_VEC3 = web_gl.RenderingContext.BOOL_VEC3;
web_gl.BOOL_VEC4 = web_gl.RenderingContext.BOOL_VEC4;
web_gl.BROWSER_DEFAULT_WEBGL = web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL;
web_gl.BUFFER_SIZE = web_gl.RenderingContext.BUFFER_SIZE;
web_gl.BUFFER_USAGE = web_gl.RenderingContext.BUFFER_USAGE;
web_gl.BYTE = web_gl.RenderingContext.BYTE;
web_gl.CCW = web_gl.RenderingContext.CCW;
web_gl.CLAMP_TO_EDGE = web_gl.RenderingContext.CLAMP_TO_EDGE;
web_gl.COLOR_ATTACHMENT0 = web_gl.RenderingContext.COLOR_ATTACHMENT0;
web_gl.COLOR_BUFFER_BIT = web_gl.RenderingContext.COLOR_BUFFER_BIT;
web_gl.COLOR_CLEAR_VALUE = web_gl.RenderingContext.COLOR_CLEAR_VALUE;
web_gl.COLOR_WRITEMASK = web_gl.RenderingContext.COLOR_WRITEMASK;
web_gl.COMPILE_STATUS = web_gl.RenderingContext.COMPILE_STATUS;
web_gl.COMPRESSED_TEXTURE_FORMATS = web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS;
web_gl.CONSTANT_ALPHA = web_gl.RenderingContext.CONSTANT_ALPHA;
web_gl.CONSTANT_COLOR = web_gl.RenderingContext.CONSTANT_COLOR;
web_gl.CONTEXT_LOST_WEBGL = web_gl.RenderingContext.CONTEXT_LOST_WEBGL;
web_gl.CULL_FACE = web_gl.RenderingContext.CULL_FACE;
web_gl.CULL_FACE_MODE = web_gl.RenderingContext.CULL_FACE_MODE;
web_gl.CURRENT_PROGRAM = web_gl.RenderingContext.CURRENT_PROGRAM;
web_gl.CURRENT_VERTEX_ATTRIB = web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB;
web_gl.CW = web_gl.RenderingContext.CW;
web_gl.DECR = web_gl.RenderingContext.DECR;
web_gl.DECR_WRAP = web_gl.RenderingContext.DECR_WRAP;
web_gl.DELETE_STATUS = web_gl.RenderingContext.DELETE_STATUS;
web_gl.DEPTH_ATTACHMENT = web_gl.RenderingContext.DEPTH_ATTACHMENT;
web_gl.DEPTH_BITS = web_gl.RenderingContext.DEPTH_BITS;
web_gl.DEPTH_BUFFER_BIT = web_gl.RenderingContext.DEPTH_BUFFER_BIT;
web_gl.DEPTH_CLEAR_VALUE = web_gl.RenderingContext.DEPTH_CLEAR_VALUE;
web_gl.DEPTH_COMPONENT = web_gl.RenderingContext.DEPTH_COMPONENT;
web_gl.DEPTH_COMPONENT16 = web_gl.RenderingContext.DEPTH_COMPONENT16;
web_gl.DEPTH_FUNC = web_gl.RenderingContext.DEPTH_FUNC;
web_gl.DEPTH_RANGE = web_gl.RenderingContext.DEPTH_RANGE;
web_gl.DEPTH_STENCIL = web_gl.RenderingContext.DEPTH_STENCIL;
web_gl.DEPTH_STENCIL_ATTACHMENT = web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT;
web_gl.DEPTH_TEST = web_gl.RenderingContext.DEPTH_TEST;
web_gl.DEPTH_WRITEMASK = web_gl.RenderingContext.DEPTH_WRITEMASK;
web_gl.DITHER = web_gl.RenderingContext.DITHER;
web_gl.DONT_CARE = web_gl.RenderingContext.DONT_CARE;
web_gl.DST_ALPHA = web_gl.RenderingContext.DST_ALPHA;
web_gl.DST_COLOR = web_gl.RenderingContext.DST_COLOR;
web_gl.DYNAMIC_DRAW = web_gl.RenderingContext.DYNAMIC_DRAW;
web_gl.ELEMENT_ARRAY_BUFFER = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER;
web_gl.ELEMENT_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
web_gl.EQUAL = web_gl.RenderingContext.EQUAL;
web_gl.FASTEST = web_gl.RenderingContext.FASTEST;
web_gl.FLOAT = web_gl.RenderingContext.FLOAT;
web_gl.FLOAT_MAT2 = web_gl.RenderingContext.FLOAT_MAT2;
web_gl.FLOAT_MAT3 = web_gl.RenderingContext.FLOAT_MAT3;
web_gl.FLOAT_MAT4 = web_gl.RenderingContext.FLOAT_MAT4;
web_gl.FLOAT_VEC2 = web_gl.RenderingContext.FLOAT_VEC2;
web_gl.FLOAT_VEC3 = web_gl.RenderingContext.FLOAT_VEC3;
web_gl.FLOAT_VEC4 = web_gl.RenderingContext.FLOAT_VEC4;
web_gl.FRAGMENT_SHADER = web_gl.RenderingContext.FRAGMENT_SHADER;
web_gl.FRAMEBUFFER = web_gl.RenderingContext.FRAMEBUFFER;
web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
web_gl.FRAMEBUFFER_BINDING = web_gl.RenderingContext.FRAMEBUFFER_BINDING;
web_gl.FRAMEBUFFER_COMPLETE = web_gl.RenderingContext.FRAMEBUFFER_COMPLETE;
web_gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
web_gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
web_gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
web_gl.FRAMEBUFFER_UNSUPPORTED = web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED;
web_gl.FRONT = web_gl.RenderingContext.FRONT;
web_gl.FRONT_AND_BACK = web_gl.RenderingContext.FRONT_AND_BACK;
web_gl.FRONT_FACE = web_gl.RenderingContext.FRONT_FACE;
web_gl.FUNC_ADD = web_gl.RenderingContext.FUNC_ADD;
web_gl.FUNC_REVERSE_SUBTRACT = web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT;
web_gl.FUNC_SUBTRACT = web_gl.RenderingContext.FUNC_SUBTRACT;
web_gl.GENERATE_MIPMAP_HINT = web_gl.RenderingContext.GENERATE_MIPMAP_HINT;
web_gl.GEQUAL = web_gl.RenderingContext.GEQUAL;
web_gl.GREATER = web_gl.RenderingContext.GREATER;
web_gl.GREEN_BITS = web_gl.RenderingContext.GREEN_BITS;
web_gl.OesTextureHalfFloat = class OesTextureHalfFloat extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.OesTextureHalfFloat, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloat, [])}),
  sfields: () => ({HALF_FLOAT_OES: core.int})
});
web_gl.OesTextureHalfFloat.HALF_FLOAT_OES = 36193;
dart.registerExtension(dart.global.OESTextureHalfFloat, web_gl.OesTextureHalfFloat);
web_gl.HALF_FLOAT_OES = web_gl.OesTextureHalfFloat.HALF_FLOAT_OES;
web_gl.HIGH_FLOAT = web_gl.RenderingContext.HIGH_FLOAT;
web_gl.HIGH_INT = web_gl.RenderingContext.HIGH_INT;
web_gl.INCR = web_gl.RenderingContext.INCR;
web_gl.INCR_WRAP = web_gl.RenderingContext.INCR_WRAP;
web_gl.INT = web_gl.RenderingContext.INT;
web_gl.INT_VEC2 = web_gl.RenderingContext.INT_VEC2;
web_gl.INT_VEC3 = web_gl.RenderingContext.INT_VEC3;
web_gl.INT_VEC4 = web_gl.RenderingContext.INT_VEC4;
web_gl.INVALID_ENUM = web_gl.RenderingContext.INVALID_ENUM;
web_gl.INVALID_FRAMEBUFFER_OPERATION = web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
web_gl.INVALID_OPERATION = web_gl.RenderingContext.INVALID_OPERATION;
web_gl.INVALID_VALUE = web_gl.RenderingContext.INVALID_VALUE;
web_gl.INVERT = web_gl.RenderingContext.INVERT;
web_gl.KEEP = web_gl.RenderingContext.KEEP;
web_gl.LEQUAL = web_gl.RenderingContext.LEQUAL;
web_gl.LESS = web_gl.RenderingContext.LESS;
web_gl.LINEAR = web_gl.RenderingContext.LINEAR;
web_gl.LINEAR_MIPMAP_LINEAR = web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR;
web_gl.LINEAR_MIPMAP_NEAREST = web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST;
web_gl.LINES = web_gl.RenderingContext.LINES;
web_gl.LINE_LOOP = web_gl.RenderingContext.LINE_LOOP;
web_gl.LINE_STRIP = web_gl.RenderingContext.LINE_STRIP;
web_gl.LINE_WIDTH = web_gl.RenderingContext.LINE_WIDTH;
web_gl.LINK_STATUS = web_gl.RenderingContext.LINK_STATUS;
web_gl.LOW_FLOAT = web_gl.RenderingContext.LOW_FLOAT;
web_gl.LOW_INT = web_gl.RenderingContext.LOW_INT;
web_gl.LUMINANCE = web_gl.RenderingContext.LUMINANCE;
web_gl.LUMINANCE_ALPHA = web_gl.RenderingContext.LUMINANCE_ALPHA;
web_gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
web_gl.MAX_CUBE_MAP_TEXTURE_SIZE = web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
web_gl.MAX_FRAGMENT_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
web_gl.MAX_RENDERBUFFER_SIZE = web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE;
web_gl.MAX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
web_gl.MAX_TEXTURE_SIZE = web_gl.RenderingContext.MAX_TEXTURE_SIZE;
web_gl.MAX_VARYING_VECTORS = web_gl.RenderingContext.MAX_VARYING_VECTORS;
web_gl.MAX_VERTEX_ATTRIBS = web_gl.RenderingContext.MAX_VERTEX_ATTRIBS;
web_gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
web_gl.MAX_VERTEX_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
web_gl.MAX_VIEWPORT_DIMS = web_gl.RenderingContext.MAX_VIEWPORT_DIMS;
web_gl.MEDIUM_FLOAT = web_gl.RenderingContext.MEDIUM_FLOAT;
web_gl.MEDIUM_INT = web_gl.RenderingContext.MEDIUM_INT;
web_gl.MIRRORED_REPEAT = web_gl.RenderingContext.MIRRORED_REPEAT;
web_gl.NEAREST = web_gl.RenderingContext.NEAREST;
web_gl.NEAREST_MIPMAP_LINEAR = web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR;
web_gl.NEAREST_MIPMAP_NEAREST = web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST;
web_gl.NEVER = web_gl.RenderingContext.NEVER;
web_gl.NICEST = web_gl.RenderingContext.NICEST;
web_gl.NONE = web_gl.RenderingContext.NONE;
web_gl.NOTEQUAL = web_gl.RenderingContext.NOTEQUAL;
web_gl.NO_ERROR = web_gl.RenderingContext.NO_ERROR;
web_gl.ONE = web_gl.RenderingContext.ONE;
web_gl.ONE_MINUS_CONSTANT_ALPHA = web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
web_gl.ONE_MINUS_CONSTANT_COLOR = web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR;
web_gl.ONE_MINUS_DST_ALPHA = web_gl.RenderingContext.ONE_MINUS_DST_ALPHA;
web_gl.ONE_MINUS_DST_COLOR = web_gl.RenderingContext.ONE_MINUS_DST_COLOR;
web_gl.ONE_MINUS_SRC_ALPHA = web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA;
web_gl.ONE_MINUS_SRC_COLOR = web_gl.RenderingContext.ONE_MINUS_SRC_COLOR;
web_gl.OUT_OF_MEMORY = web_gl.RenderingContext.OUT_OF_MEMORY;
web_gl.PACK_ALIGNMENT = web_gl.RenderingContext.PACK_ALIGNMENT;
web_gl.POINTS = web_gl.RenderingContext.POINTS;
web_gl.POLYGON_OFFSET_FACTOR = web_gl.RenderingContext.POLYGON_OFFSET_FACTOR;
web_gl.POLYGON_OFFSET_FILL = web_gl.RenderingContext.POLYGON_OFFSET_FILL;
web_gl.POLYGON_OFFSET_UNITS = web_gl.RenderingContext.POLYGON_OFFSET_UNITS;
web_gl.RED_BITS = web_gl.RenderingContext.RED_BITS;
web_gl.RENDERBUFFER = web_gl.RenderingContext.RENDERBUFFER;
web_gl.RENDERBUFFER_ALPHA_SIZE = web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE;
web_gl.RENDERBUFFER_BINDING = web_gl.RenderingContext.RENDERBUFFER_BINDING;
web_gl.RENDERBUFFER_BLUE_SIZE = web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE;
web_gl.RENDERBUFFER_DEPTH_SIZE = web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE;
web_gl.RENDERBUFFER_GREEN_SIZE = web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE;
web_gl.RENDERBUFFER_HEIGHT = web_gl.RenderingContext.RENDERBUFFER_HEIGHT;
web_gl.RENDERBUFFER_INTERNAL_FORMAT = web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
web_gl.RENDERBUFFER_RED_SIZE = web_gl.RenderingContext.RENDERBUFFER_RED_SIZE;
web_gl.RENDERBUFFER_STENCIL_SIZE = web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE;
web_gl.RENDERBUFFER_WIDTH = web_gl.RenderingContext.RENDERBUFFER_WIDTH;
web_gl.RENDERER = web_gl.RenderingContext.RENDERER;
web_gl.REPEAT = web_gl.RenderingContext.REPEAT;
web_gl.REPLACE = web_gl.RenderingContext.REPLACE;
web_gl.RGB = web_gl.RenderingContext.RGB;
web_gl.RGB565 = web_gl.RenderingContext.RGB565;
web_gl.RGB5_A1 = web_gl.RenderingContext.RGB5_A1;
web_gl.RGBA = web_gl.RenderingContext.RGBA;
web_gl.RGBA4 = web_gl.RenderingContext.RGBA4;
web_gl.SAMPLER_2D = web_gl.RenderingContext.SAMPLER_2D;
web_gl.SAMPLER_CUBE = web_gl.RenderingContext.SAMPLER_CUBE;
web_gl.SAMPLES = web_gl.RenderingContext.SAMPLES;
web_gl.SAMPLE_ALPHA_TO_COVERAGE = web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
web_gl.SAMPLE_BUFFERS = web_gl.RenderingContext.SAMPLE_BUFFERS;
web_gl.SAMPLE_COVERAGE = web_gl.RenderingContext.SAMPLE_COVERAGE;
web_gl.SAMPLE_COVERAGE_INVERT = web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT;
web_gl.SAMPLE_COVERAGE_VALUE = web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE;
web_gl.SCISSOR_BOX = web_gl.RenderingContext.SCISSOR_BOX;
web_gl.SCISSOR_TEST = web_gl.RenderingContext.SCISSOR_TEST;
web_gl.SHADER_TYPE = web_gl.RenderingContext.SHADER_TYPE;
web_gl.SHADING_LANGUAGE_VERSION = web_gl.RenderingContext.SHADING_LANGUAGE_VERSION;
web_gl.SHORT = web_gl.RenderingContext.SHORT;
web_gl.SRC_ALPHA = web_gl.RenderingContext.SRC_ALPHA;
web_gl.SRC_ALPHA_SATURATE = web_gl.RenderingContext.SRC_ALPHA_SATURATE;
web_gl.SRC_COLOR = web_gl.RenderingContext.SRC_COLOR;
web_gl.STATIC_DRAW = web_gl.RenderingContext.STATIC_DRAW;
web_gl.STENCIL_ATTACHMENT = web_gl.RenderingContext.STENCIL_ATTACHMENT;
web_gl.STENCIL_BACK_FAIL = web_gl.RenderingContext.STENCIL_BACK_FAIL;
web_gl.STENCIL_BACK_FUNC = web_gl.RenderingContext.STENCIL_BACK_FUNC;
web_gl.STENCIL_BACK_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
web_gl.STENCIL_BACK_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
web_gl.STENCIL_BACK_REF = web_gl.RenderingContext.STENCIL_BACK_REF;
web_gl.STENCIL_BACK_VALUE_MASK = web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK;
web_gl.STENCIL_BACK_WRITEMASK = web_gl.RenderingContext.STENCIL_BACK_WRITEMASK;
web_gl.STENCIL_BITS = web_gl.RenderingContext.STENCIL_BITS;
web_gl.STENCIL_BUFFER_BIT = web_gl.RenderingContext.STENCIL_BUFFER_BIT;
web_gl.STENCIL_CLEAR_VALUE = web_gl.RenderingContext.STENCIL_CLEAR_VALUE;
web_gl.STENCIL_FAIL = web_gl.RenderingContext.STENCIL_FAIL;
web_gl.STENCIL_FUNC = web_gl.RenderingContext.STENCIL_FUNC;
web_gl.STENCIL_INDEX = web_gl.RenderingContext.STENCIL_INDEX;
web_gl.STENCIL_INDEX8 = web_gl.RenderingContext.STENCIL_INDEX8;
web_gl.STENCIL_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL;
web_gl.STENCIL_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS;
web_gl.STENCIL_REF = web_gl.RenderingContext.STENCIL_REF;
web_gl.STENCIL_TEST = web_gl.RenderingContext.STENCIL_TEST;
web_gl.STENCIL_VALUE_MASK = web_gl.RenderingContext.STENCIL_VALUE_MASK;
web_gl.STENCIL_WRITEMASK = web_gl.RenderingContext.STENCIL_WRITEMASK;
web_gl.STREAM_DRAW = web_gl.RenderingContext.STREAM_DRAW;
web_gl.SUBPIXEL_BITS = web_gl.RenderingContext.SUBPIXEL_BITS;
web_gl.TEXTURE = web_gl.RenderingContext.TEXTURE;
web_gl.TEXTURE0 = web_gl.RenderingContext.TEXTURE0;
web_gl.TEXTURE1 = web_gl.RenderingContext.TEXTURE1;
web_gl.TEXTURE10 = web_gl.RenderingContext.TEXTURE10;
web_gl.TEXTURE11 = web_gl.RenderingContext.TEXTURE11;
web_gl.TEXTURE12 = web_gl.RenderingContext.TEXTURE12;
web_gl.TEXTURE13 = web_gl.RenderingContext.TEXTURE13;
web_gl.TEXTURE14 = web_gl.RenderingContext.TEXTURE14;
web_gl.TEXTURE15 = web_gl.RenderingContext.TEXTURE15;
web_gl.TEXTURE16 = web_gl.RenderingContext.TEXTURE16;
web_gl.TEXTURE17 = web_gl.RenderingContext.TEXTURE17;
web_gl.TEXTURE18 = web_gl.RenderingContext.TEXTURE18;
web_gl.TEXTURE19 = web_gl.RenderingContext.TEXTURE19;
web_gl.TEXTURE2 = web_gl.RenderingContext.TEXTURE2;
web_gl.TEXTURE20 = web_gl.RenderingContext.TEXTURE20;
web_gl.TEXTURE21 = web_gl.RenderingContext.TEXTURE21;
web_gl.TEXTURE22 = web_gl.RenderingContext.TEXTURE22;
web_gl.TEXTURE23 = web_gl.RenderingContext.TEXTURE23;
web_gl.TEXTURE24 = web_gl.RenderingContext.TEXTURE24;
web_gl.TEXTURE25 = web_gl.RenderingContext.TEXTURE25;
web_gl.TEXTURE26 = web_gl.RenderingContext.TEXTURE26;
web_gl.TEXTURE27 = web_gl.RenderingContext.TEXTURE27;
web_gl.TEXTURE28 = web_gl.RenderingContext.TEXTURE28;
web_gl.TEXTURE29 = web_gl.RenderingContext.TEXTURE29;
web_gl.TEXTURE3 = web_gl.RenderingContext.TEXTURE3;
web_gl.TEXTURE30 = web_gl.RenderingContext.TEXTURE30;
web_gl.TEXTURE31 = web_gl.RenderingContext.TEXTURE31;
web_gl.TEXTURE4 = web_gl.RenderingContext.TEXTURE4;
web_gl.TEXTURE5 = web_gl.RenderingContext.TEXTURE5;
web_gl.TEXTURE6 = web_gl.RenderingContext.TEXTURE6;
web_gl.TEXTURE7 = web_gl.RenderingContext.TEXTURE7;
web_gl.TEXTURE8 = web_gl.RenderingContext.TEXTURE8;
web_gl.TEXTURE9 = web_gl.RenderingContext.TEXTURE9;
web_gl.TEXTURE_2D = web_gl.RenderingContext.TEXTURE_2D;
web_gl.TEXTURE_BINDING_2D = web_gl.RenderingContext.TEXTURE_BINDING_2D;
web_gl.TEXTURE_BINDING_CUBE_MAP = web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP;
web_gl.TEXTURE_CUBE_MAP = web_gl.RenderingContext.TEXTURE_CUBE_MAP;
web_gl.TEXTURE_CUBE_MAP_NEGATIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
web_gl.TEXTURE_CUBE_MAP_POSITIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
web_gl.TEXTURE_CUBE_MAP_POSITIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
web_gl.TEXTURE_CUBE_MAP_POSITIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
web_gl.TEXTURE_MAG_FILTER = web_gl.RenderingContext.TEXTURE_MAG_FILTER;
web_gl.TEXTURE_MIN_FILTER = web_gl.RenderingContext.TEXTURE_MIN_FILTER;
web_gl.TEXTURE_WRAP_S = web_gl.RenderingContext.TEXTURE_WRAP_S;
web_gl.TEXTURE_WRAP_T = web_gl.RenderingContext.TEXTURE_WRAP_T;
web_gl.TRIANGLES = web_gl.RenderingContext.TRIANGLES;
web_gl.TRIANGLE_FAN = web_gl.RenderingContext.TRIANGLE_FAN;
web_gl.TRIANGLE_STRIP = web_gl.RenderingContext.TRIANGLE_STRIP;
web_gl.UNPACK_ALIGNMENT = web_gl.RenderingContext.UNPACK_ALIGNMENT;
web_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL = web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
web_gl.UNPACK_FLIP_Y_WEBGL = web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL;
web_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL = web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
web_gl.UNSIGNED_BYTE = web_gl.RenderingContext.UNSIGNED_BYTE;
web_gl.UNSIGNED_INT = web_gl.RenderingContext.UNSIGNED_INT;
web_gl.UNSIGNED_SHORT = web_gl.RenderingContext.UNSIGNED_SHORT;
web_gl.UNSIGNED_SHORT_4_4_4_4 = web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4;
web_gl.UNSIGNED_SHORT_5_5_5_1 = web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1;
web_gl.UNSIGNED_SHORT_5_6_5 = web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5;
web_gl.VALIDATE_STATUS = web_gl.RenderingContext.VALIDATE_STATUS;
web_gl.VENDOR = web_gl.RenderingContext.VENDOR;
web_gl.VERSION = web_gl.RenderingContext.VERSION;
web_gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
web_gl.VERTEX_ATTRIB_ARRAY_ENABLED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
web_gl.VERTEX_ATTRIB_ARRAY_NORMALIZED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
web_gl.VERTEX_ATTRIB_ARRAY_POINTER = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
web_gl.VERTEX_ATTRIB_ARRAY_SIZE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
web_gl.VERTEX_ATTRIB_ARRAY_STRIDE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
web_gl.VERTEX_ATTRIB_ARRAY_TYPE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
web_gl.VERTEX_SHADER = web_gl.RenderingContext.VERTEX_SHADER;
web_gl.VIEWPORT = web_gl.RenderingContext.VIEWPORT;
web_gl.ZERO = web_gl.RenderingContext.ZERO;
dart.defineExtensionNames([
  'name',
  'size',
  'type'
]);
web_gl.ActiveInfo = class ActiveInfo extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.name]() {
    return this.name;
  }
  get [dartx.size]() {
    return this.size;
  }
  get [dartx.type]() {
    return this.type;
  }
};
dart.setSignature(web_gl.ActiveInfo, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ActiveInfo, [])}),
  fields: () => ({
    [dartx.name]: core.String,
    [dartx.size]: core.int,
    [dartx.type]: core.int
  })
});
dart.registerExtension(dart.global.WebGLActiveInfo, web_gl.ActiveInfo);
dart.defineExtensionNames([
  'drawArraysInstancedAngle',
  'drawElementsInstancedAngle',
  'vertexAttribDivisorAngle'
]);
web_gl.AngleInstancedArrays = class AngleInstancedArrays extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.drawArraysInstancedAngle](...args) {
    return this.drawArraysInstancedANGLE.apply(this, args);
  }
  [dartx.drawElementsInstancedAngle](...args) {
    return this.drawElementsInstancedANGLE.apply(this, args);
  }
  [dartx.vertexAttribDivisorAngle](...args) {
    return this.vertexAttribDivisorANGLE.apply(this, args);
  }
};
dart.setSignature(web_gl.AngleInstancedArrays, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.AngleInstancedArrays, [])}),
  methods: () => ({
    [dartx.drawArraysInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
    [dartx.drawElementsInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
    [dartx.vertexAttribDivisorAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int])
  }),
  sfields: () => ({VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: core.int})
});
web_gl.AngleInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 35070;
dart.registerExtension(dart.global.ANGLEInstancedArrays, web_gl.AngleInstancedArrays);
web_gl.Buffer = class Buffer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.Buffer, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.Buffer, [])})
});
dart.registerExtension(dart.global.WebGLBuffer, web_gl.Buffer);
web_gl.CompressedTextureAtc = class CompressedTextureAtc extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.CompressedTextureAtc, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureAtc, [])}),
  sfields: () => ({
    COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: core.int,
    COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: core.int,
    COMPRESSED_RGB_ATC_WEBGL: core.int
  })
});
web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 35987;
web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 34798;
web_gl.CompressedTextureAtc.COMPRESSED_RGB_ATC_WEBGL = 35986;
dart.registerExtension(dart.global.WebGLCompressedTextureATC, web_gl.CompressedTextureAtc);
web_gl.CompressedTextureETC1 = class CompressedTextureETC1 extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.CompressedTextureETC1, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureETC1, [])}),
  sfields: () => ({COMPRESSED_RGB_ETC1_WEBGL: core.int})
});
web_gl.CompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL = 36196;
dart.registerExtension(dart.global.WebGLCompressedTextureETC1, web_gl.CompressedTextureETC1);
web_gl.CompressedTexturePvrtc = class CompressedTexturePvrtc extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.CompressedTexturePvrtc, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTexturePvrtc, [])}),
  sfields: () => ({
    COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: core.int,
    COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: core.int,
    COMPRESSED_RGB_PVRTC_2BPPV1_IMG: core.int,
    COMPRESSED_RGB_PVRTC_4BPPV1_IMG: core.int
  })
});
web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 35843;
web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842;
web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 35841;
web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840;
dart.registerExtension(dart.global.WebGLCompressedTexturePVRTC, web_gl.CompressedTexturePvrtc);
web_gl.CompressedTextureS3TC = class CompressedTextureS3TC extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.CompressedTextureS3TC, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureS3TC, [])}),
  sfields: () => ({
    COMPRESSED_RGBA_S3TC_DXT1_EXT: core.int,
    COMPRESSED_RGBA_S3TC_DXT3_EXT: core.int,
    COMPRESSED_RGBA_S3TC_DXT5_EXT: core.int,
    COMPRESSED_RGB_S3TC_DXT1_EXT: core.int
  })
});
web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777;
web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778;
web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779;
web_gl.CompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776;
dart.registerExtension(dart.global.WebGLCompressedTextureS3TC, web_gl.CompressedTextureS3TC);
dart.defineExtensionNames([
  'alpha',
  'antialias',
  'depth',
  'failIfMajorPerformanceCaveat',
  'premultipliedAlpha',
  'preserveDrawingBuffer',
  'stencil'
]);
web_gl.ContextAttributes = class ContextAttributes extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.alpha]() {
    return this.alpha;
  }
  set [dartx.alpha](value) {
    this.alpha = value;
  }
  get [dartx.antialias]() {
    return this.antialias;
  }
  set [dartx.antialias](value) {
    this.antialias = value;
  }
  get [dartx.depth]() {
    return this.depth;
  }
  set [dartx.depth](value) {
    this.depth = value;
  }
  get [dartx.failIfMajorPerformanceCaveat]() {
    return this.failIfMajorPerformanceCaveat;
  }
  set [dartx.failIfMajorPerformanceCaveat](value) {
    this.failIfMajorPerformanceCaveat = value;
  }
  get [dartx.premultipliedAlpha]() {
    return this.premultipliedAlpha;
  }
  set [dartx.premultipliedAlpha](value) {
    this.premultipliedAlpha = value;
  }
  get [dartx.preserveDrawingBuffer]() {
    return this.preserveDrawingBuffer;
  }
  set [dartx.preserveDrawingBuffer](value) {
    this.preserveDrawingBuffer = value;
  }
  get [dartx.stencil]() {
    return this.stencil;
  }
  set [dartx.stencil](value) {
    this.stencil = value;
  }
};
dart.setSignature(web_gl.ContextAttributes, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextAttributes, [])}),
  fields: () => ({
    [dartx.alpha]: core.bool,
    [dartx.antialias]: core.bool,
    [dartx.depth]: core.bool,
    [dartx.failIfMajorPerformanceCaveat]: core.bool,
    [dartx.premultipliedAlpha]: core.bool,
    [dartx.preserveDrawingBuffer]: core.bool,
    [dartx.stencil]: core.bool
  })
});
dart.registerExtension(dart.global.WebGLContextAttributes, web_gl.ContextAttributes);
dart.defineExtensionNames([
  'statusMessage'
]);
web_gl.ContextEvent = class ContextEvent extends html$.Event {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.statusMessage]() {
    return this.statusMessage;
  }
};
dart.setSignature(web_gl.ContextEvent, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextEvent, [])}),
  fields: () => ({[dartx.statusMessage]: core.String})
});
dart.registerExtension(dart.global.WebGLContextEvent, web_gl.ContextEvent);
web_gl.DebugRendererInfo = class DebugRendererInfo extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.DebugRendererInfo, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugRendererInfo, [])}),
  sfields: () => ({
    UNMASKED_RENDERER_WEBGL: core.int,
    UNMASKED_VENDOR_WEBGL: core.int
  })
});
web_gl.DebugRendererInfo.UNMASKED_RENDERER_WEBGL = 37446;
web_gl.DebugRendererInfo.UNMASKED_VENDOR_WEBGL = 37445;
dart.registerExtension(dart.global.WebGLDebugRendererInfo, web_gl.DebugRendererInfo);
dart.defineExtensionNames([
  'getTranslatedShaderSource'
]);
web_gl.DebugShaders = class DebugShaders extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.getTranslatedShaderSource](...args) {
    return this.getTranslatedShaderSource.apply(this, args);
  }
};
dart.setSignature(web_gl.DebugShaders, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugShaders, [])}),
  methods: () => ({[dartx.getTranslatedShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader])})
});
dart.registerExtension(dart.global.WebGLDebugShaders, web_gl.DebugShaders);
web_gl.DepthTexture = class DepthTexture extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.DepthTexture, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.DepthTexture, [])}),
  sfields: () => ({UNSIGNED_INT_24_8_WEBGL: core.int})
});
web_gl.DepthTexture.UNSIGNED_INT_24_8_WEBGL = 34042;
dart.registerExtension(dart.global.WebGLDepthTexture, web_gl.DepthTexture);
dart.defineExtensionNames([
  'drawBuffersWebgl'
]);
web_gl.DrawBuffers = class DrawBuffers extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.drawBuffersWebgl](...args) {
    return this.drawBuffersWEBGL.apply(this, args);
  }
};
dart.setSignature(web_gl.DrawBuffers, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.DrawBuffers, [])}),
  methods: () => ({[dartx.drawBuffersWebgl]: dart.definiteFunctionType(dart.void, [ListOfint()])}),
  sfields: () => ({
    COLOR_ATTACHMENT0_WEBGL: core.int,
    COLOR_ATTACHMENT10_WEBGL: core.int,
    COLOR_ATTACHMENT11_WEBGL: core.int,
    COLOR_ATTACHMENT12_WEBGL: core.int,
    COLOR_ATTACHMENT13_WEBGL: core.int,
    COLOR_ATTACHMENT14_WEBGL: core.int,
    COLOR_ATTACHMENT15_WEBGL: core.int,
    COLOR_ATTACHMENT1_WEBGL: core.int,
    COLOR_ATTACHMENT2_WEBGL: core.int,
    COLOR_ATTACHMENT3_WEBGL: core.int,
    COLOR_ATTACHMENT4_WEBGL: core.int,
    COLOR_ATTACHMENT5_WEBGL: core.int,
    COLOR_ATTACHMENT6_WEBGL: core.int,
    COLOR_ATTACHMENT7_WEBGL: core.int,
    COLOR_ATTACHMENT8_WEBGL: core.int,
    COLOR_ATTACHMENT9_WEBGL: core.int,
    DRAW_BUFFER0_WEBGL: core.int,
    DRAW_BUFFER10_WEBGL: core.int,
    DRAW_BUFFER11_WEBGL: core.int,
    DRAW_BUFFER12_WEBGL: core.int,
    DRAW_BUFFER13_WEBGL: core.int,
    DRAW_BUFFER14_WEBGL: core.int,
    DRAW_BUFFER15_WEBGL: core.int,
    DRAW_BUFFER1_WEBGL: core.int,
    DRAW_BUFFER2_WEBGL: core.int,
    DRAW_BUFFER3_WEBGL: core.int,
    DRAW_BUFFER4_WEBGL: core.int,
    DRAW_BUFFER5_WEBGL: core.int,
    DRAW_BUFFER6_WEBGL: core.int,
    DRAW_BUFFER7_WEBGL: core.int,
    DRAW_BUFFER8_WEBGL: core.int,
    DRAW_BUFFER9_WEBGL: core.int,
    MAX_COLOR_ATTACHMENTS_WEBGL: core.int,
    MAX_DRAW_BUFFERS_WEBGL: core.int
  })
});
web_gl.DrawBuffers.COLOR_ATTACHMENT0_WEBGL = 36064;
web_gl.DrawBuffers.COLOR_ATTACHMENT10_WEBGL = 36074;
web_gl.DrawBuffers.COLOR_ATTACHMENT11_WEBGL = 36075;
web_gl.DrawBuffers.COLOR_ATTACHMENT12_WEBGL = 36076;
web_gl.DrawBuffers.COLOR_ATTACHMENT13_WEBGL = 36077;
web_gl.DrawBuffers.COLOR_ATTACHMENT14_WEBGL = 36078;
web_gl.DrawBuffers.COLOR_ATTACHMENT15_WEBGL = 36079;
web_gl.DrawBuffers.COLOR_ATTACHMENT1_WEBGL = 36065;
web_gl.DrawBuffers.COLOR_ATTACHMENT2_WEBGL = 36066;
web_gl.DrawBuffers.COLOR_ATTACHMENT3_WEBGL = 36067;
web_gl.DrawBuffers.COLOR_ATTACHMENT4_WEBGL = 36068;
web_gl.DrawBuffers.COLOR_ATTACHMENT5_WEBGL = 36069;
web_gl.DrawBuffers.COLOR_ATTACHMENT6_WEBGL = 36070;
web_gl.DrawBuffers.COLOR_ATTACHMENT7_WEBGL = 36071;
web_gl.DrawBuffers.COLOR_ATTACHMENT8_WEBGL = 36072;
web_gl.DrawBuffers.COLOR_ATTACHMENT9_WEBGL = 36073;
web_gl.DrawBuffers.DRAW_BUFFER0_WEBGL = 34853;
web_gl.DrawBuffers.DRAW_BUFFER10_WEBGL = 34863;
web_gl.DrawBuffers.DRAW_BUFFER11_WEBGL = 34864;
web_gl.DrawBuffers.DRAW_BUFFER12_WEBGL = 34865;
web_gl.DrawBuffers.DRAW_BUFFER13_WEBGL = 34866;
web_gl.DrawBuffers.DRAW_BUFFER14_WEBGL = 34867;
web_gl.DrawBuffers.DRAW_BUFFER15_WEBGL = 34868;
web_gl.DrawBuffers.DRAW_BUFFER1_WEBGL = 34854;
web_gl.DrawBuffers.DRAW_BUFFER2_WEBGL = 34855;
web_gl.DrawBuffers.DRAW_BUFFER3_WEBGL = 34856;
web_gl.DrawBuffers.DRAW_BUFFER4_WEBGL = 34857;
web_gl.DrawBuffers.DRAW_BUFFER5_WEBGL = 34858;
web_gl.DrawBuffers.DRAW_BUFFER6_WEBGL = 34859;
web_gl.DrawBuffers.DRAW_BUFFER7_WEBGL = 34860;
web_gl.DrawBuffers.DRAW_BUFFER8_WEBGL = 34861;
web_gl.DrawBuffers.DRAW_BUFFER9_WEBGL = 34862;
web_gl.DrawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL = 36063;
web_gl.DrawBuffers.MAX_DRAW_BUFFERS_WEBGL = 34852;
dart.registerExtension(dart.global.WebGLDrawBuffers, web_gl.DrawBuffers);
web_gl.ExtBlendMinMax = class ExtBlendMinMax extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.ExtBlendMinMax, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtBlendMinMax, [])}),
  sfields: () => ({
    MAX_EXT: core.int,
    MIN_EXT: core.int
  })
});
web_gl.ExtBlendMinMax.MAX_EXT = 32776;
web_gl.ExtBlendMinMax.MIN_EXT = 32775;
dart.registerExtension(dart.global.EXTBlendMinMax, web_gl.ExtBlendMinMax);
web_gl.ExtFragDepth = class ExtFragDepth extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.ExtFragDepth, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtFragDepth, [])})
});
dart.registerExtension(dart.global.EXTFragDepth, web_gl.ExtFragDepth);
web_gl.ExtShaderTextureLod = class ExtShaderTextureLod extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.ExtShaderTextureLod, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtShaderTextureLod, [])})
});
dart.registerExtension(dart.global.EXTShaderTextureLOD, web_gl.ExtShaderTextureLod);
web_gl.ExtTextureFilterAnisotropic = class ExtTextureFilterAnisotropic extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.ExtTextureFilterAnisotropic, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtTextureFilterAnisotropic, [])}),
  sfields: () => ({
    MAX_TEXTURE_MAX_ANISOTROPY_EXT: core.int,
    TEXTURE_MAX_ANISOTROPY_EXT: core.int
  })
});
web_gl.ExtTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047;
web_gl.ExtTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT = 34046;
dart.registerExtension(dart.global.EXTTextureFilterAnisotropic, web_gl.ExtTextureFilterAnisotropic);
web_gl.Framebuffer = class Framebuffer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.Framebuffer, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.Framebuffer, [])})
});
dart.registerExtension(dart.global.WebGLFramebuffer, web_gl.Framebuffer);
dart.defineExtensionNames([
  'loseContext',
  'restoreContext'
]);
web_gl.LoseContext = class LoseContext extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.loseContext](...args) {
    return this.loseContext.apply(this, args);
  }
  [dartx.restoreContext](...args) {
    return this.restoreContext.apply(this, args);
  }
};
dart.setSignature(web_gl.LoseContext, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.LoseContext, [])}),
  methods: () => ({
    [dartx.loseContext]: dart.definiteFunctionType(dart.void, []),
    [dartx.restoreContext]: dart.definiteFunctionType(dart.void, [])
  })
});
dart.registerExtension(dart.global.WebGLLoseContext, web_gl.LoseContext);
dart.registerExtension(dart.global.WebGLExtensionLoseContext, web_gl.LoseContext);
web_gl.OesElementIndexUint = class OesElementIndexUint extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.OesElementIndexUint, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesElementIndexUint, [])})
});
dart.registerExtension(dart.global.OESElementIndexUint, web_gl.OesElementIndexUint);
web_gl.OesStandardDerivatives = class OesStandardDerivatives extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.OesStandardDerivatives, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesStandardDerivatives, [])}),
  sfields: () => ({FRAGMENT_SHADER_DERIVATIVE_HINT_OES: core.int})
});
web_gl.OesStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 35723;
dart.registerExtension(dart.global.OESStandardDerivatives, web_gl.OesStandardDerivatives);
web_gl.OesTextureFloat = class OesTextureFloat extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.OesTextureFloat, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloat, [])})
});
dart.registerExtension(dart.global.OESTextureFloat, web_gl.OesTextureFloat);
web_gl.OesTextureFloatLinear = class OesTextureFloatLinear extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.OesTextureFloatLinear, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloatLinear, [])})
});
dart.registerExtension(dart.global.OESTextureFloatLinear, web_gl.OesTextureFloatLinear);
web_gl.OesTextureHalfFloatLinear = class OesTextureHalfFloatLinear extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.OesTextureHalfFloatLinear, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloatLinear, [])})
});
dart.registerExtension(dart.global.OESTextureHalfFloatLinear, web_gl.OesTextureHalfFloatLinear);
dart.defineExtensionNames([
  'bindVertexArray',
  'createVertexArray',
  'deleteVertexArray',
  'isVertexArray'
]);
web_gl.OesVertexArrayObject = class OesVertexArrayObject extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.bindVertexArray](...args) {
    return this.bindVertexArrayOES.apply(this, args);
  }
  [dartx.createVertexArray](...args) {
    return this.createVertexArrayOES.apply(this, args);
  }
  [dartx.deleteVertexArray](...args) {
    return this.deleteVertexArrayOES.apply(this, args);
  }
  [dartx.isVertexArray](...args) {
    return this.isVertexArrayOES.apply(this, args);
  }
};
dart.setSignature(web_gl.OesVertexArrayObject, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesVertexArrayObject, [])}),
  methods: () => ({
    [dartx.bindVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
    [dartx.createVertexArray]: dart.definiteFunctionType(web_gl.VertexArrayObject, []),
    [dartx.deleteVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
    [dartx.isVertexArray]: dart.definiteFunctionType(core.bool, [web_gl.VertexArrayObject])
  }),
  sfields: () => ({VERTEX_ARRAY_BINDING_OES: core.int})
});
web_gl.OesVertexArrayObject.VERTEX_ARRAY_BINDING_OES = 34229;
dart.registerExtension(dart.global.OESVertexArrayObject, web_gl.OesVertexArrayObject);
web_gl.Program = class Program extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.Program, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.Program, [])})
});
dart.registerExtension(dart.global.WebGLProgram, web_gl.Program);
web_gl.Renderbuffer = class Renderbuffer extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.Renderbuffer, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.Renderbuffer, [])})
});
dart.registerExtension(dart.global.WebGLRenderbuffer, web_gl.Renderbuffer);
web_gl.Shader = class Shader extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.Shader, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.Shader, [])})
});
dart.registerExtension(dart.global.WebGLShader, web_gl.Shader);
dart.defineExtensionNames([
  'precision',
  'rangeMax',
  'rangeMin'
]);
web_gl.ShaderPrecisionFormat = class ShaderPrecisionFormat extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.precision]() {
    return this.precision;
  }
  get [dartx.rangeMax]() {
    return this.rangeMax;
  }
  get [dartx.rangeMin]() {
    return this.rangeMin;
  }
};
dart.setSignature(web_gl.ShaderPrecisionFormat, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [])}),
  fields: () => ({
    [dartx.precision]: core.int,
    [dartx.rangeMax]: core.int,
    [dartx.rangeMin]: core.int
  })
});
dart.registerExtension(dart.global.WebGLShaderPrecisionFormat, web_gl.ShaderPrecisionFormat);
web_gl.Texture = class Texture extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.Texture, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.Texture, [])})
});
dart.registerExtension(dart.global.WebGLTexture, web_gl.Texture);
web_gl.UniformLocation = class UniformLocation extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.UniformLocation, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.UniformLocation, [])})
});
dart.registerExtension(dart.global.WebGLUniformLocation, web_gl.UniformLocation);
web_gl.VertexArrayObject = class VertexArrayObject extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl.VertexArrayObject, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl.VertexArrayObject, [])})
});
dart.registerExtension(dart.global.WebGLVertexArrayObjectOES, web_gl.VertexArrayObject);
web_gl._WebGLRenderingContextBase = class _WebGLRenderingContextBase extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
};
dart.setSignature(web_gl._WebGLRenderingContextBase, {
  constructors: () => ({_: dart.definiteFunctionType(web_gl._WebGLRenderingContextBase, [])})
});
web_sql.SqlStatementCallback = dart.typedef('SqlStatementCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlResultSet]));
web_sql.SqlStatementErrorCallback = dart.typedef('SqlStatementErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlError]));
web_sql.SqlTransactionCallback = dart.typedef('SqlTransactionCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction]));
web_sql.SqlTransactionErrorCallback = dart.typedef('SqlTransactionErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlError]));
dart.defineExtensionNames([
  'changeVersion',
  'readTransaction',
  'transaction',
  'version'
]);
web_sql.SqlDatabase = class SqlDatabase extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  static get supported() {
    return !!window.openDatabase;
  }
  get [dartx.version]() {
    return this.version;
  }
  [dartx.changeVersion](...args) {
    return this.changeVersion.apply(this, args);
  }
  [dartx.readTransaction](...args) {
    return this.readTransaction.apply(this, args);
  }
  [dartx.transaction](...args) {
    return this.transaction.apply(this, args);
  }
};
dart.setSignature(web_sql.SqlDatabase, {
  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlDatabase, [])}),
  fields: () => ({[dartx.version]: core.String}),
  methods: () => ({
    [dartx.changeVersion]: dart.definiteFunctionType(dart.void, [core.String, core.String], [web_sql.SqlTransactionCallback, web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
    [dartx.readTransaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
    [dartx.transaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback])
  }),
  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
});
dart.registerExtension(dart.global.Database, web_sql.SqlDatabase);
dart.defineExtensionNames([
  'code',
  'message'
]);
web_sql.SqlError = class SqlError extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.code]() {
    return this.code;
  }
  get [dartx.message]() {
    return this.message;
  }
};
dart.setSignature(web_sql.SqlError, {
  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlError, [])}),
  fields: () => ({
    [dartx.code]: core.int,
    [dartx.message]: core.String
  }),
  sfields: () => ({
    CONSTRAINT_ERR: core.int,
    DATABASE_ERR: core.int,
    QUOTA_ERR: core.int,
    SYNTAX_ERR: core.int,
    TIMEOUT_ERR: core.int,
    TOO_LARGE_ERR: core.int,
    UNKNOWN_ERR: core.int,
    VERSION_ERR: core.int
  })
});
web_sql.SqlError.CONSTRAINT_ERR = 6;
web_sql.SqlError.DATABASE_ERR = 1;
web_sql.SqlError.QUOTA_ERR = 4;
web_sql.SqlError.SYNTAX_ERR = 5;
web_sql.SqlError.TIMEOUT_ERR = 7;
web_sql.SqlError.TOO_LARGE_ERR = 3;
web_sql.SqlError.UNKNOWN_ERR = 0;
web_sql.SqlError.VERSION_ERR = 2;
dart.registerExtension(dart.global.SQLError, web_sql.SqlError);
dart.defineExtensionNames([
  'insertId',
  'rows',
  'rowsAffected'
]);
web_sql.SqlResultSet = class SqlResultSet extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.insertId]() {
    return this.insertId;
  }
  get [dartx.rows]() {
    return this.rows;
  }
  get [dartx.rowsAffected]() {
    return this.rowsAffected;
  }
};
dart.setSignature(web_sql.SqlResultSet, {
  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSet, [])}),
  fields: () => ({
    [dartx.insertId]: core.int,
    [dartx.rows]: web_sql.SqlResultSetRowList,
    [dartx.rowsAffected]: core.int
  })
});
dart.registerExtension(dart.global.SQLResultSet, web_sql.SqlResultSet);
const _item_1 = Symbol('_item_1');
dart.defineExtensionNames([
  'length',
  '_get',
  '_set',
  'length',
  'first',
  'last',
  'single',
  'elementAt',
  'item'
]);
web_sql.SqlResultSetRowList = class SqlResultSetRowList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.Map), html$.ImmutableListMixin$(core.Map)) {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  get [dartx.length]() {
    return this.length;
  }
  [dartx._get](index) {
    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
    return this[dartx.item](index);
  }
  [dartx._set](index, value) {
    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
    return value;
  }
  set [dartx.length](value) {
    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
  }
  get [dartx.first]() {
    if (dart.notNull(this[dartx.length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.last]() {
    let len = this[dartx.length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError("No elements"));
  }
  get [dartx.single]() {
    let len = this[dartx.length];
    if (len == 1) {
      return this[0];
    }
    if (len == 0) dart.throw(new core.StateError("No elements"));
    dart.throw(new core.StateError("More than one element"));
  }
  [dartx.elementAt](index) {
    return this[dartx._get](index);
  }
  [dartx.item](index) {
    return html_common.convertNativeToDart_Dictionary(this[_item_1](index));
  }
  [_item_1](...args) {
    return this.item.apply(this, args);
  }
};
web_sql.SqlResultSetRowList[dart.implements] = () => [ListOfMap()];
dart.setSignature(web_sql.SqlResultSetRowList, {
  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSetRowList, [])}),
  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [dartx._get]: dart.definiteFunctionType(core.Map, [core.int]),
    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.Map]),
    [dartx.item]: dart.definiteFunctionType(core.Map, [core.int]),
    [_item_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
  })
});
dart.registerExtension(dart.global.SQLResultSetRowList, web_sql.SqlResultSetRowList);
dart.defineExtensionNames([
  'executeSql'
]);
web_sql.SqlTransaction = class SqlTransaction extends _interceptors.Interceptor {
  static _() {
    dart.throw(new core.UnsupportedError("Not supported"));
  }
  [dartx.executeSql](...args) {
    return this.executeSql.apply(this, args);
  }
};
dart.setSignature(web_sql.SqlTransaction, {
  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlTransaction, [])}),
  methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
});
dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
