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 = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = 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 (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;
    }
  }
  return typeof window == "undefined" ? global : window;
})();
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 = 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] = null;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      let ret = this[_jsIterator].next();
      this[_current] = 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]: 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 = 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;
      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];
    }
    get isEmpty() {
      return this[_length] == 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) {
        this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
        this[_length] = 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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 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]: 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];
    }
    get isEmpty() {
      return this[_map][_length] == 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] = null;
      this[_cell] = this[_map][_first];
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      if (this[_modifications] != this[_map][_modifications]) {
        dart.throw(new core.ConcurrentModificationError(this[_map]));
      } else if (this[_cell] == null) {
        this[_current] = null;
        return false;
      } else {
        this[_current] = 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]: 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] = null;
  }
  get current() {
    return this[_current];
  }
  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] = match;
        let nextIndex = match.end;
        if (match.start == nextIndex) {
          nextIndex = dart.notNull(nextIndex) + 1;
        }
        this[_nextIndex] = nextIndex;
        return true;
      }
    }
    this[_current] = 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]: 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 = Symbol('_index');
_js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
  new(input, pattern, index) {
    this[_input] = input;
    this[_pattern] = pattern;
    this[_index] = index;
    super.new();
  }
  get iterator() {
    return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index]);
  }
  get first() {
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index]);
    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]: 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] = index;
    this[_current] = null;
  }
  moveNext() {
    if (dart.notNull(this[_index]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
      this[_current] = null;
      return false;
    }
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index]);
    if (dart.notNull(index) < 0) {
      this[_index] = dart.notNull(this[_input][dartx.length]) + 1;
      this[_current] = null;
      return false;
    }
    let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
    this[_current] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
    if (end == this[_index]) end++;
    this[_index] = end;
    return true;
  }
  get current() {
    return this[_current];
  }
};
_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]: core.int,
    [_current]: 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;
const _declarations = Symbol('_declarations');
const _raw = Symbol('_raw');
const _mixin = Symbol('_mixin');
const _typeArguments = Symbol('_typeArguments');
let const;
_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 || (const = 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 || (const = 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 = Symbol('_name');
_js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
  get simpleName() {
    return this[_symbol];
  }
  _(symbol, t, annotations) {
    this[_symbol] = symbol;
    this[_name] = _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]}'`;
  }
  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]: 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]}'`;
  }
  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;
let const;
let const;
_js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
  get isSetter() {
    return this[_name][dartx.endsWith]('=');
  }
  get isPrivate() {
    return this[_name][dartx.startsWith]('_');
  }
  get simpleName() {
    return this[_symbol];
  }
  _constructor(cls, symbol, ftype) {
    this[_symbol] = symbol;
    this[_name] = _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] = _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] = _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 || (const = dart.constList([], mirrors.ParameterMirror));
      this[_metadata] = const || (const = 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 || (const = 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]}'`;
  }
  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]: 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;
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 || (const = 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;
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 || (const = 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;
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 || (const = 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;
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 || (const = 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(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(() => dart.dcall(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(async.Future, [core.Iterable, dynamicTodynamic()]),
      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;
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 || (const = 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;
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 || (const = 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 = 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] = 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];
    }
    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] = 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] = 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] = 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] = 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]: 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());
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());
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;
async._rootFork = function(self, parent, zone, specification, zoneValues) {
  _internal.printToZone = async._printToZone;
  if (specification == null) {
    specification = const || (const = 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;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
async._RootZone = class _RootZone extends async._Zone {
  new() {
    super.new();
  }
  get [_run]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
  }
  get [_runUnary]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
  }
  get [_runBinary]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
  }
  get [_registerCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
  }
  get [_registerUnaryCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
  }
  get [_registerBinaryCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
  }
  get [_errorCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
  }
  get [_scheduleMicrotask]() {
    return const || (const = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
  }
  get [_createTimer]() {
    return const || (const = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
  }
  get [_createPeriodicTimer]() {
    return const || (const = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
  }
  get [_print]() {
    return const || (const = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
  }
  get [_fork]() {
    return const || (const = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
  }
  get [_handleUncaughtError]() {
    return const || (const = 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 = 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] = 0;
      this[_strings] = null;
      this[_nums] = null;
      this[_rest] = null;
      this[_keys] = null;
    }
    get length() {
      return this[_length];
    }
    get isEmpty() {
      return this[_length] == 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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 1;
      this[_keys] = null;
      return bucket.splice(index, 2)[1];
    }
    clear() {
      if (dart.notNull(this[_length]) > 0) {
        this[_strings] = this[_nums] = this[_rest] = this[_keys] = null;
        this[_length] = 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]);
      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]);
      return this[_keys] = result;
    }
    [_addHashTableEntry](table, key, value) {
      K._check(key);
      V._check(value);
      if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
        this[_length] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 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]: 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 = 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] = map;
      super.new();
    }
    get length() {
      return this[_map][_length];
    }
    get isEmpty() {
      return this[_map][_length] == 0;
    }
    get iterator() {
      return new (_HashMapKeyIteratorOfE())(this[_map], this[_map][_computeKeys]());
    }
    contains(element) {
      return this[_map].containsKey(element);
    }
    forEach(f) {
      let keys = this[_map][_computeKeys]();
      for (let i = 0, length = keys.length; i < length; i++) {
        f(keys[i]);
        if (keys !== this[_map][_keys]) {
          dart.throw(new core.ConcurrentModificationError(this[_map]));
        }
      }
    }
  }
  _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_HashMapKeyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
    fields: () => ({[_map]: _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 = 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] = map;
      this[_keys] = keys;
      this[_offset] = 0;
      this[_current] = null;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      let keys = this[_keys];
      let offset = this[_offset];
      if (keys !== this[_map][_keys]) {
        dart.throw(new core.ConcurrentModificationError(this[_map]));
      } else if (dart.notNull(offset) >= keys.length) {
        this[_current] = null;
        return false;
      } else {
        this[_current] = 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]: _HashMapOfE$dynamic(),
      [_keys]: ListOfE(),
      [_offset]: core.int,
      [_current]: 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] = new Map();
      this[_modifications] = 0;
      super.new();
    }
    get length() {
      return this[_map].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].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].get(key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_map].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].delete(key);
      this[_modified]();
      return value;
    }
    clear() {
      this[_map].clear();
      this[_modified]();
    }
    forEach(action) {
      let jsEntries = this[_map].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]: 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] = map;
      this[_isKeys] = isKeys;
      super.new();
    }
    get length() {
      return core.int._check(dart.dload(this[_map], 'length'));
    }
    get isEmpty() {
      return core.bool._check(dart.dload(this[_map], 'isEmpty'));
    }
    get iterator() {
      return new (_Es6MapIteratorOfE())(this[_map], core.int._check(dart.dload(this[_map], _modifications)), this[_isKeys]);
    }
    contains(element) {
      return core.bool._check(dart.dsend(this[_map], 'containsKey', element));
    }
    forEach(f) {
      let jsIterator = null;
      if (dart.test(this[_isKeys])) {
        jsIterator = dart.dload(this[_map], _map).keys();
      } else {
        jsIterator = dart.dload(this[_map], _map).values();
      }
      let modifications = core.int._check(dart.dload(this[_map], _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], _modifications))) {
          dart.throw(new core.ConcurrentModificationError(this[_map]));
        }
      }
    }
  }
  _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_Es6MapIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
    fields: () => ({
      [_map]: 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 = 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] = map;
      this[_modifications] = modifications;
      this[_isKeys] = isKeys;
      this[_jsIterator] = null;
      this[_next] = null;
      this[_current] = null;
      this[_done] = null;
      if (dart.test(this[_isKeys])) {
        this[_jsIterator] = dart.dload(this[_map], _map).keys();
      } else {
        this[_jsIterator] = dart.dload(this[_map], _map).values();
      }
      this[_done] = false;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      if (!dart.equals(this[_modifications], dart.dload(this[_map], _modifications))) {
        dart.throw(new core.ConcurrentModificationError(this[_map]));
      }
      if (dart.test(this[_done])) return false;
      this[_next] = this[_jsIterator].next();
      let done = this[_next].done;
      if (done) {
        this[_current] = null;
        this[_done] = true;
        return false;
      } else {
        this[_current] = this[_next].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]: dart.dynamic,
      [_modifications]: core.int,
      [_isKeys]: core.bool,
      [_jsIterator]: dart.dynamic,
      [_next]: dart.dynamic,
      [_current]: 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 = 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] = 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];
    }
    get isEmpty() {
      return this[_length] == 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](element);
      }
    }
    [_add](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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 1;
      this[_elements] = null;
      bucket.splice(index, 1);
      return true;
    }
    clear() {
      if (dart.notNull(this[_length]) > 0) {
        this[_strings] = this[_nums] = this[_rest] = this[_elements] = null;
        this[_length] = 0;
      }
    }
    [_computeElements]() {
      if (this[_elements] != null) return this[_elements];
      let result = ListOfE().new(this[_length]);
      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]);
      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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 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]: 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]: 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](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] = null;
    }
    get current() {
      return this[_current];
    }
    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] = null;
        return false;
      } else {
        this[_current] = 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]: 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 = 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] = 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];
    }
    get isEmpty() {
      return this[_length] == 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];
      }
    }
    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](element);
      }
    }
    [_add](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];
        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]) > 0) {
        this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
        this[_length] = 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] = last;
        this[_last] = last[_next] = cell;
      }
      this[_length] = dart.notNull(this[_length]) + 1;
      this[_modified]();
      return cell;
    }
    [_unlinkCell](cell) {
      _LinkedHashSetCellOfE()._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] = dart.notNull(this[_length]) - 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]: 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]: 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](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] = null;
      this[_previous] = null;
    }
  }
  dart.addTypeTests(_LinkedHashSetCell);
  dart.setSignature(_LinkedHashSetCell, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
    fields: () => ({
      [_element]: E,
      [_next]: _LinkedHashSetCellOfE(),
      [_previous]: _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] = null;
      this[_cell] = collection._LinkedHashSetCell._check(dart.dload(this[_set], _first));
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      if (!dart.equals(this[_modifications], dart.dload(this[_set], _modifications))) {
        dart.throw(new core.ConcurrentModificationError(this[_set]));
      } else if (this[_cell] == null) {
        this[_current] = null;
        return false;
      } else {
        this[_current] = E._check(this[_cell][_element]);
        this[_cell] = this[_cell][_next];
        return true;
      }
    }
  }
  dart.addTypeTests(_LinkedHashSetIterator);
  _LinkedHashSetIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_LinkedHashSetIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetIterator$(E), [dart.dynamic, core.int])}),
    fields: () => ({
      [_set]: dart.dynamic,
      [_modifications]: core.int,
      [_cell]: collection._LinkedHashSetCell,
      [_current]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _LinkedHashSetIterator;
});
collection._LinkedHashSetIterator = _LinkedHashSetIterator();
const _source = 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] = source;
    }
    get length() {
      return this[_source][dartx.length];
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      return this[_source][dartx.elementAt](index);
    }
  }
  dart.setSignature(UnmodifiableListView, {
    constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
    fields: () => ({[_source]: 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 = 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] = 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].current;
      this[_move]();
      return result;
    }
    [_move]() {
      if (dart.test(this[_iterator].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]: 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] = 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];
    }
    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];
        entry[_next] = entry[_previous] = entry[_list] = null;
      } while (!core.identical(next, this[_first]));
      this[_first] = null;
      this[_length] = 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];
    }
    get single() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError('No such element'));
      }
      if (dart.notNull(this[_length]) > 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];
      } while (!core.identical(current, this[_first]));
    }
    get isEmpty() {
      return this[_length] == 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] = newEntry[_next] = newEntry;
        this[_first] = newEntry;
        this[_length] = dart.notNull(this[_length]) + 1;
        return;
      }
      let predecessor = entry[_previous];
      let successor = entry;
      newEntry[_previous] = predecessor;
      newEntry[_next] = successor;
      predecessor[_next] = newEntry;
      successor[_previous] = newEntry;
      if (dart.test(updateFirst) && core.identical(entry, this[_first])) {
        this[_first] = newEntry;
      }
      this[_length] = dart.notNull(this[_length]) + 1;
    }
    [_unlink](entry) {
      E._check(entry);
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      entry[_next][_previous] = entry[_previous];
      let next = entry[_previous][_next] = entry[_next];
      this[_length] = dart.notNull(this[_length]) - 1;
      entry[_list] = entry[_next] = entry[_previous] = 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]: 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] = list[_first];
      this[_visitedFirst] = false;
      this[_current] = null;
    }
    get current() {
      return this[_current];
    }
    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], this[_list].first)) {
        this[_current] = null;
        return false;
      }
      this[_visitedFirst] = true;
      this[_current] = E._check(this[_next]);
      this[_next] = this[_next][_next];
      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]: E,
      [_next]: 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] = null;
      this[_previous] = null;
    }
    get list() {
      return this[_list];
    }
    unlink() {
      this[_list][_unlink](E._check(this));
    }
    get next() {
      if (core.identical(this, this[_next])) return null;
      return this[_next];
    }
    get previous() {
      if (core.identical(this, this[_previous])) return null;
      return this[_previous];
    }
    insertAfter(entry) {
      E._check(entry);
      this[_list][_insertBefore](this[_next], 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]: E,
      [_previous]: 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] = map;
      super.new();
    }
    get length() {
      return this[_map][dartx.length];
    }
    get isEmpty() {
      return this[_map][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map][dartx.isNotEmpty];
    }
    get first() {
      return this[_map][dartx._get](this[_map][dartx.keys][dartx.first]);
    }
    get single() {
      return this[_map][dartx._get](this[_map][dartx.keys][dartx.single]);
    }
    get last() {
      return this[_map][dartx._get](this[_map][dartx.keys][dartx.last]);
    }
    get iterator() {
      return new (_MapBaseValueIteratorOfK$V())(this[_map]);
    }
  }
  _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_MapBaseValueIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
    fields: () => ({[_map]: 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] = map;
      this[_keys] = map[dartx.keys][dartx.iterator];
      this[_current] = null;
    }
    moveNext() {
      if (dart.test(this[_keys].moveNext())) {
        this[_current] = this[_map][dartx._get](this[_keys].current);
        return true;
      }
      this[_current] = null;
      return false;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(_MapBaseValueIterator);
  _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
  dart.setSignature(_MapBaseValueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
    fields: () => ({
      [_keys]: IteratorOfK(),
      [_map]: MapOfK$V(),
      [_current]: 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] = map;
    }
    _get(key) {
      return this[_map][dartx._get](key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_map][dartx._set](key, value);
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      this[_map][dartx.addAll](other);
    }
    clear() {
      this[_map][dartx.clear]();
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      return this[_map][dartx.putIfAbsent](key, ifAbsent);
    }
    containsKey(key) {
      return this[_map][dartx.containsKey](key);
    }
    containsValue(value) {
      return this[_map][dartx.containsValue](value);
    }
    forEach(action) {
      this[_map][dartx.forEach](action);
    }
    get isEmpty() {
      return this[_map][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map][dartx.isNotEmpty];
    }
    get length() {
      return this[_map][dartx.length];
    }
    get keys() {
      return this[_map][dartx.keys];
    }
    remove(key) {
      return this[_map][dartx.remove](key);
    }
    toString() {
      return dart.toString(this[_map]);
    }
    get values() {
      return this[_map][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]: 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] = null;
    }
    moveNext() {
      if (core.identical(this[_nextEntry], this[_sentinel])) {
        this[_current] = 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] = elementEntry.element;
      this[_nextEntry] = elementEntry[_nextLink];
      return true;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(_DoubleLinkedQueueIterator);
  _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_DoubleLinkedQueueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [_DoubleLinkedQueueSentinelOfE()])}),
    fields: () => ({
      [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
      [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
      [_current]: 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](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](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](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](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]: 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] = null;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      this[_queue][_checkModification](this[_modificationCount]);
      if (this[_position] == this[_end]) {
        this[_current] = null;
        return false;
      }
      this[_current] = 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]: 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] = map;
      super.new();
    }
    get length() {
      return this[_map][_count];
    }
    get isEmpty() {
      return this[_map][_count] == 0;
    }
    get iterator() {
      return new (_SplayTreeValueIteratorOfK$V())(this[_map]);
    }
  }
  _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_SplayTreeValueIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
    fields: () => ({[_map]: 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;
let const;
let const;
let const;
let const;
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 || (const = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
    } else {
      return (const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const || (const = dart.const(new convert.AsciiEncoder()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const || (const = 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;
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 || (const = 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;
const _encoder = Symbol('_encoder');
let const;
let const;
convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
  new() {
    this[_encoder] = const || (const = dart.const(new convert.Base64Encoder()));
    super.new();
  }
  urlSafe() {
    this[_encoder] = const || (const = dart.const(new convert.Base64Encoder.urlSafe()));
    super.new();
  }
  get encoder() {
    return this[_encoder];
  }
  get decoder() {
    return const || (const = 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 = 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;
  }
  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]);
    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] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state]);
    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]: 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 = Symbol('_add');
convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
  new() {
    super.new();
  }
  add(source) {
    this[_add](source, 0, source[dartx.length], false);
  }
  close() {
    this[_add](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](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](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]: 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](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]: 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;
  }
  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]))) {
      this[_state] = convert._Base64Decoder._checkPadding(input, start, end, this[_state]);
      return null;
    }
    if (start == end) return typed_data.Uint8List.new(0);
    let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state]);
    this[_state] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state]);
    return buffer;
  }
  close(input, end) {
    if (dart.notNull(this[_state]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
      dart.throw(new core.FormatException("Missing padding character", input, end));
    }
    if (dart.notNull(this[_state]) > 0) {
      dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
    }
    this[_state] = 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]: 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 = 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].encoder.fuse(T)(this[_second].encoder);
    }
    get decoder() {
      return this[_second].decoder.fuse(S)(this[_first].decoder);
    }
    new(first, second) {
      this[_first] = first;
      this[_second] = second;
      super.new();
    }
  }
  dart.setSignature(_FusedCodec, {
    constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
    fields: () => ({
      [_first]: 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] = first;
      this[_second] = second;
      super.new();
    }
    convert(input) {
      S._check(input);
      return this[_second].convert(this[_first].convert(input));
    }
    startChunkedConversion(sink) {
      SinkOfT()._check(sink);
      return this[_first].startChunkedConversion(this[_second].startChunkedConversion(sink));
    }
  }
  dart.setSignature(_FusedConverter, {
    constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
    fields: () => ({
      [_first]: ConverterOfS$M(),
      [_second]: ConverterOfM$T()
    }),
    methods: () => ({convert: dart.definiteFunctionType(T, [S])})
  });
  return _FusedConverter;
});
convert._FusedConverter = _FusedConverter();
const _name = Symbol('_name');
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
  _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
    this[_name] = 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] = name;
  }
  toString() {
    return this[_name];
  }
};
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]: 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 || (const = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
  },
  get ATTRIBUTE() {
    return const || (const = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
  },
  get SQ_ATTRIBUTE() {
    return const || (const = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
  },
  get ELEMENT() {
    return const || (const = 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;
let const;
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 || (const = dart.const(new convert.JsonEncoder()));
    return new convert.JsonEncoder(this[_toEncodable]);
  }
  get decoder() {
    if (this[_reviver] == null) return const || (const = 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;
let const;
let const;
let const;
let const;
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 || (const = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
    } else {
      return (const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const || (const = dart.const(new convert.Latin1Encoder()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const || (const = 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;
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 || (const = 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;
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 || (const = 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 = 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;
      this[_generator] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
      super.new();
    }
    slice(start, end, generator) {
      this[_start] = start;
      this[_end] = end;
      this[_generator] = generator;
      super.new();
    }
    get iterator() {
      return new (_GeneratorIteratorOfE())(this[_start], this[_end], this[_generator]);
    }
    get length() {
      return dart.notNull(this[_end]) - dart.notNull(this[_start]);
    }
    skip(count) {
      core.RangeError.checkNotNegative(count, "count");
      if (count == 0) return this;
      let newStart = dart.notNull(this[_start]) + 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]) + dart.notNull(count);
      if (newEnd >= dart.notNull(this[_end])) return this;
      return new (_GeneratorIterableOfE()).slice(this[_start], 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]: 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 = Symbol('_index');
const _current = 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] = index;
      this[_end] = end;
      this[_generator] = generator;
      this[_current] = null;
    }
    moveNext() {
      if (dart.notNull(this[_index]) < dart.notNull(this[_end])) {
        this[_current] = this[_generator](this[_index]);
        this[_index] = dart.notNull(this[_index]) + 1;
        return true;
      } else {
        this[_current] = null;
        return false;
      }
    }
    get current() {
      return this[_current];
    }
  }
  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]: core.int,
      [_current]: 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] = null;
    this[_stop] = null;
    core.Stopwatch._initTicker();
  }
  start() {
    if (dart.test(this.isRunning)) return;
    if (this[_start] == null) {
      this[_start] = core.Stopwatch._now();
    } else {
      this[_start] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start]));
      this[_stop] = null;
    }
  }
  stop() {
    if (!dart.test(this.isRunning)) return;
    this[_stop] = core.Stopwatch._now();
  }
  reset() {
    if (this[_start] == null) return;
    this[_start] = core.Stopwatch._now();
    if (this[_stop] != null) {
      this[_stop] = this[_start];
    }
  }
  get elapsedTicks() {
    if (this[_start] == null) {
      return 0;
    }
    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start]) : dart.notNull(this[_stop]) - dart.notNull(this[_start]);
  }
  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] != 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]: 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;
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 || (const = 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 = Symbol('_value');
const _toJSON = Symbol('_toJSON');
developer.Gauge = class Gauge extends developer.Metric {
  get value() {
    return this[_value];
  }
  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] = v;
  }
  new(name, description, min, max) {
    this.min = min;
    this.max = max;
    this[_value] = 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] = 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]: 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;
    super.new(name, description);
  }
  get value() {
    return this[_value];
  }
  set value(v) {
    this[_value] = 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]: 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 = 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]();
  }
  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]() {
    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]: 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] = start;
    this[_startCpu] = startCpu;
    this.category = 'Dart';
    this[_arguments] = null;
  }
  finish() {
    developer._reportCompleteEvent(this[_start], 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]: 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 = Symbol('_length');
const _buffer = Symbol('_buffer');
const _pow2roundup = Symbol('_pow2roundup');
io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
  new() {
    this[_length] = 0;
    this[_buffer] = null;
  }
  add(bytes) {
    let bytesLength = bytes[dartx.length];
    if (bytesLength == 0) return;
    let required = dart.notNull(this[_length]) + 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], required, bytes);
    } else {
      for (let i = 0; i < dart.notNull(bytesLength); i++) {
        this[_buffer][dartx._set](dart.notNull(this[_length]) + i, bytes[dartx._get](i));
      }
    }
    this[_length] = 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]);
    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]));
  }
  get length() {
    return this[_length];
  }
  get isEmpty() {
    return this[_length] == 0;
  }
  get isNotEmpty() {
    return this[_length] != 0;
  }
  clear() {
    this[_length] = 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]: 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] = 0;
  }
  add(bytes) {
    if (!typed_data.Uint8List.is(bytes)) {
      bytes = typed_data.Uint8List.fromList(bytes);
    }
    this[_chunks][dartx.add](bytes);
    this[_length] = dart.notNull(this[_length]) + 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]);
    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]);
    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];
  }
  get isEmpty() {
    return this[_length] == 0;
  }
  get isNotEmpty() {
    return this[_length] != 0;
  }
  clear() {
    this[_length] = 0;
    this[_chunks][dartx.clear]();
  }
};
io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setSignature(io._BytesBuilder, {
  fields: () => ({
    [_length]: 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 = Symbol('_sink');
const _filter = Symbol('_filter');
const _closed = Symbol('_closed');
const _empty = Symbol('_empty');
let const;
io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
  new(sink, filter) {
    this[_sink] = 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].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 || (const = dart.constList([], core.int)), 0, 0);
    try {
      let out = null;
      while ((out = this[_filter].processed({end: true})) != null) {
        this[_sink].add(ListOfint()._check(out));
      }
    } catch (e) {
      this[_closed] = true;
      dart.throw(e);
    }

    this[_closed] = true;
    this[_sink].close();
  }
};
dart.setSignature(io._FilterSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._FilterSink, [convert.ByteConversionSink, io._Filter])}),
  fields: () => ({
    [_filter]: io._Filter,
    [_sink]: 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;
io._validateZLibStrategy = function(strategy) {
  let strategies = const || (const = 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 = Symbol('_position');
const _end = Symbol('_end');
const _controller = Symbol('_controller');
const _openedFile = Symbol('_openedFile');
const _unsubscribed = Symbol('_unsubscribed');
const _readInProgress = Symbol('_readInProgress');
const _atEnd = Symbol('_atEnd');
const _setupController = Symbol('_setupController');
const _start = 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] = position;
    this[_end] = end;
    this[_controller] = null;
    this[_openedFile] = null;
    this[_unsubscribed] = false;
    this[_readInProgress] = true;
    this[_closed] = false;
    this[_atEnd] = false;
    super.new();
    if (this[_position] == null) this[_position] = 0;
  }
  forStdin() {
    this[_closeCompleter] = async.Completer.new();
    this[_position] = 0;
    this[_controller] = null;
    this[_path] = null;
    this[_openedFile] = null;
    this[_end] = 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].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  [_setupController]() {
    this[_controller] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start), 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].close();
    }).bind(this);
    dart.fn(done, VoidTovoid());
    this[_openedFile].close().catchError(dart.bind(this[_controller], '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] != null) {
      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end]) - dart.notNull(this[_position]));
      if (dart.notNull(readBytes) < 0) {
        this[_readInProgress] = false;
        if (!dart.test(this[_unsubscribed])) {
          this[_controller].addError(new core.RangeError(dart.str`Bad end position: ${this[_end]}`));
          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] = dart.notNull(this[_position]) + dart.notNull(block[dartx.length]);
      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end] != null && this[_position] == this[_end]) {
        this[_atEnd] = true;
      }
      if (!dart.test(this[_atEnd]) && !dart.test(this[_controller].isPaused)) {
        this[_readBlock]();
      }
      this[_controller].add(block);
      if (dart.test(this[_atEnd])) {
        this[_closeFile]();
      }
    }, ListOfintToNull())).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_unsubscribed])) {
        this[_controller].addError(e, core.StackTrace._check(s));
        this[_closeFile]();
        this[_unsubscribed] = true;
      }
    }, dynamicAnddynamicToNull()));
  }
  [_start]() {
    if (dart.notNull(this[_position]) < 0) {
      this[_controller].addError(new core.RangeError(dart.str`Bad start position: ${this[_position]}`));
      this[_controller].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) {
        file.setPosition(this[_position]).then(dart.void)(onReady, {onError: dart.fn((e, s) => {
            this[_controller].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].addError(error, core.StackTrace._check(stackTrace));
      this[_controller].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]: StreamControllerOfListOfint(),
    [_path]: core.String,
    [_openedFile]: io.RandomAccessFile,
    [_position]: core.int,
    [_end]: 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]: 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;
let const;
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 || (const = dart.const(new convert.LineSplitter())), 'convert'));
  }
  readAsLinesSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return (const || (const = 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;
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 || (const = 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;
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 || (const = 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;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
io.HttpDate = class HttpDate extends core.Object {
  static format(date) {
    let wkday = const || (const = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
    let month = const || (const = 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 || (const = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
    let weekdays = const || (const = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
    let months = const || (const = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
    let wkdaysLowerCase = const || (const = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
    let weekdaysLowerCase = const || (const = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
    let monthsLowerCase = const || (const = 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 || (const = 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 = 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](name, io._HttpHeaders._validateValue(v));
      }
    } else {
      this[_add](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](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]: 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 = 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] = 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];
  }
  [_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]);
    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] = 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]: 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] = 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][dartx.indexOf]("/");
    if (index == -1 || index == dart.notNull(result[_value][dartx.length]) - 1) {
      result[_primaryType] = result[_value][dartx.trim]()[dartx.toLowerCase]();
      result[_subType] = "";
    } else {
      result[_primaryType] = result[_value][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
      result[_subType] = result[_value][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;
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 || (const = 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 = 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] = false;
      this[_isBound] = false;
      this[_hasError] = false;
    }
    add(data) {
      T._check(data);
      if (dart.test(this[_isClosed])) return;
      this[_controller].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_controller].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])) {
        this[_isClosed] = 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]() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is bound to a stream"));
      }
      if (dart.test(this[_isClosed])) {
        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].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]: core.bool,
      [_isBound]: core.bool,
      [_hasError]: core.bool
    }),
    getters: () => ({
      done: dart.definiteFunctionType(async.Future, []),
      [_controller]: 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;
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] = 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]) > 0) {
        this.socket.add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
      }
      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] == 0);
    dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
    this[_buffer] = typed_data.Uint8List._check(data);
    this[_length] = 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]));
        this[_buffer] = null;
        this[_length] = 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])))) {
      add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
      this[_buffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      this[_length] = 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], dart.asInt(dart.notNull(this[_length]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
      this[_length] = dart.notNull(this[_length]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
    }
  }
  [_chunkHeader](length) {
    let hexDigits = const || (const = 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]: 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](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
    if (this[_httpClient].userAgent != null) {
      request.headers[_add]('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;
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;
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 || (const = 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 || (const = 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 = 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] = 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] = 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] == 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] = 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] == io._HttpConnection._CLOSING || this[_state] == io._HttpConnection._DETACHED) return;
    this[_state] = io._HttpConnection._CLOSING;
    dart.dsend(this[_socket], 'destroy');
    this[_httpServer][_connectionClosed](this);
    io._HttpConnection._connections[dartx.remove](this[_serviceId]);
  }
  detachSocket() {
    this[_state] = 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] == io._HttpConnection._ACTIVE;
  }
  get [_isIdle]() {
    return this[_state] == io._HttpConnection._IDLE;
  }
  get [_isClosing]() {
    return this[_state] == io._HttpConnection._CLOSING;
  }
  get [_isDetached]() {
    return this[_state] == 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]) {
      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]: 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;
let const;
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] = null;
    super.new();
    this[_controller] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
    this.idleTimeout = const || (const = 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] = null;
    super.new();
    this[_controller] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
    this.idleTimeout = const || (const = 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].addError(error, core.StackTrace._check(stackTrace));
        }
      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller], 'close')});
    return this[_controller].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].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]: 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;
let const;
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 || (const = dart.constList([const || (const = 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 = 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] = null;
    this[_state] = 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] = null;
    this[_bodyController] = null;
    super.new();
    this[_controller] = 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].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  listenToStream(stream) {
    this[_socketSubscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this, _onDone)});
  }
  [_parse]() {
    try {
      this[_doParse]();
    } catch (e) {
      let s = dart.stackTrace(e);
      this[_state] = 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] = 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].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].add(tmp);
      return false;
    } else if (dart.test(this[_chunked])) {
      this[_state] = io._State.CHUNK_SIZE;
      this[_remainingContent] = 0;
    } else if (dart.notNull(this[_transferLength]) > 0) {
      this[_remainingContent] = this[_transferLength];
      this[_state] = io._State.BODY;
    } else {
      this[_state] = io._State.BODY;
    }
    this[_parserCalled] = false;
    this[_controller].add(this[_incoming]);
    return true;
  }
  [_doParse]() {
    dart.assert(!dart.test(this[_parserCalled]));
    this[_parserCalled] = true;
    if (this[_state] == io._State.CLOSED) {
      dart.throw(new io.HttpException("Data on closed connection"));
    }
    if (this[_state] == io._State.FAILURE) {
      dart.throw(new io.HttpException("Data on failed connection"));
    }
    while (this[_buffer] != null && dart.notNull(this[_index]) < dart.notNull(this[_buffer][dartx.length]) && this[_state] != io._State.FAILURE && this[_state] != 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];
        this[_index] = dart.notNull(x) + 1;
        return x;
      })());
      switch (this[_state]) {
        case io._State.START:
        {
          if (byte == io._Const.HTTP[dartx._get](0)) {
            this[_httpVersionIndex] = 1;
            this[_state] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = 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] = io._State.REQUEST_LINE_ENDING;
            } else {
              this[_expect](byte, io._CharCode.LF);
              this[_messageType] = io._MessageType.REQUEST;
              this[_state] = io._State.HEADER_START;
            }
          }
          break;
        }
        case io._State.REQUEST_LINE_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_messageType] = io._MessageType.REQUEST;
          this[_state] = io._State.HEADER_START;
          break;
        }
        case io._State.RESPONSE_LINE_STATUS_CODE:
        {
          if (byte == io._CharCode.SP) {
            this[_state] = io._State.RESPONSE_LINE_REASON_PHRASE;
          } else if (byte == io._CharCode.CR) {
            this[_state] = 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] = 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] = io._State.HEADER_START;
          break;
        }
        case io._State.HEADER_START:
        {
          this[_headers] = new io._HttpHeaders(this.version);
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.HEADER_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state] = io._State.HEADER_ENDING;
            this[_index] = dart.notNull(this[_index]) - 1;
          } else {
            this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
            this[_state] = io._State.HEADER_FIELD;
          }
          break;
        }
        case io._State.HEADER_FIELD:
        {
          if (byte == io._CharCode.COLON) {
            this[_state] = 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] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state] = io._State.HEADER_VALUE_FOLD_OR_END;
          } else if (byte != io._CharCode.SP && byte != io._CharCode.HT) {
            this[_headerValue][dartx.add](byte);
            this[_state] = io._State.HEADER_VALUE;
          }
          break;
        }
        case io._State.HEADER_VALUE:
        {
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state] = 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] = 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] = 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](headerField, tokens[dartx._get](i));
              }
            } else {
              this[_headers][_add](headerField, headerValue);
            }
            this[_headerField][dartx.clear]();
            this[_headerValue][dartx.clear]();
            if (byte == io._CharCode.CR) {
              this[_state] = io._State.HEADER_ENDING;
            } else if (byte == io._CharCode.LF) {
              this[_state] = io._State.HEADER_ENDING;
              this[_index] = dart.notNull(this[_index]) - 1;
            } else {
              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
              this[_state] = 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] = io._State.CHUNK_SIZE_STARTING_LF;
          break;
        }
        case io._State.CHUNK_SIZE_STARTING_LF:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_state] = io._State.CHUNK_SIZE;
          break;
        }
        case io._State.CHUNK_SIZE:
        {
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.CHUNK_SIZE_ENDING;
          } else if (byte == io._CharCode.SEMI_COLON) {
            this[_state] = 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] = 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] = io._State.BODY;
          } else {
            this[_state] = io._State.CHUNKED_BODY_DONE_CR;
          }
          break;
        }
        case io._State.CHUNKED_BODY_DONE_CR:
        {
          this[_expect](byte, io._CharCode.CR);
          this[_state] = 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] = dart.notNull(this[_index]) - 1;
          let dataAvailable = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_index]);
          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]), dataAvailable);
          this[_bodyController].add(data);
          if (this[_remainingContent] != -1) {
            this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
          }
          this[_index] = dart.notNull(this[_index]) + dart.notNull(data[dartx.length]);
          if (this[_remainingContent] == 0) {
            if (!dart.test(this[_chunked])) {
              this[_reset]();
              this[_closeIncoming]();
            } else {
              this[_state] = 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] == this[_buffer][dartx.length]) {
      this[_releaseBuffer]();
      if (this[_state] != io._State.UPGRADED && this[_state] != 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] = 0;
    this[_parse]();
  }
  [_onDone]() {
    this[_socketSubscription] = null;
    if (this[_state] == io._State.CLOSED || this[_state] == io._State.FAILURE) return;
    if (this[_incoming] != null) {
      if (this[_state] != io._State.UPGRADED && !(this[_state] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state] == 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].close();
      return;
    }
    if (this[_state] == io._State.START) {
      if (!dart.test(this[_requestParser])) {
        this[_reportError](new io.HttpException("Connection closed before full header was received"));
      }
      this[_controller].close();
      return;
    }
    if (this[_state] == io._State.UPGRADED) {
      this[_controller].close();
      return;
    }
    if (dart.notNull(this[_state]) < io._State.FIRST_BODY_STATE) {
      this[_state] = io._State.FAILURE;
      this[_reportError](new io.HttpException("Connection closed before full header was received"));
      this[_controller].close();
      return;
    }
    if (!dart.test(this[_chunked]) && this[_transferLength] == -1) {
      this[_state] = io._State.CLOSED;
    } else {
      this[_state] = io._State.FAILURE;
      this[_reportError](new io.HttpException("Connection closed before full body was received"));
    }
    this[_controller].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] == io._State.UPGRADED;
  }
  get persistentConnection() {
    return this[_persistentConnection];
  }
  set isHead(value) {
    if (dart.test(value)) this[_noMessageBody] = true;
  }
  detachIncoming() {
    this[_state] = io._State.UPGRADED;
    return new io._HttpDetachedIncoming(this[_socketSubscription], this.readUnparsedData());
  }
  readUnparsedData() {
    if (this[_buffer] == null) return null;
    if (this[_index] == this[_buffer][dartx.length]) return null;
    let result = this[_buffer][dartx.sublist](this[_index]);
    this[_releaseBuffer]();
    return result;
  }
  [_reset]() {
    if (this[_state] == io._State.UPGRADED) return;
    this[_state] = 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] = 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].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] = io._State.FAILURE;
    this[_controller].addError(error, core.StackTrace._check(stackTrace));
    this[_controller].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]: core.int,
    [_requestParser]: core.bool,
    [_state]: 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]: 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 = 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] = 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]: 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] = session;
      session[_prev] = this[_tail];
      this[_tail] = session;
    }
  }
  [_removeFromTimeoutQueue](session) {
    if (session[_next] != null) {
      session[_next][_prev] = session[_prev];
    }
    if (session[_prev] != null) {
      session[_prev][_next] = session[_next];
    }
    if (dart.equals(this[_head], session)) {
      this[_head] = session[_next];
      this[_stopTimer]();
      this[_startTimer]();
    }
    if (dart.equals(this[_tail], session)) {
      this[_tail] = session[_prev];
    }
    session[_next] = 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 = 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)), 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 = 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] = MapOfString$V().new();
    }
    containsKey(key) {
      return typeof key == 'string' && dart.test(this[_map][dartx.containsKey](key[dartx.toUpperCase]()));
    }
    containsValue(value) {
      return this[_map][dartx.containsValue](value);
    }
    _get(key) {
      return typeof key == 'string' ? this[_map][dartx._get](key[dartx.toUpperCase]()) : null;
    }
    _set(key, value) {
      V._check(value);
      this[_map][dartx._set](key[dartx.toUpperCase](), value);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      VoidToV()._check(ifAbsent);
      return this[_map][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][dartx.remove](key[dartx.toUpperCase]()) : null;
    }
    clear() {
      this[_map][dartx.clear]();
    }
    forEach(f) {
      this[_map][dartx.forEach](f);
    }
    get keys() {
      return this[_map][dartx.keys];
    }
    get values() {
      return this[_map][dartx.values];
    }
    get length() {
      return this[_map][dartx.length];
    }
    get isEmpty() {
      return this[_map][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map][dartx.isNotEmpty];
    }
    toString() {
      return dart.toString(this[_map]);
    }
  }
  dart.addTypeTests(_CaseInsensitiveStringMap);
  _CaseInsensitiveStringMap[dart.implements] = () => [MapOfString$V()];
  dart.setSignature(_CaseInsensitiveStringMap, {
    fields: () => ({[_map]: 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 = Symbol('_name');
io.ProcessSignal = class ProcessSignal extends core.Object {
  _(signalNumber, name) {
    this[_signalNumber] = signalNumber;
    this[_name] = name;
  }
  toString() {
    return this[_name];
  }
  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]: 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] = null;
    this[_subscription] = null;
    this[_closed] = false;
    super.new();
    this[_controller] = 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].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].add(secureConnection);
      }
    }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_closed])) {
        this[_controller].addError(e, core.StackTrace._check(s));
      }
    }, dynamicAnddynamicToNull()));
  }
  [_onPauseStateChange]() {
    if (dart.test(this[_controller].isPaused)) {
      this[_subscription].pause();
    } else {
      this[_subscription].resume();
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller].hasListener)) {
      this[_subscription] = this[_socket].listen(dart.bind(this, _onData), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this[_controller], '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]: 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 = 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;
io.RawSocketEvent = class RawSocketEvent extends core.Object {
  _(value) {
    this[_value] = value;
  }
  toString() {
    return (const || (const = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value]);
  }
};
dart.defineNamedConstructor(io.RawSocketEvent, '_');
dart.setSignature(io.RawSocketEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.RawSocketEvent, [core.int])}),
  fields: () => ({[_value]: 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] = 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] = 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].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]() {
    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].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]();
        }
      }
    }
    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]();
      }
    }
  }
  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].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]();
    }
  }
  [_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].addError(e, stackTrace);
    }
    this[_close]();
  }
  [_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].add(io.RawSocketEvent.READ_CLOSED);
        if (dart.test(this[_socketClosedWrite])) {
          this[_close]();
        }
      } 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].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].isPaused)) {
        this[_socketSubscription].pause();
      } else {
        this[_socketSubscription].resume();
      }
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller].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].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].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]: 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]: 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] = 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]) {
      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]: 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] = value;
  }
};
dart.defineNamedConstructor(io.SocketDirection, '_');
dart.setSignature(io.SocketDirection, {
  constructors: () => ({_: dart.definiteFunctionType(io.SocketDirection, [dart.dynamic])}),
  fields: () => ({[_value]: 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] = value;
  }
};
dart.defineNamedConstructor(io.SocketOption, '_');
dart.setSignature(io.SocketOption, {
  constructors: () => ({_: dart.definiteFunctionType(io.SocketOption, [dart.dynamic])}),
  fields: () => ({[_value]: 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] = sink;
  }
  get encoding() {
    return this[_sink].encoding;
  }
  set encoding(encoding) {
    this[_sink].encoding = encoding;
  }
  write(object) {
    this[_sink].write(object);
  }
  writeln(object) {
    if (object === void 0) object = "";
    this[_sink].writeln(object);
  }
  writeAll(objects, sep) {
    if (sep === void 0) sep = "";
    this[_sink].writeAll(objects, sep);
  }
  add(data) {
    this[_sink].add(data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink].addError(error, stackTrace);
  }
  writeCharCode(charCode) {
    this[_sink].writeCharCode(charCode);
  }
  addStream(stream) {
    return this[_sink].addStream(stream);
  }
  flush() {
    return this[_sink].flush();
  }
  close() {
    return this[_sink].close();
  }
  get done() {
    return this[_sink].done;
  }
};
io._StdSink[dart.implements] = () => [io.IOSink];
dart.setSignature(io._StdSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._StdSink, [io.IOSink])}),
  fields: () => ({[_sink]: 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;
let const;
let const;
let const;
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 || (const = dart.const(new io._WindowsCodePageEncoder()));
    } else {
      return const || (const = dart.const(new convert.Utf8Encoder()));
    }
  }
  get decoder() {
    if (io.Platform.operatingSystem == "windows") {
      return const || (const = dart.const(new io._WindowsCodePageDecoder()));
    } else {
      return const || (const = 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] = sink;
  }
  close() {
    this[_sink].close();
  }
  add(string) {
    let encoded = io._WindowsCodePageEncoder._encodeString(string);
    if (encoded == null) {
      dart.throw(new core.FormatException("Invalid character for encoding"));
    }
    this[_sink].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]: 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] = sink;
    super.new();
  }
  close() {
    this[_sink].close();
  }
  add(bytes) {
    this[_sink].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
  }
};
dart.setSignature(io._WindowsCodePageDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoderSink, [SinkOfString()])}),
  fields: () => ({[_sink]: 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] = 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] == io._WebSocketProtocolTransformer.CLOSED) {
      dart.throw(new io.WebSocketException("Data on closed connection"));
    }
    if (this[_state] == io._WebSocketProtocolTransformer.FAILURE) {
      dart.throw(new io.WebSocketException("Data on failed connection"));
    }
    while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state] != io._WebSocketProtocolTransformer.CLOSED && this[_state] != io._WebSocketProtocolTransformer.FAILURE) {
      let byte = buffer[dartx._get](index);
      if (dart.notNull(this[_state]) <= io._WebSocketProtocolTransformer.LEN_REST) {
        if (this[_state] == 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] = io._WebSocketProtocolTransformer.LEN_FIRST;
        } else if (this[_state] == 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] = io._WebSocketProtocolTransformer.LEN_REST;
          } else if (this[_len] == 127) {
            this[_len] = 0;
            this[_remainingLenBytes] = 8;
            this[_state] = io._WebSocketProtocolTransformer.LEN_REST;
          } else {
            dart.assert(dart.notNull(this[_len]) < 126);
            this[_lengthDone]();
          }
        } else {
          dart.assert(this[_state] == 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] == 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] == 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] = 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] = 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] = 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] = 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] != io._WebSocketProtocolTransformer.CLOSED && this[_state] != io._WebSocketProtocolTransformer.FAILURE) this[_state] = 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]: 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] = 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].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller], 'addError'));
    }, HttpRequestToNull()), {onDone: dart.fn(() => {
        this[_controller].close();
      }, VoidToNull())});
    return this[_controller].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]: 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;
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 || (const = 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] = 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] != null) return;
    this[_controller] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause), onResume: dart.bind(this, _onResume), onCancel: dart.bind(this, _onListen)});
    let stream = this[_controller].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].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].close();
    return this[_closeCompleter].future.then(dart.dynamic)(dart.fn(_ => closeSocket(), dynamicToFuture()));
  }
  add(data) {
    if (dart.test(this[_closed])) return;
    this[_ensureController]();
    this[_controller].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]: 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;
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] = null;
    this[_subscription] = null;
    this[_sink] = 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] = 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].add(data);
      }
    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
        if (this[_closeTimer] != null) this[_closeTimer].cancel();
        if (core.FormatException.is(error)) {
          this[_close](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
        } else {
          this[_close](io.WebSocketStatus.PROTOCOL_ERROR);
        }
        this[_closeCode] = this[_outCloseCode];
        this[_closeReason] = this[_outCloseReason];
        this[_controller].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](transformer.closeCode, transformer.closeReason);
          } else {
            this[_close]();
          }
          this[_readyState] = io.WebSocket.CLOSED;
        }
        this[_closeCode] = transformer.closeCode;
        this[_closeReason] = transformer.closeReason;
        this[_controller].close();
      }, VoidToNull()), cancelOnError: true}));
    this[_subscription].pause();
    this[_controller] = 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].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](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].add(data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink].addError(error, stackTrace);
  }
  addStream(stream) {
    return this[_sink].addStream(stream);
  }
  get done() {
    return this[_sink].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].isClosed)) {
      if (!dart.test(this[_controller].hasListener) && this[_subscription] != null) {
        this[_controller].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
      }
      if (this[_closeTimer] == null) {
        this[_closeTimer] = async.Timer.new(const || (const = 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].close();
          io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
        }, VoidToNull()));
      }
    }
    return this[_sink].close();
  }
  [_close](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]: async.StreamController,
    [_subscription]: async.StreamSubscription,
    [_sink]: 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]: 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 = Symbol('_buffer');
const _getRandomBytes = Symbol('_getRandomBytes');
math._JSSecureRandom = class _JSSecureRandom extends core.Object {
  new() {
    this[_buffer] = 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][dartx.buffer][dartx.asUint8List](start, length));
  }
  nextBool() {
    this[_getRandomBytes](0, 1);
    return this[_buffer][dartx.getUint8](0)[dartx.isOdd];
  }
  nextDouble() {
    this[_getRandomBytes](1, 7);
    this[_buffer][dartx.setUint8](0, 63);
    let highByte = this[_buffer][dartx.getUint8](1);
    this[_buffer][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
    let result = dart.notNull(this[_buffer][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][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][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]: 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;
math.Random = class Random extends core.Object {
  static new(seed) {
    if (seed === void 0) seed = null;
    return seed == null ? const || (const = 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 = 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](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](...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]: 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 = Symbol('_add');
const _clear = 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](value, key);
      } else {
        request = this[_add](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]());
    } 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](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](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](...args) {
    return this.clear.apply(this, args);
  }
  [_count](...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]: 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]: dart.definiteFunctionType(indexed_db.Request, []),
    [_count]: 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 = 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 = 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];
  }
  set [dartx.clear](value) {
    this[_clear] = value == null ? '' : value;
  }
  get [_clear]() {
    return this.clear;
  }
  set [_clear](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];
  }
  set [dartx.position](value) {
    this[_position] = value == null ? '' : value;
  }
  get [_position]() {
    return this.position;
  }
  set [_position](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]: 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]: 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 = 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]() {
    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]: 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 = 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](test, false);
  }
  retainWhere(test) {
    this[_filter](test, true);
  }
  [_filter](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]: 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 = Symbol('_value');
html.ScrollAlignment = class ScrollAlignment extends core.Object {
  _internal(value) {
    this[_value] = value;
  }
  toString() {
    return dart.str`ScrollAlignment.${this[_value]}`;
  }
};
dart.defineNamedConstructor(html.ScrollAlignment, '_internal');
dart.setSignature(html.ScrollAlignment, {
  constructors: () => ({_internal: dart.definiteFunctionType(html.ScrollAlignment, [dart.dynamic])}),
  fields: () => ({[_value]: 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];
  }
  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];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'date'})[dartx.type] == 'date';
  }
};
const valueAsDate = Symbol(html.DateInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.DateInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'month'})[dartx.type] == 'month';
  }
};
const valueAsDate = Symbol(html.MonthInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.MonthInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set valueAsDate(value) {
    this[valueAsDate] = value;
  }
  get readOnly() {
    return this[readOnly];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'week'})[dartx.type] == 'week';
  }
};
const valueAsDate = Symbol(html.WeekInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.WeekInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set valueAsDate(value) {
    this[valueAsDate] = value;
  }
  get readOnly() {
    return this[readOnly];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'time'})[dartx.type] == 'time';
  }
};
const valueAsDate = Symbol(html.TimeInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.TimeInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
  }
};
const readOnly = Symbol(html.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  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;
  }
  static get supported() {
    return html.InputElement.new({type: 'number'})[dartx.type] == 'number';
  }
};
const placeholder = Symbol(html.NumberInputElement.name + "." + 'placeholder'.toString());
const readOnly = Symbol(html.NumberInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set required(value) {
    this[required] = value;
  }
};
const checked = Symbol(html.CheckboxInputElement.name + "." + 'checked'.toString());
const required = 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];
  }
  set required(value) {
    this[required] = value;
  }
};
const checked = Symbol(html.RadioButtonInputElement.name + "." + 'checked'.toString());
const required = 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];
  }
  set required(value) {
    this[required] = 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 = 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](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](test, true);
  }
  retainWhere(test) {
    this[_filter](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]: 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 = 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]();
  }
  [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];
  }
  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]() {
    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](...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]: 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]: 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] = value;
    this[_unit] = '%';
  }
  px(value) {
    this[_value] = value;
    this[_unit] = 'px';
  }
  pc(value) {
    this[_value] = value;
    this[_unit] = 'pc';
  }
  pt(value) {
    this[_value] = value;
    this[_unit] = 'pt';
  }
  inch(value) {
    this[_value] = value;
    this[_unit] = 'in';
  }
  cm(value) {
    this[_value] = value;
    this[_unit] = 'cm';
  }
  mm(value) {
    this[_value] = value;
    this[_unit] = 'mm';
  }
  em(value) {
    this[_value] = value;
    this[_unit] = 'em';
  }
  ex(value) {
    this[_value] = value;
    this[_unit] = 'ex';
  }
  css(cssValue) {
    this[_value] = 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] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
    } else {
      this[_value] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
    }
  }
  toString() {
    return dart.str`${this[_value]}${this[_unit]}`;
  }
  get value() {
    return this[_value];
  }
};
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]: 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 = 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] = 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], this[_eventType], onData, this[_useCapture]);
    }
  }
  dart.setSignature(_EventStream, {
    constructors: () => ({new: dart.definiteFunctionType(html._EventStream$(T), [html.EventTarget, core.String, core.bool])}),
    fields: () => ({
      [_target]: 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], 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 = Symbol('_onData');
const _pauseCount = 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] = target;
      this[_eventType] = eventType;
      this[_useCapture] = useCapture;
      this[_onData] = onData == null ? null : html._wrapZone(html.Event, dart.dynamic)(dart.fn(e => dart.dcall(onData, e), EventTodynamic()));
      this[_pauseCount] = 0;
      this[_tryResume]();
    }
    cancel() {
      if (dart.test(this[_canceled])) return null;
      this[_unlisten]();
      this[_target] = null;
      this[_onData] = null;
      return null;
    }
    get [_canceled]() {
      return this[_target] == null;
    }
    onData(handleData) {
      if (dart.test(this[_canceled])) {
        dart.throw(new core.StateError("Subscription has been canceled."));
      }
      this[_unlisten]();
      this[_onData] = 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] = dart.notNull(this[_pauseCount]) + 1;
      this[_unlisten]();
      if (resumeSignal != null) {
        resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
    }
    get isPaused() {
      return dart.notNull(this[_pauseCount]) > 0;
    }
    resume() {
      if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
      this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
      this[_tryResume]();
    }
    [_tryResume]() {
      if (this[_onData] != null && !dart.test(this.isPaused)) {
        this[_target][dartx.addEventListener](this[_eventType], this[_onData], this[_useCapture]);
      }
    }
    [_unlisten]() {
      if (this[_onData] != null) {
        this[_target][dartx.removeEventListener](this[_eventType], this[_onData], 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]: core.int,
      [_target]: html.EventTarget,
      [_eventType]: core.String,
      [_onData]: 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 = 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] = null;
      this[_controller] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
    }
    get stream() {
      return this[_controller].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], 'add'), {onError: dart.bind(this[_controller], '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].close();
    }
  }
  dart.addTypeTests(_StreamPool);
  dart.defineNamedConstructor(_StreamPool, 'broadcast');
  dart.setSignature(_StreamPool, {
    constructors: () => ({broadcast: dart.definiteFunctionType(html._StreamPool$(T), [])}),
    fields: () => ({
      [_controller]: 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 = 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];
  }
  new(type) {
    this[_keyDownList] = JSArrayOfKeyEvent().of([]);
    this[_type] = type;
    this[_stream] = new html._CustomKeyEventStreamImpl('event');
    this[_target] = null;
    super.new(html._KeyboardEventHandler._EVENT_TYPE);
  }
  initializeAllEventListeners(type, target) {
    this[_keyDownList] = JSArrayOfKeyEvent().of([]);
    this[_type] = type;
    this[_target] = target;
    this[_stream] = null;
    super.new(html._KeyboardEventHandler._EVENT_TYPE);
    html.Element.keyDownEvent.forTarget(this[_target], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
    html.Element.keyPressEvent.forTarget(this[_target], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
    html.Element.keyUpEvent.forTarget(this[_target], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
    this[_stream] = 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].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].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].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]: html.EventTarget,
    [_stream]: 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;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
html._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
  static allowNavigation(uriPolicy) {
    return new html._SimpleNodeValidator(uriPolicy, {allowedElements: const || (const = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const || (const = 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 || (const = dart.constList(['A::href', 'FORM::action'], core.String))});
  }
  static allowImages(uriPolicy) {
    return new html._SimpleNodeValidator(uriPolicy, {allowedElements: const || (const = dart.constList(['IMG'], core.String)), allowedAttributes: const || (const = 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 || (const = dart.constList(['IMG::src'], core.String))});
  }
  static allowTextElements() {
    return new html._SimpleNodeValidator(null, {allowedElements: const || (const = 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 || (const = dart.constList([], core.String))));
    allowedAttributes = allowedAttributes != null ? allowedAttributes : const || (const = dart.constList([], core.String));
    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const || (const = 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 = Symbol('_iterator');
html._WrappedIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class _WrappedIterator extends core.Object {
    new(iterator) {
      this[_iterator] = iterator;
    }
    moveNext() {
      return this[_iterator].moveNext();
    }
    get current() {
      return html._downcast(html.Node, E)(this[_iterator].current);
    }
  }
  dart.addTypeTests(_WrappedIterator);
  _WrappedIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_WrappedIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html._WrappedIterator$(E), [IteratorOfNode()])}),
    fields: () => ({[_iterator]: 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 = 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;
      this[_length] = array[dartx.length];
      this[_current] = null;
    }
    moveNext() {
      let nextPosition = dart.notNull(this[_position]) + 1;
      if (nextPosition < dart.notNull(this[_length])) {
        this[_current] = this[_array][dartx._get](nextPosition);
        this[_position] = nextPosition;
        return true;
      }
      this[_current] = null;
      this[_position] = this[_length];
      return false;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(FixedSizeListIterator);
  FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(FixedSizeListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html.FixedSizeListIterator$(T), [ListOfT()])}),
    fields: () => ({
      [_array]: ListOfT(),
      [_length]: core.int,
      [_position]: core.int,
      [_current]: 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;
      this[_current] = null;
    }
    moveNext() {
      let nextPosition = dart.notNull(this[_position]) + 1;
      if (nextPosition < dart.notNull(this[_array][dartx.length])) {
        this[_current] = this[_array][dartx._get](nextPosition);
        this[_position] = nextPosition;
        return true;
      }
      this[_current] = null;
      this[_position] = this[_array][dartx.length];
      return false;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(_VariableSizeListIterator);
  _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(_VariableSizeListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html._VariableSizeListIterator$(T), [ListOfT()])}),
    fields: () => ({
      [_array]: ListOfT(),
      [_position]: core.int,
      [_current]: 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++) {
      dart.dsetindex(copy, 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(dart.dynamic, [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 slot = this.findSlot(e);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      let length = core.int._check(dart.dload(e, 'length'));
      copy = dart.test(this.mustCopy) ? this.newDartList(length) : e;
      this.writeSlot(slot, copy);
      for (let i = 0; i < dart.notNull(length); i++) {
        dart.dsetindex(copy, i, this.walk(dart.dindex(e, 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(dart.dynamic, [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(dart.dynamic, [dart.dynamic]),
    newDartList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    identicalInJs: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
    forEachJsField: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
  })
});
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 = 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]() {
    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], {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][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][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][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][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][dartx.length];
  }
  _get(index) {
    return this[_iterable][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]: 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 = Symbol('_element');
svg._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
  new(element) {
    this[_element] = element;
  }
  readClasses() {
    let classname = this[_element][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][dartx.attributes][dartx._set]('class', s.join(' '));
  }
};
dart.setSignature(svg._AttributeClassSet, {
  constructors: () => ({new: dart.definiteFunctionType(svg._AttributeClassSet, [html.Element])}),
  fields: () => ({[_element]: 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];
  }
  set href(value) {
    super.href = value;
  }
};
const href = 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);
