// Generated by dart2js (, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.10.0-290.1.beta.
// The code supports the following hooks:
// dartPrint(message):
//    if this function is defined it is called instead of the Dart [print]
//    method.
//
// dartMainRunner(main, args):
//    if this function is defined, the Dart [main] method will not be invoked
//    directly. Instead, a closure that will invoke [main], and its arguments
//    [args] is passed to [dartMainRunner].
//
// dartDeferredLibraryLoader(uri, successCallback, errorCallback, loadId, loadPriority):
//    if this function is defined, it will be called when a deferred library
//    is loaded. It should load and eval the javascript of `uri`, and call
//    successCallback. If it fails to do so, it should call errorCallback with
//    an error. The loadId argument is the deferred import that resulted in
//    this uri being loaded. The loadPriority argument is an arbitrary argument
//    string forwarded from the 'dart2js:load-priority' pragma option.
// dartDeferredLibraryMultiLoader(uris, successCallback, errorCallback, loadId, loadPriority):
//    if this function is defined, it will be called when a deferred library
//    is loaded. It should load and eval the javascript of every URI in `uris`,
//    and call successCallback. If it fails to do so, it should call
//    errorCallback with an error. The loadId argument is the deferred import
//    that resulted in this uri being loaded. The loadPriority argument is an
//    arbitrary argument string forwarded from the 'dart2js:load-priority'
//    pragma option.
//
// dartCallInstrumentation(id, qualifiedName):
//    if this function is defined, it will be called at each entry of a
//    method or constructor. Used only when compiling programs with
//    --experiment-call-instrumentation.
(function dartProgram() {
  function copyProperties(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      to[key] = from[key];
    }
  }
  function mixinPropertiesHard(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      if (!to.hasOwnProperty(key)) {
        to[key] = from[key];
      }
    }
  }
  function mixinPropertiesEasy(from, to) {
    Object.assign(to, from);
  }
  var supportsDirectProtoAccess = function() {
    var cls = function() {
    };
    cls.prototype = {p: {}};
    var object = new cls();
    if (!(Object.getPrototypeOf(object) && Object.getPrototypeOf(object).p === cls.prototype.p))
      return false;
    try {
      if (typeof navigator != "undefined" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Chrome/") >= 0)
        return true;
      if (typeof version == "function" && version.length == 0) {
        var v = version();
        if (/^\d+\.\d+\.\d+\.\d+$/.test(v))
          return true;
      }
    } catch (_) {
    }
    return false;
  }();
  function inherit(cls, sup) {
    cls.prototype.constructor = cls;
    cls.prototype["$is" + cls.name] = cls;
    if (sup != null) {
      if (supportsDirectProtoAccess) {
        Object.setPrototypeOf(cls.prototype, sup.prototype);
        return;
      }
      var clsPrototype = Object.create(sup.prototype);
      copyProperties(cls.prototype, clsPrototype);
      cls.prototype = clsPrototype;
    }
  }
  function inheritMany(sup, classes) {
    for (var i = 0; i < classes.length; i++) {
      inherit(classes[i], sup);
    }
  }
  function mixinEasy(cls, mixin) {
    mixinPropertiesEasy(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function mixinHard(cls, mixin) {
    mixinPropertiesHard(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function lazy(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel) {
        holder[name] = initializer();
      }
      holder[getterName] = function() {
        return this[name];
      };
      return holder[name];
    };
  }
  function lazyFinal(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel) {
        var value = initializer();
        if (holder[name] !== uninitializedSentinel) {
          A.throwLateFieldADI(name);
        }
        holder[name] = value;
      }
      var finalValue = holder[name];
      holder[getterName] = function() {
        return finalValue;
      };
      return finalValue;
    };
  }
  function makeConstList(list, rti) {
    if (rti != null)
      A._setArrayType(list, rti);
    list.$flags = 7;
    return list;
  }
  function convertToFastObject(properties) {
    function t() {
    }
    t.prototype = properties;
    new t();
    return properties;
  }
  function convertAllToFastObject(arrayOfObjects) {
    for (var i = 0; i < arrayOfObjects.length; ++i) {
      convertToFastObject(arrayOfObjects[i]);
    }
  }
  var functionCounter = 0;
  function instanceTearOffGetter(isIntercepted, parameters) {
    var cache = null;
    return isIntercepted ? function(receiver) {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(receiver, this);
    } : function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(this, null);
    };
  }
  function staticTearOffGetter(parameters) {
    var cache = null;
    return function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters).prototype;
      return cache;
    };
  }
  var typesOffset = 0;
  function tearOffParameters(container, isStatic, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    if (typeof funType == "number") {
      funType += typesOffset;
    }
    return {co: container, iS: isStatic, iI: isIntercepted, rC: requiredParameterCount, dV: optionalParameterDefaultValues, cs: callNames, fs: funsOrNames, fT: funType, aI: applyIndex || 0, nDA: needsDirectAccess};
  }
  function installStaticTearOff(holder, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    var parameters = tearOffParameters(holder, true, false, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, false);
    var getterFunction = staticTearOffGetter(parameters);
    holder[getterName] = getterFunction;
  }
  function installInstanceTearOff(prototype, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    isIntercepted = !!isIntercepted;
    var parameters = tearOffParameters(prototype, false, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, !!needsDirectAccess);
    var getterFunction = instanceTearOffGetter(isIntercepted, parameters);
    prototype[getterName] = getterFunction;
  }
  function setOrUpdateInterceptorsByTag(newTags) {
    var tags = init.interceptorsByTag;
    if (!tags) {
      init.interceptorsByTag = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function setOrUpdateLeafTags(newTags) {
    var tags = init.leafTags;
    if (!tags) {
      init.leafTags = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function updateTypes(newTypes) {
    var types = init.types;
    var length = types.length;
    types.push.apply(types, newTypes);
    return length;
  }
  function updateHolder(holder, newHolder) {
    copyProperties(newHolder, holder);
    return holder;
  }
  var hunkHelpers = function() {
    var mkInstance = function(isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex, false);
        };
      },
      mkStatic = function(requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex);
        };
      };
    return {inherit: inherit, inheritMany: inheritMany, mixin: mixinEasy, mixinHard: mixinHard, installStaticTearOff: installStaticTearOff, installInstanceTearOff: installInstanceTearOff, _instance_0u: mkInstance(0, 0, null, ["call$0"], 0), _instance_1u: mkInstance(0, 1, null, ["call$1"], 0), _instance_2u: mkInstance(0, 2, null, ["call$2"], 0), _instance_0i: mkInstance(1, 0, null, ["call$0"], 0), _instance_1i: mkInstance(1, 1, null, ["call$1"], 0), _instance_2i: mkInstance(1, 2, null, ["call$2"], 0), _static_0: mkStatic(0, null, ["call$0"], 0), _static_1: mkStatic(1, null, ["call$1"], 0), _static_2: mkStatic(2, null, ["call$2"], 0), makeConstList: makeConstList, lazy: lazy, lazyFinal: lazyFinal, updateHolder: updateHolder, convertToFastObject: convertToFastObject, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
  }();
  function initializeDeferredHunk(hunk) {
    typesOffset = init.types.length;
    hunk(hunkHelpers, init, holders, $);
  }
  var J = {
    makeDispatchRecord(interceptor, proto, extension, indexability) {
      return {i: interceptor, p: proto, e: extension, x: indexability};
    },
    getNativeInterceptor(object) {
      var proto, objectProto, $constructor, interceptor, t1,
        record = object[init.dispatchPropertyName];
      if (record == null)
        if ($.initNativeDispatchFlag == null) {
          A.initNativeDispatch();
          record = object[init.dispatchPropertyName];
        }
      if (record != null) {
        proto = record.p;
        if (false === proto)
          return record.i;
        if (true === proto)
          return object;
        objectProto = Object.getPrototypeOf(object);
        if (proto === objectProto)
          return record.i;
        if (record.e === objectProto)
          throw A.wrapException(A.UnimplementedError$("Return interceptor for " + A.S(proto(object, record))));
      }
      $constructor = object.constructor;
      if ($constructor == null)
        interceptor = null;
      else {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        interceptor = $constructor[t1];
      }
      if (interceptor != null)
        return interceptor;
      interceptor = A.lookupAndCacheInterceptor(object);
      if (interceptor != null)
        return interceptor;
      if (typeof object == "function")
        return B.JavaScriptFunction_methods;
      proto = Object.getPrototypeOf(object);
      if (proto == null)
        return B.PlainJavaScriptObject_methods;
      if (proto === Object.prototype)
        return B.PlainJavaScriptObject_methods;
      if (typeof $constructor == "function") {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        Object.defineProperty($constructor, t1, {value: B.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
        return B.UnknownJavaScriptObject_methods;
      }
      return B.UnknownJavaScriptObject_methods;
    },
    JSArray_JSArray$fixed($length, $E) {
      if ($length < 0 || $length > 4294967295)
        throw A.wrapException(A.RangeError$range($length, 0, 4294967295, "length", null));
      return J.JSArray_JSArray$markFixed(new Array($length), $E);
    },
    JSArray_JSArray$growable($length, $E) {
      if ($length < 0)
        throw A.wrapException(A.ArgumentError$("Length must be a non-negative integer: " + $length, null));
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$allocateGrowable($length, $E) {
      if ($length < 0)
        throw A.wrapException(A.ArgumentError$("Length must be a non-negative integer: " + $length, null));
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$markFixed(allocation, $E) {
      var t1 = A._setArrayType(allocation, $E._eval$1("JSArray<0>"));
      t1.$flags = 1;
      return t1;
    },
    JSArray__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    getInterceptor$(receiver) {
      if (typeof receiver == "number") {
        if (Math.floor(receiver) == receiver)
          return J.JSInt.prototype;
        return J.JSNumNotInt.prototype;
      }
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return J.JSNull.prototype;
      if (typeof receiver == "boolean")
        return J.JSBool.prototype;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$asx(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ax(receiver) {
      if (receiver == null)
        return receiver;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ns(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$s(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$x(receiver) {
      if (receiver == null)
        return receiver;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    set$length$asx(receiver, value) {
      return J.getInterceptor$asx(receiver).set$length(receiver, value);
    },
    get$first$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$first(receiver);
    },
    get$hashCode$(receiver) {
      return J.getInterceptor$(receiver).get$hashCode(receiver);
    },
    get$isEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
    },
    get$isNotEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
    },
    get$iterator$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$iterator(receiver);
    },
    get$length$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$length(receiver);
    },
    get$runtimeType$(receiver) {
      return J.getInterceptor$(receiver).get$runtimeType(receiver);
    },
    $eq$(receiver, a0) {
      if (receiver == null)
        return a0 == null;
      if (typeof receiver != "object")
        return a0 != null && receiver === a0;
      return J.getInterceptor$(receiver).$eq(receiver, a0);
    },
    $index$asx(receiver, a0) {
      if (typeof a0 === "number")
        if (Array.isArray(receiver) || typeof receiver == "string" || A.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
          if (a0 >>> 0 === a0 && a0 < receiver.length)
            return receiver[a0];
      return J.getInterceptor$asx(receiver).$index(receiver, a0);
    },
    $indexSet$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
    },
    add$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).add$1(receiver, a0);
    },
    allMatches$1$s(receiver, a0) {
      return J.getInterceptor$s(receiver).allMatches$1(receiver, a0);
    },
    allMatches$2$s(receiver, a0, a1) {
      return J.getInterceptor$s(receiver).allMatches$2(receiver, a0, a1);
    },
    asUint8List$2$x(receiver, a0, a1) {
      return J.getInterceptor$x(receiver).asUint8List$2(receiver, a0, a1);
    },
    cast$1$0$ax(receiver, $T1) {
      return J.getInterceptor$ax(receiver).cast$1$0(receiver, $T1);
    },
    compareTo$1$ns(receiver, a0) {
      return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
    },
    contains$1$asx(receiver, a0) {
      return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
    },
    elementAt$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
    },
    fillRange$3$ax(receiver, a0, a1, a2) {
      return J.getInterceptor$ax(receiver).fillRange$3(receiver, a0, a1, a2);
    },
    getRange$2$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).getRange$2(receiver, a0, a1);
    },
    map$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).map$1(receiver, a0);
    },
    map$1$1$ax(receiver, a0, $T1) {
      return J.getInterceptor$ax(receiver).map$1$1(receiver, a0, $T1);
    },
    matchAsPrefix$2$s(receiver, a0, a1) {
      return J.getInterceptor$s(receiver).matchAsPrefix$2(receiver, a0, a1);
    },
    skip$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
    },
    sort$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
    },
    take$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).take$1(receiver, a0);
    },
    toList$0$ax(receiver) {
      return J.getInterceptor$ax(receiver).toList$0(receiver);
    },
    toString$0$(receiver) {
      return J.getInterceptor$(receiver).toString$0(receiver);
    },
    Interceptor: function Interceptor() {
    },
    JSBool: function JSBool() {
    },
    JSNull: function JSNull() {
    },
    JavaScriptObject: function JavaScriptObject() {
    },
    LegacyJavaScriptObject: function LegacyJavaScriptObject() {
    },
    PlainJavaScriptObject: function PlainJavaScriptObject() {
    },
    UnknownJavaScriptObject: function UnknownJavaScriptObject() {
    },
    JavaScriptFunction: function JavaScriptFunction() {
    },
    JavaScriptBigInt: function JavaScriptBigInt() {
    },
    JavaScriptSymbol: function JavaScriptSymbol() {
    },
    JSArray: function JSArray(t0) {
      this.$ti = t0;
    },
    JSArraySafeToStringHook: function JSArraySafeToStringHook() {
    },
    JSUnmodifiableArray: function JSUnmodifiableArray(t0) {
      this.$ti = t0;
    },
    ArrayIterator: function ArrayIterator(t0, t1, t2) {
      var _ = this;
      _._iterable = t0;
      _._length = t1;
      _._index = 0;
      _._current = null;
      _.$ti = t2;
    },
    JSNumber: function JSNumber() {
    },
    JSInt: function JSInt() {
    },
    JSNumNotInt: function JSNumNotInt() {
    },
    JSString: function JSString() {
    }
  },
  A = {JS_CONST: function JS_CONST() {
    },
    CastIterable_CastIterable(source, $S, $T) {
      if (type$.EfficientLengthIterable_dynamic._is(source))
        return new A._EfficientLengthCastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("_EfficientLengthCastIterable<1,2>"));
      return new A.CastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("CastIterable<1,2>"));
    },
    LateError$fieldADI(fieldName) {
      return new A.LateError("Field '" + fieldName + "' has been assigned during initialization.");
    },
    LateError$fieldNI(fieldName) {
      return new A.LateError("Field '" + fieldName + "' has not been initialized.");
    },
    LateError$fieldAI(fieldName) {
      return new A.LateError("Field '" + fieldName + "' has already been initialized.");
    },
    hexDigitValue(char) {
      var letter,
        digit = char ^ 48;
      if (digit <= 9)
        return digit;
      letter = char | 32;
      if (97 <= letter && letter <= 102)
        return letter - 87;
      return -1;
    },
    SystemHash_combine(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    SystemHash_finish(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    checkNotNullable(value, $name, $T) {
      return value;
    },
    isToStringVisiting(object) {
      var t1, i;
      for (t1 = $.toStringVisiting.length, i = 0; i < t1; ++i)
        if (object === $.toStringVisiting[i])
          return true;
      return false;
    },
    SubListIterable$(_iterable, _start, _endOrLength, $E) {
      A.RangeError_checkNotNegative(_start, "start");
      if (_endOrLength != null) {
        A.RangeError_checkNotNegative(_endOrLength, "end");
        if (_start > _endOrLength)
          A.throwExpression(A.RangeError$range(_start, 0, _endOrLength, "start", null));
      }
      return new A.SubListIterable(_iterable, _start, _endOrLength, $E._eval$1("SubListIterable<0>"));
    },
    MappedIterable_MappedIterable(iterable, $function, $S, $T) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new A.EfficientLengthMappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
      return new A.MappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    TakeIterable_TakeIterable(iterable, takeCount, $E) {
      var _s9_ = "takeCount";
      A.ArgumentError_checkNotNull(takeCount, _s9_, type$.int);
      A.RangeError_checkNotNegative(takeCount, _s9_);
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new A.EfficientLengthTakeIterable(iterable, takeCount, $E._eval$1("EfficientLengthTakeIterable<0>"));
      return new A.TakeIterable(iterable, takeCount, $E._eval$1("TakeIterable<0>"));
    },
    SkipIterable_SkipIterable(iterable, count, $E) {
      var _s5_ = "count";
      if (type$.EfficientLengthIterable_dynamic._is(iterable)) {
        A.ArgumentError_checkNotNull(count, _s5_, type$.int);
        A.RangeError_checkNotNegative(count, _s5_);
        return new A.EfficientLengthSkipIterable(iterable, count, $E._eval$1("EfficientLengthSkipIterable<0>"));
      }
      A.ArgumentError_checkNotNull(count, _s5_, type$.int);
      A.RangeError_checkNotNegative(count, _s5_);
      return new A.SkipIterable(iterable, count, $E._eval$1("SkipIterable<0>"));
    },
    IterableElementError_noElement() {
      return new A.StateError("No element");
    },
    IterableElementError_tooFew() {
      return new A.StateError("Too few elements");
    },
    Sort__doSort(a, left, right, compare, $E) {
      if (right - left <= 32)
        A.Sort__insertionSort(a, left, right, compare, $E);
      else
        A.Sort__dualPivotQuicksort(a, left, right, compare, $E);
    },
    Sort__insertionSort(a, left, right, compare, $E) {
      var i, t1, el, j, t2, j0;
      for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
        el = t1.$index(a, i);
        j = i;
        for (;;) {
          if (j > left) {
            t2 = compare.call$2(t1.$index(a, j - 1), el);
            if (typeof t2 !== "number")
              return t2.$gt();
            t2 = t2 > 0;
          } else
            t2 = false;
          if (!t2)
            break;
          j0 = j - 1;
          t1.$indexSet(a, j, t1.$index(a, j0));
          j = j0;
        }
        t1.$indexSet(a, j, el);
      }
    },
    Sort__dualPivotQuicksort(a, left, right, compare, $E) {
      var t0, less, great, pivots_are_equal, k, ak, comp, great0, less0,
        sixth = B.JSInt_methods._tdivFast$1(right - left + 1, 6),
        index1 = left + sixth,
        index5 = right - sixth,
        index3 = B.JSInt_methods._tdivFast$1(left + right, 2),
        index2 = index3 - sixth,
        index4 = index3 + sixth,
        t1 = J.getInterceptor$asx(a),
        el1 = t1.$index(a, index1),
        el2 = t1.$index(a, index2),
        el3 = t1.$index(a, index3),
        el4 = t1.$index(a, index4),
        el5 = t1.$index(a, index5),
        t2 = compare.call$2(el1, el2);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el2;
        el2 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t2 = compare.call$2(el1, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el1, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el3, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el3;
        el3 = t0;
      }
      t2 = compare.call$2(el2, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t1.$indexSet(a, index1, el1);
      t1.$indexSet(a, index3, el3);
      t1.$indexSet(a, index5, el5);
      t1.$indexSet(a, index2, t1.$index(a, left));
      t1.$indexSet(a, index4, t1.$index(a, right));
      less = left + 1;
      great = right - 1;
      pivots_are_equal = J.$eq$(compare.call$2(el2, el4), 0);
      if (pivots_are_equal)
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          comp = compare.call$2(ak, el2);
          if (comp === 0)
            continue;
          if (comp < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else
            for (;;) {
              comp = compare.call$2(t1.$index(a, great), el2);
              if (comp > 0) {
                --great;
                continue;
              } else {
                great0 = great - 1;
                if (comp < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  less = less0;
                  break;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  break;
                }
              }
            }
        }
      else
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          if (compare.call$2(ak, el2) < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else if (compare.call$2(ak, el4) > 0)
            for (;;)
              if (compare.call$2(t1.$index(a, great), el4) > 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                great0 = great - 1;
                if (compare.call$2(t1.$index(a, great), el2) < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
      t2 = less - 1;
      t1.$indexSet(a, left, t1.$index(a, t2));
      t1.$indexSet(a, t2, el2);
      t2 = great + 1;
      t1.$indexSet(a, right, t1.$index(a, t2));
      t1.$indexSet(a, t2, el4);
      A.Sort__doSort(a, left, less - 2, compare, $E);
      A.Sort__doSort(a, great + 2, right, compare, $E);
      if (pivots_are_equal)
        return;
      if (less < index1 && great > index5) {
        while (J.$eq$(compare.call$2(t1.$index(a, less), el2), 0))
          ++less;
        while (J.$eq$(compare.call$2(t1.$index(a, great), el4), 0))
          --great;
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          if (compare.call$2(ak, el2) === 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else if (compare.call$2(ak, el4) === 0)
            for (;;)
              if (compare.call$2(t1.$index(a, great), el4) === 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                great0 = great - 1;
                if (compare.call$2(t1.$index(a, great), el2) < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
        A.Sort__doSort(a, less, great, compare, $E);
      } else
        A.Sort__doSort(a, less, great, compare, $E);
    },
    _CastIterableBase: function _CastIterableBase() {
    },
    CastIterator: function CastIterator(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastIterable: function CastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _EfficientLengthCastIterable: function _EfficientLengthCastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _CastListBase: function _CastListBase() {
    },
    _CastListBase_sort_closure: function _CastListBase_sort_closure(t0, t1) {
      this.$this = t0;
      this.compare = t1;
    },
    CastList: function CastList(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap: function CastMap(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap_forEach_closure: function CastMap_forEach_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    LateError: function LateError(t0) {
      this._message = t0;
    },
    CodeUnits: function CodeUnits(t0) {
      this.__internal$_string = t0;
    },
    nullFuture_closure: function nullFuture_closure() {
    },
    SentinelValue: function SentinelValue() {
    },
    EfficientLengthIterable: function EfficientLengthIterable() {
    },
    ListIterable: function ListIterable() {
    },
    SubListIterable: function SubListIterable(t0, t1, t2, t3) {
      var _ = this;
      _.__internal$_iterable = t0;
      _._start = t1;
      _._endOrLength = t2;
      _.$ti = t3;
    },
    ListIterator: function ListIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_iterable = t0;
      _.__internal$_length = t1;
      _.__internal$_index = 0;
      _.__internal$_current = null;
      _.$ti = t2;
    },
    MappedIterable: function MappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    EfficientLengthMappedIterable: function EfficientLengthMappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    MappedIterator: function MappedIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_current = null;
      _._iterator = t0;
      _._f = t1;
      _.$ti = t2;
    },
    MappedListIterable: function MappedListIterable(t0, t1, t2) {
      this.__internal$_source = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterable: function WhereIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterator: function WhereIterator(t0, t1, t2) {
      this._iterator = t0;
      this._f = t1;
      this.$ti = t2;
    },
    ExpandIterable: function ExpandIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    ExpandIterator: function ExpandIterator(t0, t1, t2, t3) {
      var _ = this;
      _._iterator = t0;
      _._f = t1;
      _._currentExpansion = t2;
      _.__internal$_current = null;
      _.$ti = t3;
    },
    TakeIterable: function TakeIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._takeCount = t1;
      this.$ti = t2;
    },
    EfficientLengthTakeIterable: function EfficientLengthTakeIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._takeCount = t1;
      this.$ti = t2;
    },
    TakeIterator: function TakeIterator(t0, t1, t2) {
      this._iterator = t0;
      this._remaining = t1;
      this.$ti = t2;
    },
    SkipIterable: function SkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EfficientLengthSkipIterable: function EfficientLengthSkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    SkipIterator: function SkipIterator(t0, t1, t2) {
      this._iterator = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EmptyIterable: function EmptyIterable(t0) {
      this.$ti = t0;
    },
    EmptyIterator: function EmptyIterator(t0) {
      this.$ti = t0;
    },
    WhereTypeIterable: function WhereTypeIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    WhereTypeIterator: function WhereTypeIterator(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    FixedLengthListMixin: function FixedLengthListMixin() {
    },
    UnmodifiableListMixin: function UnmodifiableListMixin() {
    },
    UnmodifiableListBase: function UnmodifiableListBase() {
    },
    ReversedListIterable: function ReversedListIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    __CastListBase__CastIterableBase_ListMixin: function __CastListBase__CastIterableBase_ListMixin() {
    },
    ConstantMap__throwUnmodifiable() {
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable Map"));
    },
    unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    isJsIndexable(object, record) {
      var result;
      if (record != null) {
        result = record.x;
        if (result != null)
          return result;
      }
      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
    },
    S(value) {
      var result;
      if (typeof value == "string")
        return value;
      if (typeof value == "number") {
        if (value !== 0)
          return "" + value;
      } else if (true === value)
        return "true";
      else if (false === value)
        return "false";
      else if (value == null)
        return "null";
      result = J.toString$0$(value);
      return result;
    },
    Primitives_objectHashCode(object) {
      var hash,
        property = $.Primitives__identityHashCodeProperty;
      if (property == null)
        property = $.Primitives__identityHashCodeProperty = Symbol("identityHashCode");
      hash = object[property];
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object[property] = hash;
      }
      return hash;
    },
    Primitives_parseInt(source, radix) {
      var decimalMatch, maxCharCode, digitsPart, t1, i, _null = null,
        match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
      if (match == null)
        return _null;
      if (3 >= match.length)
        return A.ioore(match, 3);
      decimalMatch = match[3];
      if (radix == null) {
        if (decimalMatch != null)
          return parseInt(source, 10);
        if (match[2] != null)
          return parseInt(source, 16);
        return _null;
      }
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", _null));
      if (radix === 10 && decimalMatch != null)
        return parseInt(source, 10);
      if (radix < 10 || decimalMatch == null) {
        maxCharCode = radix <= 10 ? 47 + radix : 86 + radix;
        digitsPart = match[1];
        for (t1 = digitsPart.length, i = 0; i < t1; ++i)
          if ((digitsPart.charCodeAt(i) | 32) > maxCharCode)
            return _null;
      }
      return parseInt(source, radix);
    },
    Primitives_objectTypeName(object) {
      var interceptor, dispatchName, $constructor, constructorName;
      if (object instanceof A.Object)
        return A._rtiToString(A.instanceType(object), null);
      interceptor = J.getInterceptor$(object);
      if (interceptor === B.Interceptor_methods || interceptor === B.JavaScriptObject_methods || type$.UnknownJavaScriptObject._is(object)) {
        dispatchName = B.C_JS_CONST(object);
        if (dispatchName !== "Object" && dispatchName !== "")
          return dispatchName;
        $constructor = object.constructor;
        if (typeof $constructor == "function") {
          constructorName = $constructor.name;
          if (typeof constructorName == "string" && constructorName !== "Object" && constructorName !== "")
            return constructorName;
        }
      }
      return A._rtiToString(A.instanceType(object), null);
    },
    Primitives_safeToString(object) {
      var hooks, i, hookResult;
      if (object == null || typeof object == "number" || A._isBool(object))
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      if (object instanceof A.Closure)
        return object.toString$0(0);
      if (object instanceof A._Record)
        return object._toString$1(true);
      hooks = $.$get$_safeToStringHooks();
      for (i = 0; i < 1; ++i) {
        hookResult = hooks[i].tryFormat$1(object);
        if (hookResult != null)
          return hookResult;
      }
      return "Instance of '" + A.Primitives_objectTypeName(object) + "'";
    },
    Primitives_currentUri() {
      if (!!self.location)
        return self.location.href;
      return null;
    },
    Primitives__fromCharCodeApply(array) {
      var result, i, i0, chunkEnd,
        end = array.length;
      if (end <= 500)
        return String.fromCharCode.apply(null, array);
      for (result = "", i = 0; i < end; i = i0) {
        i0 = i + 500;
        chunkEnd = i0 < end ? i0 : end;
        result += String.fromCharCode.apply(null, array.slice(i, chunkEnd));
      }
      return result;
    },
    Primitives_stringFromCodePoints(codePoints) {
      var t1, _i, i,
        a = A._setArrayType([], type$.JSArray_int);
      for (t1 = codePoints.length, _i = 0; _i < codePoints.length; codePoints.length === t1 || (0, A.throwConcurrentModificationError)(codePoints), ++_i) {
        i = codePoints[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i <= 65535)
          B.JSArray_methods.add$1(a, i);
        else if (i <= 1114111) {
          B.JSArray_methods.add$1(a, 55296 + (B.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
          B.JSArray_methods.add$1(a, 56320 + (i & 1023));
        } else
          throw A.wrapException(A.argumentErrorValue(i));
      }
      return A.Primitives__fromCharCodeApply(a);
    },
    Primitives_stringFromCharCodes(charCodes) {
      var t1, _i, i;
      for (t1 = charCodes.length, _i = 0; _i < t1; ++_i) {
        i = charCodes[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i < 0)
          throw A.wrapException(A.argumentErrorValue(i));
        if (i > 65535)
          return A.Primitives_stringFromCodePoints(charCodes);
      }
      return A.Primitives__fromCharCodeApply(charCodes);
    },
    Primitives_stringFromNativeUint8List(charCodes, start, end) {
      var i, result, i0, chunkEnd;
      if (end <= 500 && start === 0 && end === charCodes.length)
        return String.fromCharCode.apply(null, charCodes);
      for (i = start, result = ""; i < end; i = i0) {
        i0 = i + 500;
        chunkEnd = i0 < end ? i0 : end;
        result += String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
      }
      return result;
    },
    Primitives_stringFromCharCode(charCode) {
      var bits;
      if (0 <= charCode) {
        if (charCode <= 65535)
          return String.fromCharCode(charCode);
        if (charCode <= 1114111) {
          bits = charCode - 65536;
          return String.fromCharCode((B.JSInt_methods._shrOtherPositive$1(bits, 10) | 55296) >>> 0, bits & 1023 | 56320);
        }
      }
      throw A.wrapException(A.RangeError$range(charCode, 0, 1114111, null, null));
    },
    Primitives_lazyAsJsDate(receiver) {
      if (receiver.date === void 0)
        receiver.date = new Date(receiver._value);
      return receiver.date;
    },
    Primitives_getYear(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCFullYear() + 0 : A.Primitives_lazyAsJsDate(receiver).getFullYear() + 0;
    },
    Primitives_getMonth(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMonth() + 1 : A.Primitives_lazyAsJsDate(receiver).getMonth() + 1;
    },
    Primitives_getDay(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCDate() + 0 : A.Primitives_lazyAsJsDate(receiver).getDate() + 0;
    },
    Primitives_getHours(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCHours() + 0 : A.Primitives_lazyAsJsDate(receiver).getHours() + 0;
    },
    Primitives_getMinutes(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMinutes() + 0 : A.Primitives_lazyAsJsDate(receiver).getMinutes() + 0;
    },
    Primitives_getSeconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCSeconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getSeconds() + 0;
    },
    Primitives_getMilliseconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
    },
    Primitives_extractStackTrace(error) {
      var jsError = error.$thrownJsError;
      if (jsError == null)
        return null;
      return A.getTraceFromException(jsError);
    },
    Primitives_trySetStackTrace(error, stackTrace) {
      var jsError;
      if (error.$thrownJsError == null) {
        jsError = new Error();
        A.initializeExceptionWrapper(error, jsError);
        error.$thrownJsError = jsError;
        jsError.stack = stackTrace.toString$0(0);
      }
    },
    iae(argument) {
      throw A.wrapException(A.argumentErrorValue(argument));
    },
    ioore(receiver, index) {
      if (receiver == null)
        J.get$length$asx(receiver);
      throw A.wrapException(A.diagnoseIndexError(receiver, index));
    },
    diagnoseIndexError(indexable, index) {
      var $length, _s5_ = "index";
      if (!A._isInt(index))
        return new A.ArgumentError(true, index, _s5_, null);
      $length = A._asInt(J.get$length$asx(indexable));
      if (index < 0 || index >= $length)
        return A.IndexError$withLength(index, $length, indexable, null, _s5_);
      return A.RangeError$value(index, _s5_);
    },
    diagnoseRangeError(start, end, $length) {
      if (start < 0 || start > $length)
        return A.RangeError$range(start, 0, $length, "start", null);
      if (end != null)
        if (end < start || end > $length)
          return A.RangeError$range(end, start, $length, "end", null);
      return new A.ArgumentError(true, end, "end", null);
    },
    argumentErrorValue(object) {
      return new A.ArgumentError(true, object, null, null);
    },
    wrapException(ex) {
      return A.initializeExceptionWrapper(ex, new Error());
    },
    initializeExceptionWrapper(ex, wrapper) {
      var t1;
      if (ex == null)
        ex = new A.TypeError();
      wrapper.dartException = ex;
      t1 = A.toStringWrapper;
      if ("defineProperty" in Object) {
        Object.defineProperty(wrapper, "message", {get: t1});
        wrapper.name = "";
      } else
        wrapper.toString = t1;
      return wrapper;
    },
    toStringWrapper() {
      return J.toString$0$(this.dartException);
    },
    throwExpression(ex, wrapper) {
      throw A.initializeExceptionWrapper(ex, wrapper == null ? new Error() : wrapper);
    },
    throwUnsupportedOperation(o, operation, verb) {
      var wrapper;
      if (operation == null)
        operation = 0;
      if (verb == null)
        verb = 0;
      wrapper = Error();
      A.throwExpression(A._diagnoseUnsupportedOperation(o, operation, verb), wrapper);
    },
    _diagnoseUnsupportedOperation(o, encodedOperation, encodedVerb) {
      var operation, table, tableLength, index, verb, object, flags, article, adjective;
      if (typeof encodedOperation == "string")
        operation = encodedOperation;
      else {
        table = "[]=;add;removeWhere;retainWhere;removeRange;setRange;setInt8;setInt16;setInt32;setUint8;setUint16;setUint32;setFloat32;setFloat64".split(";");
        tableLength = table.length;
        index = encodedOperation;
        if (index > tableLength) {
          encodedVerb = index / tableLength | 0;
          index %= tableLength;
        }
        operation = table[index];
      }
      verb = typeof encodedVerb == "string" ? encodedVerb : "modify;remove from;add to".split(";")[encodedVerb];
      object = type$.List_dynamic._is(o) ? "list" : "ByteData";
      flags = o.$flags | 0;
      article = "a ";
      if ((flags & 4) !== 0)
        adjective = "constant ";
      else if ((flags & 2) !== 0) {
        adjective = "unmodifiable ";
        article = "an ";
      } else
        adjective = (flags & 1) !== 0 ? "fixed-length " : "";
      return new A.UnsupportedError("'" + operation + "': Cannot " + verb + " " + article + adjective + object);
    },
    throwConcurrentModificationError(collection) {
      throw A.wrapException(A.ConcurrentModificationError$(collection));
    },
    TypeErrorDecoder_extractPattern(message) {
      var match, $arguments, argumentsExpr, expr, method, receiver;
      message = A.quoteStringForRegExp(message.replace(String({}), "$receiver$"));
      match = message.match(/\\\$[a-zA-Z]+\\\$/g);
      if (match == null)
        match = A._setArrayType([], type$.JSArray_String);
      $arguments = match.indexOf("\\$arguments\\$");
      argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
      expr = match.indexOf("\\$expr\\$");
      method = match.indexOf("\\$method\\$");
      receiver = match.indexOf("\\$receiver\\$");
      return new A.TypeErrorDecoder(message.replace(new RegExp("\\\\\\$arguments\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$", "g"), "((?:x|[^x])*)"), $arguments, argumentsExpr, expr, method, receiver);
    },
    TypeErrorDecoder_provokeCallErrorOn(expression) {
      return function($expr$) {
        var $argumentsExpr$ = "$arguments$";
        try {
          $expr$.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    TypeErrorDecoder_provokePropertyErrorOn(expression) {
      return function($expr$) {
        try {
          $expr$.$method$;
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    JsNoSuchMethodError$(_message, match) {
      var t1 = match == null,
        t2 = t1 ? null : match.method;
      return new A.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
    },
    unwrapException(ex) {
      var t1;
      if (ex == null)
        return new A.NullThrownFromJavaScriptException(ex);
      if (ex instanceof A.ExceptionAndStackTrace) {
        t1 = ex.dartException;
        return A.saveStackTrace(ex, t1 == null ? A._asObject(t1) : t1);
      }
      if (typeof ex !== "object")
        return ex;
      if ("dartException" in ex)
        return A.saveStackTrace(ex, ex.dartException);
      return A._unwrapNonDartException(ex);
    },
    saveStackTrace(ex, error) {
      if (type$.Error._is(error))
        if (error.$thrownJsError == null)
          error.$thrownJsError = ex;
      return error;
    },
    _unwrapNonDartException(ex) {
      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match;
      if (!("message" in ex))
        return ex;
      message = ex.message;
      if ("number" in ex && typeof ex.number == "number") {
        number = ex.number;
        ieErrorCode = number & 65535;
        if ((B.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
          switch (ieErrorCode) {
            case 438:
              return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A.S(message) + " (Error " + ieErrorCode + ")", null));
            case 445:
            case 5007:
              A.S(message);
              return A.saveStackTrace(ex, new A.NullError());
          }
      }
      if (ex instanceof TypeError) {
        nsme = $.$get$TypeErrorDecoder_noSuchMethodPattern();
        notClosure = $.$get$TypeErrorDecoder_notClosurePattern();
        nullCall = $.$get$TypeErrorDecoder_nullCallPattern();
        nullLiteralCall = $.$get$TypeErrorDecoder_nullLiteralCallPattern();
        undefCall = $.$get$TypeErrorDecoder_undefinedCallPattern();
        undefLiteralCall = $.$get$TypeErrorDecoder_undefinedLiteralCallPattern();
        nullProperty = $.$get$TypeErrorDecoder_nullPropertyPattern();
        $.$get$TypeErrorDecoder_nullLiteralPropertyPattern();
        undefProperty = $.$get$TypeErrorDecoder_undefinedPropertyPattern();
        undefLiteralProperty = $.$get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
        match = nsme.matchTypeError$1(message);
        if (match != null)
          return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asString(message), match));
        else {
          match = notClosure.matchTypeError$1(message);
          if (match != null) {
            match.method = "call";
            return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asString(message), match));
          } else if (nullCall.matchTypeError$1(message) != null || nullLiteralCall.matchTypeError$1(message) != null || undefCall.matchTypeError$1(message) != null || undefLiteralCall.matchTypeError$1(message) != null || nullProperty.matchTypeError$1(message) != null || nullLiteralCall.matchTypeError$1(message) != null || undefProperty.matchTypeError$1(message) != null || undefLiteralProperty.matchTypeError$1(message) != null) {
            A._asString(message);
            return A.saveStackTrace(ex, new A.NullError());
          }
        }
        return A.saveStackTrace(ex, new A.UnknownJsTypeError(typeof message == "string" ? message : ""));
      }
      if (ex instanceof RangeError) {
        if (typeof message == "string" && message.indexOf("call stack") !== -1)
          return new A.StackOverflowError();
        message = function(ex) {
          try {
            return String(ex);
          } catch (e) {
          }
          return null;
        }(ex);
        return A.saveStackTrace(ex, new A.ArgumentError(false, null, null, typeof message == "string" ? message.replace(/^RangeError:\s*/, "") : message));
      }
      if (typeof InternalError == "function" && ex instanceof InternalError)
        if (typeof message == "string" && message === "too much recursion")
          return new A.StackOverflowError();
      return ex;
    },
    getTraceFromException(exception) {
      var trace;
      if (exception instanceof A.ExceptionAndStackTrace)
        return exception.stackTrace;
      if (exception == null)
        return new A._StackTrace(exception);
      trace = exception.$cachedTrace;
      if (trace != null)
        return trace;
      trace = new A._StackTrace(exception);
      if (typeof exception === "object")
        exception.$cachedTrace = trace;
      return trace;
    },
    objectHashCode(object) {
      if (object == null)
        return J.get$hashCode$(object);
      if (typeof object == "object")
        return A.Primitives_objectHashCode(object);
      return J.get$hashCode$(object);
    },
    fillLiteralMap(keyValuePairs, result) {
      var index, index0, index1,
        $length = keyValuePairs.length;
      for (index = 0; index < $length; index = index1) {
        index0 = index + 1;
        index1 = index0 + 1;
        result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
      }
      return result;
    },
    _invokeClosure(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
      type$.Function._as(closure);
      switch (A._asInt(numberOfArguments)) {
        case 0:
          return closure.call$0();
        case 1:
          return closure.call$1(arg1);
        case 2:
          return closure.call$2(arg1, arg2);
        case 3:
          return closure.call$3(arg1, arg2, arg3);
        case 4:
          return closure.call$4(arg1, arg2, arg3, arg4);
      }
      throw A.wrapException(A.Exception_Exception("Unsupported number of arguments for wrapped closure"));
    },
    convertDartClosureToJS(closure, arity) {
      var $function = closure.$identity;
      if (!!$function)
        return $function;
      $function = A.convertDartClosureToJSUncached(closure, arity);
      closure.$identity = $function;
      return $function;
    },
    convertDartClosureToJSUncached(closure, arity) {
      var entry;
      switch (arity) {
        case 0:
          entry = closure.call$0;
          break;
        case 1:
          entry = closure.call$1;
          break;
        case 2:
          entry = closure.call$2;
          break;
        case 3:
          entry = closure.call$3;
          break;
        case 4:
          entry = closure.call$4;
          break;
        default:
          entry = null;
      }
      if (entry != null)
        return entry.bind(closure);
      return function(closure, arity, invoke) {
        return function(a1, a2, a3, a4) {
          return invoke(closure, arity, a1, a2, a3, a4);
        };
      }(closure, arity, A._invokeClosure);
    },
    Closure_fromTearOff(parameters) {
      var $prototype, $constructor, t2, trampoline, applyTrampoline, i, stub, stub0, stubName, stubCallName,
        container = parameters.co,
        isStatic = parameters.iS,
        isIntercepted = parameters.iI,
        needsDirectAccess = parameters.nDA,
        applyTrampolineIndex = parameters.aI,
        funsOrNames = parameters.fs,
        callNames = parameters.cs,
        $name = funsOrNames[0],
        callName = callNames[0],
        $function = container[$name],
        t1 = parameters.fT;
      t1.toString;
      $prototype = isStatic ? Object.create(new A.StaticClosure().constructor.prototype) : Object.create(new A.BoundClosure(null, null).constructor.prototype);
      $prototype.$initialize = $prototype.constructor;
      $constructor = isStatic ? function static_tear_off() {
        this.$initialize();
      } : function tear_off(a, b) {
        this.$initialize(a, b);
      };
      $prototype.constructor = $constructor;
      $constructor.prototype = $prototype;
      $prototype.$_name = $name;
      $prototype.$_target = $function;
      t2 = !isStatic;
      if (t2)
        trampoline = A.Closure_forwardCallTo($name, $function, isIntercepted, needsDirectAccess);
      else {
        $prototype.$static_name = $name;
        trampoline = $function;
      }
      $prototype.$signature = A.Closure__computeSignatureFunction(t1, isStatic, isIntercepted);
      $prototype[callName] = trampoline;
      for (applyTrampoline = trampoline, i = 1; i < funsOrNames.length; ++i) {
        stub = funsOrNames[i];
        if (typeof stub == "string") {
          stub0 = container[stub];
          stubName = stub;
          stub = stub0;
        } else
          stubName = "";
        stubCallName = callNames[i];
        if (stubCallName != null) {
          if (t2)
            stub = A.Closure_forwardCallTo(stubName, stub, isIntercepted, needsDirectAccess);
          $prototype[stubCallName] = stub;
        }
        if (i === applyTrampolineIndex)
          applyTrampoline = stub;
      }
      $prototype["call*"] = applyTrampoline;
      $prototype.$requiredArgCount = parameters.rC;
      $prototype.$defaultValues = parameters.dV;
      return $constructor;
    },
    Closure__computeSignatureFunction(functionType, isStatic, isIntercepted) {
      if (typeof functionType == "number")
        return functionType;
      if (typeof functionType == "string") {
        if (isStatic)
          throw A.wrapException("Cannot compute signature for static tearoff.");
        return function(recipe, evalOnReceiver) {
          return function() {
            return evalOnReceiver(this, recipe);
          };
        }(functionType, A.BoundClosure_evalRecipe);
      }
      throw A.wrapException("Error in functionType of tearoff");
    },
    Closure_cspForwardCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf;
      switch (needsDirectAccess ? -1 : arity) {
        case 0:
          return function(entry, receiverOf) {
            return function() {
              return receiverOf(this)[entry]();
            };
          }(stubName, getReceiver);
        case 1:
          return function(entry, receiverOf) {
            return function(a) {
              return receiverOf(this)[entry](a);
            };
          }(stubName, getReceiver);
        case 2:
          return function(entry, receiverOf) {
            return function(a, b) {
              return receiverOf(this)[entry](a, b);
            };
          }(stubName, getReceiver);
        case 3:
          return function(entry, receiverOf) {
            return function(a, b, c) {
              return receiverOf(this)[entry](a, b, c);
            };
          }(stubName, getReceiver);
        case 4:
          return function(entry, receiverOf) {
            return function(a, b, c, d) {
              return receiverOf(this)[entry](a, b, c, d);
            };
          }(stubName, getReceiver);
        case 5:
          return function(entry, receiverOf) {
            return function(a, b, c, d, e) {
              return receiverOf(this)[entry](a, b, c, d, e);
            };
          }(stubName, getReceiver);
        default:
          return function(f, receiverOf) {
            return function() {
              return f.apply(receiverOf(this), arguments);
            };
          }($function, getReceiver);
      }
    },
    Closure_forwardCallTo(stubName, $function, isIntercepted, needsDirectAccess) {
      if (isIntercepted)
        return A.Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess);
      return A.Closure_cspForwardCall($function.length, needsDirectAccess, stubName, $function);
    },
    Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf,
        getInterceptor = A.BoundClosure_interceptorOf;
      switch (needsDirectAccess ? -1 : arity) {
        case 0:
          throw A.wrapException(new A.RuntimeError("Intercepted function with no arguments."));
        case 1:
          return function(entry, interceptorOf, receiverOf) {
            return function() {
              return interceptorOf(this)[entry](receiverOf(this));
            };
          }(stubName, getInterceptor, getReceiver);
        case 2:
          return function(entry, interceptorOf, receiverOf) {
            return function(a) {
              return interceptorOf(this)[entry](receiverOf(this), a);
            };
          }(stubName, getInterceptor, getReceiver);
        case 3:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b) {
              return interceptorOf(this)[entry](receiverOf(this), a, b);
            };
          }(stubName, getInterceptor, getReceiver);
        case 4:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c);
            };
          }(stubName, getInterceptor, getReceiver);
        case 5:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d);
            };
          }(stubName, getInterceptor, getReceiver);
        case 6:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d, e) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d, e);
            };
          }(stubName, getInterceptor, getReceiver);
        default:
          return function(f, interceptorOf, receiverOf) {
            return function() {
              var a = [receiverOf(this)];
              Array.prototype.push.apply(a, arguments);
              return f.apply(interceptorOf(this), a);
            };
          }($function, getInterceptor, getReceiver);
      }
    },
    Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess) {
      var arity, t1;
      if ($.BoundClosure__interceptorFieldNameCache == null)
        $.BoundClosure__interceptorFieldNameCache = A.BoundClosure__computeFieldNamed("interceptor");
      if ($.BoundClosure__receiverFieldNameCache == null)
        $.BoundClosure__receiverFieldNameCache = A.BoundClosure__computeFieldNamed("receiver");
      arity = $function.length;
      t1 = A.Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function);
      return t1;
    },
    closureFromTearOff(parameters) {
      return A.Closure_fromTearOff(parameters);
    },
    BoundClosure_evalRecipe(closure, recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, A.instanceType(closure._receiver), recipe);
    },
    BoundClosure_receiverOf(closure) {
      return closure._receiver;
    },
    BoundClosure_interceptorOf(closure) {
      return closure._interceptor;
    },
    BoundClosure__computeFieldNamed(fieldName) {
      var names, i, $name,
        template = new A.BoundClosure("receiver", "interceptor"),
        t1 = Object.getOwnPropertyNames(template);
      t1.$flags = 1;
      names = t1;
      for (t1 = names.length, i = 0; i < t1; ++i) {
        $name = names[i];
        if (template[$name] === fieldName)
          return $name;
      }
      throw A.wrapException(A.ArgumentError$("Field name " + fieldName + " not found.", null));
    },
    getIsolateAffinityTag($name) {
      return init.getIsolateTag($name);
    },
    staticInteropGlobalContext() {
      return init.G;
    },
    defineProperty(obj, property, value) {
      Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
    },
    lookupAndCacheInterceptor(obj) {
      var interceptor, interceptorClass, altTag, mark, t1,
        tag = A._asString($.getTagFunction.call$1(obj)),
        record = $.dispatchRecordsForInstanceTags[tag];
      if (record != null) {
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      interceptor = $.interceptorsForUncacheableTags[tag];
      if (interceptor != null)
        return interceptor;
      interceptorClass = init.interceptorsByTag[tag];
      if (interceptorClass == null) {
        altTag = A._asStringQ($.alternateTagFunction.call$2(obj, tag));
        if (altTag != null) {
          record = $.dispatchRecordsForInstanceTags[altTag];
          if (record != null) {
            Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
            return record.i;
          }
          interceptor = $.interceptorsForUncacheableTags[altTag];
          if (interceptor != null)
            return interceptor;
          interceptorClass = init.interceptorsByTag[altTag];
          tag = altTag;
        }
      }
      if (interceptorClass == null)
        return null;
      interceptor = interceptorClass.prototype;
      mark = tag[0];
      if (mark === "!") {
        record = A.makeLeafDispatchRecord(interceptor);
        $.dispatchRecordsForInstanceTags[tag] = record;
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      if (mark === "~") {
        $.interceptorsForUncacheableTags[tag] = interceptor;
        return interceptor;
      }
      if (mark === "-") {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      }
      if (mark === "+")
        return A.patchInteriorProto(obj, interceptor);
      if (mark === "*")
        throw A.wrapException(A.UnimplementedError$(tag));
      if (init.leafTags[tag] === true) {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      } else
        return A.patchInteriorProto(obj, interceptor);
    },
    patchInteriorProto(obj, interceptor) {
      var proto = Object.getPrototypeOf(obj);
      Object.defineProperty(proto, init.dispatchPropertyName, {value: J.makeDispatchRecord(interceptor, proto, null, null), enumerable: false, writable: true, configurable: true});
      return interceptor;
    },
    makeLeafDispatchRecord(interceptor) {
      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
    },
    makeDefaultDispatchRecord(tag, interceptorClass, proto) {
      var interceptor = interceptorClass.prototype;
      if (init.leafTags[tag] === true)
        return A.makeLeafDispatchRecord(interceptor);
      else
        return J.makeDispatchRecord(interceptor, proto, null, null);
    },
    initNativeDispatch() {
      if (true === $.initNativeDispatchFlag)
        return;
      $.initNativeDispatchFlag = true;
      A.initNativeDispatchContinue();
    },
    initNativeDispatchContinue() {
      var map, tags, fun, i, tag, proto, record, interceptorClass;
      $.dispatchRecordsForInstanceTags = Object.create(null);
      $.interceptorsForUncacheableTags = Object.create(null);
      A.initHooks();
      map = init.interceptorsByTag;
      tags = Object.getOwnPropertyNames(map);
      if (typeof window != "undefined") {
        window;
        fun = function() {
        };
        for (i = 0; i < tags.length; ++i) {
          tag = tags[i];
          proto = $.prototypeForTagFunction.call$1(tag);
          if (proto != null) {
            record = A.makeDefaultDispatchRecord(tag, map[tag], proto);
            if (record != null) {
              Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
              fun.prototype = proto;
            }
          }
        }
      }
      for (i = 0; i < tags.length; ++i) {
        tag = tags[i];
        if (/^[A-Za-z_]/.test(tag)) {
          interceptorClass = map[tag];
          map["!" + tag] = interceptorClass;
          map["~" + tag] = interceptorClass;
          map["-" + tag] = interceptorClass;
          map["+" + tag] = interceptorClass;
          map["*" + tag] = interceptorClass;
        }
      }
    },
    initHooks() {
      var transformers, i, transformer, getTag, getUnknownTag, prototypeForTag,
        hooks = B.C_JS_CONST0();
      hooks = A.applyHooksTransformer(B.C_JS_CONST1, A.applyHooksTransformer(B.C_JS_CONST2, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST4, A.applyHooksTransformer(B.C_JS_CONST5, A.applyHooksTransformer(B.C_JS_CONST6(B.C_JS_CONST), hooks)))))));
      if (typeof dartNativeDispatchHooksTransformer != "undefined") {
        transformers = dartNativeDispatchHooksTransformer;
        if (typeof transformers == "function")
          transformers = [transformers];
        if (Array.isArray(transformers))
          for (i = 0; i < transformers.length; ++i) {
            transformer = transformers[i];
            if (typeof transformer == "function")
              hooks = transformer(hooks) || hooks;
          }
      }
      getTag = hooks.getTag;
      getUnknownTag = hooks.getUnknownTag;
      prototypeForTag = hooks.prototypeForTag;
      $.getTagFunction = new A.initHooks_closure(getTag);
      $.alternateTagFunction = new A.initHooks_closure0(getUnknownTag);
      $.prototypeForTagFunction = new A.initHooks_closure1(prototypeForTag);
    },
    applyHooksTransformer(transformer, hooks) {
      return transformer(hooks) || hooks;
    },
    createRecordTypePredicate(shape, fieldRtis) {
      var $length = fieldRtis.length,
        $function = init.rttc["" + $length + ";" + shape];
      if ($function == null)
        return null;
      if ($length === 0)
        return $function;
      if ($length === $function.length)
        return $function.apply(null, fieldRtis);
      return $function(fieldRtis);
    },
    JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, unicode, dotAll, extraFlags) {
      var m = multiLine ? "m" : "",
        i = caseSensitive ? "" : "i",
        u = unicode ? "u" : "",
        s = dotAll ? "s" : "",
        regexp = function(source, modifiers) {
          try {
            return new RegExp(source, modifiers);
          } catch (e) {
            return e;
          }
        }(source, m + i + u + s + extraFlags);
      if (regexp instanceof RegExp)
        return regexp;
      throw A.wrapException(A.FormatException$("Illegal RegExp pattern (" + String(regexp) + ")", source, null));
    },
    stringContainsUnchecked(receiver, other, startIndex) {
      var t1;
      if (typeof other == "string")
        return receiver.indexOf(other, startIndex) >= 0;
      else if (other instanceof A.JSSyntaxRegExp) {
        t1 = B.JSString_methods.substring$1(receiver, startIndex);
        return other._nativeRegExp.test(t1);
      } else
        return !J.allMatches$1$s(other, B.JSString_methods.substring$1(receiver, startIndex)).get$isEmpty(0);
    },
    escapeReplacement(replacement) {
      if (replacement.indexOf("$", 0) >= 0)
        return replacement.replace(/\$/g, "$$$$");
      return replacement;
    },
    stringReplaceFirstRE(receiver, regexp, replacement, startIndex) {
      var match = regexp._execGlobal$2(receiver, startIndex);
      if (match == null)
        return receiver;
      return A.stringReplaceRangeUnchecked(receiver, match._match.index, match.get$end(), replacement);
    },
    quoteStringForRegExp(string) {
      if (/[[\]{}()*+?.\\^$|]/.test(string))
        return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
      return string;
    },
    stringReplaceAllUnchecked(receiver, pattern, replacement) {
      var nativeRegexp;
      if (typeof pattern == "string")
        return A.stringReplaceAllUncheckedString(receiver, pattern, replacement);
      if (pattern instanceof A.JSSyntaxRegExp) {
        nativeRegexp = pattern.get$_nativeGlobalVersion();
        nativeRegexp.lastIndex = 0;
        return receiver.replace(nativeRegexp, A.escapeReplacement(replacement));
      }
      return A.stringReplaceAllGeneral(receiver, pattern, replacement);
    },
    stringReplaceAllGeneral(receiver, pattern, replacement) {
      var t1, startIndex, t2, match;
      for (t1 = J.allMatches$1$s(pattern, receiver), t1 = t1.get$iterator(t1), startIndex = 0, t2 = ""; t1.moveNext$0();) {
        match = t1.get$current();
        t2 = t2 + receiver.substring(startIndex, match.get$start()) + replacement;
        startIndex = match.get$end();
      }
      t1 = t2 + receiver.substring(startIndex);
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    stringReplaceAllUncheckedString(receiver, pattern, replacement) {
      var $length, t1, i;
      if (pattern === "") {
        if (receiver === "")
          return replacement;
        $length = receiver.length;
        for (t1 = replacement, i = 0; i < $length; ++i)
          t1 = t1 + receiver[i] + replacement;
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      }
      if (receiver.indexOf(pattern, 0) < 0)
        return receiver;
      if (receiver.length < 500 || replacement.indexOf("$", 0) >= 0)
        return receiver.split(pattern).join(replacement);
      return receiver.replace(new RegExp(A.quoteStringForRegExp(pattern), "g"), A.escapeReplacement(replacement));
    },
    _stringIdentity(string) {
      return string;
    },
    stringReplaceAllFuncUnchecked(receiver, pattern, onMatch, onNonMatch) {
      var t1, t2, startIndex, t3, match, t4, t5;
      for (t1 = pattern.allMatches$1(0, receiver), t1 = new A._AllMatchesIterator(t1._re, t1._string, t1.__js_helper$_start), t2 = type$.RegExpMatch, startIndex = 0, t3 = ""; t1.moveNext$0();) {
        match = t1.__js_helper$_current;
        if (match == null)
          match = t2._as(match);
        t4 = match._match;
        t5 = t4.index;
        t3 = t3 + A.S(A._stringIdentity(B.JSString_methods.substring$2(receiver, startIndex, t5))) + A.S(onMatch.call$1(match));
        startIndex = t5 + t4[0].length;
      }
      t1 = t3 + A.S(A._stringIdentity(B.JSString_methods.substring$1(receiver, startIndex)));
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    stringReplaceFirstUnchecked(receiver, pattern, replacement, startIndex) {
      var index, t1, matches, match;
      if (typeof pattern == "string") {
        index = receiver.indexOf(pattern, startIndex);
        if (index < 0)
          return receiver;
        return A.stringReplaceRangeUnchecked(receiver, index, index + pattern.length, replacement);
      }
      if (pattern instanceof A.JSSyntaxRegExp)
        return startIndex === 0 ? receiver.replace(pattern._nativeRegExp, A.escapeReplacement(replacement)) : A.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
      t1 = J.allMatches$2$s(pattern, receiver, startIndex);
      matches = t1.get$iterator(t1);
      if (!matches.moveNext$0())
        return receiver;
      match = matches.get$current();
      return B.JSString_methods.replaceRange$3(receiver, match.get$start(), match.get$end(), replacement);
    },
    stringReplaceRangeUnchecked(receiver, start, end, replacement) {
      return receiver.substring(0, start) + replacement + receiver.substring(end);
    },
    _Record_2: function _Record_2(t0, t1) {
      this._0 = t0;
      this._1 = t1;
    },
    ConstantMap: function ConstantMap() {
    },
    ConstantMap_map_closure: function ConstantMap_map_closure(t0, t1, t2) {
      this.$this = t0;
      this.transform = t1;
      this.result = t2;
    },
    ConstantStringMap: function ConstantStringMap(t0, t1, t2) {
      this._jsIndex = t0;
      this._values = t1;
      this.$ti = t2;
    },
    _KeysOrValues: function _KeysOrValues(t0, t1) {
      this._elements = t0;
      this.$ti = t1;
    },
    _KeysOrValuesOrElementsIterator: function _KeysOrValuesOrElementsIterator(t0, t1, t2) {
      var _ = this;
      _._elements = t0;
      _.__js_helper$_length = t1;
      _.__js_helper$_index = 0;
      _.__js_helper$_current = null;
      _.$ti = t2;
    },
    Instantiation: function Instantiation() {
    },
    Instantiation1: function Instantiation1(t0, t1) {
      this._genericClosure = t0;
      this.$ti = t1;
    },
    SafeToStringHook: function SafeToStringHook() {
    },
    TypeErrorDecoder: function TypeErrorDecoder(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _._pattern = t0;
      _._arguments = t1;
      _._argumentsExpr = t2;
      _._expr = t3;
      _._method = t4;
      _._receiver = t5;
    },
    NullError: function NullError() {
    },
    JsNoSuchMethodError: function JsNoSuchMethodError(t0, t1, t2) {
      this.__js_helper$_message = t0;
      this._method = t1;
      this._receiver = t2;
    },
    UnknownJsTypeError: function UnknownJsTypeError(t0) {
      this.__js_helper$_message = t0;
    },
    NullThrownFromJavaScriptException: function NullThrownFromJavaScriptException(t0) {
      this._irritant = t0;
    },
    ExceptionAndStackTrace: function ExceptionAndStackTrace(t0, t1) {
      this.dartException = t0;
      this.stackTrace = t1;
    },
    _StackTrace: function _StackTrace(t0) {
      this._exception = t0;
      this._trace = null;
    },
    Closure: function Closure() {
    },
    Closure0Args: function Closure0Args() {
    },
    Closure2Args: function Closure2Args() {
    },
    TearOffClosure: function TearOffClosure() {
    },
    StaticClosure: function StaticClosure() {
    },
    BoundClosure: function BoundClosure(t0, t1) {
      this._receiver = t0;
      this._interceptor = t1;
    },
    RuntimeError: function RuntimeError(t0) {
      this.message = t0;
    },
    JsLinkedHashMap: function JsLinkedHashMap(t0) {
      var _ = this;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _.__js_helper$_nums = _.__js_helper$_strings = null;
      _._modifications = 0;
      _.$ti = t0;
    },
    JsLinkedHashMap_addAll_closure: function JsLinkedHashMap_addAll_closure(t0) {
      this.$this = t0;
    },
    LinkedHashMapCell: function LinkedHashMapCell(t0, t1) {
      var _ = this;
      _.hashMapCellKey = t0;
      _.hashMapCellValue = t1;
      _._previous = _._next = null;
    },
    LinkedHashMapKeysIterable: function LinkedHashMapKeysIterable(t0, t1) {
      this.__js_helper$_map = t0;
      this.$ti = t1;
    },
    LinkedHashMapKeyIterator: function LinkedHashMapKeyIterator(t0, t1, t2, t3) {
      var _ = this;
      _.__js_helper$_map = t0;
      _._modifications = t1;
      _._cell = t2;
      _.__js_helper$_current = null;
      _.$ti = t3;
    },
    LinkedHashMapValuesIterable: function LinkedHashMapValuesIterable(t0, t1) {
      this.__js_helper$_map = t0;
      this.$ti = t1;
    },
    LinkedHashMapValueIterator: function LinkedHashMapValueIterator(t0, t1, t2, t3) {
      var _ = this;
      _.__js_helper$_map = t0;
      _._modifications = t1;
      _._cell = t2;
      _.__js_helper$_current = null;
      _.$ti = t3;
    },
    LinkedHashMapEntriesIterable: function LinkedHashMapEntriesIterable(t0, t1) {
      this.__js_helper$_map = t0;
      this.$ti = t1;
    },
    LinkedHashMapEntryIterator: function LinkedHashMapEntryIterator(t0, t1, t2, t3) {
      var _ = this;
      _.__js_helper$_map = t0;
      _._modifications = t1;
      _._cell = t2;
      _.__js_helper$_current = null;
      _.$ti = t3;
    },
    JsIdentityLinkedHashMap: function JsIdentityLinkedHashMap(t0) {
      var _ = this;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _.__js_helper$_nums = _.__js_helper$_strings = null;
      _._modifications = 0;
      _.$ti = t0;
    },
    initHooks_closure: function initHooks_closure(t0) {
      this.getTag = t0;
    },
    initHooks_closure0: function initHooks_closure0(t0) {
      this.getUnknownTag = t0;
    },
    initHooks_closure1: function initHooks_closure1(t0) {
      this.prototypeForTag = t0;
    },
    _Record: function _Record() {
    },
    _Record2: function _Record2() {
    },
    JSSyntaxRegExp: function JSSyntaxRegExp(t0, t1) {
      var _ = this;
      _.pattern = t0;
      _._nativeRegExp = t1;
      _._hasCapturesCache = _._nativeAnchoredRegExp = _._nativeGlobalRegExp = null;
    },
    _MatchImplementation: function _MatchImplementation(t0) {
      this._match = t0;
    },
    _AllMatchesIterable: function _AllMatchesIterable(t0, t1, t2) {
      this._re = t0;
      this._string = t1;
      this.__js_helper$_start = t2;
    },
    _AllMatchesIterator: function _AllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._regExp = t0;
      _._string = t1;
      _._nextIndex = t2;
      _.__js_helper$_current = null;
    },
    StringMatch: function StringMatch(t0, t1) {
      this.start = t0;
      this.pattern = t1;
    },
    _StringAllMatchesIterable: function _StringAllMatchesIterable(t0, t1, t2) {
      this._input = t0;
      this._pattern = t1;
      this.__js_helper$_index = t2;
    },
    _StringAllMatchesIterator: function _StringAllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._input = t0;
      _._pattern = t1;
      _.__js_helper$_index = t2;
      _.__js_helper$_current = null;
    },
    throwLateFieldNI(fieldName) {
      throw A.initializeExceptionWrapper(A.LateError$fieldNI(fieldName), new Error());
    },
    throwLateFieldAI(fieldName) {
      throw A.initializeExceptionWrapper(A.LateError$fieldAI(fieldName), new Error());
    },
    throwLateFieldADI(fieldName) {
      throw A.initializeExceptionWrapper(A.LateError$fieldADI(fieldName), new Error());
    },
    _Cell$named(_name) {
      var t1 = new A._Cell(_name);
      return t1.__late_helper$_value = t1;
    },
    _Cell: function _Cell(t0) {
      this._name = t0;
      this.__late_helper$_value = null;
    },
    _checkLength($length) {
      return $length;
    },
    _ensureNativeList(list) {
      var t1, result, i;
      if (type$.JSIndexable_dynamic._is(list))
        return list;
      t1 = J.getInterceptor$asx(list);
      result = A.List_List$filled(t1.get$length(list), null, false, type$.dynamic);
      for (i = 0; i < t1.get$length(list); ++i)
        B.JSArray_methods.$indexSet(result, i, t1.$index(list, i));
      return result;
    },
    NativeInt8List__create1(arg) {
      return new Int8Array(arg);
    },
    NativeUint8List_NativeUint8List($length) {
      return new Uint8Array($length);
    },
    NativeUint8List_NativeUint8List$view(buffer, offsetInBytes, $length) {
      return $length == null ? new Uint8Array(buffer, offsetInBytes) : new Uint8Array(buffer, offsetInBytes, $length);
    },
    _checkValidIndex(index, list, $length) {
      if (index >>> 0 !== index || index >= $length)
        throw A.wrapException(A.diagnoseIndexError(list, index));
    },
    _checkValidRange(start, end, $length) {
      var t1;
      if (!(start >>> 0 !== start))
        if (end == null)
          t1 = start > $length;
        else
          t1 = end >>> 0 !== end || start > end || end > $length;
      else
        t1 = true;
      if (t1)
        throw A.wrapException(A.diagnoseRangeError(start, end, $length));
      if (end == null)
        return $length;
      return end;
    },
    NativeByteBuffer: function NativeByteBuffer() {
    },
    NativeArrayBuffer: function NativeArrayBuffer() {
    },
    NativeTypedData: function NativeTypedData() {
    },
    _UnmodifiableNativeByteBufferView: function _UnmodifiableNativeByteBufferView(t0) {
      this._data = t0;
    },
    NativeByteData: function NativeByteData() {
    },
    NativeTypedArray: function NativeTypedArray() {
    },
    NativeTypedArrayOfDouble: function NativeTypedArrayOfDouble() {
    },
    NativeTypedArrayOfInt: function NativeTypedArrayOfInt() {
    },
    NativeFloat32List: function NativeFloat32List() {
    },
    NativeFloat64List: function NativeFloat64List() {
    },
    NativeInt16List: function NativeInt16List() {
    },
    NativeInt32List: function NativeInt32List() {
    },
    NativeInt8List: function NativeInt8List() {
    },
    NativeUint16List: function NativeUint16List() {
    },
    NativeUint32List: function NativeUint32List() {
    },
    NativeUint8ClampedList: function NativeUint8ClampedList() {
    },
    NativeUint8List: function NativeUint8List() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    Rti__getFutureFromFutureOr(universe, rti) {
      var future = rti._precomputed1;
      return future == null ? rti._precomputed1 = A._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
    },
    Rti__isUnionOfFunctionType(rti) {
      var kind = rti._kind;
      if (kind === 6 || kind === 7)
        return A.Rti__isUnionOfFunctionType(rti._primary);
      return kind === 11 || kind === 12;
    },
    Rti__getCanonicalRecipe(rti) {
      return rti._canonicalRecipe;
    },
    findType(recipe) {
      return A._Universe_eval(init.typeUniverse, recipe, false);
    },
    instantiatedGenericFunctionType(genericFunctionRti, instantiationRti) {
      var t1, cache, key, probe, rti;
      if (genericFunctionRti == null)
        return null;
      t1 = instantiationRti._rest;
      cache = genericFunctionRti._bindCache;
      if (cache == null)
        cache = genericFunctionRti._bindCache = new Map();
      key = instantiationRti._canonicalRecipe;
      probe = cache.get(key);
      if (probe != null)
        return probe;
      rti = A._substitute(init.typeUniverse, genericFunctionRti._primary, t1, 0);
      cache.set(key, rti);
      return rti;
    },
    _substitute(universe, rti, typeArguments, depth) {
      var baseType, substitutedBaseType, interfaceTypeArguments, substitutedInterfaceTypeArguments, base, substitutedBase, $arguments, substitutedArguments, t1, fields, substitutedFields, returnType, substitutedReturnType, functionParameters, substitutedFunctionParameters, bounds, substitutedBounds, index, argument,
        kind = rti._kind;
      switch (kind) {
        case 5:
        case 1:
        case 2:
        case 3:
        case 4:
          return rti;
        case 6:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
        case 7:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
        case 8:
          interfaceTypeArguments = rti._rest;
          substitutedInterfaceTypeArguments = A._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
            return rti;
          return A._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
        case 9:
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          $arguments = rti._rest;
          substitutedArguments = A._substituteArray(universe, $arguments, typeArguments, depth);
          if (substitutedBase === base && substitutedArguments === $arguments)
            return rti;
          return A._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
        case 10:
          t1 = rti._primary;
          fields = rti._rest;
          substitutedFields = A._substituteArray(universe, fields, typeArguments, depth);
          if (substitutedFields === fields)
            return rti;
          return A._Universe__lookupRecordRti(universe, t1, substitutedFields);
        case 11:
          returnType = rti._primary;
          substitutedReturnType = A._substitute(universe, returnType, typeArguments, depth);
          functionParameters = rti._rest;
          substitutedFunctionParameters = A._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
            return rti;
          return A._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
        case 12:
          bounds = rti._rest;
          depth += bounds.length;
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, depth);
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          if (substitutedBounds === bounds && substitutedBase === base)
            return rti;
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, true);
        case 13:
          index = rti._primary;
          if (index < depth)
            return rti;
          argument = typeArguments[index - depth];
          if (argument == null)
            return rti;
          return argument;
        default:
          throw A.wrapException(A.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
      }
    },
    _substituteArray(universe, rtiArray, typeArguments, depth) {
      var changed, i, rti, substitutedRti,
        $length = rtiArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; ++i) {
        rti = rtiArray[i];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result[i] = substitutedRti;
      }
      return changed ? result : rtiArray;
    },
    _substituteNamed(universe, namedArray, typeArguments, depth) {
      var changed, i, t1, t2, rti, substitutedRti,
        $length = namedArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; i += 3) {
        t1 = namedArray[i];
        t2 = namedArray[i + 1];
        rti = namedArray[i + 2];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.splice(i, 3, t1, t2, substitutedRti);
      }
      return changed ? result : namedArray;
    },
    _substituteFunctionParameters(universe, functionParameters, typeArguments, depth) {
      var result,
        requiredPositional = functionParameters._requiredPositional,
        substitutedRequiredPositional = A._substituteArray(universe, requiredPositional, typeArguments, depth),
        optionalPositional = functionParameters._optionalPositional,
        substitutedOptionalPositional = A._substituteArray(universe, optionalPositional, typeArguments, depth),
        named = functionParameters._named,
        substitutedNamed = A._substituteNamed(universe, named, typeArguments, depth);
      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
        return functionParameters;
      result = new A._FunctionParameters();
      result._requiredPositional = substitutedRequiredPositional;
      result._optionalPositional = substitutedOptionalPositional;
      result._named = substitutedNamed;
      return result;
    },
    _setArrayType(target, rti) {
      target[init.arrayRti] = rti;
      return target;
    },
    closureFunctionType(closure) {
      var signature = closure.$signature;
      if (signature != null) {
        if (typeof signature == "number")
          return A.getTypeFromTypesTable(signature);
        return closure.$signature();
      }
      return null;
    },
    instanceOrFunctionType(object, testRti) {
      var rti;
      if (A.Rti__isUnionOfFunctionType(testRti))
        if (object instanceof A.Closure) {
          rti = A.closureFunctionType(object);
          if (rti != null)
            return rti;
        }
      return A.instanceType(object);
    },
    instanceType(object) {
      if (object instanceof A.Object)
        return A._instanceType(object);
      if (Array.isArray(object))
        return A._arrayInstanceType(object);
      return A._instanceTypeFromConstructor(J.getInterceptor$(object));
    },
    _arrayInstanceType(object) {
      var rti = object[init.arrayRti],
        defaultRti = type$.JSArray_dynamic;
      if (rti == null)
        return defaultRti;
      if (rti.constructor !== defaultRti.constructor)
        return defaultRti;
      return rti;
    },
    _instanceType(object) {
      var rti = object.$ti;
      return rti != null ? rti : A._instanceTypeFromConstructor(object);
    },
    _instanceTypeFromConstructor(instance) {
      var $constructor = instance.constructor,
        probe = $constructor.$ccache;
      if (probe != null)
        return probe;
      return A._instanceTypeFromConstructorMiss(instance, $constructor);
    },
    _instanceTypeFromConstructorMiss(instance, $constructor) {
      var effectiveConstructor = instance instanceof A.Closure ? Object.getPrototypeOf(Object.getPrototypeOf(instance)).constructor : $constructor,
        rti = A._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
      $constructor.$ccache = rti;
      return rti;
    },
    getTypeFromTypesTable(index) {
      var rti,
        table = init.types,
        type = table[index];
      if (typeof type == "string") {
        rti = A._Universe_eval(init.typeUniverse, type, false);
        table[index] = rti;
        return rti;
      }
      return type;
    },
    getRuntimeTypeOfDartObject(object) {
      return A.createRuntimeType(A._instanceType(object));
    },
    getRuntimeTypeOfClosure(closure) {
      var rti = A.closureFunctionType(closure);
      return A.createRuntimeType(rti == null ? A.instanceType(closure) : rti);
    },
    _structuralTypeOf(object) {
      var functionRti;
      if (object instanceof A._Record)
        return object._getRti$0();
      functionRti = object instanceof A.Closure ? A.closureFunctionType(object) : null;
      if (functionRti != null)
        return functionRti;
      if (type$.TrustedGetRuntimeType._is(object))
        return J.get$runtimeType$(object)._rti;
      if (Array.isArray(object))
        return A._arrayInstanceType(object);
      return A.instanceType(object);
    },
    createRuntimeType(rti) {
      var t1 = rti._cachedRuntimeType;
      return t1 == null ? rti._cachedRuntimeType = new A._Type(rti) : t1;
    },
    evaluateRtiForRecord(recordRecipe, valuesList) {
      var bindings, i,
        values = valuesList,
        $length = values.length;
      if ($length === 0)
        return type$.Record_0;
      if (0 >= $length)
        return A.ioore(values, 0);
      bindings = A._Universe_evalInEnvironment(init.typeUniverse, A._structuralTypeOf(values[0]), "@<0>");
      for (i = 1; i < $length; ++i) {
        if (!(i < values.length))
          return A.ioore(values, i);
        bindings = A._Universe_bind(init.typeUniverse, bindings, A._structuralTypeOf(values[i]));
      }
      return A._Universe_evalInEnvironment(init.typeUniverse, bindings, recordRecipe);
    },
    typeLiteral(recipe) {
      return A.createRuntimeType(A._Universe_eval(init.typeUniverse, recipe, false));
    },
    _installSpecializedIsTest(object) {
      var testRti = this;
      testRti._is = A._specializedIsTest(testRti);
      return testRti._is(object);
    },
    _specializedIsTest(testRti) {
      var kind, simpleIsFn, $name, predicate, t1;
      if (testRti === type$.Object)
        return A._isObject;
      if (A.isTopType(testRti))
        return A._isTop;
      kind = testRti._kind;
      if (kind === 6)
        return A._generalNullableIsTestImplementation;
      if (kind === 1)
        return A._isNever;
      if (kind === 7)
        return A._isFutureOr;
      simpleIsFn = A._simpleSpecializedIsTest(testRti);
      if (simpleIsFn != null)
        return simpleIsFn;
      if (kind === 8) {
        $name = testRti._primary;
        if (testRti._rest.every(A.isTopType)) {
          testRti._specializedTestResource = "$is" + $name;
          if ($name === "List")
            return A._isListTestViaProperty;
          if (testRti === type$.JSObject)
            return A._isJSObject;
          return A._isTestViaProperty;
        }
      } else if (kind === 10) {
        predicate = A.createRecordTypePredicate(testRti._primary, testRti._rest);
        t1 = predicate == null ? A._isNever : predicate;
        return t1 == null ? A._asObject(t1) : t1;
      }
      return A._generalIsTestImplementation;
    },
    _simpleSpecializedIsTest(testRti) {
      if (testRti._kind === 8) {
        if (testRti === type$.int)
          return A._isInt;
        if (testRti === type$.double || testRti === type$.num)
          return A._isNum;
        if (testRti === type$.String)
          return A._isString;
        if (testRti === type$.bool)
          return A._isBool;
      }
      return null;
    },
    _installSpecializedAsCheck(object) {
      var testRti = this,
        asFn = A._generalAsCheckImplementation;
      if (A.isTopType(testRti))
        asFn = A._asTop;
      else if (testRti === type$.Object)
        asFn = A._asObject;
      else if (A.isNullable(testRti)) {
        asFn = A._generalNullableAsCheckImplementation;
        if (testRti === type$.nullable_int)
          asFn = A._asIntQ;
        else if (testRti === type$.nullable_String)
          asFn = A._asStringQ;
        else if (testRti === type$.nullable_bool)
          asFn = A._asBoolQ;
        else if (testRti === type$.nullable_num)
          asFn = A._asNumQ;
        else if (testRti === type$.nullable_double)
          asFn = A._asDoubleQ;
        else if (testRti === type$.nullable_JSObject)
          asFn = A._asJSObjectQ;
      } else if (testRti === type$.int)
        asFn = A._asInt;
      else if (testRti === type$.String)
        asFn = A._asString;
      else if (testRti === type$.bool)
        asFn = A._asBool;
      else if (testRti === type$.num)
        asFn = A._asNum;
      else if (testRti === type$.double)
        asFn = A._asDouble;
      else if (testRti === type$.JSObject)
        asFn = A._asJSObject;
      testRti._as = asFn;
      return testRti._as(object);
    },
    _generalIsTestImplementation(object) {
      var testRti = this;
      if (object == null)
        return A.isNullable(testRti);
      return A.isSubtype(init.typeUniverse, A.instanceOrFunctionType(object, testRti), testRti);
    },
    _generalNullableIsTestImplementation(object) {
      if (object == null)
        return true;
      return this._primary._is(object);
    },
    _isTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A.isNullable(testRti);
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _isListTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A.isNullable(testRti);
      if (typeof object != "object")
        return false;
      if (Array.isArray(object))
        return true;
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _isJSObject(object) {
      var t1 = this;
      if (object == null)
        return false;
      if (typeof object == "object") {
        if (object instanceof A.Object)
          return !!object[t1._specializedTestResource];
        return true;
      }
      if (typeof object == "function")
        return true;
      return false;
    },
    _isJSObjectStandalone(object) {
      if (typeof object == "object") {
        if (object instanceof A.Object)
          return type$.JSObject._is(object);
        return true;
      }
      if (typeof object == "function")
        return true;
      return false;
    },
    _generalAsCheckImplementation(object) {
      var testRti = this;
      if (object == null) {
        if (A.isNullable(testRti))
          return object;
      } else if (testRti._is(object))
        return object;
      throw A.initializeExceptionWrapper(A._errorForAsCheck(object, testRti), new Error());
    },
    _generalNullableAsCheckImplementation(object) {
      var testRti = this;
      if (object == null || testRti._is(object))
        return object;
      throw A.initializeExceptionWrapper(A._errorForAsCheck(object, testRti), new Error());
    },
    _errorForAsCheck(object, testRti) {
      return new A._TypeError("TypeError: " + A._Error_compose(object, A._rtiToString(testRti, null)));
    },
    checkTypeBound(type, bound, variable, methodName) {
      if (A.isSubtype(init.typeUniverse, type, bound))
        return type;
      throw A.initializeExceptionWrapper(A._TypeError$fromMessage("The type argument '" + A._rtiToString(type, null) + "' is not a subtype of the type variable bound '" + A._rtiToString(bound, null) + "' of type variable '" + variable + "' in '" + methodName + "'."), new Error());
    },
    _Error_compose(object, checkedTypeDescription) {
      return A.Error_safeToString(object) + ": type '" + A._rtiToString(A._structuralTypeOf(object), null) + "' is not a subtype of type '" + checkedTypeDescription + "'";
    },
    _TypeError$fromMessage(message) {
      return new A._TypeError("TypeError: " + message);
    },
    _TypeError__TypeError$forType(object, type) {
      return new A._TypeError("TypeError: " + A._Error_compose(object, type));
    },
    _isFutureOr(object) {
      var testRti = this;
      return testRti._primary._is(object) || A.Rti__getFutureFromFutureOr(init.typeUniverse, testRti)._is(object);
    },
    _isObject(object) {
      return object != null;
    },
    _asObject(object) {
      if (object != null)
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "Object"), new Error());
    },
    _isTop(object) {
      return true;
    },
    _asTop(object) {
      return object;
    },
    _isNever(object) {
      return false;
    },
    _isBool(object) {
      return true === object || false === object;
    },
    _asBool(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "bool"), new Error());
    },
    _asBoolQ(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "bool?"), new Error());
    },
    _asDouble(object) {
      if (typeof object == "number")
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "double"), new Error());
    },
    _asDoubleQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "double?"), new Error());
    },
    _isInt(object) {
      return typeof object == "number" && Math.floor(object) === object;
    },
    _asInt(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "int"), new Error());
    },
    _asIntQ(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "int?"), new Error());
    },
    _isNum(object) {
      return typeof object == "number";
    },
    _asNum(object) {
      if (typeof object == "number")
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "num"), new Error());
    },
    _asNumQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "num?"), new Error());
    },
    _isString(object) {
      return typeof object == "string";
    },
    _asString(object) {
      if (typeof object == "string")
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "String"), new Error());
    },
    _asStringQ(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "String?"), new Error());
    },
    _asJSObject(object) {
      if (A._isJSObjectStandalone(object))
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "JSObject"), new Error());
    },
    _asJSObjectQ(object) {
      if (object == null)
        return object;
      if (A._isJSObjectStandalone(object))
        return object;
      throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "JSObject?"), new Error());
    },
    _rtiArrayToString(array, genericContext) {
      var s, sep, i;
      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
        s += sep + A._rtiToString(array[i], genericContext);
      return s;
    },
    _recordRtiToString(recordType, genericContext) {
      var fieldCount, names, namesIndex, s, comma, i,
        partialShape = recordType._primary,
        fields = recordType._rest;
      if ("" === partialShape)
        return "(" + A._rtiArrayToString(fields, genericContext) + ")";
      fieldCount = fields.length;
      names = partialShape.split(",");
      namesIndex = names.length - fieldCount;
      for (s = "(", comma = "", i = 0; i < fieldCount; ++i, comma = ", ") {
        s += comma;
        if (namesIndex === 0)
          s += "{";
        s += A._rtiToString(fields[i], genericContext);
        if (namesIndex >= 0)
          s += " " + names[namesIndex];
        ++namesIndex;
      }
      return s + "})";
    },
    _functionRtiToString(functionType, genericContext, bounds) {
      var boundsLength, offset, i, t1, typeParametersText, typeSep, t2, t3, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ", outerContextLength = null;
      if (bounds != null) {
        boundsLength = bounds.length;
        if (genericContext == null)
          genericContext = A._setArrayType([], type$.JSArray_String);
        else
          outerContextLength = genericContext.length;
        offset = genericContext.length;
        for (i = boundsLength; i > 0; --i)
          B.JSArray_methods.add$1(genericContext, "T" + (offset + i));
        for (t1 = type$.nullable_Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
          t2 = genericContext.length;
          t3 = t2 - 1 - i;
          if (!(t3 >= 0))
            return A.ioore(genericContext, t3);
          typeParametersText = typeParametersText + typeSep + genericContext[t3];
          boundRti = bounds[i];
          kind = boundRti._kind;
          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
            typeParametersText += " extends " + A._rtiToString(boundRti, genericContext);
        }
        typeParametersText += ">";
      } else
        typeParametersText = "";
      t1 = functionType._primary;
      parameters = functionType._rest;
      requiredPositional = parameters._requiredPositional;
      requiredPositionalLength = requiredPositional.length;
      optionalPositional = parameters._optionalPositional;
      optionalPositionalLength = optionalPositional.length;
      named = parameters._named;
      namedLength = named.length;
      returnTypeText = A._rtiToString(t1, genericContext);
      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
        argumentsText += sep + A._rtiToString(requiredPositional[i], genericContext);
      if (optionalPositionalLength > 0) {
        argumentsText += sep + "[";
        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
          argumentsText += sep + A._rtiToString(optionalPositional[i], genericContext);
        argumentsText += "]";
      }
      if (namedLength > 0) {
        argumentsText += sep + "{";
        for (sep = "", i = 0; i < namedLength; i += 3, sep = _s2_) {
          argumentsText += sep;
          if (named[i + 1])
            argumentsText += "required ";
          argumentsText += A._rtiToString(named[i + 2], genericContext) + " " + named[i];
        }
        argumentsText += "}";
      }
      if (outerContextLength != null) {
        genericContext.toString;
        genericContext.length = outerContextLength;
      }
      return typeParametersText + "(" + argumentsText + ") => " + returnTypeText;
    },
    _rtiToString(rti, genericContext) {
      var questionArgument, s, argumentKind, $name, $arguments, t1, t2,
        kind = rti._kind;
      if (kind === 5)
        return "erased";
      if (kind === 2)
        return "dynamic";
      if (kind === 3)
        return "void";
      if (kind === 1)
        return "Never";
      if (kind === 4)
        return "any";
      if (kind === 6) {
        questionArgument = rti._primary;
        s = A._rtiToString(questionArgument, genericContext);
        argumentKind = questionArgument._kind;
        return (argumentKind === 11 || argumentKind === 12 ? "(" + s + ")" : s) + "?";
      }
      if (kind === 7)
        return "FutureOr<" + A._rtiToString(rti._primary, genericContext) + ">";
      if (kind === 8) {
        $name = A._unminifyOrTag(rti._primary);
        $arguments = rti._rest;
        return $arguments.length > 0 ? $name + ("<" + A._rtiArrayToString($arguments, genericContext) + ">") : $name;
      }
      if (kind === 10)
        return A._recordRtiToString(rti, genericContext);
      if (kind === 11)
        return A._functionRtiToString(rti, genericContext, null);
      if (kind === 12)
        return A._functionRtiToString(rti._primary, genericContext, rti._rest);
      if (kind === 13) {
        t1 = rti._primary;
        t2 = genericContext.length;
        t1 = t2 - 1 - t1;
        if (!(t1 >= 0 && t1 < t2))
          return A.ioore(genericContext, t1);
        return genericContext[t1];
      }
      return "?";
    },
    _unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    _Universe_findRule(universe, targetType) {
      var rule = universe.tR[targetType];
      while (typeof rule == "string")
        rule = universe.tR[rule];
      return rule;
    },
    _Universe_findErasedType(universe, cls) {
      var $length, erased, $arguments, i, $interface,
        metadata = universe.eT,
        probe = metadata[cls];
      if (probe == null)
        return A._Universe_eval(universe, cls, false);
      else if (typeof probe == "number") {
        $length = probe;
        erased = A._Universe__lookupTerminalRti(universe, 5, "#");
        $arguments = A._Utils_newArrayOrEmpty($length);
        for (i = 0; i < $length; ++i)
          $arguments[i] = erased;
        $interface = A._Universe__lookupInterfaceRti(universe, cls, $arguments);
        metadata[cls] = $interface;
        return $interface;
      } else
        return probe;
    },
    _Universe_addRules(universe, rules) {
      return A._Utils_objectAssign(universe.tR, rules);
    },
    _Universe_addErasedTypes(universe, types) {
      return A._Utils_objectAssign(universe.eT, types);
    },
    _Universe_eval(universe, recipe, normalize) {
      var rti,
        cache = universe.eC,
        probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, null, recipe, false));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_evalInEnvironment(universe, environment, recipe) {
      var probe, rti,
        cache = environment._evalCache;
      if (cache == null)
        cache = environment._evalCache = new Map();
      probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, environment, recipe, true));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_bind(universe, environment, argumentsRti) {
      var argumentsRecipe, probe, rti,
        cache = environment._bindCache;
      if (cache == null)
        cache = environment._bindCache = new Map();
      argumentsRecipe = argumentsRti._canonicalRecipe;
      probe = cache.get(argumentsRecipe);
      if (probe != null)
        return probe;
      rti = A._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 9 ? argumentsRti._rest : [argumentsRti]);
      cache.set(argumentsRecipe, rti);
      return rti;
    },
    _Universe__installTypeTests(universe, rti) {
      rti._as = A._installSpecializedAsCheck;
      rti._is = A._installSpecializedIsTest;
      return rti;
    },
    _Universe__lookupTerminalRti(universe, kind, key) {
      var rti, t1,
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = kind;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupQuestionRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "?",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createQuestionRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createQuestionRti(universe, baseType, key, normalize) {
      var baseKind, t1, rti;
      if (normalize) {
        baseKind = baseType._kind;
        t1 = true;
        if (!A.isTopType(baseType))
          if (!(baseType === type$.Null || baseType === type$.JSNull))
            if (baseKind !== 6)
              t1 = baseKind === 7 && A.isNullable(baseType._primary);
        if (t1)
          return baseType;
        else if (baseKind === 1)
          return type$.Null;
      }
      rti = new A.Rti(null, null);
      rti._kind = 6;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupFutureOrRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "/",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createFutureOrRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createFutureOrRti(universe, baseType, key, normalize) {
      var t1, rti;
      if (normalize) {
        t1 = baseType._kind;
        if (A.isTopType(baseType) || baseType === type$.Object)
          return baseType;
        else if (t1 === 1)
          return A._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
        else if (baseType === type$.Null || baseType === type$.JSNull)
          return type$.nullable_Future_Null;
      }
      rti = new A.Rti(null, null);
      rti._kind = 7;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupGenericFunctionParameterRti(universe, index) {
      var rti, t1,
        key = "" + index + "^",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 13;
      rti._primary = index;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__canonicalRecipeJoin($arguments) {
      var s, sep, i,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; ++i, sep = ",")
        s += sep + $arguments[i]._canonicalRecipe;
      return s;
    },
    _Universe__canonicalRecipeJoinNamed($arguments) {
      var s, sep, i, t1, nameSep,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
        t1 = $arguments[i];
        nameSep = $arguments[i + 1] ? "!" : ":";
        s += sep + t1 + nameSep + $arguments[i + 2]._canonicalRecipe;
      }
      return s;
    },
    _Universe__lookupInterfaceRti(universe, $name, $arguments) {
      var probe, rti, t1,
        s = $name;
      if ($arguments.length > 0)
        s += "<" + A._Universe__canonicalRecipeJoin($arguments) + ">";
      probe = universe.eC.get(s);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 8;
      rti._primary = $name;
      rti._rest = $arguments;
      if ($arguments.length > 0)
        rti._precomputed1 = $arguments[0];
      rti._canonicalRecipe = s;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(s, t1);
      return t1;
    },
    _Universe__lookupBindingRti(universe, base, $arguments) {
      var newBase, newArguments, key, probe, rti, t1;
      if (base._kind === 9) {
        newBase = base._primary;
        newArguments = base._rest.concat($arguments);
      } else {
        newArguments = $arguments;
        newBase = base;
      }
      key = newBase._canonicalRecipe + (";<" + A._Universe__canonicalRecipeJoin(newArguments) + ">");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 9;
      rti._primary = newBase;
      rti._rest = newArguments;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupRecordRti(universe, partialShapeTag, fields) {
      var rti, t1,
        key = "+" + (partialShapeTag + "(" + A._Universe__canonicalRecipeJoin(fields) + ")"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 10;
      rti._primary = partialShapeTag;
      rti._rest = fields;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupFunctionRti(universe, returnType, parameters) {
      var sep, key, probe, rti, t1,
        s = returnType._canonicalRecipe,
        requiredPositional = parameters._requiredPositional,
        requiredPositionalLength = requiredPositional.length,
        optionalPositional = parameters._optionalPositional,
        optionalPositionalLength = optionalPositional.length,
        named = parameters._named,
        namedLength = named.length,
        recipe = "(" + A._Universe__canonicalRecipeJoin(requiredPositional);
      if (optionalPositionalLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        recipe += sep + "[" + A._Universe__canonicalRecipeJoin(optionalPositional) + "]";
      }
      if (namedLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        recipe += sep + "{" + A._Universe__canonicalRecipeJoinNamed(named) + "}";
      }
      key = s + (recipe + ")");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 11;
      rti._primary = returnType;
      rti._rest = parameters;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupGenericFunctionRti(universe, baseFunctionType, bounds, normalize) {
      var t1,
        key = baseFunctionType._canonicalRecipe + ("<" + A._Universe__canonicalRecipeJoin(bounds) + ">"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize) {
      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
      if (normalize) {
        $length = bounds.length;
        typeArguments = A._Utils_newArrayOrEmpty($length);
        for (count = 0, i = 0; i < $length; ++i) {
          bound = bounds[i];
          if (bound._kind === 1) {
            typeArguments[i] = bound;
            ++count;
          }
        }
        if (count > 0) {
          substitutedBase = A._substitute(universe, baseFunctionType, typeArguments, 0);
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, 0);
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
        }
      }
      rti = new A.Rti(null, null);
      rti._kind = 12;
      rti._primary = baseFunctionType;
      rti._rest = bounds;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Parser_create(universe, environment, recipe, normalize) {
      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
    },
    _Parser_parse(parser) {
      var t1, i, ch, u, array, end, item,
        source = parser.r,
        stack = parser.s;
      for (t1 = source.length, i = 0; i < t1;) {
        ch = source.charCodeAt(i);
        if (ch >= 48 && ch <= 57)
          i = A._Parser_handleDigit(i + 1, ch, source, stack);
        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36 || ch === 124)
          i = A._Parser_handleIdentifier(parser, i, source, stack, false);
        else if (ch === 46)
          i = A._Parser_handleIdentifier(parser, i, source, stack, true);
        else {
          ++i;
          switch (ch) {
            case 44:
              break;
            case 58:
              stack.push(false);
              break;
            case 33:
              stack.push(true);
              break;
            case 59:
              stack.push(A._Parser_toType(parser.u, parser.e, stack.pop()));
              break;
            case 94:
              stack.push(A._Universe__lookupGenericFunctionParameterRti(parser.u, stack.pop()));
              break;
            case 35:
              stack.push(A._Universe__lookupTerminalRti(parser.u, 5, "#"));
              break;
            case 64:
              stack.push(A._Universe__lookupTerminalRti(parser.u, 2, "@"));
              break;
            case 126:
              stack.push(A._Universe__lookupTerminalRti(parser.u, 3, "~"));
              break;
            case 60:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 62:
              A._Parser_handleTypeArguments(parser, stack);
              break;
            case 38:
              A._Parser_handleExtendedOperations(parser, stack);
              break;
            case 63:
              u = parser.u;
              stack.push(A._Universe__lookupQuestionRti(u, A._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 47:
              u = parser.u;
              stack.push(A._Universe__lookupFutureOrRti(u, A._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 40:
              stack.push(-3);
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 41:
              A._Parser_handleArguments(parser, stack);
              break;
            case 91:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 93:
              array = stack.splice(parser.p);
              A._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              stack.push(array);
              stack.push(-1);
              break;
            case 123:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 125:
              array = stack.splice(parser.p);
              A._Parser_toTypesNamed(parser.u, parser.e, array);
              parser.p = stack.pop();
              stack.push(array);
              stack.push(-2);
              break;
            case 43:
              end = source.indexOf("(", i);
              stack.push(source.substring(i, end));
              stack.push(-4);
              stack.push(parser.p);
              parser.p = stack.length;
              i = end + 1;
              break;
            default:
              throw "Bad character " + ch;
          }
        }
      }
      item = stack.pop();
      return A._Parser_toType(parser.u, parser.e, item);
    },
    _Parser_handleDigit(i, digit, source, stack) {
      var t1, ch,
        value = digit - 48;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (!(ch >= 48 && ch <= 57))
          break;
        value = value * 10 + (ch - 48);
      }
      stack.push(value);
      return i;
    },
    _Parser_handleIdentifier(parser, start, source, stack, hasPeriod) {
      var t1, ch, t2, string, environment, recipe,
        i = start + 1;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (ch === 46) {
          if (hasPeriod)
            break;
          hasPeriod = true;
        } else {
          if (!((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36 || ch === 124))
            t2 = ch >= 48 && ch <= 57;
          else
            t2 = true;
          if (!t2)
            break;
        }
      }
      string = source.substring(start, i);
      if (hasPeriod) {
        t1 = parser.u;
        environment = parser.e;
        if (environment._kind === 9)
          environment = environment._primary;
        recipe = A._Universe_findRule(t1, environment._primary)[string];
        if (recipe == null)
          A.throwExpression('No "' + string + '" in "' + A.Rti__getCanonicalRecipe(environment) + '"');
        stack.push(A._Universe_evalInEnvironment(t1, environment, recipe));
      } else
        stack.push(string);
      return i;
    },
    _Parser_handleTypeArguments(parser, stack) {
      var base,
        universe = parser.u,
        $arguments = A._Parser_collectArray(parser, stack),
        head = stack.pop();
      if (typeof head == "string")
        stack.push(A._Universe__lookupInterfaceRti(universe, head, $arguments));
      else {
        base = A._Parser_toType(universe, parser.e, head);
        switch (base._kind) {
          case 11:
            stack.push(A._Universe__lookupGenericFunctionRti(universe, base, $arguments, parser.n));
            break;
          default:
            stack.push(A._Universe__lookupBindingRti(universe, base, $arguments));
            break;
        }
      }
    },
    _Parser_handleArguments(parser, stack) {
      var requiredPositional, returnType, parameters,
        universe = parser.u,
        head = stack.pop(),
        optionalPositional = null, named = null;
      if (typeof head == "number")
        switch (head) {
          case -1:
            optionalPositional = stack.pop();
            break;
          case -2:
            named = stack.pop();
            break;
          default:
            stack.push(head);
            break;
        }
      else
        stack.push(head);
      requiredPositional = A._Parser_collectArray(parser, stack);
      head = stack.pop();
      switch (head) {
        case -3:
          head = stack.pop();
          if (optionalPositional == null)
            optionalPositional = universe.sEA;
          if (named == null)
            named = universe.sEA;
          returnType = A._Parser_toType(universe, parser.e, head);
          parameters = new A._FunctionParameters();
          parameters._requiredPositional = requiredPositional;
          parameters._optionalPositional = optionalPositional;
          parameters._named = named;
          stack.push(A._Universe__lookupFunctionRti(universe, returnType, parameters));
          return;
        case -4:
          stack.push(A._Universe__lookupRecordRti(universe, stack.pop(), requiredPositional));
          return;
        default:
          throw A.wrapException(A.AssertionError$("Unexpected state under `()`: " + A.S(head)));
      }
    },
    _Parser_handleExtendedOperations(parser, stack) {
      var $top = stack.pop();
      if (0 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 1, "0&"));
        return;
      }
      if (1 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 4, "1&"));
        return;
      }
      throw A.wrapException(A.AssertionError$("Unexpected extended operation " + A.S($top)));
    },
    _Parser_collectArray(parser, stack) {
      var array = stack.splice(parser.p);
      A._Parser_toTypes(parser.u, parser.e, array);
      parser.p = stack.pop();
      return array;
    },
    _Parser_toType(universe, environment, item) {
      if (typeof item == "string")
        return A._Universe__lookupInterfaceRti(universe, item, universe.sEA);
      else if (typeof item == "number") {
        environment.toString;
        return A._Parser_indexToType(universe, environment, item);
      } else
        return item;
    },
    _Parser_toTypes(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 0; i < $length; ++i)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_toTypesNamed(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 2; i < $length; i += 3)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_indexToType(universe, environment, index) {
      var typeArguments, len,
        kind = environment._kind;
      if (kind === 9) {
        if (index === 0)
          return environment._primary;
        typeArguments = environment._rest;
        len = typeArguments.length;
        if (index <= len)
          return typeArguments[index - 1];
        index -= len;
        environment = environment._primary;
        kind = environment._kind;
      } else if (index === 0)
        return environment;
      if (kind !== 8)
        throw A.wrapException(A.AssertionError$("Indexed base must be an interface type"));
      typeArguments = environment._rest;
      if (index <= typeArguments.length)
        return typeArguments[index - 1];
      throw A.wrapException(A.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
    },
    isSubtype(universe, s, t) {
      var result,
        sCache = s._isSubtypeCache;
      if (sCache == null)
        sCache = s._isSubtypeCache = new Map();
      result = sCache.get(t);
      if (result == null) {
        result = A._isSubtype(universe, s, null, t, null);
        sCache.set(t, result);
      }
      return result;
    },
    _isSubtype(universe, s, sEnv, t, tEnv) {
      var sKind, leftTypeVariable, tKind, t1, t2, sBounds, tBounds, sLength, i, sBound, tBound;
      if (s === t)
        return true;
      if (A.isTopType(t))
        return true;
      sKind = s._kind;
      if (sKind === 4)
        return true;
      if (A.isTopType(s))
        return false;
      if (s._kind === 1)
        return true;
      leftTypeVariable = sKind === 13;
      if (leftTypeVariable)
        if (A._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
          return true;
      tKind = t._kind;
      t1 = type$.Null;
      if (s === t1 || s === type$.JSNull) {
        if (tKind === 7)
          return A._isSubtype(universe, s, sEnv, t._primary, tEnv);
        return t === t1 || t === type$.JSNull || tKind === 6;
      }
      if (t === type$.Object) {
        if (sKind === 7)
          return A._isSubtype(universe, s._primary, sEnv, t, tEnv);
        return sKind !== 6;
      }
      if (sKind === 7) {
        if (!A._isSubtype(universe, s._primary, sEnv, t, tEnv))
          return false;
        return A._isSubtype(universe, A.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
      }
      if (sKind === 6)
        return A._isSubtype(universe, t1, sEnv, t, tEnv) && A._isSubtype(universe, s._primary, sEnv, t, tEnv);
      if (tKind === 7) {
        if (A._isSubtype(universe, s, sEnv, t._primary, tEnv))
          return true;
        return A._isSubtype(universe, s, sEnv, A.Rti__getFutureFromFutureOr(universe, t), tEnv);
      }
      if (tKind === 6)
        return A._isSubtype(universe, s, sEnv, t1, tEnv) || A._isSubtype(universe, s, sEnv, t._primary, tEnv);
      if (leftTypeVariable)
        return false;
      t1 = sKind !== 11;
      if ((!t1 || sKind === 12) && t === type$.Function)
        return true;
      t2 = sKind === 10;
      if (t2 && t === type$.Record)
        return true;
      if (tKind === 12) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (sKind !== 12)
          return false;
        sBounds = s._rest;
        tBounds = t._rest;
        sLength = sBounds.length;
        if (sLength !== tBounds.length)
          return false;
        sEnv = sEnv == null ? sBounds : sBounds.concat(sEnv);
        tEnv = tEnv == null ? tBounds : tBounds.concat(tEnv);
        for (i = 0; i < sLength; ++i) {
          sBound = sBounds[i];
          tBound = tBounds[i];
          if (!A._isSubtype(universe, sBound, sEnv, tBound, tEnv) || !A._isSubtype(universe, tBound, tEnv, sBound, sEnv))
            return false;
        }
        return A._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv);
      }
      if (tKind === 11) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (t1)
          return false;
        return A._isFunctionSubtype(universe, s, sEnv, t, tEnv);
      }
      if (sKind === 8) {
        if (tKind !== 8)
          return false;
        return A._isInterfaceSubtype(universe, s, sEnv, t, tEnv);
      }
      if (t2 && tKind === 10)
        return A._isRecordSubtype(universe, s, sEnv, t, tEnv);
      return false;
    },
    _isFunctionSubtype(universe, s, sEnv, t, tEnv) {
      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName, sIsRequired;
      if (!A._isSubtype(universe, s._primary, sEnv, t._primary, tEnv))
        return false;
      sParameters = s._rest;
      tParameters = t._rest;
      sRequiredPositional = sParameters._requiredPositional;
      tRequiredPositional = tParameters._requiredPositional;
      sRequiredPositionalLength = sRequiredPositional.length;
      tRequiredPositionalLength = tRequiredPositional.length;
      if (sRequiredPositionalLength > tRequiredPositionalLength)
        return false;
      requiredPositionalDelta = tRequiredPositionalLength - sRequiredPositionalLength;
      sOptionalPositional = sParameters._optionalPositional;
      tOptionalPositional = tParameters._optionalPositional;
      sOptionalPositionalLength = sOptionalPositional.length;
      tOptionalPositionalLength = tOptionalPositional.length;
      if (sRequiredPositionalLength + sOptionalPositionalLength < tRequiredPositionalLength + tOptionalPositionalLength)
        return false;
      for (i = 0; i < sRequiredPositionalLength; ++i) {
        t1 = sRequiredPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < requiredPositionalDelta; ++i) {
        t1 = sOptionalPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < tOptionalPositionalLength; ++i) {
        t1 = sOptionalPositional[requiredPositionalDelta + i];
        if (!A._isSubtype(universe, tOptionalPositional[i], tEnv, t1, sEnv))
          return false;
      }
      sNamed = sParameters._named;
      tNamed = tParameters._named;
      sNamedLength = sNamed.length;
      tNamedLength = tNamed.length;
      for (sIndex = 0, tIndex = 0; tIndex < tNamedLength; tIndex += 3) {
        tName = tNamed[tIndex];
        for (;;) {
          if (sIndex >= sNamedLength)
            return false;
          sName = sNamed[sIndex];
          sIndex += 3;
          if (tName < sName)
            return false;
          sIsRequired = sNamed[sIndex - 2];
          if (sName < tName) {
            if (sIsRequired)
              return false;
            continue;
          }
          t1 = tNamed[tIndex + 1];
          if (sIsRequired && !t1)
            return false;
          t1 = sNamed[sIndex - 1];
          if (!A._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
            return false;
          break;
        }
      }
      while (sIndex < sNamedLength) {
        if (sNamed[sIndex + 1])
          return false;
        sIndex += 3;
      }
      return true;
    },
    _isInterfaceSubtype(universe, s, sEnv, t, tEnv) {
      var rule, recipes, $length, supertypeArgs, i,
        sName = s._primary,
        tName = t._primary;
      while (sName !== tName) {
        rule = universe.tR[sName];
        if (rule == null)
          return false;
        if (typeof rule == "string") {
          sName = rule;
          continue;
        }
        recipes = rule[tName];
        if (recipes == null)
          return false;
        $length = recipes.length;
        supertypeArgs = $length > 0 ? new Array($length) : init.typeUniverse.sEA;
        for (i = 0; i < $length; ++i)
          supertypeArgs[i] = A._Universe_evalInEnvironment(universe, s, recipes[i]);
        return A._areArgumentsSubtypes(universe, supertypeArgs, null, sEnv, t._rest, tEnv);
      }
      return A._areArgumentsSubtypes(universe, s._rest, null, sEnv, t._rest, tEnv);
    },
    _areArgumentsSubtypes(universe, sArgs, sVariances, sEnv, tArgs, tEnv) {
      var i,
        $length = sArgs.length;
      for (i = 0; i < $length; ++i)
        if (!A._isSubtype(universe, sArgs[i], sEnv, tArgs[i], tEnv))
          return false;
      return true;
    },
    _isRecordSubtype(universe, s, sEnv, t, tEnv) {
      var i,
        sFields = s._rest,
        tFields = t._rest,
        sCount = sFields.length;
      if (sCount !== tFields.length)
        return false;
      if (s._primary !== t._primary)
        return false;
      for (i = 0; i < sCount; ++i)
        if (!A._isSubtype(universe, sFields[i], sEnv, tFields[i], tEnv))
          return false;
      return true;
    },
    isNullable(t) {
      var kind = t._kind,
        t1 = true;
      if (!(t === type$.Null || t === type$.JSNull))
        if (!A.isTopType(t))
          if (kind !== 6)
            t1 = kind === 7 && A.isNullable(t._primary);
      return t1;
    },
    isTopType(t) {
      var kind = t._kind;
      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
    },
    _Utils_objectAssign(o, other) {
      var i, key,
        keys = Object.keys(other),
        $length = keys.length;
      for (i = 0; i < $length; ++i) {
        key = keys[i];
        o[key] = other[key];
      }
    },
    _Utils_newArrayOrEmpty($length) {
      return $length > 0 ? new Array($length) : init.typeUniverse.sEA;
    },
    Rti: function Rti(t0, t1) {
      var _ = this;
      _._as = t0;
      _._is = t1;
      _._cachedRuntimeType = _._specializedTestResource = _._isSubtypeCache = _._precomputed1 = null;
      _._kind = 0;
      _._canonicalRecipe = _._bindCache = _._evalCache = _._rest = _._primary = null;
    },
    _FunctionParameters: function _FunctionParameters() {
      this._named = this._optionalPositional = this._requiredPositional = null;
    },
    _Type: function _Type(t0) {
      this._rti = t0;
    },
    _Error: function _Error() {
    },
    _TypeError: function _TypeError(t0) {
      this.__rti$_message = t0;
    },
    _AsyncRun__initializeScheduleImmediate() {
      var t1, div, span;
      if (self.scheduleImmediate != null)
        return A.async__AsyncRun__scheduleImmediateJsOverride$closure();
      if (self.MutationObserver != null && self.document != null) {
        t1 = {};
        div = self.document.createElement("div");
        span = self.document.createElement("span");
        t1.storedCallback = null;
        new self.MutationObserver(A.convertDartClosureToJS(new A._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
        return new A._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
      } else if (self.setImmediate != null)
        return A.async__AsyncRun__scheduleImmediateWithSetImmediate$closure();
      return A.async__AsyncRun__scheduleImmediateWithTimer$closure();
    },
    _AsyncRun__scheduleImmediateJsOverride(callback) {
      self.scheduleImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateJsOverride_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithSetImmediate(callback) {
      self.setImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithTimer(callback) {
      A.Timer__createTimer(B.Duration_0, type$.void_Function._as(callback));
    },
    Timer__createTimer(duration, callback) {
      var milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _TimerImpl$(milliseconds, callback) {
      var t1 = new A._TimerImpl(true);
      t1._TimerImpl$2(milliseconds, callback);
      return t1;
    },
    _TimerImpl$periodic(milliseconds, callback) {
      var t1 = new A._TimerImpl(false);
      t1._TimerImpl$periodic$2(milliseconds, callback);
      return t1;
    },
    _makeAsyncAwaitCompleter($T) {
      return new A._AsyncAwaitCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
    },
    _asyncStartSync(bodyFunction, completer) {
      bodyFunction.call$2(0, null);
      completer.isSync = true;
      return completer._future;
    },
    _asyncAwait(object, bodyFunction) {
      A._awaitOnObject(object, bodyFunction);
    },
    _asyncReturn(object, completer) {
      completer.complete$1(object);
    },
    _asyncRethrow(object, completer) {
      completer.completeError$2(A.unwrapException(object), A.getTraceFromException(object));
    },
    _awaitOnObject(object, bodyFunction) {
      var t1, future,
        thenCallback = new A._awaitOnObject_closure(bodyFunction),
        errorCallback = new A._awaitOnObject_closure0(bodyFunction);
      if (object instanceof A._Future)
        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
      else {
        t1 = type$.dynamic;
        if (object instanceof A._Future)
          object.then$1$2$onError(thenCallback, errorCallback, t1);
        else {
          future = new A._Future($.Zone__current, type$._Future_dynamic);
          future._state = 8;
          future._resultOrListeners = object;
          future._thenAwait$1$2(thenCallback, errorCallback, t1);
        }
      }
    },
    _wrapJsFunctionForAsync($function) {
      var $protected = function(fn, ERROR) {
        return function(errorCode, result) {
          while (true) {
            try {
              fn(errorCode, result);
              break;
            } catch (error) {
              result = error;
              errorCode = ERROR;
            }
          }
        };
      }($function, 1);
      return $.Zone__current.registerBinaryCallback$3$1(new A._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
    },
    _asyncStarHelper(object, bodyFunctionOrErrorCode, controller) {
      var t1, t2, t3,
        _s10_ = "controller";
      if (bodyFunctionOrErrorCode === 0) {
        t1 = controller.cancelationFuture;
        if (t1 != null)
          t1._completeWithValue$1(null);
        else {
          t1 = controller.___AsyncStarStreamController_controller_A;
          t1 === $ && A.throwLateFieldNI(_s10_);
          t1.close$0();
        }
        return;
      } else if (bodyFunctionOrErrorCode === 1) {
        t1 = controller.cancelationFuture;
        if (t1 != null) {
          t2 = A.unwrapException(object);
          t3 = A.getTraceFromException(object);
          t1._completeErrorObject$1(new A.AsyncError(t2, t3));
        } else {
          t1 = A.unwrapException(object);
          t2 = A.getTraceFromException(object);
          t3 = controller.___AsyncStarStreamController_controller_A;
          t3 === $ && A.throwLateFieldNI(_s10_);
          t3.addError$2(t1, t2);
          controller.___AsyncStarStreamController_controller_A.close$0();
        }
        return;
      }
      type$.void_Function_int_dynamic._as(bodyFunctionOrErrorCode);
      if (object instanceof A._IterationMarker) {
        if (controller.cancelationFuture != null) {
          bodyFunctionOrErrorCode.call$2(2, null);
          return;
        }
        t1 = object.state;
        if (t1 === 0) {
          t1 = object.value;
          t2 = controller.___AsyncStarStreamController_controller_A;
          t2 === $ && A.throwLateFieldNI(_s10_);
          t2.add$1(0, controller.$ti._precomputed1._as(t1));
          A.scheduleMicrotask(new A._asyncStarHelper_closure(controller, bodyFunctionOrErrorCode));
          return;
        } else if (t1 === 1) {
          t1 = controller.$ti._eval$1("Stream<1>")._as(type$.Stream_dynamic._as(object.value));
          t2 = controller.___AsyncStarStreamController_controller_A;
          t2 === $ && A.throwLateFieldNI(_s10_);
          t2.addStream$2$cancelOnError(t1, false).then$1$1(new A._asyncStarHelper_closure0(controller, bodyFunctionOrErrorCode), type$.Null);
          return;
        }
      }
      A._awaitOnObject(object, bodyFunctionOrErrorCode);
    },
    _streamOfController(controller) {
      var t1 = controller.___AsyncStarStreamController_controller_A;
      t1 === $ && A.throwLateFieldNI("controller");
      return new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>"));
    },
    _AsyncStarStreamController$(body, $T) {
      var t1 = new A._AsyncStarStreamController($T._eval$1("_AsyncStarStreamController<0>"));
      t1._AsyncStarStreamController$1(body, $T);
      return t1;
    },
    _makeAsyncStarStreamController(body, $T) {
      return A._AsyncStarStreamController$(body, $T);
    },
    _IterationMarker_yieldStar(values) {
      return new A._IterationMarker(values, 1);
    },
    _IterationMarker_yieldSingle(value) {
      return new A._IterationMarker(value, 0);
    },
    AsyncError_defaultStackTrace(error) {
      var stackTrace;
      if (type$.Error._is(error)) {
        stackTrace = error.get$stackTrace();
        if (stackTrace != null)
          return stackTrace;
      }
      return B._StringStackTrace_OdL;
    },
    Future_Future$microtask(computation, $T) {
      var result = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      A.scheduleMicrotask(new A.Future_Future$microtask_closure(computation, result));
      return result;
    },
    Future_Future$sync(computation, $T) {
      var error, stackTrace, exception, t1, t2, t3, t4, result = null;
      try {
        result = computation.call$0();
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
        t2 = error;
        t3 = stackTrace;
        t4 = A._interceptError(t2, t3);
        if (t4 == null)
          t2 = new A.AsyncError(t2, t3 == null ? A.AsyncError_defaultStackTrace(t2) : t3);
        else
          t2 = t4;
        t1._asyncCompleteErrorObject$1(t2);
        return t1;
      }
      return $T._eval$1("Future<0>")._is(result) ? result : A._Future$value(result, $T);
    },
    Future_Future$value(value, $T) {
      var t1 = value == null ? $T._as(value) : value,
        t2 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      t2._asyncComplete$1(t1);
      return t2;
    },
    Completer_Completer($T) {
      return new A._AsyncCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncCompleter<0>"));
    },
    _interceptError(error, stackTrace) {
      var replacement, t1, t2,
        zone = $.Zone__current;
      if (zone === B.C__RootZone)
        return null;
      replacement = zone.errorCallback$2(error, stackTrace);
      if (replacement == null)
        return null;
      t1 = replacement.error;
      t2 = replacement.stackTrace;
      if (type$.Error._is(t1))
        A.Primitives_trySetStackTrace(t1, t2);
      return replacement;
    },
    _interceptUserError(error, stackTrace) {
      var replacement;
      if ($.Zone__current !== B.C__RootZone) {
        replacement = A._interceptError(error, stackTrace);
        if (replacement != null)
          return replacement;
      }
      if (stackTrace == null)
        if (type$.Error._is(error)) {
          stackTrace = error.get$stackTrace();
          if (stackTrace == null) {
            A.Primitives_trySetStackTrace(error, B._StringStackTrace_OdL);
            stackTrace = B._StringStackTrace_OdL;
          }
        } else
          stackTrace = B._StringStackTrace_OdL;
      else if (type$.Error._is(error))
        A.Primitives_trySetStackTrace(error, stackTrace);
      return new A.AsyncError(error, stackTrace);
    },
    _Future$value(value, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      $T._as(value);
      t1._state = 8;
      t1._resultOrListeners = value;
      return t1;
    },
    _Future__chainCoreFuture(source, target, sync) {
      var t2, t3, ignoreError, listeners, _box_0 = {},
        t1 = _box_0.source = source;
      for (t2 = type$._Future_dynamic; t3 = t1._state, (t3 & 4) !== 0; t1 = source) {
        source = t2._as(t1._resultOrListeners);
        _box_0.source = source;
      }
      if (t1 === target) {
        t2 = A.StackTrace_current();
        target._asyncCompleteErrorObject$1(new A.AsyncError(new A.ArgumentError(true, t1, null, "Cannot complete a future with itself"), t2));
        return;
      }
      ignoreError = target._state & 1;
      t2 = t1._state = t3 | ignoreError;
      if ((t2 & 24) === 0) {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._state = target._state & 1 | 4;
        target._resultOrListeners = t1;
        t1._prependListeners$1(listeners);
        return;
      }
      if (!sync)
        if (target._resultOrListeners == null)
          t1 = (t2 & 16) === 0 || ignoreError !== 0;
        else
          t1 = false;
      else
        t1 = true;
      if (t1) {
        listeners = target._removeListeners$0();
        target._cloneResult$1(_box_0.source);
        A._Future__propagateToListeners(target, listeners);
        return;
      }
      target._state ^= 2;
      target._zone.scheduleMicrotask$1(new A._Future__chainCoreFuture_closure(_box_0, target));
    },
    _Future__propagateToListeners(source, listeners) {
      var t2, t3, _box_0, t4, t5, hasError, asyncError, nextListener, nextListener0, sourceResult, t6, zone, oldZone, result, current, _box_1 = {},
        t1 = _box_1.source = source;
      for (t2 = type$.AsyncError, t3 = type$.nullable__FutureListener_dynamic_dynamic;;) {
        _box_0 = {};
        t4 = t1._state;
        t5 = (t4 & 16) === 0;
        hasError = !t5;
        if (listeners == null) {
          if (hasError && (t4 & 1) === 0) {
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
          }
          return;
        }
        _box_0.listener = listeners;
        nextListener = listeners._nextListener;
        for (t1 = listeners; nextListener != null; t1 = nextListener, nextListener = nextListener0) {
          t1._nextListener = null;
          A._Future__propagateToListeners(_box_1.source, t1);
          _box_0.listener = nextListener;
          nextListener0 = nextListener._nextListener;
        }
        t4 = _box_1.source;
        sourceResult = t4._resultOrListeners;
        _box_0.listenerHasError = hasError;
        _box_0.listenerValueOrError = sourceResult;
        if (t5) {
          t6 = t1.state;
          t6 = (t6 & 1) !== 0 || (t6 & 15) === 8;
        } else
          t6 = true;
        if (t6) {
          zone = t1.result._zone;
          if (hasError) {
            t1 = t4._zone;
            t1 = !(t1 === zone || t1.get$errorZone() === zone.get$errorZone());
          } else
            t1 = false;
          if (t1) {
            t1 = _box_1.source;
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
            return;
          }
          oldZone = $.Zone__current;
          if (oldZone !== zone)
            $.Zone__current = zone;
          else
            oldZone = null;
          t1 = _box_0.listener.state;
          if ((t1 & 15) === 8)
            new A._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
          else if (t5) {
            if ((t1 & 1) !== 0)
              new A._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
          } else if ((t1 & 2) !== 0)
            new A._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
          if (oldZone != null)
            $.Zone__current = oldZone;
          t1 = _box_0.listenerValueOrError;
          if (t1 instanceof A._Future) {
            t4 = _box_0.listener.$ti;
            t4 = t4._eval$1("Future<2>")._is(t1) || !t4._rest[1]._is(t1);
          } else
            t4 = false;
          if (t4) {
            result = _box_0.listener.result;
            if ((t1._state & 24) !== 0) {
              current = t3._as(result._resultOrListeners);
              result._resultOrListeners = null;
              listeners = result._reverseListeners$1(current);
              result._state = t1._state & 30 | result._state & 1;
              result._resultOrListeners = t1._resultOrListeners;
              _box_1.source = t1;
              continue;
            } else
              A._Future__chainCoreFuture(t1, result, true);
            return;
          }
        }
        result = _box_0.listener.result;
        current = t3._as(result._resultOrListeners);
        result._resultOrListeners = null;
        listeners = result._reverseListeners$1(current);
        t1 = _box_0.listenerHasError;
        t4 = _box_0.listenerValueOrError;
        if (!t1) {
          result.$ti._precomputed1._as(t4);
          result._state = 8;
          result._resultOrListeners = t4;
        } else {
          t2._as(t4);
          result._state = result._state & 1 | 16;
          result._resultOrListeners = t4;
        }
        _box_1.source = result;
        t1 = result;
      }
    },
    _registerErrorHandler(errorHandler, zone) {
      if (type$.dynamic_Function_Object_StackTrace._is(errorHandler))
        return zone.registerBinaryCallback$3$1(errorHandler, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.dynamic_Function_Object._is(errorHandler))
        return zone.registerUnaryCallback$2$1(errorHandler, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$value(errorHandler, "onError", string$.Error_));
    },
    _microtaskLoop() {
      var entry, next;
      for (entry = $._nextCallback; entry != null; entry = $._nextCallback) {
        $._lastPriorityCallback = null;
        next = entry.next;
        $._nextCallback = next;
        if (next == null)
          $._lastCallback = null;
        entry.callback.call$0();
      }
    },
    _startMicrotaskLoop() {
      $._isInCallbackLoop = true;
      try {
        A._microtaskLoop();
      } finally {
        $._lastPriorityCallback = null;
        $._isInCallbackLoop = false;
        if ($._nextCallback != null)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      }
    },
    _scheduleAsyncCallback(callback) {
      var newEntry = new A._AsyncCallbackEntry(callback),
        lastCallback = $._lastCallback;
      if (lastCallback == null) {
        $._nextCallback = $._lastCallback = newEntry;
        if (!$._isInCallbackLoop)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      } else
        $._lastCallback = lastCallback.next = newEntry;
    },
    _schedulePriorityAsyncCallback(callback) {
      var entry, lastPriorityCallback, next,
        t1 = $._nextCallback;
      if (t1 == null) {
        A._scheduleAsyncCallback(callback);
        $._lastPriorityCallback = $._lastCallback;
        return;
      }
      entry = new A._AsyncCallbackEntry(callback);
      lastPriorityCallback = $._lastPriorityCallback;
      if (lastPriorityCallback == null) {
        entry.next = t1;
        $._nextCallback = $._lastPriorityCallback = entry;
      } else {
        next = lastPriorityCallback.next;
        entry.next = next;
        $._lastPriorityCallback = lastPriorityCallback.next = entry;
        if (next == null)
          $._lastCallback = entry;
      }
    },
    scheduleMicrotask(callback) {
      var t1, _null = null,
        currentZone = $.Zone__current;
      if (B.C__RootZone === currentZone) {
        A._rootScheduleMicrotask(_null, _null, B.C__RootZone, callback);
        return;
      }
      if (B.C__RootZone === currentZone.get$_scheduleMicrotask().zone)
        t1 = B.C__RootZone.get$errorZone() === currentZone.get$errorZone();
      else
        t1 = false;
      if (t1) {
        A._rootScheduleMicrotask(_null, _null, currentZone, currentZone.registerCallback$1$1(callback, type$.void));
        return;
      }
      t1 = $.Zone__current;
      t1.scheduleMicrotask$1(t1.bindCallbackGuarded$1(callback));
    },
    StreamIterator_StreamIterator(stream, $T) {
      A.checkNotNullable(stream, "stream", type$.Object);
      return new A._StreamIterator($T._eval$1("_StreamIterator<0>"));
    },
    StreamController_StreamController(onCancel, onListen, onResume, sync, $T) {
      return sync ? new A._SyncStreamController(onListen, null, onResume, onCancel, $T._eval$1("_SyncStreamController<0>")) : new A._AsyncStreamController(onListen, null, onResume, onCancel, $T._eval$1("_AsyncStreamController<0>"));
    },
    _runGuarded(notificationHandler) {
      var e, s, exception;
      if (notificationHandler == null)
        return;
      try {
        notificationHandler.call$0();
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current.handleUncaughtError$2(e, s);
      }
    },
    _AddStreamState_makeErrorHandler(controller) {
      return new A._AddStreamState_makeErrorHandler_closure(controller);
    },
    _BufferingStreamSubscription__registerDataHandler(zone, handleData, $T) {
      var t1 = handleData == null ? A.async___nullDataHandler$closure() : handleData;
      return zone.registerUnaryCallback$2$1(t1, type$.void, $T);
    },
    _BufferingStreamSubscription__registerErrorHandler(zone, handleError) {
      if (handleError == null)
        handleError = A.async___nullErrorHandler$closure();
      if (type$.void_Function_Object_StackTrace._is(handleError))
        return zone.registerBinaryCallback$3$1(handleError, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.void_Function_Object._is(handleError))
        return zone.registerUnaryCallback$2$1(handleError, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace.", null));
    },
    _nullDataHandler(value) {
    },
    _nullErrorHandler(error, stackTrace) {
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      $.Zone__current.handleUncaughtError$2(error, stackTrace);
    },
    _nullDoneHandler() {
    },
    _cancelAndValue(subscription, future, value) {
      var cancelFuture = subscription.cancel$0();
      if (cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new A._cancelAndValue_closure(future, value));
      else
        future._complete$1(value);
    },
    Timer_Timer(duration, callback) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return t1.createTimer$2(duration, callback);
      return t1.createTimer$2(duration, t1.bindCallbackGuarded$1(callback));
    },
    ZoneSpecification_ZoneSpecification$from(other, handleUncaughtError) {
      var t1 = handleUncaughtError == null ? other.handleUncaughtError : handleUncaughtError;
      return new A._ZoneSpecification(t1, other.run, other.runUnary, other.runBinary, other.registerCallback, other.registerUnaryCallback, other.registerBinaryCallback, other.errorCallback, other.scheduleMicrotask, other.createTimer, other.createPeriodicTimer, other.print, other.fork);
    },
    _rootHandleUncaughtError($self, $parent, zone, error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    _rootHandleError(error, stackTrace) {
      A._schedulePriorityAsyncCallback(new A._rootHandleError_closure(error, stackTrace));
    },
    _rootRun($self, $parent, zone, f, $R) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("0()")._as(f);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$0();
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$0();
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunUnary($self, $parent, zone, f, arg, $R, $T) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$1(arg);
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$1(arg);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunBinary($self, $parent, zone, f, arg1, arg2, $R, $T1, $T2) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f);
      $T1._as(arg1);
      $T2._as(arg2);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$2(arg1, arg2);
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$2(arg1, arg2);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRegisterCallback($self, $parent, zone, f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    _rootRegisterUnaryCallback($self, $parent, zone, f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    _rootRegisterBinaryCallback($self, $parent, zone, f, $R, $T1, $T2) {
      return $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f);
    },
    _rootErrorCallback($self, $parent, zone, error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    _rootScheduleMicrotask($self, $parent, zone, f) {
      var t1, t2;
      type$.void_Function._as(f);
      if (B.C__RootZone !== zone) {
        t1 = B.C__RootZone.get$errorZone();
        t2 = zone.get$errorZone();
        f = t1 !== t2 ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
      }
      A._scheduleAsyncCallback(f);
    },
    _rootCreateTimer($self, $parent, zone, duration, callback) {
      type$.Duration._as(duration);
      type$.void_Function._as(callback);
      return A.Timer__createTimer(duration, B.C__RootZone !== zone ? zone.bindCallback$1$1(callback, type$.void) : callback);
    },
    _rootCreatePeriodicTimer($self, $parent, zone, duration, callback) {
      var milliseconds;
      type$.Duration._as(duration);
      type$.void_Function_Timer._as(callback);
      if (B.C__RootZone !== zone)
        callback = zone.bindUnaryCallback$2$1(callback, type$.void, type$.Timer);
      milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$periodic(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _rootPrint($self, $parent, zone, line) {
      A.printString(A._asString(line));
    },
    _printToZone(line) {
      $.Zone__current.print$1(line);
    },
    _rootFork($self, $parent, zone, specification, zoneValues) {
      var valueMap, t1, handleUncaughtError;
      type$.nullable_ZoneSpecification._as(specification);
      type$.nullable_Map_of_nullable_Object_and_nullable_Object._as(zoneValues);
      $.printToZone = A.async___printToZone$closure();
      valueMap = zone.get$_map();
      t1 = new A._CustomZone(zone.get$_run(), zone.get$_runUnary(), zone.get$_runBinary(), zone.get$_registerCallback(), zone.get$_registerUnaryCallback(), zone.get$_registerBinaryCallback(), zone.get$_errorCallback(), zone.get$_scheduleMicrotask(), zone.get$_createTimer(), zone.get$_createPeriodicTimer(), zone.get$_print(), zone.get$_fork(), zone.get$_handleUncaughtError(), zone, valueMap);
      handleUncaughtError = specification.handleUncaughtError;
      if (handleUncaughtError != null)
        t1._handleUncaughtError = new A._ZoneFunction(t1, handleUncaughtError, type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace);
      return t1;
    },
    runZonedGuarded(body, onError, $R) {
      var error, stackTrace, t1, exception, _null = null, zoneSpecification = null, zoneValues = null,
        parentZone = $.Zone__current,
        errorHandler = new A.runZonedGuarded_closure(parentZone, onError);
      if (zoneSpecification == null)
        zoneSpecification = new A._ZoneSpecification(errorHandler, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null);
      else
        zoneSpecification = A.ZoneSpecification_ZoneSpecification$from(zoneSpecification, errorHandler);
      try {
        t1 = parentZone.fork$2$specification$zoneValues(zoneSpecification, zoneValues).run$1$1(body, $R);
        return t1;
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        onError.call$2(error, stackTrace);
      }
      return _null;
    },
    _AsyncRun__initializeScheduleImmediate_internalCallback: function _AsyncRun__initializeScheduleImmediate_internalCallback(t0) {
      this._box_0 = t0;
    },
    _AsyncRun__initializeScheduleImmediate_closure: function _AsyncRun__initializeScheduleImmediate_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.div = t1;
      this.span = t2;
    },
    _AsyncRun__scheduleImmediateJsOverride_internalCallback: function _AsyncRun__scheduleImmediateJsOverride_internalCallback(t0) {
      this.callback = t0;
    },
    _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback: function _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(t0) {
      this.callback = t0;
    },
    _TimerImpl: function _TimerImpl(t0) {
      this._once = t0;
      this._handle = null;
      this._tick = 0;
    },
    _TimerImpl_internalCallback: function _TimerImpl_internalCallback(t0, t1) {
      this.$this = t0;
      this.callback = t1;
    },
    _TimerImpl$periodic_closure: function _TimerImpl$periodic_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.milliseconds = t1;
      _.start = t2;
      _.callback = t3;
    },
    _AsyncAwaitCompleter: function _AsyncAwaitCompleter(t0, t1) {
      this._future = t0;
      this.isSync = false;
      this.$ti = t1;
    },
    _awaitOnObject_closure: function _awaitOnObject_closure(t0) {
      this.bodyFunction = t0;
    },
    _awaitOnObject_closure0: function _awaitOnObject_closure0(t0) {
      this.bodyFunction = t0;
    },
    _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) {
      this.$protected = t0;
    },
    _asyncStarHelper_closure: function _asyncStarHelper_closure(t0, t1) {
      this.controller = t0;
      this.bodyFunction = t1;
    },
    _asyncStarHelper_closure0: function _asyncStarHelper_closure0(t0, t1) {
      this.controller = t0;
      this.bodyFunction = t1;
    },
    _AsyncStarStreamController: function _AsyncStarStreamController(t0) {
      var _ = this;
      _.___AsyncStarStreamController_controller_A = $;
      _.isSuspended = false;
      _.cancelationFuture = null;
      _.$ti = t0;
    },
    _AsyncStarStreamController__resumeBody: function _AsyncStarStreamController__resumeBody(t0) {
      this.body = t0;
    },
    _AsyncStarStreamController__resumeBody_closure: function _AsyncStarStreamController__resumeBody_closure(t0) {
      this.body = t0;
    },
    _AsyncStarStreamController_closure0: function _AsyncStarStreamController_closure0(t0) {
      this._resumeBody = t0;
    },
    _AsyncStarStreamController_closure1: function _AsyncStarStreamController_closure1(t0, t1) {
      this.$this = t0;
      this._resumeBody = t1;
    },
    _AsyncStarStreamController_closure: function _AsyncStarStreamController_closure(t0, t1) {
      this.$this = t0;
      this.body = t1;
    },
    _AsyncStarStreamController__closure: function _AsyncStarStreamController__closure(t0) {
      this.body = t0;
    },
    _IterationMarker: function _IterationMarker(t0, t1) {
      this.value = t0;
      this.state = t1;
    },
    AsyncError: function AsyncError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    Future_Future$microtask_closure: function Future_Future$microtask_closure(t0, t1) {
      this.computation = t0;
      this.result = t1;
    },
    TimeoutException: function TimeoutException() {
    },
    _Completer: function _Completer() {
    },
    _AsyncCompleter: function _AsyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _SyncCompleter: function _SyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _FutureListener: function _FutureListener(t0, t1, t2, t3, t4) {
      var _ = this;
      _._nextListener = null;
      _.result = t0;
      _.state = t1;
      _.callback = t2;
      _.errorCallback = t3;
      _.$ti = t4;
    },
    _Future: function _Future(t0, t1) {
      var _ = this;
      _._state = 0;
      _._zone = t0;
      _._resultOrListeners = null;
      _.$ti = t1;
    },
    _Future__addListener_closure: function _Future__addListener_closure(t0, t1) {
      this.$this = t0;
      this.listener = t1;
    },
    _Future__prependListeners_closure: function _Future__prependListeners_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _Future__chainCoreFuture_closure: function _Future__chainCoreFuture_closure(t0, t1) {
      this._box_0 = t0;
      this.target = t1;
    },
    _Future__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__asyncCompleteErrorObject_closure: function _Future__asyncCompleteErrorObject_closure(t0, t1) {
      this.$this = t0;
      this.error = t1;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback: function _Future__propagateToListeners_handleWhenCompleteCallback(t0, t1, t2) {
      this._box_0 = t0;
      this._box_1 = t1;
      this.hasError = t2;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback_closure: function _Future__propagateToListeners_handleWhenCompleteCallback_closure(t0, t1) {
      this.joinedResult = t0;
      this.originalSource = t1;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback_closure0: function _Future__propagateToListeners_handleWhenCompleteCallback_closure0(t0) {
      this.joinedResult = t0;
    },
    _Future__propagateToListeners_handleValueCallback: function _Future__propagateToListeners_handleValueCallback(t0, t1) {
      this._box_0 = t0;
      this.sourceResult = t1;
    },
    _Future__propagateToListeners_handleError: function _Future__propagateToListeners_handleError(t0, t1) {
      this._box_1 = t0;
      this._box_0 = t1;
    },
    _Future_timeout_closure: function _Future_timeout_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _._future = t1;
      _.zone = t2;
      _.onTimeoutHandler = t3;
    },
    _Future_timeout_closure0: function _Future_timeout_closure0(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this._future = t2;
    },
    _Future_timeout_closure1: function _Future_timeout_closure1(t0, t1) {
      this._box_0 = t0;
      this._future = t1;
    },
    _AsyncCallbackEntry: function _AsyncCallbackEntry(t0) {
      this.callback = t0;
      this.next = null;
    },
    Stream: function Stream() {
    },
    Stream_length_closure: function Stream_length_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    Stream_length_closure0: function Stream_length_closure0(t0, t1) {
      this._box_0 = t0;
      this.future = t1;
    },
    Stream_first_closure: function Stream_first_closure(t0) {
      this.future = t0;
    },
    Stream_first_closure0: function Stream_first_closure0(t0, t1, t2) {
      this.$this = t0;
      this.subscription = t1;
      this.future = t2;
    },
    StreamView: function StreamView() {
    },
    _StreamController: function _StreamController() {
    },
    _StreamController__subscribe_closure: function _StreamController__subscribe_closure(t0) {
      this.$this = t0;
    },
    _StreamController__recordCancel_complete: function _StreamController__recordCancel_complete(t0) {
      this.$this = t0;
    },
    _SyncStreamControllerDispatch: function _SyncStreamControllerDispatch() {
    },
    _AsyncStreamControllerDispatch: function _AsyncStreamControllerDispatch() {
    },
    _AsyncStreamController: function _AsyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _SyncStreamController: function _SyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _ControllerStream: function _ControllerStream(t0, t1) {
      this._controller = t0;
      this.$ti = t1;
    },
    _ControllerSubscription: function _ControllerSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._controller = t0;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _StreamSinkWrapper: function _StreamSinkWrapper(t0, t1) {
      this._async$_target = t0;
      this.$ti = t1;
    },
    _AddStreamState: function _AddStreamState() {
    },
    _AddStreamState_makeErrorHandler_closure: function _AddStreamState_makeErrorHandler_closure(t0) {
      this.controller = t0;
    },
    _AddStreamState_cancel_closure: function _AddStreamState_cancel_closure(t0) {
      this.$this = t0;
    },
    _StreamControllerAddStreamState: function _StreamControllerAddStreamState(t0, t1, t2, t3) {
      var _ = this;
      _._varData = t0;
      _.addStreamFuture = t1;
      _.addSubscription = t2;
      _.$ti = t3;
    },
    _BufferingStreamSubscription: function _BufferingStreamSubscription() {
    },
    _BufferingStreamSubscription_asFuture_closure: function _BufferingStreamSubscription_asFuture_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture_closure0: function _BufferingStreamSubscription_asFuture_closure0(t0, t1) {
      this.$this = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture__closure: function _BufferingStreamSubscription_asFuture__closure(t0, t1, t2) {
      this.result = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendError_sendError: function _BufferingStreamSubscription__sendError_sendError(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendDone_sendDone: function _BufferingStreamSubscription__sendDone_sendDone(t0) {
      this.$this = t0;
    },
    _StreamImpl: function _StreamImpl() {
    },
    _DelayedEvent: function _DelayedEvent() {
    },
    _DelayedData: function _DelayedData(t0, t1) {
      this.value = t0;
      this.next = null;
      this.$ti = t1;
    },
    _DelayedError: function _DelayedError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
      this.next = null;
    },
    _DelayedDone: function _DelayedDone() {
    },
    _PendingEvents: function _PendingEvents(t0) {
      var _ = this;
      _._state = 0;
      _.lastPendingEvent = _.firstPendingEvent = null;
      _.$ti = t0;
    },
    _PendingEvents_schedule_closure: function _PendingEvents_schedule_closure(t0, t1) {
      this.$this = t0;
      this.dispatch = t1;
    },
    _DoneStreamSubscription: function _DoneStreamSubscription(t0, t1) {
      var _ = this;
      _._state = 1;
      _._zone = t0;
      _._onDone = null;
      _.$ti = t1;
    },
    _StreamIterator: function _StreamIterator(t0) {
      this.$ti = t0;
    },
    _EmptyStream: function _EmptyStream(t0) {
      this.$ti = t0;
    },
    _cancelAndValue_closure: function _cancelAndValue_closure(t0, t1) {
      this.future = t0;
      this.value = t1;
    },
    _ForwardingStream: function _ForwardingStream() {
    },
    _ForwardingStreamSubscription: function _ForwardingStreamSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._stream = t0;
      _._subscription = null;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _MapStream: function _MapStream(t0, t1, t2) {
      this._transform = t0;
      this._source = t1;
      this.$ti = t2;
    },
    _ZoneFunction: function _ZoneFunction(t0, t1, t2) {
      this.zone = t0;
      this.$function = t1;
      this.$ti = t2;
    },
    _ZoneSpecification: function _ZoneSpecification(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
      var _ = this;
      _.handleUncaughtError = t0;
      _.run = t1;
      _.runUnary = t2;
      _.runBinary = t3;
      _.registerCallback = t4;
      _.registerUnaryCallback = t5;
      _.registerBinaryCallback = t6;
      _.errorCallback = t7;
      _.scheduleMicrotask = t8;
      _.createTimer = t9;
      _.createPeriodicTimer = t10;
      _.print = t11;
      _.fork = t12;
    },
    _ZoneDelegate: function _ZoneDelegate(t0) {
      this._delegationTarget = t0;
    },
    _Zone: function _Zone() {
    },
    _CustomZone: function _CustomZone(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14) {
      var _ = this;
      _._run = t0;
      _._runUnary = t1;
      _._runBinary = t2;
      _._registerCallback = t3;
      _._registerUnaryCallback = t4;
      _._registerBinaryCallback = t5;
      _._errorCallback = t6;
      _._scheduleMicrotask = t7;
      _._createTimer = t8;
      _._createPeriodicTimer = t9;
      _._print = t10;
      _._fork = t11;
      _._handleUncaughtError = t12;
      _._delegateCache = null;
      _.parent = t13;
      _._map = t14;
    },
    _CustomZone_bindCallback_closure: function _CustomZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.R = t2;
    },
    _CustomZone_bindUnaryCallback_closure: function _CustomZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.registered = t1;
      _.T = t2;
      _.R = t3;
    },
    _CustomZone_bindCallbackGuarded_closure: function _CustomZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.registered = t1;
    },
    _CustomZone_bindUnaryCallbackGuarded_closure: function _CustomZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.T = t2;
    },
    _rootHandleError_closure: function _rootHandleError_closure(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    _RootZone: function _RootZone() {
    },
    _RootZone_bindCallback_closure: function _RootZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.R = t2;
    },
    _RootZone_bindUnaryCallback_closure: function _RootZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.f = t1;
      _.T = t2;
      _.R = t3;
    },
    _RootZone_bindCallbackGuarded_closure: function _RootZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    _RootZone_bindUnaryCallbackGuarded_closure: function _RootZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.T = t2;
    },
    runZonedGuarded_closure: function runZonedGuarded_closure(t0, t1) {
      this.parentZone = t0;
      this.onError = t1;
    },
    HashMap_HashMap(equals, hashCode, isValidKey, $K, $V) {
      if (isValidKey == null)
        if (hashCode == null) {
          if (equals == null)
            return new A._HashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_HashMap<1,2>"));
          hashCode = A.collection___defaultHashCode$closure();
        } else {
          if (A.core__identityHashCode$closure() === hashCode && A.core__identical$closure() === equals)
            return new A._IdentityHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_IdentityHashMap<1,2>"));
          if (equals == null)
            equals = A.collection___defaultEquals$closure();
        }
      else {
        if (hashCode == null)
          hashCode = A.collection___defaultHashCode$closure();
        if (equals == null)
          equals = A.collection___defaultEquals$closure();
      }
      return A._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
    },
    _HashMap__getTableEntry(table, key) {
      var entry = table[key];
      return entry === table ? null : entry;
    },
    _HashMap__setTableEntry(table, key, value) {
      if (value == null)
        table[key] = table;
      else
        table[key] = value;
    },
    _HashMap__newHashTable() {
      var table = Object.create(null);
      A._HashMap__setTableEntry(table, "<non-identifier-key>", table);
      delete table["<non-identifier-key>"];
      return table;
    },
    _CustomHashMap$(_equals, _hashCode, validKey, $K, $V) {
      var t1 = validKey != null ? validKey : new A._CustomHashMap_closure($K);
      return new A._CustomHashMap(_equals, _hashCode, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("_CustomHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap(equals, hashCode, $K, $V) {
      if (hashCode == null) {
        if (equals == null)
          return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
        hashCode = A.collection___defaultHashCode$closure();
      } else {
        if (A.core__identityHashCode$closure() === hashCode && A.core__identical$closure() === equals)
          return new A.JsIdentityLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsIdentityLinkedHashMap<1,2>"));
        if (equals == null)
          equals = A.collection___defaultEquals$closure();
      }
      return A._LinkedCustomHashMap$(equals, hashCode, null, $K, $V);
    },
    LinkedHashMap_LinkedHashMap$_literal(keyValuePairs, $K, $V) {
      return $K._eval$1("@<0>")._bind$1($V)._eval$1("LinkedHashMap<1,2>")._as(A.fillLiteralMap(keyValuePairs, new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"))));
    },
    LinkedHashMap_LinkedHashMap$_empty($K, $V) {
      return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    _LinkedCustomHashMap$(_equals, _hashCode, validKey, $K, $V) {
      return new A._LinkedCustomHashMap(_equals, _hashCode, new A._LinkedCustomHashMap_closure($K), $K._eval$1("@<0>")._bind$1($V)._eval$1("_LinkedCustomHashMap<1,2>"));
    },
    HashSet_HashSet(equals, hashCode, $E) {
      return new A._HashSet($E._eval$1("_HashSet<0>"));
    },
    _HashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    LinkedHashSet_LinkedHashSet($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    LinkedHashSet_LinkedHashSet$_empty($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    _LinkedHashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    _LinkedHashSetIterator$(_set, _modifications, $E) {
      var t1 = new A._LinkedHashSetIterator(_set, _modifications, $E._eval$1("_LinkedHashSetIterator<0>"));
      t1._collection$_cell = _set._collection$_first;
      return t1;
    },
    _defaultEquals0(a, b) {
      return J.$eq$(a, b);
    },
    _defaultHashCode(a) {
      return J.get$hashCode$(a);
    },
    LinkedHashMap_LinkedHashMap$from(other, $K, $V) {
      var result = A.LinkedHashMap_LinkedHashMap(null, null, $K, $V);
      other.forEach$1(0, new A.LinkedHashMap_LinkedHashMap$from_closure(result, $K, $V));
      return result;
    },
    LinkedHashSet_LinkedHashSet$from(elements, $E) {
      var t1, _i,
        result = A.LinkedHashSet_LinkedHashSet($E);
      for (t1 = elements.length, _i = 0; _i < elements.length; elements.length === t1 || (0, A.throwConcurrentModificationError)(elements), ++_i)
        result.add$1(0, $E._as(elements[_i]));
      return result;
    },
    ListBase__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    MapBase_mapToString(m) {
      var result, t1;
      if (A.isToStringVisiting(m))
        return "{...}";
      result = new A.StringBuffer("");
      try {
        t1 = {};
        B.JSArray_methods.add$1($.toStringVisiting, m);
        result._contents += "{";
        t1.first = true;
        m.forEach$1(0, new A.MapBase_mapToString_closure(t1, result));
        result._contents += "}";
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      t1 = result._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    ListQueue$($E) {
      return new A.ListQueue(A.List_List$filled(A.ListQueue__calculateCapacity(null), null, false, $E._eval$1("0?")), $E._eval$1("ListQueue<0>"));
    },
    ListQueue__calculateCapacity(initialCapacity) {
      return 8;
    },
    SplayTreeSet$(compare, isValidKey, $E) {
      return new A.SplayTreeSet(compare, isValidKey, $E._eval$1("SplayTreeSet<0>"));
    },
    _HashMap: function _HashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._nums = _._strings = null;
      _.$ti = t0;
    },
    _IdentityHashMap: function _IdentityHashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._nums = _._strings = null;
      _.$ti = t0;
    },
    _CustomHashMap: function _CustomHashMap(t0, t1, t2, t3) {
      var _ = this;
      _._equals = t0;
      _._hashCode = t1;
      _._validKey = t2;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._nums = _._strings = null;
      _.$ti = t3;
    },
    _CustomHashMap_closure: function _CustomHashMap_closure(t0) {
      this.K = t0;
    },
    _HashMapKeyIterable: function _HashMapKeyIterable(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    _HashMapKeyIterator: function _HashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._collection$_map = t0;
      _._keys = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _LinkedCustomHashMap: function _LinkedCustomHashMap(t0, t1, t2, t3) {
      var _ = this;
      _._equals = t0;
      _._hashCode = t1;
      _._validKey = t2;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _.__js_helper$_nums = _.__js_helper$_strings = null;
      _._modifications = 0;
      _.$ti = t3;
    },
    _LinkedCustomHashMap_closure: function _LinkedCustomHashMap_closure(t0) {
      this.K = t0;
    },
    _HashSet: function _HashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_elements = _._collection$_rest = _._nums = _._strings = null;
      _.$ti = t0;
    },
    _HashSetIterator: function _HashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._collection$_elements = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _LinkedHashSet: function _LinkedHashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_last = _._collection$_first = _._collection$_rest = _._nums = _._strings = null;
      _._collection$_modifications = 0;
      _.$ti = t0;
    },
    _LinkedHashSetCell: function _LinkedHashSetCell(t0) {
      this._element = t0;
      this._collection$_next = null;
    },
    _LinkedHashSetIterator: function _LinkedHashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._collection$_modifications = t1;
      _._collection$_current = _._collection$_cell = null;
      _.$ti = t2;
    },
    UnmodifiableListView: function UnmodifiableListView(t0, t1) {
      this._collection$_source = t0;
      this.$ti = t1;
    },
    LinkedHashMap_LinkedHashMap$from_closure: function LinkedHashMap_LinkedHashMap$from_closure(t0, t1, t2) {
      this.result = t0;
      this.K = t1;
      this.V = t2;
    },
    ListBase: function ListBase() {
    },
    MapBase: function MapBase() {
    },
    MapBase_mapToString_closure: function MapBase_mapToString_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    _UnmodifiableMapMixin: function _UnmodifiableMapMixin() {
    },
    MapView: function MapView() {
    },
    UnmodifiableMapView: function UnmodifiableMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    ListQueue: function ListQueue(t0, t1) {
      var _ = this;
      _._table = t0;
      _._modificationCount = _._tail = _._head = 0;
      _.$ti = t1;
    },
    _ListQueueIterator: function _ListQueueIterator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue = t0;
      _._end = t1;
      _._modificationCount = t2;
      _._position = t3;
      _._collection$_current = null;
      _.$ti = t4;
    },
    SetBase: function SetBase() {
    },
    _SetBase: function _SetBase() {
    },
    _SplayTreeNode: function _SplayTreeNode() {
    },
    _SplayTreeSetNode: function _SplayTreeSetNode(t0, t1) {
      var _ = this;
      _.key = t0;
      _._right = _._left = null;
      _.$ti = t1;
    },
    _SplayTree: function _SplayTree() {
    },
    _SplayTreeIterator: function _SplayTreeIterator() {
    },
    _SplayTreeKeyIterator: function _SplayTreeKeyIterator(t0, t1, t2, t3) {
      var _ = this;
      _._tree = t0;
      _._path = t1;
      _._modificationCount = null;
      _._splayCount = t2;
      _.$ti = t3;
    },
    SplayTreeSet: function SplayTreeSet(t0, t1, t2) {
      var _ = this;
      _._root = null;
      _._compare = t0;
      _._validKey = t1;
      _._splayCount = _._modificationCount = _._count = 0;
      _.$ti = t2;
    },
    _SplayTreeSet__SplayTree_Iterable: function _SplayTreeSet__SplayTree_Iterable() {
    },
    _SplayTreeSet__SplayTree_Iterable_SetMixin: function _SplayTreeSet__SplayTree_Iterable_SetMixin() {
    },
    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
    },
    _parseJson(source, reviver) {
      var e, exception, t1, parsed = null;
      try {
        parsed = JSON.parse(source);
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.FormatException$(String(e), null, null);
        throw A.wrapException(t1);
      }
      t1 = A._convertJsonToDartLazy(parsed);
      return t1;
    },
    _convertJsonToDartLazy(object) {
      var i;
      if (object == null)
        return null;
      if (typeof object != "object")
        return object;
      if (!Array.isArray(object))
        return new A._JsonMap(object, Object.create(null));
      for (i = 0; i < object.length; ++i)
        object[i] = A._convertJsonToDartLazy(object[i]);
      return object;
    },
    _Utf8Decoder__makeNativeUint8List(codeUnits, start, end) {
      var bytes, t1, i, b,
        $length = end - start;
      if ($length <= 4096)
        bytes = $.$get$_Utf8Decoder__reusableBuffer();
      else
        bytes = new Uint8Array($length);
      for (t1 = J.getInterceptor$asx(codeUnits), i = 0; i < $length; ++i) {
        b = t1.$index(codeUnits, start + i);
        if ((b & 255) !== b)
          b = 255;
        bytes[i] = b;
      }
      return bytes;
    },
    _Utf8Decoder__convertInterceptedUint8List(allowMalformed, codeUnits, start, end) {
      var decoder = allowMalformed ? $.$get$_Utf8Decoder__decoderNonfatal() : $.$get$_Utf8Decoder__decoder();
      if (decoder == null)
        return null;
      if (0 === start && end === codeUnits.length)
        return A._Utf8Decoder__useTextDecoder(decoder, codeUnits);
      return A._Utf8Decoder__useTextDecoder(decoder, codeUnits.subarray(start, end));
    },
    _Utf8Decoder__useTextDecoder(decoder, codeUnits) {
      var t1, exception;
      try {
        t1 = decoder.decode(codeUnits);
        return t1;
      } catch (exception) {
      }
      return null;
    },
    Base64Codec__checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, $length) {
      if (B.JSInt_methods.$mod($length, 4) !== 0)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, padded length must be multiple of four, is " + $length, source, sourceEnd));
      if (firstPadding + paddingCount !== $length)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, '=' not at the end", source, sourceIndex));
      if (paddingCount > 2)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
    },
    _Base64Encoder_encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
      var t1, t2, t3, i, byteOr, byte, outputIndex0, t4, t5, outputIndex1,
        bits = state >>> 2,
        expectedChars = 3 - (state & 3);
      for (t1 = J.getInterceptor$asx(bytes), t2 = alphabet.length, t3 = output.$flags | 0, i = start, byteOr = 0; i < end; ++i) {
        byte = t1.$index(bytes, i);
        byteOr = (byteOr | byte) >>> 0;
        bits = (bits << 8 | byte) & 16777215;
        --expectedChars;
        if (expectedChars === 0) {
          outputIndex0 = outputIndex + 1;
          t4 = bits >>> 18 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          t3 & 2 && A.throwUnsupportedOperation(output);
          t5 = output.length;
          if (!(outputIndex < t5))
            return A.ioore(output, outputIndex);
          output[outputIndex] = alphabet.charCodeAt(t4);
          outputIndex = outputIndex0 + 1;
          t4 = bits >>> 12 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex0 < t5))
            return A.ioore(output, outputIndex0);
          output[outputIndex0] = alphabet.charCodeAt(t4);
          outputIndex0 = outputIndex + 1;
          t4 = bits >>> 6 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex < t5))
            return A.ioore(output, outputIndex);
          output[outputIndex] = alphabet.charCodeAt(t4);
          outputIndex = outputIndex0 + 1;
          t4 = bits & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex0 < t5))
            return A.ioore(output, outputIndex0);
          output[outputIndex0] = alphabet.charCodeAt(t4);
          bits = 0;
          expectedChars = 3;
        }
      }
      if (byteOr >= 0 && byteOr <= 255) {
        if (isLast && expectedChars < 3) {
          outputIndex0 = outputIndex + 1;
          outputIndex1 = outputIndex0 + 1;
          if (3 - expectedChars === 1) {
            t1 = bits >>> 2 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            t3 & 2 && A.throwUnsupportedOperation(output);
            t3 = output.length;
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = alphabet.charCodeAt(t1);
            t1 = bits << 4 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex0 < t3))
              return A.ioore(output, outputIndex0);
            output[outputIndex0] = alphabet.charCodeAt(t1);
            outputIndex = outputIndex1 + 1;
            if (!(outputIndex1 < t3))
              return A.ioore(output, outputIndex1);
            output[outputIndex1] = 61;
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = 61;
          } else {
            t1 = bits >>> 10 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            t3 & 2 && A.throwUnsupportedOperation(output);
            t3 = output.length;
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = alphabet.charCodeAt(t1);
            t1 = bits >>> 4 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex0 < t3))
              return A.ioore(output, outputIndex0);
            output[outputIndex0] = alphabet.charCodeAt(t1);
            outputIndex = outputIndex1 + 1;
            t1 = bits << 2 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex1 < t3))
              return A.ioore(output, outputIndex1);
            output[outputIndex1] = alphabet.charCodeAt(t1);
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = 61;
          }
          return 0;
        }
        return (bits << 2 | 3 - expectedChars) >>> 0;
      }
      for (i = start; i < end;) {
        byte = t1.$index(bytes, i);
        if (byte < 0 || byte > 255)
          break;
        ++i;
      }
      throw A.wrapException(A.ArgumentError$value(bytes, "Not a byte value at index " + i + ": 0x" + B.JSInt_methods.toRadixString$1(t1.$index(bytes, i), 16), null));
    },
    _Base64Decoder_decodeChunk(input, start, end, output, outIndex, state) {
      var t1, t2, t3, i, charOr, char, t4, code, outIndex0, expectedPadding,
        _s31_ = "Invalid encoding before padding",
        _s17_ = "Invalid character",
        bits = B.JSInt_methods._shrOtherPositive$1(state, 2),
        count = state & 3,
        inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (t1 = input.length, t2 = inverseAlphabet.length, t3 = output.$flags | 0, i = start, charOr = 0; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(input, i);
        char = input.charCodeAt(i);
        charOr |= char;
        t4 = char & 127;
        if (!(t4 < t2))
          return A.ioore(inverseAlphabet, t4);
        code = inverseAlphabet[t4];
        if (code >= 0) {
          bits = (bits << 6 | code) & 16777215;
          count = count + 1 & 3;
          if (count === 0) {
            outIndex0 = outIndex + 1;
            t3 & 2 && A.throwUnsupportedOperation(output);
            t4 = output.length;
            if (!(outIndex < t4))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 16 & 255;
            outIndex = outIndex0 + 1;
            if (!(outIndex0 < t4))
              return A.ioore(output, outIndex0);
            output[outIndex0] = bits >>> 8 & 255;
            outIndex0 = outIndex + 1;
            if (!(outIndex < t4))
              return A.ioore(output, outIndex);
            output[outIndex] = bits & 255;
            outIndex = outIndex0;
            bits = 0;
          }
          continue;
        } else if (code === -1 && count > 1) {
          if (charOr > 127)
            break;
          if (count === 3) {
            if ((bits & 3) !== 0)
              throw A.wrapException(A.FormatException$(_s31_, input, i));
            outIndex0 = outIndex + 1;
            t3 & 2 && A.throwUnsupportedOperation(output);
            t1 = output.length;
            if (!(outIndex < t1))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 10;
            if (!(outIndex0 < t1))
              return A.ioore(output, outIndex0);
            output[outIndex0] = bits >>> 2;
          } else {
            if ((bits & 15) !== 0)
              throw A.wrapException(A.FormatException$(_s31_, input, i));
            t3 & 2 && A.throwUnsupportedOperation(output);
            if (!(outIndex < output.length))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 4;
          }
          expectedPadding = (3 - count) * 3;
          if (char === 37)
            expectedPadding += 2;
          return A._Base64Decoder__checkPadding(input, i + 1, end, -expectedPadding - 1);
        }
        throw A.wrapException(A.FormatException$(_s17_, input, i));
      }
      if (charOr >= 0 && charOr <= 127)
        return (bits << 2 | count) >>> 0;
      for (i = start; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(input, i);
        if (input.charCodeAt(i) > 127)
          break;
      }
      throw A.wrapException(A.FormatException$(_s17_, input, i));
    },
    _Base64Decoder__allocateBuffer(input, start, end, state) {
      var paddingStart = A._Base64Decoder__trimPaddingChars(input, start, end),
        $length = (state & 3) + (paddingStart - start),
        bufferLength = B.JSInt_methods._shrOtherPositive$1($length, 2) * 3,
        remainderLength = $length & 3;
      if (remainderLength !== 0 && paddingStart < end)
        bufferLength += remainderLength - 1;
      if (bufferLength > 0)
        return new Uint8Array(bufferLength);
      return $.$get$_Base64Decoder__emptyBuffer();
    },
    _Base64Decoder__trimPaddingChars(input, start, end) {
      var char,
        t1 = input.length,
        newEnd = end,
        index = newEnd,
        padding = 0;
      for (;;) {
        if (!(index > start && padding < 2))
          break;
        c$0: {
          --index;
          if (!(index >= 0 && index < t1))
            return A.ioore(input, index);
          char = input.charCodeAt(index);
          if (char === 61) {
            ++padding;
            newEnd = index;
            break c$0;
          }
          if ((char | 32) === 100) {
            if (index === start)
              break;
            --index;
            if (!(index >= 0 && index < t1))
              return A.ioore(input, index);
            char = input.charCodeAt(index);
          }
          if (char === 51) {
            if (index === start)
              break;
            --index;
            if (!(index >= 0 && index < t1))
              return A.ioore(input, index);
            char = input.charCodeAt(index);
          }
          if (char === 37) {
            ++padding;
            newEnd = index;
            break c$0;
          }
          break;
        }
      }
      return newEnd;
    },
    _Base64Decoder__checkPadding(input, start, end, state) {
      var expectedPadding, t1, char;
      if (start === end)
        return state;
      expectedPadding = -state - 1;
      for (t1 = input.length; expectedPadding > 0;) {
        if (!(start < t1))
          return A.ioore(input, start);
        char = input.charCodeAt(start);
        if (expectedPadding === 3) {
          if (char === 61) {
            expectedPadding -= 3;
            ++start;
            break;
          }
          if (char === 37) {
            --expectedPadding;
            ++start;
            if (start === end)
              break;
            if (!(start < t1))
              return A.ioore(input, start);
            char = input.charCodeAt(start);
          } else
            break;
        }
        if ((expectedPadding > 3 ? expectedPadding - 3 : expectedPadding) === 2) {
          if (char !== 51)
            break;
          ++start;
          --expectedPadding;
          if (start === end)
            break;
          if (!(start < t1))
            return A.ioore(input, start);
          char = input.charCodeAt(start);
        }
        if ((char | 32) !== 100)
          break;
        ++start;
        --expectedPadding;
        if (start === end)
          break;
      }
      if (start !== end)
        throw A.wrapException(A.FormatException$("Invalid padding character", input, start));
      return -expectedPadding - 1;
    },
    Encoding_getByName($name) {
      return $.$get$Encoding__nameToEncoding().$index(0, $name.toLowerCase());
    },
    JsonUnsupportedObjectError$(unsupportedObject, cause, partialResult) {
      return new A.JsonUnsupportedObjectError(unsupportedObject, cause);
    },
    _defaultToEncodable(object) {
      return object.toJson$0();
    },
    _JsonStringStringifier$(_sink, _toEncodable) {
      return new A._JsonStringStringifier(_sink, [], A.convert___defaultToEncodable$closure());
    },
    _JsonStringStringifier_stringify(object, toEncodable, indent) {
      var t1,
        output = new A.StringBuffer("");
      A._JsonStringStringifier_printOn(object, output, toEncodable, indent);
      t1 = output._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _JsonStringStringifier_printOn(object, output, toEncodable, indent) {
      var stringifier = A._JsonStringStringifier$(output, toEncodable);
      stringifier.writeObject$1(object);
    },
    _Utf8Decoder_errorDescription(state) {
      switch (state) {
        case 65:
          return "Missing extension byte";
        case 67:
          return "Unexpected extension byte";
        case 69:
          return "Invalid UTF-8 byte";
        case 71:
          return "Overlong encoding";
        case 73:
          return "Out of unicode range";
        case 75:
          return "Encoded surrogate";
        case 77:
          return "Unfinished UTF-8 octet sequence";
        default:
          return "";
      }
    },
    _JsonMap: function _JsonMap(t0, t1) {
      this._original = t0;
      this._processed = t1;
      this._convert$_data = null;
    },
    _JsonMapKeyIterable: function _JsonMapKeyIterable(t0) {
      this._parent = t0;
    },
    _Utf8Decoder__decoder_closure: function _Utf8Decoder__decoder_closure() {
    },
    _Utf8Decoder__decoderNonfatal_closure: function _Utf8Decoder__decoderNonfatal_closure() {
    },
    AsciiCodec: function AsciiCodec() {
    },
    _UnicodeSubsetEncoder: function _UnicodeSubsetEncoder() {
    },
    AsciiEncoder: function AsciiEncoder(t0) {
      this._subsetMask = t0;
    },
    _UnicodeSubsetDecoder: function _UnicodeSubsetDecoder() {
    },
    AsciiDecoder: function AsciiDecoder(t0, t1) {
      this._allowInvalid = t0;
      this._subsetMask = t1;
    },
    Base64Codec: function Base64Codec() {
    },
    Base64Encoder: function Base64Encoder() {
    },
    _Base64Encoder: function _Base64Encoder(t0) {
      this._convert$_state = 0;
      this._alphabet = t0;
    },
    Base64Decoder: function Base64Decoder() {
    },
    _Base64Decoder: function _Base64Decoder() {
      this._convert$_state = 0;
    },
    ByteConversionSink: function ByteConversionSink() {
    },
    _ByteCallbackSink: function _ByteCallbackSink(t0, t1) {
      this._callback = t0;
      this._convert$_buffer = t1;
      this._bufferIndex = 0;
    },
    Codec: function Codec() {
    },
    Converter: function Converter() {
    },
    Encoding: function Encoding() {
    },
    JsonUnsupportedObjectError: function JsonUnsupportedObjectError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCyclicError: function JsonCyclicError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCodec: function JsonCodec() {
    },
    JsonEncoder: function JsonEncoder(t0) {
      this._toEncodable = t0;
    },
    JsonDecoder: function JsonDecoder(t0) {
      this._reviver = t0;
    },
    _JsonStringifier: function _JsonStringifier() {
    },
    _JsonStringifier_writeMap_closure: function _JsonStringifier_writeMap_closure(t0, t1) {
      this._box_0 = t0;
      this.keyValueList = t1;
    },
    _JsonStringStringifier: function _JsonStringStringifier(t0, t1, t2) {
      this._convert$_sink = t0;
      this._seen = t1;
      this._toEncodable = t2;
    },
    Latin1Codec: function Latin1Codec() {
    },
    Latin1Encoder: function Latin1Encoder(t0) {
      this._subsetMask = t0;
    },
    Latin1Decoder: function Latin1Decoder(t0, t1) {
      this._allowInvalid = t0;
      this._subsetMask = t1;
    },
    Utf8Codec: function Utf8Codec() {
    },
    Utf8Encoder: function Utf8Encoder() {
    },
    _Utf8Encoder: function _Utf8Encoder(t0) {
      this._bufferIndex = this._carry = 0;
      this._convert$_buffer = t0;
    },
    Utf8Decoder: function Utf8Decoder(t0) {
      this._allowMalformed = t0;
    },
    _Utf8Decoder: function _Utf8Decoder(t0) {
      this.allowMalformed = t0;
      this._convert$_state = 16;
      this._charOrIndex = 0;
    },
    _BigIntImpl__parseDecimal(source, isNegative) {
      var part, i,
        result = $.$get$_BigIntImpl_zero(),
        t1 = source.length,
        digitInPartCount = 4 - t1 % 4;
      if (digitInPartCount === 4)
        digitInPartCount = 0;
      for (part = 0, i = 0; i < t1; ++i) {
        part = part * 10 + source.charCodeAt(i) - 48;
        ++digitInPartCount;
        if (digitInPartCount === 4) {
          result = result.$mul(0, $.$get$_BigIntImpl__bigInt10000()).$add(0, A._BigIntImpl__BigIntImpl$_fromInt(part));
          part = 0;
          digitInPartCount = 0;
        }
      }
      if (isNegative)
        return result.$negate(0);
      return result;
    },
    _BigIntImpl__codeUnitToRadixValue(codeUnit) {
      if (48 <= codeUnit && codeUnit <= 57)
        return codeUnit - 48;
      return (codeUnit | 32) - 97 + 10;
    },
    _BigIntImpl__parseHex(source, startPos, isNegative) {
      var i, chunk, j, i0, digitValue, digitIndex, digitIndex0,
        t1 = source.length,
        sourceLength = t1 - startPos,
        chunkCount = B.JSNumber_methods.ceil$0(sourceLength / 4),
        digits = new Uint16Array(chunkCount),
        t2 = chunkCount - 1,
        lastDigitLength = sourceLength - t2 * 4;
      for (i = startPos, chunk = 0, j = 0; j < lastDigitLength; ++j, i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(source, i);
        digitValue = A._BigIntImpl__codeUnitToRadixValue(source.charCodeAt(i));
        if (digitValue >= 16)
          return null;
        chunk = chunk * 16 + digitValue;
      }
      digitIndex = t2 - 1;
      if (!(t2 >= 0 && t2 < chunkCount))
        return A.ioore(digits, t2);
      digits[t2] = chunk;
      for (; i < t1; digitIndex = digitIndex0) {
        for (chunk = 0, j = 0; j < 4; ++j, i = i0) {
          i0 = i + 1;
          if (!(i >= 0 && i < t1))
            return A.ioore(source, i);
          digitValue = A._BigIntImpl__codeUnitToRadixValue(source.charCodeAt(i));
          if (digitValue >= 16)
            return null;
          chunk = chunk * 16 + digitValue;
        }
        digitIndex0 = digitIndex - 1;
        if (!(digitIndex >= 0 && digitIndex < chunkCount))
          return A.ioore(digits, digitIndex);
        digits[digitIndex] = chunk;
      }
      if (chunkCount === 1) {
        if (0 >= chunkCount)
          return A.ioore(digits, 0);
        t1 = digits[0] === 0;
      } else
        t1 = false;
      if (t1)
        return $.$get$_BigIntImpl_zero();
      t1 = A._BigIntImpl__normalize(chunkCount, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__tryParse(source, radix) {
      var match, t1, t2, isNegative, decimalMatch, hexMatch;
      if (source === "")
        return null;
      match = $.$get$_BigIntImpl__parseRE().firstMatch$1(source);
      if (match == null)
        return null;
      t1 = match._match;
      t2 = t1.length;
      if (1 >= t2)
        return A.ioore(t1, 1);
      isNegative = t1[1] === "-";
      if (4 >= t2)
        return A.ioore(t1, 4);
      decimalMatch = t1[4];
      hexMatch = t1[3];
      if (5 >= t2)
        return A.ioore(t1, 5);
      if (decimalMatch != null)
        return A._BigIntImpl__parseDecimal(decimalMatch, isNegative);
      if (hexMatch != null)
        return A._BigIntImpl__parseHex(hexMatch, 2, isNegative);
      return null;
    },
    _BigIntImpl__normalize(used, digits) {
      var t2,
        t1 = digits.length;
      for (;;) {
        if (used > 0) {
          t2 = used - 1;
          if (!(t2 < t1))
            return A.ioore(digits, t2);
          t2 = digits[t2] === 0;
        } else
          t2 = false;
        if (!t2)
          break;
        --used;
      }
      return used;
    },
    _BigIntImpl__cloneDigits(digits, from, to, $length) {
      var t1, i, t2,
        resultDigits = new Uint16Array($length),
        n = to - from;
      for (t1 = digits.length, i = 0; i < n; ++i) {
        t2 = from + i;
        if (!(t2 >= 0 && t2 < t1))
          return A.ioore(digits, t2);
        t2 = digits[t2];
        if (!(i < $length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = t2;
      }
      return resultDigits;
    },
    _BigIntImpl__BigIntImpl$_fromInt(value) {
      var digits, t1, i, i0,
        isNegative = value < 0;
      if (isNegative) {
        if (value === -9223372036854776e3) {
          digits = new Uint16Array(4);
          digits[3] = 32768;
          t1 = A._BigIntImpl__normalize(4, digits);
          return new A._BigIntImpl(t1 !== 0, digits, t1);
        }
        value = -value;
      }
      if (value < 65536) {
        digits = new Uint16Array(1);
        digits[0] = value;
        t1 = A._BigIntImpl__normalize(1, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      if (value <= 4294967295) {
        digits = new Uint16Array(2);
        digits[0] = value & 65535;
        digits[1] = B.JSInt_methods._shrOtherPositive$1(value, 16);
        t1 = A._BigIntImpl__normalize(2, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      t1 = B.JSInt_methods._tdivFast$1(B.JSInt_methods.get$bitLength(value) - 1, 16) + 1;
      digits = new Uint16Array(t1);
      for (i = 0; value !== 0; i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(digits, i);
        digits[i] = value & 65535;
        value = B.JSInt_methods._tdivFast$1(value, 65536);
      }
      t1 = A._BigIntImpl__normalize(t1, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__dlShiftDigits(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, t3, t4;
      if (xUsed === 0)
        return 0;
      if (n === 0 && resultDigits === xDigits)
        return xUsed;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.$flags | 0; i >= 0; --i) {
        t3 = i + n;
        if (!(i < t1))
          return A.ioore(xDigits, i);
        t4 = xDigits[i];
        t2 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(t3 >= 0 && t3 < resultDigits.length))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = t4;
      }
      for (i = n - 1; i >= 0; --i) {
        t2 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(i < resultDigits.length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      return xUsed + n;
    },
    _BigIntImpl__lsh(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, carry, digit, t3, t4,
        digitShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, carryBitShift) - 1;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.$flags | 0, carry = 0; i >= 0; --i) {
        if (!(i < t1))
          return A.ioore(xDigits, i);
        digit = xDigits[i];
        t3 = i + digitShift + 1;
        t4 = B.JSInt_methods.$shr(digit, carryBitShift);
        t2 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(t3 >= 0 && t3 < resultDigits.length))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = (t4 | carry) >>> 0;
        carry = B.JSInt_methods.$shl((digit & bitMask) >>> 0, bitShift);
      }
      t2 & 2 && A.throwUnsupportedOperation(resultDigits);
      if (!(digitShift >= 0 && digitShift < resultDigits.length))
        return A.ioore(resultDigits, digitShift);
      resultDigits[digitShift] = carry;
    },
    _BigIntImpl__lShiftDigits(xDigits, xUsed, n, resultDigits) {
      var resultUsed, t1, i,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16);
      if (B.JSInt_methods.$mod(n, 16) === 0)
        return A._BigIntImpl__dlShiftDigits(xDigits, xUsed, digitsShift, resultDigits);
      resultUsed = xUsed + digitsShift + 1;
      A._BigIntImpl__lsh(xDigits, xUsed, n, resultDigits);
      for (t1 = resultDigits.$flags | 0, i = digitsShift; --i, i >= 0;) {
        t1 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(i < resultDigits.length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      t1 = resultUsed - 1;
      if (!(t1 >= 0 && t1 < resultDigits.length))
        return A.ioore(resultDigits, t1);
      if (resultDigits[t1] === 0)
        resultUsed = t1;
      return resultUsed;
    },
    _BigIntImpl__rsh(xDigits, xUsed, n, resultDigits) {
      var carry, last, t2, i, t3, digit,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, bitShift) - 1,
        t1 = xDigits.length;
      if (!(digitsShift >= 0 && digitsShift < t1))
        return A.ioore(xDigits, digitsShift);
      carry = B.JSInt_methods.$shr(xDigits[digitsShift], bitShift);
      last = xUsed - digitsShift - 1;
      for (t2 = resultDigits.$flags | 0, i = 0; i < last; ++i) {
        t3 = i + digitsShift + 1;
        if (!(t3 < t1))
          return A.ioore(xDigits, t3);
        digit = xDigits[t3];
        t3 = B.JSInt_methods.$shl((digit & bitMask) >>> 0, carryBitShift);
        t2 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(i < resultDigits.length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = (t3 | carry) >>> 0;
        carry = B.JSInt_methods.$shr(digit, bitShift);
      }
      t2 & 2 && A.throwUnsupportedOperation(resultDigits);
      if (!(last >= 0 && last < resultDigits.length))
        return A.ioore(resultDigits, last);
      resultDigits[last] = carry;
    },
    _BigIntImpl__compareDigits(digits, used, otherDigits, otherUsed) {
      var i, t1, t2, t3,
        result = used - otherUsed;
      if (result === 0)
        for (i = used - 1, t1 = digits.length, t2 = otherDigits.length; i >= 0; --i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          t3 = digits[i];
          if (!(i < t2))
            return A.ioore(otherDigits, i);
          result = t3 - otherDigits[i];
          if (result !== 0)
            return result;
        }
      return result;
    },
    _BigIntImpl__absAdd(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.$flags | 0, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 + otherDigits[i];
        t3 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(i < resultDigits.length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = B.JSInt_methods._shrOtherPositive$1(carry, 16);
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        t3 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(i < resultDigits.length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = B.JSInt_methods._shrOtherPositive$1(carry, 16);
      }
      t3 & 2 && A.throwUnsupportedOperation(resultDigits);
      if (!(used >= 0 && used < resultDigits.length))
        return A.ioore(resultDigits, used);
      resultDigits[used] = carry;
    },
    _BigIntImpl__absSub(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.$flags | 0, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 - otherDigits[i];
        t3 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(i < resultDigits.length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        t3 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(i < resultDigits.length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
    },
    _BigIntImpl__mulAdd(x, multiplicandDigits, i, accumulatorDigits, j, n) {
      var t1, t2, t3, c, i0, t4, combined, j0, l;
      if (x === 0)
        return;
      for (t1 = multiplicandDigits.length, t2 = accumulatorDigits.length, t3 = accumulatorDigits.$flags | 0, c = 0; --n, n >= 0; j = j0, i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(multiplicandDigits, i);
        t4 = multiplicandDigits[i];
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        combined = x * t4 + accumulatorDigits[j] + c;
        j0 = j + 1;
        t3 & 2 && A.throwUnsupportedOperation(accumulatorDigits);
        accumulatorDigits[j] = combined & 65535;
        c = B.JSInt_methods._tdivFast$1(combined, 65536);
      }
      for (; c !== 0; j = j0) {
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        l = accumulatorDigits[j] + c;
        j0 = j + 1;
        t3 & 2 && A.throwUnsupportedOperation(accumulatorDigits);
        accumulatorDigits[j] = l & 65535;
        c = B.JSInt_methods._tdivFast$1(l, 65536);
      }
    },
    _BigIntImpl__estimateQuotientDigit(topDigitDivisor, digits, i) {
      var t2, t3, quotientDigit,
        t1 = digits.length;
      if (!(i >= 0 && i < t1))
        return A.ioore(digits, i);
      t2 = digits[i];
      if (t2 === topDigitDivisor)
        return 65535;
      t3 = i - 1;
      if (!(t3 >= 0 && t3 < t1))
        return A.ioore(digits, t3);
      quotientDigit = B.JSInt_methods.$tdiv((t2 << 16 | digits[t3]) >>> 0, topDigitDivisor);
      if (quotientDigit > 65535)
        return 65535;
      return quotientDigit;
    },
    identityHashCode(object) {
      return A.objectHashCode(object);
    },
    int_parse(source, radix) {
      var value = A.Primitives_parseInt(source, radix);
      if (value != null)
        return value;
      throw A.wrapException(A.FormatException$(source, null, null));
    },
    Error__throw(error, stackTrace) {
      error = A.initializeExceptionWrapper(error, new Error());
      if (error == null)
        error = A._asObject(error);
      error.stack = stackTrace.toString$0(0);
      throw error;
    },
    List_List$filled($length, fill, growable, $E) {
      var i,
        result = growable ? J.JSArray_JSArray$growable($length, $E) : J.JSArray_JSArray$fixed($length, $E);
      if ($length !== 0 && fill != null)
        for (i = 0; i < result.length; ++i)
          result[i] = fill;
      return result;
    },
    List_List$from(elements, growable, $E) {
      var t1,
        list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, $E._as(t1.get$current()));
      if (growable)
        return list;
      list.$flags = 1;
      return list;
    },
    List_List$_of(elements, $E) {
      var list, t1;
      if (Array.isArray(elements))
        return A._setArrayType(elements.slice(0), $E._eval$1("JSArray<0>"));
      list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, t1.get$current());
      return list;
    },
    List_List$unmodifiable(elements, $E) {
      var result = A.List_List$from(elements, false, $E);
      result.$flags = 3;
      return result;
    },
    String_String$fromCharCodes(charCodes, start, end) {
      var t1, t2, maxLength, array, len;
      A.RangeError_checkNotNegative(start, "start");
      t1 = end == null;
      t2 = !t1;
      if (t2) {
        maxLength = end - start;
        if (maxLength < 0)
          throw A.wrapException(A.RangeError$range(end, start, null, "end", null));
        if (maxLength === 0)
          return "";
      }
      if (Array.isArray(charCodes)) {
        array = charCodes;
        len = array.length;
        if (t1)
          end = len;
        return A.Primitives_stringFromCharCodes(start > 0 || end < len ? array.slice(start, end) : array);
      }
      if (type$.NativeUint8List._is(charCodes))
        return A.String__stringFromUint8List(charCodes, start, end);
      if (t2)
        charCodes = J.take$1$ax(charCodes, end);
      if (start > 0)
        charCodes = J.skip$1$ax(charCodes, start);
      t1 = A.List_List$_of(charCodes, type$.int);
      return A.Primitives_stringFromCharCodes(t1);
    },
    String__stringFromUint8List(charCodes, start, endOrNull) {
      var len = charCodes.length;
      if (start >= len)
        return "";
      return A.Primitives_stringFromNativeUint8List(charCodes, start, endOrNull == null || endOrNull > len ? len : endOrNull);
    },
    RegExp_RegExp(source, caseSensitive, multiLine) {
      return new A.JSSyntaxRegExp(source, A.JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, false, false, ""));
    },
    identical(a, b) {
      return a == null ? b == null : a === b;
    },
    StringBuffer__writeAll(string, objects, separator) {
      var iterator = J.get$iterator$ax(objects);
      if (!iterator.moveNext$0())
        return string;
      if (separator.length === 0) {
        do
          string += A.S(iterator.get$current());
        while (iterator.moveNext$0());
      } else {
        string += A.S(iterator.get$current());
        while (iterator.moveNext$0())
          string = string + separator + A.S(iterator.get$current());
      }
      return string;
    },
    Uri_base() {
      var cachedUri, uri,
        current = A.Primitives_currentUri();
      if (current == null)
        throw A.wrapException(A.UnsupportedError$("'Uri.base' is not supported"));
      cachedUri = $.Uri__cachedBaseUri;
      if (cachedUri != null && current === $.Uri__cachedBaseString)
        return cachedUri;
      uri = A.Uri_parse(current);
      $.Uri__cachedBaseUri = uri;
      $.Uri__cachedBaseString = current;
      return uri;
    },
    _Uri__uriEncode(canonicalMask, text, encoding, spaceToPlus) {
      var t1, bytes, i, t2, byte,
        _s16_ = "0123456789ABCDEF";
      if (encoding === B.C_Utf8Codec) {
        t1 = $.$get$_Uri__needsNoEncoding();
        t1 = t1._nativeRegExp.test(text);
      } else
        t1 = false;
      if (t1)
        return text;
      bytes = encoding.encode$1(text);
      for (t1 = bytes.length, i = 0, t2 = ""; i < t1; ++i) {
        byte = bytes[i];
        if (byte < 128 && (string$.x00_____.charCodeAt(byte) & canonicalMask) !== 0)
          t2 += A.Primitives_stringFromCharCode(byte);
        else
          t2 = spaceToPlus && byte === 32 ? t2 + "+" : t2 + "%" + _s16_[byte >>> 4 & 15] + _s16_[byte & 15];
      }
      return t2.charCodeAt(0) == 0 ? t2 : t2;
    },
    StackTrace_current() {
      return A.getTraceFromException(new Error());
    },
    DateTime__fourDigits(n) {
      var absN = Math.abs(n),
        sign = n < 0 ? "-" : "";
      if (absN >= 1000)
        return "" + n;
      if (absN >= 100)
        return sign + "0" + absN;
      if (absN >= 10)
        return sign + "00" + absN;
      return sign + "000" + absN;
    },
    DateTime__threeDigits(n) {
      if (n >= 100)
        return "" + n;
      if (n >= 10)
        return "0" + n;
      return "00" + n;
    },
    DateTime__twoDigits(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    Duration$(microseconds, milliseconds) {
      return new A.Duration(microseconds + 1000 * milliseconds);
    },
    Error_safeToString(object) {
      if (typeof object == "number" || A._isBool(object) || object == null)
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      return A.Primitives_safeToString(object);
    },
    Error_throwWithStackTrace(error, stackTrace) {
      A.checkNotNullable(error, "error", type$.Object);
      A.checkNotNullable(stackTrace, "stackTrace", type$.StackTrace);
      A.Error__throw(error, stackTrace);
    },
    AssertionError$(message) {
      return new A.AssertionError(message);
    },
    ArgumentError$(message, $name) {
      return new A.ArgumentError(false, null, $name, message);
    },
    ArgumentError$value(value, $name, message) {
      return new A.ArgumentError(true, value, $name, message);
    },
    ArgumentError$notNull($name) {
      return new A.ArgumentError(false, null, $name, "Must not be null");
    },
    ArgumentError_checkNotNull(argument, $name, $T) {
      return argument;
    },
    RangeError$(message) {
      var _null = null;
      return new A.RangeError(_null, _null, false, _null, _null, message);
    },
    RangeError$value(value, $name) {
      return new A.RangeError(null, null, true, value, $name, "Value not in range");
    },
    RangeError$range(invalidValue, minValue, maxValue, $name, message) {
      return new A.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
    },
    RangeError_checkValueInInterval(value, minValue, maxValue, $name) {
      if (value < minValue || value > maxValue)
        throw A.wrapException(A.RangeError$range(value, minValue, maxValue, $name, null));
      return value;
    },
    RangeError_checkValidRange(start, end, $length) {
      if (0 > start || start > $length)
        throw A.wrapException(A.RangeError$range(start, 0, $length, "start", null));
      if (end != null) {
        if (start > end || end > $length)
          throw A.wrapException(A.RangeError$range(end, start, $length, "end", null));
        return end;
      }
      return $length;
    },
    RangeError_checkNotNegative(value, $name) {
      if (value < 0)
        throw A.wrapException(A.RangeError$range(value, 0, null, $name, null));
      return value;
    },
    IndexError$withLength(invalidValue, $length, indexable, message, $name) {
      return new A.IndexError($length, true, invalidValue, $name, "Index out of range");
    },
    UnsupportedError$(message) {
      return new A.UnsupportedError(message);
    },
    UnimplementedError$(message) {
      return new A.UnimplementedError(message);
    },
    StateError$(message) {
      return new A.StateError(message);
    },
    ConcurrentModificationError$(modifiedObject) {
      return new A.ConcurrentModificationError(modifiedObject);
    },
    Exception_Exception(message) {
      return new A._Exception(message);
    },
    FormatException$(message, source, offset) {
      return new A.FormatException(message, source, offset);
    },
    Iterable_iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
      var parts, t1;
      if (A.isToStringVisiting(iterable)) {
        if (leftDelimiter === "(" && rightDelimiter === ")")
          return "(...)";
        return leftDelimiter + "..." + rightDelimiter;
      }
      parts = A._setArrayType([], type$.JSArray_String);
      B.JSArray_methods.add$1($.toStringVisiting, iterable);
      try {
        A._iterablePartsToStrings(iterable, parts);
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      t1 = A.StringBuffer__writeAll(leftDelimiter, type$.Iterable_dynamic._as(parts), ", ") + rightDelimiter;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    Iterable_iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
      var buffer, t1;
      if (A.isToStringVisiting(iterable))
        return leftDelimiter + "..." + rightDelimiter;
      buffer = new A.StringBuffer(leftDelimiter);
      B.JSArray_methods.add$1($.toStringVisiting, iterable);
      try {
        t1 = buffer;
        t1._contents = A.StringBuffer__writeAll(t1._contents, iterable, ", ");
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      buffer._contents += rightDelimiter;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _iterablePartsToStrings(iterable, parts) {
      var next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision,
        it = J.get$iterator$ax(iterable),
        $length = 0, count = 0;
      for (;;) {
        if (!($length < 80 || count < 3))
          break;
        if (!it.moveNext$0())
          return;
        next = A.S(it.get$current());
        B.JSArray_methods.add$1(parts, next);
        $length += next.length + 2;
        ++count;
      }
      if (!it.moveNext$0()) {
        if (count <= 5)
          return;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        ultimateString = parts.pop();
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        penultimateString = parts.pop();
      } else {
        penultimate = it.get$current();
        ++count;
        if (!it.moveNext$0()) {
          if (count <= 4) {
            B.JSArray_methods.add$1(parts, A.S(penultimate));
            return;
          }
          ultimateString = A.S(penultimate);
          if (0 >= parts.length)
            return A.ioore(parts, -1);
          penultimateString = parts.pop();
          $length += ultimateString.length + 2;
        } else {
          ultimate = it.get$current();
          ++count;
          for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
            ultimate0 = it.get$current();
            ++count;
            if (count > 100) {
              for (;;) {
                if (!($length > 75 && count > 3))
                  break;
                if (0 >= parts.length)
                  return A.ioore(parts, -1);
                $length -= parts.pop().length + 2;
                --count;
              }
              B.JSArray_methods.add$1(parts, "...");
              return;
            }
          }
          penultimateString = A.S(penultimate);
          ultimateString = A.S(ultimate);
          $length += ultimateString.length + penultimateString.length + 4;
        }
      }
      if (count > parts.length + 2) {
        $length += 5;
        elision = "...";
      } else
        elision = null;
      for (;;) {
        if (!($length > 80 && parts.length > 3))
          break;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        $length -= parts.pop().length + 2;
        if (elision == null) {
          $length += 5;
          elision = "...";
        }
      }
      if (elision != null)
        B.JSArray_methods.add$1(parts, elision);
      B.JSArray_methods.add$1(parts, penultimateString);
      B.JSArray_methods.add$1(parts, ultimateString);
    },
    Map_castFrom(source, $K, $V, $K2, $V2) {
      return new A.CastMap(source, $K._eval$1("@<0>")._bind$1($V)._bind$1($K2)._bind$1($V2)._eval$1("CastMap<1,2,3,4>"));
    },
    Object_hash(object1, object2, object3, object4) {
      var t1;
      if (B.C_SentinelValue === object3) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2));
      }
      if (B.C_SentinelValue === object4) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        object3 = J.get$hashCode$(object3);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3));
      }
      t1 = J.get$hashCode$(object1);
      object2 = J.get$hashCode$(object2);
      object3 = J.get$hashCode$(object3);
      object4 = J.get$hashCode$(object4);
      object4 = A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3), object4));
      return object4;
    },
    print(object) {
      var toZone = $.printToZone;
      if (toZone == null)
        A.printString(object);
      else
        toZone.call$1(object);
    },
    Uri_parse(uri) {
      var delta, indices, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, isSimple, scheme, t1, t2, schemeAuth, queryStart0, pathStart0, port, userInfoStart, userInfo, host, portNumber, path, query, _null = null,
        end = uri.length;
      if (end >= 5) {
        if (4 >= end)
          return A.ioore(uri, 4);
        delta = ((uri.charCodeAt(4) ^ 58) * 3 | uri.charCodeAt(0) ^ 100 | uri.charCodeAt(1) ^ 97 | uri.charCodeAt(2) ^ 116 | uri.charCodeAt(3) ^ 97) >>> 0;
        if (delta === 0)
          return A.UriData__parse(end < end ? B.JSString_methods.substring$2(uri, 0, end) : uri, 5, _null).get$uri();
        else if (delta === 32)
          return A.UriData__parse(B.JSString_methods.substring$2(uri, 5, end), 0, _null).get$uri();
      }
      indices = A.List_List$filled(8, 0, false, type$.int);
      B.JSArray_methods.$indexSet(indices, 0, 0);
      B.JSArray_methods.$indexSet(indices, 1, -1);
      B.JSArray_methods.$indexSet(indices, 2, -1);
      B.JSArray_methods.$indexSet(indices, 7, -1);
      B.JSArray_methods.$indexSet(indices, 3, 0);
      B.JSArray_methods.$indexSet(indices, 4, 0);
      B.JSArray_methods.$indexSet(indices, 5, end);
      B.JSArray_methods.$indexSet(indices, 6, end);
      if (A._scan(uri, 0, end, 0, indices) >= 14)
        B.JSArray_methods.$indexSet(indices, 7, end);
      schemeEnd = indices[1];
      if (schemeEnd >= 0)
        if (A._scan(uri, 0, schemeEnd, 20, indices) === 20)
          indices[7] = schemeEnd;
      hostStart = indices[2] + 1;
      portStart = indices[3];
      pathStart = indices[4];
      queryStart = indices[5];
      fragmentStart = indices[6];
      if (fragmentStart < queryStart)
        queryStart = fragmentStart;
      if (pathStart < hostStart)
        pathStart = queryStart;
      else if (pathStart <= schemeEnd)
        pathStart = schemeEnd + 1;
      if (portStart < hostStart)
        portStart = pathStart;
      isSimple = indices[7] < 0;
      scheme = _null;
      if (isSimple) {
        isSimple = false;
        if (!(hostStart > schemeEnd + 3)) {
          t1 = portStart > 0;
          if (!(t1 && portStart + 1 === pathStart)) {
            if (!B.JSString_methods.startsWith$2(uri, "\\", pathStart))
              if (hostStart > 0)
                t2 = B.JSString_methods.startsWith$2(uri, "\\", hostStart - 1) || B.JSString_methods.startsWith$2(uri, "\\", hostStart - 2);
              else
                t2 = false;
            else
              t2 = true;
            if (!t2) {
              if (!(queryStart < end && queryStart === pathStart + 2 && B.JSString_methods.startsWith$2(uri, "..", pathStart)))
                t2 = queryStart > pathStart + 2 && B.JSString_methods.startsWith$2(uri, "/..", queryStart - 3);
              else
                t2 = true;
              if (!t2)
                if (schemeEnd === 4) {
                  if (B.JSString_methods.startsWith$2(uri, "file", 0)) {
                    if (hostStart <= 0) {
                      if (!B.JSString_methods.startsWith$2(uri, "/", pathStart)) {
                        schemeAuth = "file:///";
                        delta = 3;
                      } else {
                        schemeAuth = "file://";
                        delta = 2;
                      }
                      uri = schemeAuth + B.JSString_methods.substring$2(uri, pathStart, end);
                      queryStart += delta;
                      fragmentStart += delta;
                      end = uri.length;
                      hostStart = 7;
                      portStart = 7;
                      pathStart = 7;
                    } else if (pathStart === queryStart) {
                      ++fragmentStart;
                      queryStart0 = queryStart + 1;
                      uri = B.JSString_methods.replaceRange$3(uri, pathStart, queryStart, "/");
                      ++end;
                      queryStart = queryStart0;
                    }
                    scheme = "file";
                  } else if (B.JSString_methods.startsWith$2(uri, "http", 0)) {
                    if (t1 && portStart + 3 === pathStart && B.JSString_methods.startsWith$2(uri, "80", portStart + 1)) {
                      fragmentStart -= 3;
                      pathStart0 = pathStart - 3;
                      queryStart -= 3;
                      uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                      end -= 3;
                      pathStart = pathStart0;
                    }
                    scheme = "http";
                  }
                } else if (schemeEnd === 5 && B.JSString_methods.startsWith$2(uri, "https", 0)) {
                  if (t1 && portStart + 4 === pathStart && B.JSString_methods.startsWith$2(uri, "443", portStart + 1)) {
                    fragmentStart -= 4;
                    pathStart0 = pathStart - 4;
                    queryStart -= 4;
                    uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                    end -= 3;
                    pathStart = pathStart0;
                  }
                  scheme = "https";
                }
              isSimple = !t2;
            }
          }
        }
      }
      if (isSimple)
        return new A._SimpleUri(end < uri.length ? B.JSString_methods.substring$2(uri, 0, end) : uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
      if (scheme == null)
        if (schemeEnd > 0)
          scheme = A._Uri__makeScheme(uri, 0, schemeEnd);
        else {
          if (schemeEnd === 0)
            A._Uri__fail(uri, 0, "Invalid empty scheme");
          scheme = "";
        }
      port = _null;
      if (hostStart > 0) {
        userInfoStart = schemeEnd + 3;
        userInfo = userInfoStart < hostStart ? A._Uri__makeUserInfo(uri, userInfoStart, hostStart - 1) : "";
        host = A._Uri__makeHost(uri, hostStart, portStart, false);
        t1 = portStart + 1;
        if (t1 < pathStart) {
          portNumber = A.Primitives_parseInt(B.JSString_methods.substring$2(uri, t1, pathStart), _null);
          port = A._Uri__makePort(portNumber == null ? A.throwExpression(A.FormatException$("Invalid port", uri, t1)) : portNumber, scheme);
        }
      } else {
        host = _null;
        userInfo = "";
      }
      path = A._Uri__makePath(uri, pathStart, queryStart, _null, scheme, host != null);
      query = queryStart < fragmentStart ? A._Uri__makeQuery(uri, queryStart + 1, fragmentStart, _null) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragmentStart < end ? A._Uri__makeFragment(uri, fragmentStart + 1, end) : _null);
    },
    Uri_decodeComponent(encodedComponent) {
      A._asString(encodedComponent);
      return A._Uri__uriDecode(encodedComponent, 0, encodedComponent.length, B.C_Utf8Codec, false);
    },
    Uri__ipv4FormatError(msg, source, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv4 address, " + msg, source, position));
    },
    Uri__parseIPv4Address(host, start, end, target, targetOffset) {
      var t1, octetStart, cursor, octetIndex, octetValue, char, digit, octetIndex0, t2,
        _s17_ = "invalid character";
      for (t1 = host.length, octetStart = start, cursor = octetStart, octetIndex = 0, octetValue = 0;;) {
        if (cursor >= end)
          char = 0;
        else {
          if (!(cursor >= 0 && cursor < t1))
            return A.ioore(host, cursor);
          char = host.charCodeAt(cursor);
        }
        digit = char ^ 48;
        if (digit <= 9) {
          if (octetValue !== 0 || cursor === octetStart) {
            octetValue = octetValue * 10 + digit;
            if (octetValue <= 255) {
              ++cursor;
              continue;
            }
            A.Uri__ipv4FormatError("each part must be in the range 0..255", host, octetStart);
          }
          A.Uri__ipv4FormatError("parts must not have leading zeros", host, octetStart);
        }
        if (cursor === octetStart) {
          if (cursor === end)
            break;
          A.Uri__ipv4FormatError(_s17_, host, cursor);
        }
        octetIndex0 = octetIndex + 1;
        t2 = targetOffset + octetIndex;
        target.$flags & 2 && A.throwUnsupportedOperation(target);
        if (!(t2 < 16))
          return A.ioore(target, t2);
        target[t2] = octetValue;
        if (char === 46) {
          if (octetIndex0 < 4) {
            ++cursor;
            octetIndex = octetIndex0;
            octetStart = cursor;
            octetValue = 0;
            continue;
          }
          break;
        }
        if (cursor === end) {
          if (octetIndex0 === 4)
            return;
          break;
        }
        A.Uri__ipv4FormatError(_s17_, host, cursor);
        octetIndex = octetIndex0;
      }
      A.Uri__ipv4FormatError("IPv4 address should contain exactly 4 parts", host, cursor);
    },
    Uri__validateIPvAddress(host, start, end) {
      var error;
      if (start === end)
        throw A.wrapException(A.FormatException$("Empty IP address", host, start));
      if (!(start >= 0 && start < host.length))
        return A.ioore(host, start);
      if (host.charCodeAt(start) === 118) {
        error = A.Uri__validateIPvFutureAddress(host, start, end);
        if (error != null)
          throw A.wrapException(error);
        return false;
      }
      A.Uri_parseIPv6Address(host, start, end);
      return true;
    },
    Uri__validateIPvFutureAddress(host, start, end) {
      var t1, cursor, cursor0, char, ucChar,
        _s38_ = "Missing hex-digit in IPvFuture address",
        _s128_ = string$.x00_____;
      ++start;
      for (t1 = host.length, cursor = start;; cursor = cursor0) {
        if (cursor < end) {
          cursor0 = cursor + 1;
          if (!(cursor >= 0 && cursor < t1))
            return A.ioore(host, cursor);
          char = host.charCodeAt(cursor);
          if ((char ^ 48) <= 9)
            continue;
          ucChar = char | 32;
          if (ucChar >= 97 && ucChar <= 102)
            continue;
          if (char === 46) {
            if (cursor0 - 1 === start)
              return new A.FormatException(_s38_, host, cursor0);
            cursor = cursor0;
            break;
          }
          return new A.FormatException("Unexpected character", host, cursor0 - 1);
        }
        if (cursor - 1 === start)
          return new A.FormatException(_s38_, host, cursor);
        return new A.FormatException("Missing '.' in IPvFuture address", host, cursor);
      }
      if (cursor === end)
        return new A.FormatException("Missing address in IPvFuture address, host, cursor", null, null);
      for (;;) {
        if (!(cursor >= 0 && cursor < t1))
          return A.ioore(host, cursor);
        char = host.charCodeAt(cursor);
        if (!(char < 128))
          return A.ioore(_s128_, char);
        if ((_s128_.charCodeAt(char) & 16) !== 0) {
          ++cursor;
          if (cursor < end)
            continue;
          return null;
        }
        return new A.FormatException("Invalid IPvFuture address character", host, cursor);
      }
    },
    Uri_parseIPv6Address(host, start, end) {
      var result, t1, wildcardAt, partCount, t2, cursor, partStart, hexValue, decValue, char, _0_0, decValue0, hexDigit, _1_0, t3, partCount0, partAfterWildcard, partsAfterWildcard, positionAfterWildcard, newPositionAfterWildcard,
        _s39_ = "an address must contain at most 8 parts",
        error = new A.Uri_parseIPv6Address_error(host);
      if (end - start < 2)
        error.call$2("address is too short", null);
      result = new Uint8Array(16);
      t1 = host.length;
      if (!(start >= 0 && start < t1))
        return A.ioore(host, start);
      wildcardAt = -1;
      partCount = 0;
      if (host.charCodeAt(start) === 58) {
        t2 = start + 1;
        if (!(t2 < t1))
          return A.ioore(host, t2);
        if (host.charCodeAt(t2) === 58) {
          cursor = start + 2;
          partStart = cursor;
          wildcardAt = 0;
          partCount = 1;
        } else {
          error.call$2("invalid start colon", start);
          cursor = start;
          partStart = cursor;
        }
      } else {
        cursor = start;
        partStart = cursor;
      }
      for (hexValue = 0, decValue = true;;) {
        if (cursor >= end)
          char = 0;
        else {
          if (!(cursor < t1))
            return A.ioore(host, cursor);
          char = host.charCodeAt(cursor);
        }
        $label0$0: {
          _0_0 = char ^ 48;
          decValue0 = false;
          if (_0_0 <= 9)
            hexDigit = _0_0;
          else {
            _1_0 = char | 32;
            if (_1_0 >= 97 && _1_0 <= 102)
              hexDigit = _1_0 - 87;
            else
              break $label0$0;
            decValue = decValue0;
          }
          if (cursor < partStart + 4) {
            hexValue = hexValue * 16 + hexDigit;
            ++cursor;
            continue;
          }
          error.call$2("an IPv6 part can contain a maximum of 4 hex digits", partStart);
        }
        if (cursor > partStart) {
          if (char === 46) {
            if (decValue) {
              if (partCount <= 6) {
                A.Uri__parseIPv4Address(host, partStart, end, result, partCount * 2);
                partCount += 2;
                cursor = end;
                break;
              }
              error.call$2(_s39_, partStart);
            }
            break;
          }
          t2 = partCount * 2;
          t3 = B.JSInt_methods._shrOtherPositive$1(hexValue, 8);
          if (!(t2 < 16))
            return A.ioore(result, t2);
          result[t2] = t3;
          ++t2;
          if (!(t2 < 16))
            return A.ioore(result, t2);
          result[t2] = hexValue & 255;
          ++partCount;
          if (char === 58) {
            if (partCount < 8) {
              ++cursor;
              partStart = cursor;
              hexValue = 0;
              decValue = true;
              continue;
            }
            error.call$2(_s39_, cursor);
          }
          break;
        }
        if (char === 58) {
          if (wildcardAt < 0) {
            partCount0 = partCount + 1;
            ++cursor;
            wildcardAt = partCount;
            partCount = partCount0;
            partStart = cursor;
            continue;
          }
          error.call$2("only one wildcard `::` is allowed", cursor);
        }
        if (wildcardAt !== partCount - 1)
          error.call$2("missing part", cursor);
        break;
      }
      if (cursor < end)
        error.call$2("invalid character", cursor);
      if (partCount < 8) {
        if (wildcardAt < 0)
          error.call$2("an address without a wildcard must contain exactly 8 parts", end);
        partAfterWildcard = wildcardAt + 1;
        partsAfterWildcard = partCount - partAfterWildcard;
        if (partsAfterWildcard > 0) {
          positionAfterWildcard = partAfterWildcard * 2;
          newPositionAfterWildcard = 16 - partsAfterWildcard * 2;
          B.NativeUint8List_methods.setRange$4(result, newPositionAfterWildcard, 16, result, positionAfterWildcard);
          B.NativeUint8List_methods.fillRange$3(result, positionAfterWildcard, newPositionAfterWildcard, 0);
        }
      }
      return result;
    },
    _Uri$_internal(scheme, _userInfo, _host, _port, path, _query, _fragment) {
      return new A._Uri(scheme, _userInfo, _host, _port, path, _query, _fragment);
    },
    _Uri__Uri(host, path, pathSegments, scheme) {
      var userInfo, query, fragment, port, isFile, t1, hasAuthority, t2, _null = null;
      scheme = scheme == null ? "" : A._Uri__makeScheme(scheme, 0, scheme.length);
      userInfo = A._Uri__makeUserInfo(_null, 0, 0);
      host = A._Uri__makeHost(host, 0, host == null ? 0 : host.length, false);
      query = A._Uri__makeQuery(_null, 0, 0, _null);
      fragment = A._Uri__makeFragment(_null, 0, 0);
      port = A._Uri__makePort(_null, scheme);
      isFile = scheme === "file";
      if (host == null)
        t1 = userInfo.length !== 0 || port != null || isFile;
      else
        t1 = false;
      if (t1)
        host = "";
      t1 = host == null;
      hasAuthority = !t1;
      path = A._Uri__makePath(path, 0, path == null ? 0 : path.length, pathSegments, scheme, hasAuthority);
      t2 = scheme.length === 0;
      if (t2 && t1 && !B.JSString_methods.startsWith$1(path, "/"))
        path = A._Uri__normalizeRelativePath(path, !t2 || hasAuthority);
      else
        path = A._Uri__removeDotSegments(path);
      return A._Uri$_internal(scheme, userInfo, t1 && B.JSString_methods.startsWith$1(path, "//") ? "" : host, port, path, query, fragment);
    },
    _Uri__defaultPort(scheme) {
      if (scheme === "http")
        return 80;
      if (scheme === "https")
        return 443;
      return 0;
    },
    _Uri__fail(uri, index, message) {
      throw A.wrapException(A.FormatException$(message, uri, index));
    },
    _Uri__checkNonWindowsPathReservedCharacters(segments, argumentError) {
      var t1, _i, segment;
      for (t1 = segments.length, _i = 0; _i < t1; ++_i) {
        segment = segments[_i];
        if (B.JSString_methods.contains$1(segment, "/")) {
          t1 = A.UnsupportedError$("Illegal path character " + segment);
          throw A.wrapException(t1);
        }
      }
    },
    _Uri__makePort(port, scheme) {
      if (port != null && port === A._Uri__defaultPort(scheme))
        return null;
      return port;
    },
    _Uri__makeHost(host, start, end, strictIPv6) {
      var t1, t2, t3, zoneID, index, zoneIDstart, isIPv6, hostChars, i;
      if (host == null)
        return null;
      if (start === end)
        return "";
      t1 = host.length;
      if (!(start >= 0 && start < t1))
        return A.ioore(host, start);
      if (host.charCodeAt(start) === 91) {
        t2 = end - 1;
        if (!(t2 >= 0 && t2 < t1))
          return A.ioore(host, t2);
        if (host.charCodeAt(t2) !== 93)
          A._Uri__fail(host, start, "Missing end `]` to match `[` in host");
        t3 = start + 1;
        if (!(t3 < t1))
          return A.ioore(host, t3);
        zoneID = "";
        if (host.charCodeAt(t3) !== 118) {
          index = A._Uri__checkZoneID(host, t3, t2);
          if (index < t2) {
            zoneIDstart = index + 1;
            zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, t2, "%25");
          }
        } else
          index = t2;
        isIPv6 = A.Uri__validateIPvAddress(host, t3, index);
        hostChars = B.JSString_methods.substring$2(host, t3, index);
        return "[" + (isIPv6 ? hostChars.toLowerCase() : hostChars) + zoneID + "]";
      }
      for (i = start; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(host, i);
        if (host.charCodeAt(i) === 58) {
          index = B.JSString_methods.indexOf$2(host, "%", start);
          index = index >= start && index < end ? index : end;
          if (index < end) {
            zoneIDstart = index + 1;
            zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, end, "%25");
          } else
            zoneID = "";
          A.Uri_parseIPv6Address(host, start, index);
          return "[" + B.JSString_methods.substring$2(host, start, index) + zoneID + "]";
        }
      }
      return A._Uri__normalizeRegName(host, start, end);
    },
    _Uri__checkZoneID(host, start, end) {
      var index = B.JSString_methods.indexOf$2(host, "%", start);
      return index >= start && index < end ? index : end;
    },
    _Uri__normalizeZoneID(host, start, end, prefix) {
      var t1, index, sectionStart, isNormalized, char, replacement, t2, t3, sourceLength, tail, slice,
        buffer = prefix !== "" ? new A.StringBuffer(prefix) : null;
      for (t1 = host.length, index = start, sectionStart = index, isNormalized = true; index < end;) {
        if (!(index >= 0 && index < t1))
          return A.ioore(host, index);
        char = host.charCodeAt(index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t2 = replacement == null;
          if (t2 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          t3 = buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
          if (t2)
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
          else if (replacement === "%")
            A._Uri__fail(host, index, "ZoneID should not contain % anymore");
          buffer._contents = t3 + replacement;
          index += 3;
          sectionStart = index;
          isNormalized = true;
        } else if (char < 127 && (string$.x00_____.charCodeAt(char) & 1) !== 0) {
          if (isNormalized && 65 <= char && 90 >= char) {
            if (buffer == null)
              buffer = new A.StringBuffer("");
            if (sectionStart < index) {
              buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
              sectionStart = index;
            }
            isNormalized = false;
          }
          ++index;
        } else {
          sourceLength = 1;
          if ((char & 64512) === 55296 && index + 1 < end) {
            t2 = index + 1;
            if (!(t2 < t1))
              return A.ioore(host, t2);
            tail = host.charCodeAt(t2);
            if ((tail & 64512) === 56320) {
              char = 65536 + ((char & 1023) << 10) + (tail & 1023);
              sourceLength = 2;
            }
          }
          slice = B.JSString_methods.substring$2(host, sectionStart, index);
          if (buffer == null) {
            buffer = new A.StringBuffer("");
            t2 = buffer;
          } else
            t2 = buffer;
          t2._contents += slice;
          t3 = A._Uri__escapeChar(char);
          t2._contents += t3;
          index += sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end) {
        slice = B.JSString_methods.substring$2(host, sectionStart, end);
        buffer._contents += slice;
      }
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__normalizeRegName(host, start, end) {
      var t1, index, sectionStart, buffer, isNormalized, char, replacement, t2, slice, t3, sourceLength, tail,
        _s128_ = string$.x00_____;
      for (t1 = host.length, index = start, sectionStart = index, buffer = null, isNormalized = true; index < end;) {
        if (!(index >= 0 && index < t1))
          return A.ioore(host, index);
        char = host.charCodeAt(index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t2 = replacement == null;
          if (t2 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          slice = B.JSString_methods.substring$2(host, sectionStart, index);
          if (!isNormalized)
            slice = slice.toLowerCase();
          t3 = buffer._contents += slice;
          sourceLength = 3;
          if (t2)
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
          else if (replacement === "%") {
            replacement = "%25";
            sourceLength = 1;
          }
          buffer._contents = t3 + replacement;
          index += sourceLength;
          sectionStart = index;
          isNormalized = true;
        } else if (char < 127 && (_s128_.charCodeAt(char) & 32) !== 0) {
          if (isNormalized && 65 <= char && 90 >= char) {
            if (buffer == null)
              buffer = new A.StringBuffer("");
            if (sectionStart < index) {
              buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
              sectionStart = index;
            }
            isNormalized = false;
          }
          ++index;
        } else if (char <= 93 && (_s128_.charCodeAt(char) & 1024) !== 0)
          A._Uri__fail(host, index, "Invalid character");
        else {
          sourceLength = 1;
          if ((char & 64512) === 55296 && index + 1 < end) {
            t2 = index + 1;
            if (!(t2 < t1))
              return A.ioore(host, t2);
            tail = host.charCodeAt(t2);
            if ((tail & 64512) === 56320) {
              char = 65536 + ((char & 1023) << 10) + (tail & 1023);
              sourceLength = 2;
            }
          }
          slice = B.JSString_methods.substring$2(host, sectionStart, index);
          if (!isNormalized)
            slice = slice.toLowerCase();
          if (buffer == null) {
            buffer = new A.StringBuffer("");
            t2 = buffer;
          } else
            t2 = buffer;
          t2._contents += slice;
          t3 = A._Uri__escapeChar(char);
          t2._contents += t3;
          index += sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end) {
        slice = B.JSString_methods.substring$2(host, sectionStart, end);
        if (!isNormalized)
          slice = slice.toLowerCase();
        buffer._contents += slice;
      }
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__makeScheme(scheme, start, end) {
      var t1, i, containsUpperCase, codeUnit;
      if (start === end)
        return "";
      t1 = scheme.length;
      if (!(start < t1))
        return A.ioore(scheme, start);
      if (!A._Uri__isAlphabeticCharacter(scheme.charCodeAt(start)))
        A._Uri__fail(scheme, start, "Scheme not starting with alphabetic character");
      for (i = start, containsUpperCase = false; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(scheme, i);
        codeUnit = scheme.charCodeAt(i);
        if (!(codeUnit < 128 && (string$.x00_____.charCodeAt(codeUnit) & 8) !== 0))
          A._Uri__fail(scheme, i, "Illegal scheme character");
        if (65 <= codeUnit && codeUnit <= 90)
          containsUpperCase = true;
      }
      scheme = B.JSString_methods.substring$2(scheme, start, end);
      return A._Uri__canonicalizeScheme(containsUpperCase ? scheme.toLowerCase() : scheme);
    },
    _Uri__canonicalizeScheme(scheme) {
      if (scheme === "http")
        return "http";
      if (scheme === "file")
        return "file";
      if (scheme === "https")
        return "https";
      if (scheme === "package")
        return "package";
      return scheme;
    },
    _Uri__makeUserInfo(userInfo, start, end) {
      if (userInfo == null)
        return "";
      return A._Uri__normalizeOrSubstring(userInfo, start, end, 16, false, false);
    },
    _Uri__makePath(path, start, end, pathSegments, scheme, hasAuthority) {
      var t1, result,
        isFile = scheme === "file",
        ensureLeadingSlash = isFile || hasAuthority;
      if (path == null) {
        if (pathSegments == null)
          return isFile ? "/" : "";
        t1 = A._arrayInstanceType(pathSegments);
        result = new A.MappedListIterable(pathSegments, t1._eval$1("String(1)")._as(new A._Uri__makePath_closure()), t1._eval$1("MappedListIterable<1,String>")).join$1(0, "/");
      } else if (pathSegments != null)
        throw A.wrapException(A.ArgumentError$("Both path and pathSegments specified", null));
      else
        result = A._Uri__normalizeOrSubstring(path, start, end, 128, true, true);
      if (result.length === 0) {
        if (isFile)
          return "/";
      } else if (ensureLeadingSlash && !B.JSString_methods.startsWith$1(result, "/"))
        result = "/" + result;
      return A._Uri__normalizePath(result, scheme, hasAuthority);
    },
    _Uri__normalizePath(path, scheme, hasAuthority) {
      var t1 = scheme.length === 0;
      if (t1 && !hasAuthority && !B.JSString_methods.startsWith$1(path, "/") && !B.JSString_methods.startsWith$1(path, "\\"))
        return A._Uri__normalizeRelativePath(path, !t1 || hasAuthority);
      return A._Uri__removeDotSegments(path);
    },
    _Uri__makeQuery(query, start, end, queryParameters) {
      if (query != null)
        return A._Uri__normalizeOrSubstring(query, start, end, 256, true, false);
      return null;
    },
    _Uri__makeFragment(fragment, start, end) {
      if (fragment == null)
        return null;
      return A._Uri__normalizeOrSubstring(fragment, start, end, 256, true, false);
    },
    _Uri__normalizeEscape(source, index, lowerCase) {
      var t3, firstDigit, secondDigit, firstDigitValue, secondDigitValue, value,
        _s128_ = string$.x00_____,
        t1 = index + 2,
        t2 = source.length;
      if (t1 >= t2)
        return "%";
      t3 = index + 1;
      if (!(t3 >= 0 && t3 < t2))
        return A.ioore(source, t3);
      firstDigit = source.charCodeAt(t3);
      if (!(t1 >= 0))
        return A.ioore(source, t1);
      secondDigit = source.charCodeAt(t1);
      firstDigitValue = A.hexDigitValue(firstDigit);
      secondDigitValue = A.hexDigitValue(secondDigit);
      if (firstDigitValue < 0 || secondDigitValue < 0)
        return "%";
      value = firstDigitValue * 16 + secondDigitValue;
      if (value < 127) {
        if (!(value >= 0))
          return A.ioore(_s128_, value);
        t1 = (_s128_.charCodeAt(value) & 1) !== 0;
      } else
        t1 = false;
      if (t1)
        return A.Primitives_stringFromCharCode(lowerCase && 65 <= value && 90 >= value ? (value | 32) >>> 0 : value);
      if (firstDigit >= 97 || secondDigit >= 97)
        return B.JSString_methods.substring$2(source, index, index + 3).toUpperCase();
      return null;
    },
    _Uri__escapeChar(char) {
      var codeUnits, t1, flag, encodedBytes, index, byte, t2, t3,
        _s16_ = "0123456789ABCDEF";
      if (char <= 127) {
        codeUnits = new Uint8Array(3);
        codeUnits[0] = 37;
        t1 = char >>> 4;
        if (!(t1 < 16))
          return A.ioore(_s16_, t1);
        codeUnits[1] = _s16_.charCodeAt(t1);
        codeUnits[2] = _s16_.charCodeAt(char & 15);
      } else {
        if (char > 2047)
          if (char > 65535) {
            flag = 240;
            encodedBytes = 4;
          } else {
            flag = 224;
            encodedBytes = 3;
          }
        else {
          flag = 192;
          encodedBytes = 2;
        }
        t1 = 3 * encodedBytes;
        codeUnits = new Uint8Array(t1);
        for (index = 0; --encodedBytes, encodedBytes >= 0; flag = 128) {
          byte = B.JSInt_methods._shrReceiverPositive$1(char, 6 * encodedBytes) & 63 | flag;
          if (!(index < t1))
            return A.ioore(codeUnits, index);
          codeUnits[index] = 37;
          t2 = index + 1;
          t3 = byte >>> 4;
          if (!(t3 < 16))
            return A.ioore(_s16_, t3);
          if (!(t2 < t1))
            return A.ioore(codeUnits, t2);
          codeUnits[t2] = _s16_.charCodeAt(t3);
          t3 = index + 2;
          if (!(t3 < t1))
            return A.ioore(codeUnits, t3);
          codeUnits[t3] = _s16_.charCodeAt(byte & 15);
          index += 3;
        }
      }
      return A.String_String$fromCharCodes(codeUnits, 0, null);
    },
    _Uri__normalizeOrSubstring(component, start, end, charMask, escapeDelimiters, replaceBackslash) {
      var t1 = A._Uri__normalize(component, start, end, charMask, escapeDelimiters, replaceBackslash);
      return t1 == null ? B.JSString_methods.substring$2(component, start, end) : t1;
    },
    _Uri__normalize(component, start, end, charMask, escapeDelimiters, replaceBackslash) {
      var t1, t2, index, sectionStart, buffer, char, sourceLength, replacement, t3, tail, _null = null,
        _s128_ = string$.x00_____;
      for (t1 = !escapeDelimiters, t2 = component.length, index = start, sectionStart = index, buffer = _null; index < end;) {
        if (!(index >= 0 && index < t2))
          return A.ioore(component, index);
        char = component.charCodeAt(index);
        if (char < 127 && (_s128_.charCodeAt(char) & charMask) !== 0)
          ++index;
        else {
          sourceLength = 1;
          if (char === 37) {
            replacement = A._Uri__normalizeEscape(component, index, false);
            if (replacement == null) {
              index += 3;
              continue;
            }
            if ("%" === replacement)
              replacement = "%25";
            else
              sourceLength = 3;
          } else if (char === 92 && replaceBackslash)
            replacement = "/";
          else if (t1 && char <= 93 && (_s128_.charCodeAt(char) & 1024) !== 0) {
            A._Uri__fail(component, index, "Invalid character");
            sourceLength = _null;
            replacement = sourceLength;
          } else {
            if ((char & 64512) === 55296) {
              t3 = index + 1;
              if (t3 < end) {
                if (!(t3 < t2))
                  return A.ioore(component, t3);
                tail = component.charCodeAt(t3);
                if ((tail & 64512) === 56320) {
                  char = 65536 + ((char & 1023) << 10) + (tail & 1023);
                  sourceLength = 2;
                }
              }
            }
            replacement = A._Uri__escapeChar(char);
          }
          if (buffer == null) {
            buffer = new A.StringBuffer("");
            t3 = buffer;
          } else
            t3 = buffer;
          t3._contents = (t3._contents += B.JSString_methods.substring$2(component, sectionStart, index)) + replacement;
          if (typeof sourceLength !== "number")
            return A.iae(sourceLength);
          index += sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null)
        return _null;
      if (sectionStart < end) {
        t1 = B.JSString_methods.substring$2(component, sectionStart, end);
        buffer._contents += t1;
      }
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__mayContainDotSegments(path) {
      if (B.JSString_methods.startsWith$1(path, "."))
        return true;
      return B.JSString_methods.indexOf$1(path, "/.") !== -1;
    },
    _Uri__removeDotSegments(path) {
      var output, t1, t2, appendSlash, _i, segment, t3;
      if (!A._Uri__mayContainDotSegments(path))
        return path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (segment === "..") {
          t3 = output.length;
          if (t3 !== 0) {
            if (0 >= t3)
              return A.ioore(output, -1);
            output.pop();
            if (output.length === 0)
              B.JSArray_methods.add$1(output, "");
          }
          appendSlash = true;
        } else {
          appendSlash = "." === segment;
          if (!appendSlash)
            B.JSArray_methods.add$1(output, segment);
        }
      }
      if (appendSlash)
        B.JSArray_methods.add$1(output, "");
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__normalizeRelativePath(path, allowScheme) {
      var output, t1, t2, appendSlash, _i, segment;
      if (!A._Uri__mayContainDotSegments(path))
        return !allowScheme ? A._Uri__escapeScheme(path) : path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (".." === segment) {
          if (output.length !== 0 && B.JSArray_methods.get$last(output) !== "..") {
            if (0 >= output.length)
              return A.ioore(output, -1);
            output.pop();
          } else
            B.JSArray_methods.add$1(output, "..");
          appendSlash = true;
        } else {
          appendSlash = "." === segment;
          if (!appendSlash)
            B.JSArray_methods.add$1(output, segment.length === 0 && output.length === 0 ? "./" : segment);
        }
      }
      if (output.length === 0)
        return "./";
      if (appendSlash)
        B.JSArray_methods.add$1(output, "");
      if (!allowScheme) {
        if (0 >= output.length)
          return A.ioore(output, 0);
        B.JSArray_methods.$indexSet(output, 0, A._Uri__escapeScheme(output[0]));
      }
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__escapeScheme(path) {
      var i, char, t2,
        _s128_ = string$.x00_____,
        t1 = path.length;
      if (t1 >= 2 && A._Uri__isAlphabeticCharacter(path.charCodeAt(0)))
        for (i = 1; i < t1; ++i) {
          char = path.charCodeAt(i);
          if (char === 58)
            return B.JSString_methods.substring$2(path, 0, i) + "%3A" + B.JSString_methods.substring$1(path, i + 1);
          if (char <= 127) {
            if (!(char < 128))
              return A.ioore(_s128_, char);
            t2 = (_s128_.charCodeAt(char) & 8) === 0;
          } else
            t2 = true;
          if (t2)
            break;
        }
      return path;
    },
    _Uri__packageNameEnd(uri, path) {
      if (uri.isScheme$1("package") && uri._host == null)
        return A._skipPackageNameChars(path, 0, path.length);
      return -1;
    },
    _Uri__hexCharPairToByte(s, pos) {
      var t1, byte, i, t2, charCode;
      for (t1 = s.length, byte = 0, i = 0; i < 2; ++i) {
        t2 = pos + i;
        if (!(t2 < t1))
          return A.ioore(s, t2);
        charCode = s.charCodeAt(t2);
        if (48 <= charCode && charCode <= 57)
          byte = byte * 16 + charCode - 48;
        else {
          charCode |= 32;
          if (97 <= charCode && charCode <= 102)
            byte = byte * 16 + charCode - 87;
          else
            throw A.wrapException(A.ArgumentError$("Invalid URL encoding", null));
        }
      }
      return byte;
    },
    _Uri__uriDecode(text, start, end, encoding, plusToSpace) {
      var simple, codeUnit, t2, bytes,
        t1 = text.length,
        i = start;
      for (;;) {
        if (!(i < end)) {
          simple = true;
          break;
        }
        if (!(i < t1))
          return A.ioore(text, i);
        codeUnit = text.charCodeAt(i);
        if (codeUnit <= 127)
          t2 = codeUnit === 37;
        else
          t2 = true;
        if (t2) {
          simple = false;
          break;
        }
        ++i;
      }
      if (simple)
        if (B.C_Utf8Codec === encoding)
          return B.JSString_methods.substring$2(text, start, end);
        else
          bytes = new A.CodeUnits(B.JSString_methods.substring$2(text, start, end));
      else {
        bytes = A._setArrayType([], type$.JSArray_int);
        for (i = start; i < end; ++i) {
          if (!(i < t1))
            return A.ioore(text, i);
          codeUnit = text.charCodeAt(i);
          if (codeUnit > 127)
            throw A.wrapException(A.ArgumentError$("Illegal percent encoding in URI", null));
          if (codeUnit === 37) {
            if (i + 3 > t1)
              throw A.wrapException(A.ArgumentError$("Truncated URI", null));
            B.JSArray_methods.add$1(bytes, A._Uri__hexCharPairToByte(text, i + 1));
            i += 2;
          } else
            B.JSArray_methods.add$1(bytes, codeUnit);
        }
      }
      return encoding.decode$1(bytes);
    },
    _Uri__isAlphabeticCharacter(codeUnit) {
      var lowerCase = codeUnit | 32;
      return 97 <= lowerCase && lowerCase <= 122;
    },
    UriData__parse(text, start, sourceUri) {
      var t1, i, slashIndex, char, equalsIndex, lastSeparator, t2, data,
        _s17_ = "Invalid MIME type",
        indices = A._setArrayType([start - 1], type$.JSArray_int);
      for (t1 = text.length, i = start, slashIndex = -1, char = null; i < t1; ++i) {
        char = text.charCodeAt(i);
        if (char === 44 || char === 59)
          break;
        if (char === 47) {
          if (slashIndex < 0) {
            slashIndex = i;
            continue;
          }
          throw A.wrapException(A.FormatException$(_s17_, text, i));
        }
      }
      if (slashIndex < 0 && i > start)
        throw A.wrapException(A.FormatException$(_s17_, text, i));
      while (char !== 44) {
        B.JSArray_methods.add$1(indices, i);
        ++i;
        for (equalsIndex = -1; i < t1; ++i) {
          if (!(i >= 0))
            return A.ioore(text, i);
          char = text.charCodeAt(i);
          if (char === 61) {
            if (equalsIndex < 0)
              equalsIndex = i;
          } else if (char === 59 || char === 44)
            break;
        }
        if (equalsIndex >= 0)
          B.JSArray_methods.add$1(indices, equalsIndex);
        else {
          lastSeparator = B.JSArray_methods.get$last(indices);
          if (char !== 44 || i !== lastSeparator + 7 || !B.JSString_methods.startsWith$2(text, "base64", lastSeparator + 1))
            throw A.wrapException(A.FormatException$("Expecting '='", text, i));
          break;
        }
      }
      B.JSArray_methods.add$1(indices, i);
      t2 = i + 1;
      if ((indices.length & 1) === 1)
        text = B.C_Base64Codec.normalize$3(text, t2, t1);
      else {
        data = A._Uri__normalize(text, t2, t1, 256, true, false);
        if (data != null)
          text = B.JSString_methods.replaceRange$3(text, t2, t1, data);
      }
      return new A.UriData(text, indices, sourceUri);
    },
    _scan(uri, start, end, state, indices) {
      var t1, i, char, t2, transition,
        _s2112_ = '\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe3\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0e\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\n\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\xeb\xeb\x8b\xeb\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x83\xeb\xeb\x8b\xeb\x8b\xeb\xcd\x8b\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x92\x83\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x8b\xeb\x8b\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xebD\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12D\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe8\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\x05\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x10\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\f\xec\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\xec\f\xec\f\xec\xcd\f\xec\f\f\f\f\f\f\f\f\f\xec\f\f\f\f\f\f\f\f\f\f\xec\f\xec\f\xec\f\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\r\xed\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\xed\r\xed\r\xed\xed\r\xed\r\r\r\r\r\r\r\r\r\xed\r\r\r\r\r\r\r\r\r\r\xed\r\xed\r\xed\r\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0f\xea\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe9\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\t\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x11\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xe9\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\t\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x13\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\xf5\x15\x15\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5';
      for (t1 = uri.length, i = start; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(uri, i);
        char = uri.charCodeAt(i) ^ 96;
        if (char > 95)
          char = 31;
        t2 = state * 96 + char;
        if (!(t2 < 2112))
          return A.ioore(_s2112_, t2);
        transition = _s2112_.charCodeAt(t2);
        state = transition & 31;
        B.JSArray_methods.$indexSet(indices, transition >>> 5, i);
      }
      return state;
    },
    _SimpleUri__packageNameEnd(uri) {
      if (uri._schemeEnd === 7 && B.JSString_methods.startsWith$1(uri._uri, "package") && uri._hostStart <= 0)
        return A._skipPackageNameChars(uri._uri, uri._pathStart, uri._queryStart);
      return -1;
    },
    _skipPackageNameChars(source, start, end) {
      var t1, i, dots, char;
      for (t1 = source.length, i = start, dots = 0; i < end; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(source, i);
        char = source.charCodeAt(i);
        if (char === 47)
          return dots !== 0 ? i : -1;
        if (char === 37 || char === 58)
          return -1;
        dots |= char ^ 46;
      }
      return -1;
    },
    _caseInsensitiveCompareStart(prefix, string, start) {
      var t1, t2, result, i, t3, stringChar, delta, lowerChar;
      for (t1 = prefix.length, t2 = string.length, result = 0, i = 0; i < t1; ++i) {
        t3 = start + i;
        if (!(t3 < t2))
          return A.ioore(string, t3);
        stringChar = string.charCodeAt(t3);
        delta = prefix.charCodeAt(i) ^ stringChar;
        if (delta !== 0) {
          if (delta === 32) {
            lowerChar = stringChar | delta;
            if (97 <= lowerChar && lowerChar <= 122) {
              result = 32;
              continue;
            }
          }
          return -1;
        }
      }
      return result;
    },
    _BigIntImpl: function _BigIntImpl(t0, t1, t2) {
      this._isNegative = t0;
      this._digits = t1;
      this._used = t2;
    },
    _BigIntImpl_hashCode_combine: function _BigIntImpl_hashCode_combine() {
    },
    _BigIntImpl_hashCode_finish: function _BigIntImpl_hashCode_finish() {
    },
    DateTime: function DateTime(t0, t1, t2) {
      this._value = t0;
      this._microsecond = t1;
      this.isUtc = t2;
    },
    Duration: function Duration(t0) {
      this._duration = t0;
    },
    Error: function Error() {
    },
    AssertionError: function AssertionError(t0) {
      this.message = t0;
    },
    TypeError: function TypeError() {
    },
    ArgumentError: function ArgumentError(t0, t1, t2, t3) {
      var _ = this;
      _._hasValue = t0;
      _.invalidValue = t1;
      _.name = t2;
      _.message = t3;
    },
    RangeError: function RangeError(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _.start = t0;
      _.end = t1;
      _._hasValue = t2;
      _.invalidValue = t3;
      _.name = t4;
      _.message = t5;
    },
    IndexError: function IndexError(t0, t1, t2, t3, t4) {
      var _ = this;
      _.length = t0;
      _._hasValue = t1;
      _.invalidValue = t2;
      _.name = t3;
      _.message = t4;
    },
    UnsupportedError: function UnsupportedError(t0) {
      this.message = t0;
    },
    UnimplementedError: function UnimplementedError(t0) {
      this.message = t0;
    },
    StateError: function StateError(t0) {
      this.message = t0;
    },
    ConcurrentModificationError: function ConcurrentModificationError(t0) {
      this.modifiedObject = t0;
    },
    OutOfMemoryError: function OutOfMemoryError() {
    },
    StackOverflowError: function StackOverflowError() {
    },
    _Exception: function _Exception(t0) {
      this.message = t0;
    },
    FormatException: function FormatException(t0, t1, t2) {
      this.message = t0;
      this.source = t1;
      this.offset = t2;
    },
    IntegerDivisionByZeroException: function IntegerDivisionByZeroException() {
    },
    Iterable: function Iterable() {
    },
    MapEntry: function MapEntry(t0, t1, t2) {
      this.key = t0;
      this.value = t1;
      this.$ti = t2;
    },
    Null: function Null() {
    },
    Object: function Object() {
    },
    _StringStackTrace: function _StringStackTrace(t0) {
      this._stackTrace = t0;
    },
    StringBuffer: function StringBuffer(t0) {
      this._contents = t0;
    },
    Uri_parseIPv6Address_error: function Uri_parseIPv6Address_error(t0) {
      this.host = t0;
    },
    _Uri: function _Uri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode_FI = _.___Uri_pathSegments_FI = _.___Uri__text_FI = $;
    },
    _Uri__makePath_closure: function _Uri__makePath_closure() {
    },
    UriData: function UriData(t0, t1, t2) {
      this._text = t0;
      this._separatorIndices = t1;
      this._uriCache = t2;
    },
    _SimpleUri: function _SimpleUri(t0, t1, t2, t3, t4, t5, t6, t7) {
      var _ = this;
      _._uri = t0;
      _._schemeEnd = t1;
      _._hostStart = t2;
      _._portStart = t3;
      _._pathStart = t4;
      _._queryStart = t5;
      _._fragmentStart = t6;
      _._schemeCache = t7;
      _._hashCodeCache = null;
    },
    _DataUri: function _DataUri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode_FI = _.___Uri_pathSegments_FI = _.___Uri__text_FI = $;
    },
    JSAnyUtilityExtension_instanceOfString(_this, constructorName) {
      var parts, $constructor, t1, _i, t2;
      if (constructorName.length === 0)
        return false;
      parts = constructorName.split(".");
      $constructor = init.G;
      for (t1 = parts.length, _i = 0; _i < t1; ++_i, $constructor = t2) {
        t2 = $constructor[parts[_i]];
        A._asJSObjectQ(t2);
        if (t2 == null)
          return false;
      }
      return _this instanceof type$.JavaScriptFunction._as($constructor);
    },
    FutureOfJSAnyToJSPromise_get_toJS(_this, $T) {
      return A._asJSObject(new init.G.Promise(A._functionToJS2(new A.FutureOfJSAnyToJSPromise_get_toJS_closure(_this))));
    },
    FutureOfVoidToJSPromise_get_toJS(_this) {
      return A._asJSObject(new init.G.Promise(A._functionToJS2(new A.FutureOfVoidToJSPromise_get_toJS_closure(_this))));
    },
    NullRejectionException: function NullRejectionException(t0) {
      this.isUndefined = t0;
    },
    FutureOfJSAnyToJSPromise_get_toJS_closure: function FutureOfJSAnyToJSPromise_get_toJS_closure(t0) {
      this._this = t0;
    },
    FutureOfJSAnyToJSPromise_get_toJS__closure: function FutureOfJSAnyToJSPromise_get_toJS__closure(t0) {
      this.resolve = t0;
    },
    FutureOfJSAnyToJSPromise_get_toJS__closure0: function FutureOfJSAnyToJSPromise_get_toJS__closure0(t0) {
      this.reject = t0;
    },
    FutureOfVoidToJSPromise_get_toJS_closure: function FutureOfVoidToJSPromise_get_toJS_closure(t0) {
      this._this = t0;
    },
    FutureOfVoidToJSPromise_get_toJS__closure: function FutureOfVoidToJSPromise_get_toJS__closure(t0) {
      this.resolve = t0;
    },
    FutureOfVoidToJSPromise_get_toJS__closure0: function FutureOfVoidToJSPromise_get_toJS__closure0(t0) {
      this.reject = t0;
    },
    _functionToJS0(f) {
      var result;
      if (typeof f == "function")
        throw A.wrapException(A.ArgumentError$("Attempting to rewrap a JS function.", null));
      result = function(_call, f) {
        return function() {
          return _call(f);
        };
      }(A._callDartFunctionFast0, f);
      result[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
      return result;
    },
    _functionToJS1(f) {
      var result;
      if (typeof f == "function")
        throw A.wrapException(A.ArgumentError$("Attempting to rewrap a JS function.", null));
      result = function(_call, f) {
        return function(arg1) {
          return _call(f, arg1, arguments.length);
        };
      }(A._callDartFunctionFast1, f);
      result[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
      return result;
    },
    _functionToJS2(f) {
      var result;
      if (typeof f == "function")
        throw A.wrapException(A.ArgumentError$("Attempting to rewrap a JS function.", null));
      result = function(_call, f) {
        return function(arg1, arg2) {
          return _call(f, arg1, arg2, arguments.length);
        };
      }(A._callDartFunctionFast2, f);
      result[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
      return result;
    },
    _callDartFunctionFast0(callback) {
      return type$.Function._as(callback).call$0();
    },
    _callDartFunctionFast1(callback, arg1, $length) {
      type$.Function._as(callback);
      if (A._asInt($length) >= 1)
        return callback.call$1(arg1);
      return callback.call$0();
    },
    _callDartFunctionFast2(callback, arg1, arg2, $length) {
      type$.Function._as(callback);
      A._asInt($length);
      if ($length >= 2)
        return callback.call$2(arg1, arg2);
      if ($length === 1)
        return callback.call$1(arg1);
      return callback.call$0();
    },
    _callDartFunctionFast3(callback, arg1, arg2, arg3, $length) {
      type$.Function._as(callback);
      A._asInt($length);
      if ($length >= 3)
        return callback.call$3(arg1, arg2, arg3);
      if ($length === 2)
        return callback.call$2(arg1, arg2);
      if ($length === 1)
        return callback.call$1(arg1);
      return callback.call$0();
    },
    _noJsifyRequired(o) {
      return o == null || A._isBool(o) || typeof o == "number" || typeof o == "string" || type$.Int8List._is(o) || type$.Uint8List._is(o) || type$.Uint8ClampedList._is(o) || type$.Int16List._is(o) || type$.Uint16List._is(o) || type$.Int32List._is(o) || type$.Uint32List._is(o) || type$.Float32List._is(o) || type$.Float64List._is(o) || type$.ByteBuffer._is(o) || type$.ByteData._is(o);
    },
    jsify(object) {
      if (A._noJsifyRequired(object))
        return object;
      return new A.jsify__convert(new A._IdentityHashMap(type$._IdentityHashMap_of_nullable_Object_and_nullable_Object)).call$1(object);
    },
    getProperty(o, $name, $T) {
      return $T._as(o[$name]);
    },
    callConstructor(constr, $arguments, $T) {
      var args, factoryFunction;
      if ($arguments == null)
        return $T._as(new constr());
      if ($arguments instanceof Array)
        switch ($arguments.length) {
          case 0:
            return $T._as(new constr());
          case 1:
            return $T._as(new constr($arguments[0]));
          case 2:
            return $T._as(new constr($arguments[0], $arguments[1]));
          case 3:
            return $T._as(new constr($arguments[0], $arguments[1], $arguments[2]));
          case 4:
            return $T._as(new constr($arguments[0], $arguments[1], $arguments[2], $arguments[3]));
        }
      args = [null];
      B.JSArray_methods.addAll$1(args, $arguments);
      factoryFunction = constr.bind.apply(constr, args);
      String(factoryFunction);
      return $T._as(new factoryFunction());
    },
    promiseToFuture(jsPromise, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new A._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      jsPromise.then(A.convertDartClosureToJS(new A.promiseToFuture_closure(completer, $T), 1), A.convertDartClosureToJS(new A.promiseToFuture_closure0(completer), 1));
      return t1;
    },
    _noDartifyRequired(o) {
      return o == null || typeof o === "boolean" || typeof o === "number" || typeof o === "string" || o instanceof Int8Array || o instanceof Uint8Array || o instanceof Uint8ClampedArray || o instanceof Int16Array || o instanceof Uint16Array || o instanceof Int32Array || o instanceof Uint32Array || o instanceof Float32Array || o instanceof Float64Array || o instanceof ArrayBuffer || o instanceof DataView;
    },
    dartify(o) {
      if (A._noDartifyRequired(o))
        return o;
      return new A.dartify_convert(new A._IdentityHashMap(type$._IdentityHashMap_of_nullable_Object_and_nullable_Object)).call$1(o);
    },
    jsify__convert: function jsify__convert(t0) {
      this._convertedObjects = t0;
    },
    promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
      this.completer = t0;
      this.T = t1;
    },
    promiseToFuture_closure0: function promiseToFuture_closure0(t0) {
      this.completer = t0;
    },
    dartify_convert: function dartify_convert(t0) {
      this._convertedObjects = t0;
    },
    max(a, b, $T) {
      A.checkTypeBound($T, type$.num, "T", "max");
      return Math.max($T._as(a), $T._as(b));
    },
    _JSRandom: function _JSRandom() {
    },
    _JSSecureRandom: function _JSSecureRandom(t0) {
      this._math$_buffer = t0;
    },
    AsyncMemoizer: function AsyncMemoizer(t0, t1) {
      this._async_memoizer$_completer = t0;
      this.$ti = t1;
    },
    DelegatingStreamSink: function DelegatingStreamSink() {
    },
    ErrorResult: function ErrorResult(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    ValueResult: function ValueResult(t0, t1) {
      this.value = t0;
      this.$ti = t1;
    },
    StreamQueue: function StreamQueue(t0, t1, t2, t3) {
      var _ = this;
      _._stream_queue$_source = t0;
      _._stream_queue$_subscription = null;
      _._isDone = false;
      _._eventsReceived = 0;
      _._eventQueue = t1;
      _._requestQueue = t2;
      _.$ti = t3;
    },
    StreamQueue__ensureListening_closure: function StreamQueue__ensureListening_closure(t0) {
      this.$this = t0;
    },
    StreamQueue__ensureListening_closure1: function StreamQueue__ensureListening_closure1(t0) {
      this.$this = t0;
    },
    StreamQueue__ensureListening_closure0: function StreamQueue__ensureListening_closure0(t0) {
      this.$this = t0;
    },
    _NextRequest: function _NextRequest(t0, t1) {
      this._stream_queue$_completer = t0;
      this.$ti = t1;
    },
    _HasNextRequest: function _HasNextRequest(t0, t1) {
      this._stream_queue$_completer = t0;
      this.$ti = t1;
    },
    hashObjects(objects) {
      return A._finish(B.JSArray_methods.fold$1$2(objects, 0, new A.hashObjects_closure(), type$.int));
    },
    _combine(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    _finish(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    hashObjects_closure: function hashObjects_closure() {
    },
    BuiltList_BuiltList$from(iterable, $E) {
      var t1;
      if (iterable instanceof A._BuiltList) {
        t1 = A.createRuntimeType($E);
        t1 = A.createRuntimeType(iterable.$ti._precomputed1) === t1;
      } else
        t1 = false;
      if (t1)
        return $E._eval$1("BuiltList<0>")._as(iterable);
      else {
        t1 = new A._BuiltList(A.List_List$from(iterable, false, $E), $E._eval$1("_BuiltList<0>"));
        t1._list$_maybeCheckForNull$0();
        return t1;
      }
    },
    ListBuilder_ListBuilder(iterable, $E) {
      var t1 = new A.ListBuilder($E._eval$1("ListBuilder<0>"));
      t1.replace$1(iterable);
      return t1;
    },
    BuiltList: function BuiltList() {
    },
    _BuiltList: function _BuiltList(t0, t1) {
      this._list = t0;
      this._list$_hashCode = null;
      this.$ti = t1;
    },
    ListBuilder: function ListBuilder(t0) {
      this.__ListBuilder__list_A = $;
      this._listOwner = null;
      this.$ti = t0;
    },
    BuiltListMultimap_BuiltListMultimap($K, $V) {
      var t1 = A._BuiltListMultimap$copy(B.Map_empty.get$keys(), new A.BuiltListMultimap_BuiltListMultimap_closure(B.Map_empty), $K, $V);
      return t1;
    },
    _BuiltListMultimap$copy(keys, lookup, $K, $V) {
      var t1 = new A._BuiltListMultimap(A.LinkedHashMap_LinkedHashMap$_empty($K, $V._eval$1("BuiltList<0>")), A.BuiltList_BuiltList$from(B.List_empty0, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltListMultimap<1,2>"));
      t1._BuiltListMultimap$copy$2(keys, lookup, $K, $V);
      return t1;
    },
    ListMultimapBuilder_ListMultimapBuilder($K, $V) {
      var t1 = new A.ListMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("ListMultimapBuilder<1,2>"));
      t1.replace$1(B.Map_empty);
      return t1;
    },
    BuiltListMultimap: function BuiltListMultimap() {
    },
    BuiltListMultimap_BuiltListMultimap_closure: function BuiltListMultimap_BuiltListMultimap_closure(t0) {
      this.multimap = t0;
    },
    BuiltListMultimap_hashCode_closure: function BuiltListMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltListMultimap: function _BuiltListMultimap(t0, t1, t2) {
      var _ = this;
      _._list_multimap$_map = t0;
      _._emptyList = t1;
      _._list_multimap$_keys = _._list_multimap$_hashCode = null;
      _.$ti = t2;
    },
    ListMultimapBuilder: function ListMultimapBuilder(t0) {
      var _ = this;
      _.__ListMultimapBuilder__builtMap_A = $;
      _._list_multimap$_builtMapOwner = null;
      _.__ListMultimapBuilder__builderMap_A = $;
      _.$ti = t0;
    },
    ListMultimapBuilder_replace_closure: function ListMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    BuiltMap_BuiltMap($K, $V) {
      var t1 = new A._BuiltMap(null, A.LinkedHashMap_LinkedHashMap$_empty($K, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltMap<1,2>"));
      t1._BuiltMap$copyAndCheckTypes$2(B.Map_empty.get$keys(), new A.BuiltMap_BuiltMap_closure(B.Map_empty), $K, $V);
      return t1;
    },
    MapBuilder_MapBuilder($K, $V) {
      var t1 = new A.MapBuilder(null, $, null, $K._eval$1("@<0>")._bind$1($V)._eval$1("MapBuilder<1,2>"));
      t1.replace$1(B.Map_empty);
      return t1;
    },
    BuiltMap: function BuiltMap() {
    },
    BuiltMap_BuiltMap_closure: function BuiltMap_BuiltMap_closure(t0) {
      this.map = t0;
    },
    BuiltMap_hashCode_closure: function BuiltMap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltMap: function _BuiltMap(t0, t1, t2) {
      var _ = this;
      _._mapFactory = t0;
      _._map$_map = t1;
      _._map$_keys = _._map$_hashCode = null;
      _.$ti = t2;
    },
    MapBuilder: function MapBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._mapFactory = t0;
      _.__MapBuilder__map_A = t1;
      _._mapOwner = t2;
      _.$ti = t3;
    },
    MapBuilder_replace_closure: function MapBuilder_replace_closure(t0, t1) {
      this.$this = t0;
      this.replacement = t1;
    },
    BuiltSet_BuiltSet$from(iterable, $E) {
      var t1 = new A._BuiltSet(null, A.LinkedHashSet_LinkedHashSet$from(iterable, $E), $E._eval$1("_BuiltSet<0>"));
      t1._maybeCheckForNull$0();
      return t1;
    },
    SetBuilder_SetBuilder($E) {
      var t1 = new A.SetBuilder(null, $, null, $E._eval$1("SetBuilder<0>"));
      t1.replace$1(B.List_empty0);
      return t1;
    },
    BuiltSet: function BuiltSet() {
    },
    BuiltSet_hashCode_closure: function BuiltSet_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSet: function _BuiltSet(t0, t1, t2) {
      var _ = this;
      _._setFactory = t0;
      _._set$_set = t1;
      _._set$_hashCode = null;
      _.$ti = t2;
    },
    SetBuilder: function SetBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._setFactory = t0;
      _.__SetBuilder__set_A = t1;
      _._setOwner = t2;
      _.$ti = t3;
    },
    SetMultimapBuilder_SetMultimapBuilder($K, $V) {
      var t1 = new A.SetMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("SetMultimapBuilder<1,2>"));
      t1.replace$1(B.Map_empty);
      return t1;
    },
    BuiltSetMultimap: function BuiltSetMultimap() {
    },
    BuiltSetMultimap_hashCode_closure: function BuiltSetMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSetMultimap: function _BuiltSetMultimap(t0, t1, t2) {
      var _ = this;
      _._set_multimap$_map = t0;
      _._emptySet = t1;
      _._set_multimap$_keys = _._set_multimap$_hashCode = null;
      _.$ti = t2;
    },
    SetMultimapBuilder: function SetMultimapBuilder(t0) {
      var _ = this;
      _.__SetMultimapBuilder__builtMap_A = $;
      _._builtMapOwner = null;
      _.__SetMultimapBuilder__builderMap_A = $;
      _.$ti = t0;
    },
    SetMultimapBuilder_replace_closure: function SetMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    $jc(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $jf(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    BuiltValueNullFieldError_checkNotNull(value, type, field, $T) {
      if (value == null)
        throw A.wrapException(new A.BuiltValueNullFieldError(type, field));
      return value;
    },
    BuiltValueNestedFieldError$(type, field, error) {
      return new A.BuiltValueNestedFieldError(type, field, error);
    },
    EnumClass: function EnumClass() {
    },
    newBuiltValueToStringHelper_closure: function newBuiltValueToStringHelper_closure() {
    },
    IndentingBuiltValueToStringHelper: function IndentingBuiltValueToStringHelper(t0) {
      this._result = t0;
    },
    BuiltValueNullFieldError: function BuiltValueNullFieldError(t0, t1) {
      this.type = t0;
      this.field = t1;
    },
    BuiltValueNestedFieldError: function BuiltValueNestedFieldError(t0, t1, t2) {
      this.type = t0;
      this.field = t1;
      this.error = t2;
    },
    JsonObject_JsonObject(value) {
      if (typeof value == "number")
        return new A.NumJsonObject(value);
      else if (typeof value == "string")
        return new A.StringJsonObject(value);
      else if (A._isBool(value))
        return new A.BoolJsonObject(value);
      else if (type$.List_dynamic._is(value))
        return new A.ListJsonObject(new A.UnmodifiableListView(value, type$.UnmodifiableListView_nullable_Object));
      else if (type$.Map_of_String_and_nullable_Object._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(value, type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else if (type$.Map_dynamic_dynamic._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(value.cast$2$0(0, type$.String, type$.nullable_Object), type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else
        throw A.wrapException(A.ArgumentError$value(value, "value", "Must be bool, List<Object?>, Map<String?, Object?>, num or String"));
    },
    JsonObject: function JsonObject() {
    },
    BoolJsonObject: function BoolJsonObject(t0) {
      this.value = t0;
    },
    ListJsonObject: function ListJsonObject(t0) {
      this.value = t0;
    },
    MapJsonObject: function MapJsonObject(t0) {
      this.value = t0;
    },
    NumJsonObject: function NumJsonObject(t0) {
      this.value = t0;
    },
    StringJsonObject: function StringJsonObject(t0) {
      this.value = t0;
    },
    Serializers_Serializers() {
      var t1 = type$.Type,
        t2 = type$.Serializer_dynamic,
        t3 = type$.String;
      t2 = new A.BuiltJsonSerializersBuilder(A.MapBuilder_MapBuilder(t1, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(type$.FullType, type$.Function), A.ListBuilder_ListBuilder(B.List_empty0, type$.SerializerPlugin));
      t2.add$1(0, new A.BigIntSerializer(A.BuiltList_BuiltList$from([B.Type_BigInt_DZK, A.getRuntimeTypeOfDartObject($.$get$_BigIntImpl_zero())], t1)));
      t2.add$1(0, new A.BoolSerializer(A.BuiltList_BuiltList$from([B.Type_bool_wF1], t1)));
      t2.add$1(0, new A.ListSerializer(A.BuiltList_BuiltList$from([B.Type_List_hc9, A.createRuntimeType(A._arrayInstanceType(A._setArrayType([], type$.JSArray_Object)))], t1)));
      t3 = type$.Object;
      t2.add$1(0, new A.MapSerializer(A.BuiltList_BuiltList$from([B.Type_Map_9Aj, A.getRuntimeTypeOfDartObject(A.LinkedHashMap_LinkedHashMap$_empty(t3, t3))], t1)));
      t2.add$1(0, new A.SetSerializer(A.BuiltSet_BuiltSet$from([B.Type_Set_tZi, A.getRuntimeTypeOfDartObject(A.LinkedHashSet_LinkedHashSet$_empty(t3))], t1)));
      t2.add$1(0, new A.BuiltListSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltList_fj6, A.getRuntimeTypeOfDartObject(A.BuiltList_BuiltList$from(B.List_empty0, t3))], t1)));
      t2.add$1(0, new A.BuiltListMultimapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltListMultimap_HQW, A.getRuntimeTypeOfDartObject(A.BuiltListMultimap_BuiltListMultimap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltMapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltMap_TeX, A.getRuntimeTypeOfDartObject(A.BuiltMap_BuiltMap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltSetSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltSet_oHu, A.getRuntimeTypeOfDartObject(A.BuiltSet_BuiltSet$from(B.List_empty0, t3))], t1)));
      t2.add$1(0, new A.BuiltSetMultimapSerializer(A.BuiltSet_BuiltSet$from([B.Type_BuiltSetMultimap_yT7], t1)));
      t2.add$1(0, new A.DateTimeSerializer(A.BuiltList_BuiltList$from([B.Type_DateTime_akv], t1)));
      t2.add$1(0, new A.DoubleSerializer(A.BuiltList_BuiltList$from([B.Type_double_JIQ], t1)));
      t2.add$1(0, new A.DurationSerializer(A.BuiltList_BuiltList$from([B.Type_Duration_VAs], t1)));
      t2.add$1(0, new A.IntSerializer(A.BuiltList_BuiltList$from([B.Type_int_T7V], t1)));
      t2.add$1(0, new A.Int32Serializer(A.BuiltList_BuiltList$from([B.Type_Int32_291], t1)));
      t2.add$1(0, new A.Int64Serializer(A.BuiltList_BuiltList$from([B.Type_Int64_LHp], t1)));
      t2.add$1(0, new A.JsonObjectSerializer(A.BuiltList_BuiltList$from([B.Type_JsonObject_5jQ, B.Type_BoolJsonObject_Zqn, B.Type_ListJsonObject_qcV, B.Type_MapJsonObject_VMr, B.Type_NumJsonObject_hYY, B.Type_StringJsonObject_NL7], t1)));
      t2.add$1(0, new A.NullSerializer(A.BuiltList_BuiltList$from([B.Type_Null_0Rm], t1)));
      t2.add$1(0, new A.NumSerializer(A.BuiltList_BuiltList$from([B.Type_num_LZa], t1)));
      t2.add$1(0, new A.RegExpSerializer(A.BuiltList_BuiltList$from([B.Type_RegExp_w5l, $.$get$_runtimeType()], t1)));
      t2.add$1(0, new A.StringSerializer(A.BuiltList_BuiltList$from([B.Type_String_AXU], t1)));
      t2.add$1(0, new A.Uint8ListSerializer());
      t2.add$1(0, new A.UriSerializer(A.BuiltList_BuiltList$from([B.Type_Uri_l9i, A.getRuntimeTypeOfDartObject(A.Uri_parse("http://example.com")), A.getRuntimeTypeOfDartObject(A.Uri_parse("http://example.com:"))], t1)));
      t2.addBuilderFactory$2(B.FullType_hm4, new A.Serializers_Serializers_closure());
      t2.addBuilderFactory$2(B.FullType_WP0, new A.Serializers_Serializers_closure0());
      t2.addBuilderFactory$2(B.FullType_mo5, new A.Serializers_Serializers_closure1());
      t2.addBuilderFactory$2(B.FullType_tpw, new A.Serializers_Serializers_closure2());
      t2.addBuilderFactory$2(B.FullType_SWR, new A.Serializers_Serializers_closure3());
      return t2.build$0();
    },
    FullType__getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    DeserializationError_DeserializationError(json, type, error) {
      var limitedJson = J.toString$0$(json),
        t1 = limitedJson.length;
      if (t1 > 80)
        B.JSString_methods.replaceRange$3(limitedJson, 77, t1, "...");
      return new A.DeserializationError(type, error);
    },
    Serializers_Serializers_closure: function Serializers_Serializers_closure() {
    },
    Serializers_Serializers_closure0: function Serializers_Serializers_closure0() {
    },
    Serializers_Serializers_closure1: function Serializers_Serializers_closure1() {
    },
    Serializers_Serializers_closure2: function Serializers_Serializers_closure2() {
    },
    Serializers_Serializers_closure3: function Serializers_Serializers_closure3() {
    },
    FullType: function FullType(t0, t1, t2) {
      this.root = t0;
      this.parameters = t1;
      this.nullable = t2;
    },
    DeserializationError: function DeserializationError(t0, t1) {
      this.type = t0;
      this.error = t1;
    },
    BigIntSerializer: function BigIntSerializer(t0) {
      this.types = t0;
    },
    BoolSerializer: function BoolSerializer(t0) {
      this.types = t0;
    },
    BuiltJsonSerializersBuilder$_(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins) {
      return new A.BuiltJsonSerializersBuilder(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins);
    },
    _getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    _noSerializerMessageFor(typeName) {
      var maybeRecordAdvice = B.JSString_methods.contains$1(typeName, "(") ? " Note that record types are not automatically serializable, please write and install your own `Serializer`." : "";
      return "No serializer for '" + typeName + "'." + maybeRecordAdvice;
    },
    BuiltJsonSerializers: function BuiltJsonSerializers(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _.builderFactories = t3;
      _.serializerPlugins = t4;
    },
    BuiltJsonSerializersBuilder: function BuiltJsonSerializersBuilder(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _._builderFactories = t3;
      _._plugins = t4;
    },
    BuiltListMultimapSerializer: function BuiltListMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltListMultimapSerializer_serialize_closure: function BuiltListMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListMultimapSerializer_deserialize_closure: function BuiltListMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListSerializer: function BuiltListSerializer(t0) {
      this.types = t0;
    },
    BuiltListSerializer_serialize_closure: function BuiltListSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltListSerializer_deserialize_closure: function BuiltListSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltMapSerializer: function BuiltMapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer: function BuiltSetMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer_serialize_closure: function BuiltSetMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetMultimapSerializer_deserialize_closure: function BuiltSetMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetSerializer: function BuiltSetSerializer(t0) {
      this.types = t0;
    },
    BuiltSetSerializer_serialize_closure: function BuiltSetSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltSetSerializer_deserialize_closure: function BuiltSetSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    DateTimeSerializer: function DateTimeSerializer(t0) {
      this.types = t0;
    },
    DoubleSerializer: function DoubleSerializer(t0) {
      this.types = t0;
    },
    DurationSerializer: function DurationSerializer(t0) {
      this.types = t0;
    },
    Int32Serializer: function Int32Serializer(t0) {
      this.types = t0;
    },
    Int64Serializer: function Int64Serializer(t0) {
      this.types = t0;
    },
    IntSerializer: function IntSerializer(t0) {
      this.types = t0;
    },
    JsonObjectSerializer: function JsonObjectSerializer(t0) {
      this.types = t0;
    },
    ListSerializer: function ListSerializer(t0) {
      this.types = t0;
    },
    ListSerializer_serialize_closure: function ListSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    MapSerializer: function MapSerializer(t0) {
      this.types = t0;
    },
    NullSerializer: function NullSerializer(t0) {
      this.types = t0;
    },
    NumSerializer: function NumSerializer(t0) {
      this.types = t0;
    },
    RegExpSerializer: function RegExpSerializer(t0) {
      this.types = t0;
    },
    SetSerializer: function SetSerializer(t0) {
      this.types = t0;
    },
    SetSerializer_serialize_closure: function SetSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    StringSerializer: function StringSerializer(t0) {
      this.types = t0;
    },
    Uint8ListSerializer: function Uint8ListSerializer() {
    },
    UriSerializer: function UriSerializer(t0) {
      this.types = t0;
    },
    CanonicalizedMap: function CanonicalizedMap() {
    },
    CanonicalizedMap_addAll_closure: function CanonicalizedMap_addAll_closure(t0) {
      this.$this = t0;
    },
    CanonicalizedMap_forEach_closure: function CanonicalizedMap_forEach_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    CanonicalizedMap_keys_closure: function CanonicalizedMap_keys_closure(t0) {
      this.$this = t0;
    },
    CanonicalizedMap_map_closure: function CanonicalizedMap_map_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.transform = t1;
      _.K2 = t2;
      _.V2 = t3;
    },
    DefaultEquality: function DefaultEquality(t0) {
      this.$ti = t0;
    },
    IterableEquality: function IterableEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    ListEquality: function ListEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _UnorderedEquality: function _UnorderedEquality() {
    },
    SetEquality: function SetEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _MapEntry: function _MapEntry(t0, t1, t2) {
      this.equality = t0;
      this.key = t1;
      this.value = t2;
    },
    MapEquality: function MapEquality(t0, t1, t2) {
      this._keyEquality = t0;
      this._valueEquality = t1;
      this.$ti = t2;
    },
    DeepCollectionEquality: function DeepCollectionEquality() {
    },
    QueueList__computeInitialCapacity(initialCapacity) {
      return 8;
    },
    QueueList__nextPowerOf2(number) {
      var nextNumber;
      number = (number << 1 >>> 0) - 1;
      for (;; number = nextNumber) {
        nextNumber = (number & number - 1) >>> 0;
        if (nextNumber === 0)
          return number;
      }
    },
    QueueList: function QueueList(t0, t1, t2, t3) {
      var _ = this;
      _._queue_list$_table = t0;
      _._queue_list$_head = t1;
      _._queue_list$_tail = t2;
      _.$ti = t3;
    },
    _CastQueueList: function _CastQueueList(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue_list$_delegate = t0;
      _._queue_list$_table = t1;
      _._queue_list$_head = t2;
      _._queue_list$_tail = t3;
      _.$ti = t4;
    },
    _QueueList_Object_ListMixin: function _QueueList_Object_ListMixin() {
    },
    _$valueOf($name) {
      switch ($name) {
        case "started":
          return B.BuildStatus_started;
        case "succeeded":
          return B.BuildStatus_succeeded;
        case "failed":
          return B.BuildStatus_failed;
        default:
          throw A.wrapException(A.ArgumentError$($name, null));
      }
    },
    BuildStatus: function BuildStatus(t0) {
      this.name = t0;
    },
    BuildResult: function BuildResult() {
    },
    _$BuildStatusSerializer: function _$BuildStatusSerializer() {
    },
    _$BuildResultSerializer: function _$BuildResultSerializer() {
    },
    _$BuildResult: function _$BuildResult(t0) {
      this.status = t0;
    },
    BuildResultBuilder: function BuildResultBuilder() {
      this._status = this._build_result$_$v = null;
    },
    ConnectRequest: function ConnectRequest() {
    },
    _$ConnectRequestSerializer: function _$ConnectRequestSerializer() {
    },
    _$ConnectRequest: function _$ConnectRequest(t0, t1, t2) {
      this.appId = t0;
      this.instanceId = t1;
      this.entrypointPath = t2;
    },
    ConnectRequestBuilder: function ConnectRequestBuilder() {
      var _ = this;
      _._entrypointPath = _._instanceId = _._connect_request$_appId = _._connect_request$_$v = null;
    },
    DebugEvent: function DebugEvent() {
    },
    BatchedDebugEvents: function BatchedDebugEvents() {
    },
    _$DebugEventSerializer: function _$DebugEventSerializer() {
    },
    _$BatchedDebugEventsSerializer: function _$BatchedDebugEventsSerializer() {
    },
    _$DebugEvent: function _$DebugEvent(t0, t1, t2) {
      this.kind = t0;
      this.eventData = t1;
      this.timestamp = t2;
    },
    DebugEventBuilder: function DebugEventBuilder() {
      var _ = this;
      _._timestamp = _._eventData = _._debug_event$_kind = _._debug_event$_$v = null;
    },
    _$BatchedDebugEvents: function _$BatchedDebugEvents(t0) {
      this.events = t0;
    },
    BatchedDebugEventsBuilder: function BatchedDebugEventsBuilder() {
      this._events = this._debug_event$_$v = null;
    },
    DebugInfo: function DebugInfo() {
    },
    _$DebugInfoSerializer: function _$DebugInfoSerializer() {
    },
    _$DebugInfo: function _$DebugInfo(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
      var _ = this;
      _.appEntrypointPath = t0;
      _.appId = t1;
      _.appInstanceId = t2;
      _.appOrigin = t3;
      _.appUrl = t4;
      _.authUrl = t5;
      _.dwdsVersion = t6;
      _.extensionUrl = t7;
      _.isInternalBuild = t8;
      _.isFlutterApp = t9;
      _.workspaceName = t10;
      _.tabUrl = t11;
      _.tabId = t12;
    },
    DebugInfoBuilder: function DebugInfoBuilder() {
      var _ = this;
      _._tabId = _._tabUrl = _._workspaceName = _._isFlutterApp = _._isInternalBuild = _._extensionUrl = _._dwdsVersion = _._authUrl = _._appUrl = _._appOrigin = _._appInstanceId = _._appId = _._appEntrypointPath = _._$v = null;
    },
    DevToolsRequest: function DevToolsRequest() {
    },
    DevToolsResponse: function DevToolsResponse() {
    },
    _$DevToolsRequestSerializer: function _$DevToolsRequestSerializer() {
    },
    _$DevToolsResponseSerializer: function _$DevToolsResponseSerializer() {
    },
    _$DevToolsRequest: function _$DevToolsRequest(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _.appId = t0;
      _.instanceId = t1;
      _.contextId = t2;
      _.tabUrl = t3;
      _.uriOnly = t4;
      _.client = t5;
    },
    DevToolsRequestBuilder: function DevToolsRequestBuilder() {
      var _ = this;
      _._devtools_request$_client = _._uriOnly = _._devtools_request$_tabUrl = _._contextId = _._devtools_request$_instanceId = _._devtools_request$_appId = _._devtools_request$_$v = null;
    },
    _$DevToolsResponse: function _$DevToolsResponse(t0, t1, t2) {
      this.success = t0;
      this.promptExtension = t1;
      this.error = t2;
    },
    DevToolsResponseBuilder: function DevToolsResponseBuilder() {
      var _ = this;
      _._error = _._promptExtension = _._success = _._devtools_request$_$v = null;
    },
    ErrorResponse: function ErrorResponse() {
    },
    _$ErrorResponseSerializer: function _$ErrorResponseSerializer() {
    },
    _$ErrorResponse: function _$ErrorResponse(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    ErrorResponseBuilder: function ErrorResponseBuilder() {
      this._error_response$_stackTrace = this._error_response$_error = this._error_response$_$v = null;
    },
    ExtensionRequest: function ExtensionRequest() {
    },
    ExtensionResponse: function ExtensionResponse() {
    },
    ExtensionEvent: function ExtensionEvent() {
    },
    BatchedEvents: function BatchedEvents() {
    },
    _$ExtensionRequestSerializer: function _$ExtensionRequestSerializer() {
    },
    _$ExtensionResponseSerializer: function _$ExtensionResponseSerializer() {
    },
    _$ExtensionEventSerializer: function _$ExtensionEventSerializer() {
    },
    _$BatchedEventsSerializer: function _$BatchedEventsSerializer() {
    },
    _$ExtensionRequest: function _$ExtensionRequest(t0, t1, t2) {
      this.id = t0;
      this.command = t1;
      this.commandParams = t2;
    },
    ExtensionRequestBuilder: function ExtensionRequestBuilder() {
      var _ = this;
      _._commandParams = _._command = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionResponse: function _$ExtensionResponse(t0, t1, t2, t3) {
      var _ = this;
      _.id = t0;
      _.success = t1;
      _.result = t2;
      _.error = t3;
    },
    ExtensionResponseBuilder: function ExtensionResponseBuilder() {
      var _ = this;
      _._extension_request$_error = _._extension_request$_result = _._extension_request$_success = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionEvent: function _$ExtensionEvent(t0, t1) {
      this.params = t0;
      this.method = t1;
    },
    ExtensionEventBuilder: function ExtensionEventBuilder() {
      this._extension_request$_method = this._params = this._extension_request$_$v = null;
    },
    _$BatchedEvents: function _$BatchedEvents(t0) {
      this.events = t0;
    },
    BatchedEventsBuilder: function BatchedEventsBuilder() {
      this._extension_request$_events = this._extension_request$_$v = null;
    },
    HotReloadRequest: function HotReloadRequest() {
    },
    _$HotReloadRequestSerializer: function _$HotReloadRequestSerializer() {
    },
    _$HotReloadRequest: function _$HotReloadRequest(t0) {
      this.id = t0;
    },
    HotReloadRequestBuilder: function HotReloadRequestBuilder() {
      this._hot_reload_request$_id = this._hot_reload_request$_$v = null;
    },
    HotReloadResponse___new_tearOff(updates) {
      var t1 = new A.HotReloadResponseBuilder();
      type$.nullable_void_Function_HotReloadResponseBuilder._as(type$.void_Function_HotReloadResponseBuilder._as(updates)).call$1(t1);
      return t1._hot_reload_response$_build$0();
    },
    HotReloadResponse: function HotReloadResponse() {
    },
    _$HotReloadResponseSerializer: function _$HotReloadResponseSerializer() {
    },
    _$HotReloadResponse: function _$HotReloadResponse(t0, t1, t2) {
      this.id = t0;
      this.success = t1;
      this.errorMessage = t2;
    },
    HotReloadResponseBuilder: function HotReloadResponseBuilder() {
      var _ = this;
      _._errorMessage = _._hot_reload_response$_success = _._hot_reload_response$_id = _._hot_reload_response$_$v = null;
    },
    HotRestartRequest: function HotRestartRequest() {
    },
    _$HotRestartRequestSerializer: function _$HotRestartRequestSerializer() {
    },
    _$HotRestartRequest: function _$HotRestartRequest(t0) {
      this.id = t0;
    },
    HotRestartRequestBuilder: function HotRestartRequestBuilder() {
      this._hot_restart_request$_id = this._hot_restart_request$_$v = null;
    },
    HotRestartResponse___new_tearOff(updates) {
      var t1 = new A.HotRestartResponseBuilder();
      type$.nullable_void_Function_HotRestartResponseBuilder._as(type$.void_Function_HotRestartResponseBuilder._as(updates)).call$1(t1);
      return t1._hot_restart_response$_build$0();
    },
    HotRestartResponse: function HotRestartResponse() {
    },
    _$HotRestartResponseSerializer: function _$HotRestartResponseSerializer() {
    },
    _$HotRestartResponse: function _$HotRestartResponse(t0, t1, t2) {
      this.id = t0;
      this.success = t1;
      this.errorMessage = t2;
    },
    HotRestartResponseBuilder: function HotRestartResponseBuilder() {
      var _ = this;
      _._hot_restart_response$_errorMessage = _._hot_restart_response$_success = _._hot_restart_response$_id = _._hot_restart_response$_$v = null;
    },
    IsolateExit: function IsolateExit() {
    },
    IsolateStart: function IsolateStart() {
    },
    _$IsolateExitSerializer: function _$IsolateExitSerializer() {
    },
    _$IsolateStartSerializer: function _$IsolateStartSerializer() {
    },
    _$IsolateExit: function _$IsolateExit() {
    },
    IsolateExitBuilder: function IsolateExitBuilder() {
      this._isolate_events$_$v = null;
    },
    _$IsolateStart: function _$IsolateStart() {
    },
    IsolateStartBuilder: function IsolateStartBuilder() {
      this._isolate_events$_$v = null;
    },
    RegisterEvent: function RegisterEvent() {
    },
    _$RegisterEventSerializer: function _$RegisterEventSerializer() {
    },
    _$RegisterEvent: function _$RegisterEvent(t0, t1) {
      this.eventData = t0;
      this.timestamp = t1;
    },
    RegisterEventBuilder: function RegisterEventBuilder() {
      this._register_event$_timestamp = this._register_event$_eventData = this._register_event$_$v = null;
    },
    RunRequest: function RunRequest() {
    },
    _$RunRequestSerializer: function _$RunRequestSerializer() {
    },
    _$RunRequest: function _$RunRequest() {
    },
    _$serializers_closure: function _$serializers_closure() {
    },
    _$serializers_closure0: function _$serializers_closure0() {
    },
    ServiceExtensionRequest: function ServiceExtensionRequest() {
    },
    _$ServiceExtensionRequestSerializer: function _$ServiceExtensionRequestSerializer() {
    },
    _$ServiceExtensionRequest: function _$ServiceExtensionRequest(t0, t1, t2) {
      this.id = t0;
      this.method = t1;
      this.argsJson = t2;
    },
    ServiceExtensionRequestBuilder: function ServiceExtensionRequestBuilder() {
      var _ = this;
      _._argsJson = _._service_extension_request$_method = _._service_extension_request$_id = _._service_extension_request$_$v = null;
    },
    ServiceExtensionResponse_ServiceExtensionResponse$fromResult(errorCode, errorMessage, id, result, success) {
      var t1 = new A.ServiceExtensionResponseBuilder();
      type$.nullable_void_Function_ServiceExtensionResponseBuilder._as(new A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure(id, success, result, errorCode, errorMessage)).call$1(t1);
      return t1._service_extension_response$_build$0();
    },
    ServiceExtensionResponse: function ServiceExtensionResponse() {
    },
    ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure: function ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure(t0, t1, t2, t3, t4) {
      var _ = this;
      _.id = t0;
      _.success = t1;
      _.result = t2;
      _.errorCode = t3;
      _.errorMessage = t4;
    },
    _$ServiceExtensionResponseSerializer: function _$ServiceExtensionResponseSerializer() {
    },
    _$ServiceExtensionResponse: function _$ServiceExtensionResponse(t0, t1, t2, t3, t4) {
      var _ = this;
      _.id = t0;
      _.resultJson = t1;
      _.success = t2;
      _.errorCode = t3;
      _.errorMessage = t4;
    },
    ServiceExtensionResponseBuilder: function ServiceExtensionResponseBuilder() {
      var _ = this;
      _._service_extension_response$_errorMessage = _._errorCode = _._service_extension_response$_success = _._resultJson = _._service_extension_response$_id = _._service_extension_response$_$v = null;
    },
    BatchedStreamController: function BatchedStreamController(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _._checkDelayMilliseconds = t0;
      _._batchDelayMilliseconds = t1;
      _._inputController = t2;
      _.__BatchedStreamController__inputQueue_A = $;
      _._outputController = t3;
      _._completer = t4;
      _.$ti = t5;
    },
    BatchedStreamController__hasEventOrTimeOut_closure: function BatchedStreamController__hasEventOrTimeOut_closure() {
    },
    BatchedStreamController__hasEventDuring_closure: function BatchedStreamController__hasEventDuring_closure() {
    },
    SocketClient: function SocketClient() {
    },
    SseSocketClient: function SseSocketClient(t0) {
      this._sockets$_client = t0;
    },
    WebSocketClient: function WebSocketClient(t0) {
      this._channel = t0;
    },
    WebSocketClient_stream_closure: function WebSocketClient_stream_closure() {
    },
    safeUnawaited(future) {
      future.catchError$1(new A.safeUnawaited_closure());
    },
    safeUnawaited_closure: function safeUnawaited_closure() {
    },
    Int32: function Int32(t0) {
      this._i = t0;
    },
    Int64__parseRadix(s, radix, throwOnError) {
      var d0, d1, d2, digit, d00, d10,
        negative = B.JSString_methods.startsWith$1(s, "-"),
        i = negative ? 1 : 0,
        t1 = s.length;
      if (i >= t1)
        throw A.wrapException(A.FormatException$("No digits", s, i));
      for (d0 = 0, d1 = 0, d2 = 0; i < t1; ++i, d1 = d10, d0 = d00) {
        digit = A.decodeDigit(s.charCodeAt(i));
        if (digit < radix) {
          d0 = d0 * radix + digit;
          d00 = d0 & 4194303;
          d1 = d1 * radix + B.JSInt_methods._shrOtherPositive$1(d0, 22);
          d10 = d1 & 4194303;
          d2 = d2 * radix + (d1 >>> 22) & 1048575;
        } else
          throw A.wrapException(A.FormatException$("Not radix digit", s, i));
      }
      if (negative)
        return A.Int64__sub(0, 0, 0, d0, d1, d2);
      return new A.Int64(d0 & 4194303, d1 & 4194303, d2 & 1048575);
    },
    Int64_Int64(value) {
      var v2, v1, t1, t2, t3,
        negative = value < 0;
      if (negative)
        value = -value;
      v2 = B.JSInt_methods._tdivFast$1(value, 17592186044416);
      value -= v2 * 17592186044416;
      v1 = B.JSInt_methods._tdivFast$1(value, 4194304);
      t1 = value - v1 * 4194304 & 4194303;
      t2 = v1 & 4194303;
      t3 = v2 & 1048575;
      return negative ? A.Int64__sub(0, 0, 0, t1, t2, t3) : new A.Int64(t1, t2, t3);
    },
    Int64__promote(value) {
      if (value instanceof A.Int64)
        return value;
      else if (A._isInt(value))
        return A.Int64_Int64(value);
      else if (value instanceof A.Int32)
        return A.Int64_Int64(value._i);
      throw A.wrapException(A.ArgumentError$value(value, "other", "not an int, Int32 or Int64"));
    },
    Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign) {
      var d4, d3, fatRadix, chunk1, chunk2, chunk3, q, q0, q1, q2, q3, chunk10, residue;
      if (d0 === 0 && d1 === 0 && d2 === 0)
        return "0";
      d4 = (d2 << 4 | d1 >>> 18) >>> 0;
      d3 = d1 >>> 8 & 1023;
      d2 = (d1 << 2 | d0 >>> 20) & 1023;
      d1 = d0 >>> 10 & 1023;
      d0 &= 1023;
      if (!(radix < 37))
        return A.ioore(B.List_ZNA, radix);
      fatRadix = B.List_ZNA[radix];
      chunk1 = "";
      chunk2 = "";
      chunk3 = "";
      for (;;) {
        if (!!(d4 === 0 && d3 === 0))
          break;
        q = B.JSInt_methods.$tdiv(d4, fatRadix);
        d3 += d4 - q * fatRadix << 10 >>> 0;
        q0 = B.JSInt_methods.$tdiv(d3, fatRadix);
        d2 += d3 - q0 * fatRadix << 10 >>> 0;
        q1 = B.JSInt_methods.$tdiv(d2, fatRadix);
        d1 += d2 - q1 * fatRadix << 10 >>> 0;
        q2 = B.JSInt_methods.$tdiv(d1, fatRadix);
        d0 += d1 - q2 * fatRadix << 10 >>> 0;
        q3 = B.JSInt_methods.$tdiv(d0, fatRadix);
        chunk10 = B.JSString_methods.substring$1(B.JSInt_methods.toRadixString$1(fatRadix + (d0 - q3 * fatRadix), radix), 1);
        chunk3 = chunk2;
        chunk2 = chunk1;
        chunk1 = chunk10;
        d3 = q0;
        d4 = q;
        d2 = q1;
        d1 = q2;
        d0 = q3;
      }
      residue = (d2 << 20 >>> 0) + (d1 << 10 >>> 0) + d0;
      return sign + (residue === 0 ? "" : B.JSInt_methods.toRadixString$1(residue, radix)) + chunk1 + chunk2 + chunk3;
    },
    Int64__sub(a0, a1, a2, b0, b1, b2) {
      var diff0 = a0 - b0,
        diff1 = a1 - b1 - (B.JSInt_methods._shrOtherPositive$1(diff0, 22) & 1);
      return new A.Int64(diff0 & 4194303, diff1 & 4194303, a2 - b2 - (B.JSInt_methods._shrOtherPositive$1(diff1, 22) & 1) & 1048575);
    },
    Int64: function Int64(t0, t1, t2) {
      this._l = t0;
      this._m = t1;
      this._h = t2;
    },
    stronglyConnectedComponents(nodes, edges, $T) {
      var t2, t3, t4, node, index, t5, state, iterator, index0, lowLink, t6, next, component, _null = null,
        result = A._setArrayType([], $T._eval$1("JSArray<List<0>>")),
        t1 = type$.int,
        lowLinks = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        indexes = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        onStack = A.HashSet_HashSet(_null, _null, $T),
        lastVisited = A.ListQueue$($T);
      t1 = A._setArrayType([], $T._eval$1("JSArray<_StackState<0>>"));
      for (t2 = nodes.$ti, t3 = new A.ListIterator(nodes, nodes.get$length(0), t2._eval$1("ListIterator<ListIterable.E>")), t4 = $T._eval$1("_StackState<0>"), t2 = t2._eval$1("ListIterable.E"); t3.moveNext$0();) {
        node = t3.__internal$_current;
        t1.push(new A._StackState(node == null ? t2._as(node) : node, _null, t4));
      }
      $label0$0:
        for (t2 = lastVisited.$ti._precomputed1, t3 = $T._eval$1("JSArray<0>"), index = 0; t5 = t1.length, t5 !== 0;) {
          if (0 >= t5)
            return A.ioore(t1, -1);
          state = t1.pop();
          node = state.node;
          iterator = state.iterator;
          if (iterator == null) {
            if (indexes.containsKey$1(node))
              continue $label0$0;
            indexes.$indexSet(0, node, index);
            lowLinks.$indexSet(0, node, index);
            index0 = index + 1;
            iterator = J.get$iterator$ax(edges.call$1(node));
            if (!iterator.moveNext$0()) {
              B.JSArray_methods.add$1(result, A._setArrayType([node], t3));
              index = index0;
              continue $label0$0;
            }
            lastVisited._collection$_add$1(t2._as(node));
            onStack.add$1(0, node);
            lowLink = index;
            index = index0;
          } else {
            t5 = lowLinks.$index(0, node);
            t5.toString;
            t6 = lowLinks.$index(0, iterator.get$current());
            t6.toString;
            lowLink = Math.min(t5, t6);
          }
          do {
            next = iterator.get$current();
            if (!indexes.containsKey$1(next)) {
              B.JSArray_methods.add$1(t1, new A._StackState(node, iterator, t4));
              B.JSArray_methods.add$1(t1, new A._StackState(next, _null, t4));
              continue $label0$0;
            } else if (onStack.contains$1(0, next)) {
              t5 = indexes.$index(0, next);
              t5.toString;
              lowLink = Math.min(lowLink, t5);
              lowLinks.$indexSet(0, node, lowLink);
            }
          } while (iterator.moveNext$0());
          if (lowLink === indexes.$index(0, node)) {
            component = A._setArrayType([], t3);
            do {
              next = lastVisited.removeLast$0(0);
              onStack.remove$1(0, next);
              B.JSArray_methods.add$1(component, next);
            } while (!A._defaultEquals(next, node));
            B.JSArray_methods.add$1(result, component);
          }
        }
      return result;
    },
    _defaultEquals(a, b) {
      return J.$eq$(a, b);
    },
    _StackState: function _StackState(t0, t1, t2) {
      this.node = t0;
      this.iterator = t1;
      this.$ti = t2;
    },
    RequestAbortedException: function RequestAbortedException(t0, t1) {
      this.message = t0;
      this.uri = t1;
    },
    BaseClient: function BaseClient() {
    },
    BaseRequest: function BaseRequest() {
    },
    BaseRequest_closure: function BaseRequest_closure() {
    },
    BaseRequest_closure0: function BaseRequest_closure0() {
    },
    BaseResponse: function BaseResponse() {
    },
    _rethrowAsClientException(e, st, request) {
      var t1, message;
      if (type$.JSObject._is(e))
        t1 = A._asString(e.name) === "AbortError";
      else
        t1 = false;
      if (t1)
        A.Error_throwWithStackTrace(new A.RequestAbortedException("Request aborted by `abortTrigger`", request.url), st);
      if (!(e instanceof A.ClientException)) {
        message = J.toString$0$(e);
        if (B.JSString_methods.startsWith$1(message, "TypeError: "))
          message = B.JSString_methods.substring$1(message, 11);
        e = new A.ClientException(message, request.url);
      }
      A.Error_throwWithStackTrace(e, st);
    },
    _readBody(request, response) {
      return A._readBody$body(request, response);
    },
    _readBody$body(request, response) {
      var $async$_readBody = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        switch ($async$errorCode) {
          case 2:
            $async$next = $async$nextWhenCanceled;
            $async$goto = $async$next.pop();
            break;
          case 1:
            $async$errorStack.push($async$result);
            $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              _box_0 = {};
              t1 = A._asJSObjectQ(response.body);
              bodyStreamReader = t1 == null ? null : A._asJSObject(t1.getReader());
              if (bodyStreamReader == null) {
                // goto return
                $async$goto = 1;
                break;
              }
              isDone = false;
              _box_0.isError = false;
              $async$handler = 4;
              t1 = type$.NativeUint8List, t2 = type$.JSObject;
            case 7:
              // for condition
              // trivial condition
              $async$goto = 9;
              return A._asyncStarHelper(A.promiseToFuture(A._asJSObject(bodyStreamReader.read()), t2), $async$_readBody, $async$controller);
            case 9:
              // returning from await.
              chunk = $async$result;
              if (A._asBool(chunk.done)) {
                isDone = true;
                // goto after for
                $async$goto = 8;
                break;
              }
              t3 = chunk.value;
              t3.toString;
              $async$goto = 10;
              $async$nextWhenCanceled = [1, 5];
              return A._asyncStarHelper(A._IterationMarker_yieldSingle(t1._as(t3)), $async$_readBody, $async$controller);
            case 10:
              // after yield
              // goto for condition
              $async$goto = 7;
              break;
            case 8:
              // after for
              $async$next.push(6);
              // goto finally
              $async$goto = 5;
              break;
            case 4:
              // catch
              $async$handler = 3;
              $async$exception = $async$errorStack.pop();
              e = A.unwrapException($async$exception);
              st = A.getTraceFromException($async$exception);
              _box_0.isError = true;
              A._rethrowAsClientException(e, st, request);
              $async$next.push(6);
              // goto finally
              $async$goto = 5;
              break;
            case 3:
              // uncaught
              $async$next = [2];
            case 5:
              // finally
              $async$handler = 2;
              $async$goto = !isDone ? 11 : 12;
              break;
            case 11:
              // then
              $async$handler = 14;
              $async$goto = 17;
              return A._asyncStarHelper(A.promiseToFuture(A._asJSObject(bodyStreamReader.cancel()), type$.nullable_Object).catchError$2$test(new A._readBody_closure(), new A._readBody_closure0(_box_0)), $async$_readBody, $async$controller);
            case 17:
              // returning from await.
              $async$handler = 2;
              // goto after finally
              $async$goto = 16;
              break;
            case 14:
              // catch
              $async$handler = 13;
              $async$exception1 = $async$errorStack.pop();
              e0 = A.unwrapException($async$exception1);
              st0 = A.getTraceFromException($async$exception1);
              if (!_box_0.isError)
                A._rethrowAsClientException(e0, st0, request);
              // goto after finally
              $async$goto = 16;
              break;
            case 13:
              // uncaught
              // goto rethrow
              $async$goto = 2;
              break;
            case 16:
              // after finally
            case 12:
              // join
              // goto the next finally handler
              $async$goto = $async$next.pop();
              break;
            case 6:
              // after finally
            case 1:
              // return
              return A._asyncStarHelper(null, 0, $async$controller);
            case 2:
              // rethrow
              return A._asyncStarHelper($async$errorStack.at(-1), 1, $async$controller);
          }
      });
      var $async$goto = 0,
        $async$controller = A._makeAsyncStarStreamController($async$_readBody, type$.List_int),
        $async$nextWhenCanceled, $async$handler = 2, $async$errorStack = [], $async$next = [], isDone, chunk, e, st, e0, st0, t2, t3, exception, _box_0, t1, bodyStreamReader, $async$exception, $async$exception1;
      return A._streamOfController($async$controller);
    },
    BrowserClient: function BrowserClient(t0) {
      this.withCredentials = false;
      this._openRequestAbortControllers = t0;
    },
    BrowserClient_send_closure: function BrowserClient_send_closure(t0) {
      this.headers = t0;
    },
    _readBody_closure: function _readBody_closure() {
    },
    _readBody_closure0: function _readBody_closure0(t0) {
      this._box_0 = t0;
    },
    ByteStream: function ByteStream(t0) {
      this._stream = t0;
    },
    ByteStream_toBytes_closure: function ByteStream_toBytes_closure(t0) {
      this.completer = t0;
    },
    ClientException$(message, uri) {
      return new A.ClientException(message, uri);
    },
    ClientException: function ClientException(t0, t1) {
      this.message = t0;
      this.uri = t1;
    },
    Request$(method, url) {
      var t1 = new Uint8Array(0),
        t2 = $.$get$BaseRequest__tokenRE();
      if (!t2._nativeRegExp.test(method))
        A.throwExpression(A.ArgumentError$value(method, "method", "Not a valid method"));
      t2 = type$.String;
      return new A.Request(B.C_Utf8Codec, t1, method, url, A.LinkedHashMap_LinkedHashMap(new A.BaseRequest_closure(), new A.BaseRequest_closure0(), t2, t2));
    },
    Request: function Request(t0, t1, t2, t3, t4) {
      var _ = this;
      _._defaultEncoding = t0;
      _._bodyBytes = t1;
      _.method = t2;
      _.url = t3;
      _.headers = t4;
      _._finalized = false;
    },
    Response_fromStream(response) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Response),
        $async$returnValue, body, t1, t2, t3, t4, t5, t6;
      var $async$Response_fromStream = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = 3;
              return A._asyncAwait(response.stream.toBytes$0(), $async$Response_fromStream);
            case 3:
              // returning from await.
              body = $async$result;
              t1 = response.statusCode;
              t2 = response.request;
              t3 = response.headers;
              t4 = response.reasonPhrase;
              t5 = A.toUint8List(body);
              t6 = body.length;
              t5 = new A.Response(t5, t2, t1, t4, t6, t3, false, true);
              t5.BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(t1, t6, t3, false, true, t4, t2);
              $async$returnValue = t5;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$Response_fromStream, $async$completer);
    },
    _contentTypeForHeaders(headers) {
      var contentType = headers.$index(0, "content-type");
      if (contentType != null)
        return A.MediaType_MediaType$parse(contentType);
      return A.MediaType$("application", "octet-stream", null);
    },
    Response: function Response(t0, t1, t2, t3, t4, t5, t6, t7) {
      var _ = this;
      _.bodyBytes = t0;
      _.request = t1;
      _.statusCode = t2;
      _.reasonPhrase = t3;
      _.contentLength = t4;
      _.headers = t5;
      _.isRedirect = t6;
      _.persistentConnection = t7;
    },
    StreamedResponse: function StreamedResponse() {
    },
    StreamedResponseV2: function StreamedResponseV2(t0, t1, t2, t3, t4, t5, t6, t7) {
      var _ = this;
      _.stream = t0;
      _.request = t1;
      _.statusCode = t2;
      _.reasonPhrase = t3;
      _.contentLength = t4;
      _.headers = t5;
      _.isRedirect = t6;
      _.persistentConnection = t7;
    },
    CaseInsensitiveMap__canonicalizer(key) {
      return A._asString(key).toLowerCase();
    },
    CaseInsensitiveMap: function CaseInsensitiveMap(t0, t1, t2) {
      this._canonicalize = t0;
      this._base = t1;
      this.$ti = t2;
    },
    MediaType_MediaType$parse(mediaType) {
      return A.wrapFormatException("media type", mediaType, new A.MediaType_MediaType$parse_closure(mediaType), type$.MediaType);
    },
    MediaType$(type, subtype, parameters) {
      var t1 = type$.String;
      if (parameters == null)
        t1 = A.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
      else {
        t1 = new A.CaseInsensitiveMap(A.case_insensitive_map_CaseInsensitiveMap__canonicalizer$closure(), A.LinkedHashMap_LinkedHashMap$_empty(t1, type$.MapEntry_String_String), type$.CaseInsensitiveMap_String);
        t1.addAll$1(0, parameters);
      }
      return new A.MediaType(type.toLowerCase(), subtype.toLowerCase(), new A.UnmodifiableMapView(t1, type$.UnmodifiableMapView_String_String));
    },
    MediaType: function MediaType(t0, t1, t2) {
      this.type = t0;
      this.subtype = t1;
      this.parameters = t2;
    },
    MediaType_MediaType$parse_closure: function MediaType_MediaType$parse_closure(t0) {
      this.mediaType = t0;
    },
    MediaType_toString_closure: function MediaType_toString_closure(t0) {
      this.buffer = t0;
    },
    MediaType_toString__closure: function MediaType_toString__closure() {
    },
    expectQuotedString(scanner) {
      var string;
      scanner.expect$2$name($.$get$_quotedString(), "quoted string");
      string = scanner.get$lastMatch().$index(0, 0);
      return A.stringReplaceAllFuncUnchecked(B.JSString_methods.substring$2(string, 1, string.length - 1), $.$get$_quotedPair(), type$.nullable_String_Function_Match._as(type$.String_Function_Match._as(new A.expectQuotedString_closure())), null);
    },
    expectQuotedString_closure: function expectQuotedString_closure() {
    },
    Level: function Level(t0, t1) {
      this.name = t0;
      this.value = t1;
    },
    LogRecord: function LogRecord(t0, t1, t2) {
      this.level = t0;
      this.message = t1;
      this.loggerName = t2;
    },
    Logger_Logger($name) {
      return $.Logger__loggers.putIfAbsent$2($name, new A.Logger_Logger_closure($name));
    },
    Logger: function Logger(t0, t1, t2) {
      var _ = this;
      _.name = t0;
      _.parent = t1;
      _._level = null;
      _._children = t2;
    },
    Logger_Logger_closure: function Logger_Logger_closure(t0) {
      this.name = t0;
    },
    _parseUri(uri) {
      return uri;
    },
    _validateArgList(method, args) {
      var numArgs, i, numArgs0, message, t1, t2, t3, t4;
      for (numArgs = args.length, i = 1; i < numArgs; ++i) {
        if (args[i] == null || args[i - 1] != null)
          continue;
        for (; numArgs >= 1; numArgs = numArgs0) {
          numArgs0 = numArgs - 1;
          if (args[numArgs0] != null)
            break;
        }
        message = new A.StringBuffer("");
        t1 = method + "(";
        message._contents = t1;
        t2 = A._arrayInstanceType(args);
        t3 = t2._eval$1("SubListIterable<1>");
        t4 = new A.SubListIterable(args, 0, numArgs, t3);
        t4.SubListIterable$3(args, 0, numArgs, t2._precomputed1);
        t3 = t1 + new A.MappedListIterable(t4, t3._eval$1("String(ListIterable.E)")._as(new A._validateArgList_closure()), t3._eval$1("MappedListIterable<ListIterable.E,String>")).join$1(0, ", ");
        message._contents = t3;
        message._contents = t3 + ("): part " + (i - 1) + " was null, but part " + i + " was not.");
        throw A.wrapException(A.ArgumentError$(message.toString$0(0), null));
      }
    },
    Context: function Context(t0, t1) {
      this.style = t0;
      this._context$_current = t1;
    },
    Context_joinAll_closure: function Context_joinAll_closure() {
    },
    Context_split_closure: function Context_split_closure() {
    },
    _validateArgList_closure: function _validateArgList_closure() {
    },
    InternalStyle: function InternalStyle() {
    },
    ParsedPath_ParsedPath$parse(path, style) {
      var t1, parts, separators, t2, start, i,
        root = style.getRoot$1(path);
      style.isRootRelative$1(path);
      if (root != null)
        path = B.JSString_methods.substring$1(path, root.length);
      t1 = type$.JSArray_String;
      parts = A._setArrayType([], t1);
      separators = A._setArrayType([], t1);
      t1 = path.length;
      if (t1 !== 0) {
        if (0 >= t1)
          return A.ioore(path, 0);
        t2 = style.isSeparator$1(path.charCodeAt(0));
      } else
        t2 = false;
      if (t2) {
        if (0 >= t1)
          return A.ioore(path, 0);
        B.JSArray_methods.add$1(separators, path[0]);
        start = 1;
      } else {
        B.JSArray_methods.add$1(separators, "");
        start = 0;
      }
      for (i = start; i < t1; ++i)
        if (style.isSeparator$1(path.charCodeAt(i))) {
          B.JSArray_methods.add$1(parts, B.JSString_methods.substring$2(path, start, i));
          B.JSArray_methods.add$1(separators, path[i]);
          start = i + 1;
        }
      if (start < t1) {
        B.JSArray_methods.add$1(parts, B.JSString_methods.substring$1(path, start));
        B.JSArray_methods.add$1(separators, "");
      }
      return new A.ParsedPath(style, root, parts, separators);
    },
    ParsedPath: function ParsedPath(t0, t1, t2, t3) {
      var _ = this;
      _.style = t0;
      _.root = t1;
      _.parts = t2;
      _.separators = t3;
    },
    PathException$(message) {
      return new A.PathException(message);
    },
    PathException: function PathException(t0) {
      this.message = t0;
    },
    Style__getPlatformStyle() {
      if (A.Uri_base().get$scheme() !== "file")
        return $.$get$Style_url();
      if (!B.JSString_methods.endsWith$1(A.Uri_base().get$path(), "/"))
        return $.$get$Style_url();
      if (A._Uri__Uri(null, "a/b", null, null).toFilePath$0() === "a\\b")
        return $.$get$Style_windows();
      return $.$get$Style_posix();
    },
    Style: function Style() {
    },
    PosixStyle: function PosixStyle(t0, t1, t2) {
      this.separatorPattern = t0;
      this.needsSeparatorPattern = t1;
      this.rootPattern = t2;
    },
    UrlStyle: function UrlStyle(t0, t1, t2, t3) {
      var _ = this;
      _.separatorPattern = t0;
      _.needsSeparatorPattern = t1;
      _.rootPattern = t2;
      _.relativeRootPattern = t3;
    },
    WindowsStyle: function WindowsStyle(t0, t1, t2, t3) {
      var _ = this;
      _.separatorPattern = t0;
      _.needsSeparatorPattern = t1;
      _.rootPattern = t2;
      _.relativeRootPattern = t3;
    },
    Pool: function Pool(t0, t1, t2, t3, t4) {
      var _ = this;
      _._requestedResources = t0;
      _._onReleaseCallbacks = t1;
      _._onReleaseCompleters = t2;
      _._maxAllocatedResources = t3;
      _._allocatedResources = 0;
      _._timer = null;
      _._closeMemo = t4;
    },
    Pool__runOnRelease_closure: function Pool__runOnRelease_closure(t0) {
      this.$this = t0;
    },
    Pool__runOnRelease_closure0: function Pool__runOnRelease_closure0(t0) {
      this.$this = t0;
    },
    PoolResource: function PoolResource(t0) {
      this._pool = t0;
      this._released = false;
    },
    FileLocation$_(file, offset) {
      if (offset < 0)
        A.throwExpression(A.RangeError$("Offset may not be negative, was " + offset + "."));
      else if (offset > file._decodedChars.length)
        A.throwExpression(A.RangeError$("Offset " + offset + string$.x20must_ + file.get$length(0) + "."));
      return new A.FileLocation(file, offset);
    },
    SourceFile: function SourceFile(t0, t1, t2) {
      var _ = this;
      _.url = t0;
      _._lineStarts = t1;
      _._decodedChars = t2;
      _._cachedLine = null;
    },
    FileLocation: function FileLocation(t0, t1) {
      this.file = t0;
      this.offset = t1;
    },
    _FileSpan: function _FileSpan(t0, t1, t2) {
      this.file = t0;
      this._file$_start = t1;
      this._file$_end = t2;
    },
    Highlighter$(span, color) {
      var t1 = A.Highlighter__collateLines(A._setArrayType([A._Highlight$(span, true)], type$.JSArray__Highlight)),
        t2 = new A.Highlighter_closure(color).call$0(),
        t3 = B.JSInt_methods.toString$0(B.JSArray_methods.get$last(t1).number + 1),
        t4 = A.Highlighter__contiguous(t1) ? 0 : 3,
        t5 = A._arrayInstanceType(t1);
      return new A.Highlighter(t1, t2, null, 1 + Math.max(t3.length, t4), new A.MappedListIterable(t1, t5._eval$1("int(1)")._as(new A.Highlighter$__closure()), t5._eval$1("MappedListIterable<1,int>")).reduce$1(0, B.CONSTANT), !A.isAllTheSame(new A.MappedListIterable(t1, t5._eval$1("Object?(1)")._as(new A.Highlighter$__closure0()), t5._eval$1("MappedListIterable<1,Object?>"))), new A.StringBuffer(""));
    },
    Highlighter__contiguous(lines) {
      var i, thisLine, nextLine;
      for (i = 0; i < lines.length - 1;) {
        thisLine = lines[i];
        ++i;
        nextLine = lines[i];
        if (thisLine.number + 1 !== nextLine.number && J.$eq$(thisLine.url, nextLine.url))
          return false;
      }
      return true;
    },
    Highlighter__collateLines(highlights) {
      var t1, t2,
        highlightsByUrl = A.groupBy(highlights, new A.Highlighter__collateLines_closure(), type$._Highlight, type$.Object);
      for (t1 = A._instanceType(highlightsByUrl), t2 = new A.LinkedHashMapValueIterator(highlightsByUrl, highlightsByUrl._modifications, highlightsByUrl._first, t1._eval$1("LinkedHashMapValueIterator<2>")); t2.moveNext$0();)
        J.sort$1$ax(t2.__js_helper$_current, new A.Highlighter__collateLines_closure0());
      t1 = t1._eval$1("LinkedHashMapEntriesIterable<1,2>");
      t2 = t1._eval$1("ExpandIterable<Iterable.E,_Line>");
      t1 = A.List_List$_of(new A.ExpandIterable(new A.LinkedHashMapEntriesIterable(highlightsByUrl, t1), t1._eval$1("Iterable<_Line>(Iterable.E)")._as(new A.Highlighter__collateLines_closure1()), t2), t2._eval$1("Iterable.E"));
      return t1;
    },
    _Highlight$(span, primary) {
      var t1 = new A._Highlight_closure(span).call$0();
      return new A._Highlight(t1, true, null);
    },
    _Highlight__normalizeNewlines(span) {
      var endOffset, t1, i, t2, t3, t4,
        text = span.get$text();
      if (!B.JSString_methods.contains$1(text, "\r\n"))
        return span;
      endOffset = span.get$end().get$offset();
      for (t1 = text.length - 1, i = 0; i < t1; ++i)
        if (text.charCodeAt(i) === 13 && text.charCodeAt(i + 1) === 10)
          --endOffset;
      t1 = span.get$start();
      t2 = span.get$sourceUrl();
      t3 = span.get$end().get$line();
      t2 = A.SourceLocation$(endOffset, span.get$end().get$column(), t3, t2);
      t3 = A.stringReplaceAllUnchecked(text, "\r\n", "\n");
      t4 = span.get$context();
      return A.SourceSpanWithContext$(t1, t2, t3, A.stringReplaceAllUnchecked(t4, "\r\n", "\n"));
    },
    _Highlight__normalizeTrailingNewline(span) {
      var context, text, start, end, t1, t2, t3;
      if (!B.JSString_methods.endsWith$1(span.get$context(), "\n"))
        return span;
      if (B.JSString_methods.endsWith$1(span.get$text(), "\n\n"))
        return span;
      context = B.JSString_methods.substring$2(span.get$context(), 0, span.get$context().length - 1);
      text = span.get$text();
      start = span.get$start();
      end = span.get$end();
      if (B.JSString_methods.endsWith$1(span.get$text(), "\n")) {
        t1 = A.findLineStart(span.get$context(), span.get$text(), span.get$start().get$column());
        t1.toString;
        t1 = t1 + span.get$start().get$column() + span.get$length(span) === span.get$context().length;
      } else
        t1 = false;
      if (t1) {
        text = B.JSString_methods.substring$2(span.get$text(), 0, span.get$text().length - 1);
        if (text.length === 0)
          end = start;
        else {
          t1 = span.get$end().get$offset();
          t2 = span.get$sourceUrl();
          t3 = span.get$end().get$line();
          end = A.SourceLocation$(t1 - 1, A._Highlight__lastLineLength(context), t3 - 1, t2);
          start = span.get$start().get$offset() === span.get$end().get$offset() ? end : span.get$start();
        }
      }
      return A.SourceSpanWithContext$(start, end, text, context);
    },
    _Highlight__normalizeEndOfLine(span) {
      var text, t1, t2, t3, t4;
      if (span.get$end().get$column() !== 0)
        return span;
      if (span.get$end().get$line() === span.get$start().get$line())
        return span;
      text = B.JSString_methods.substring$2(span.get$text(), 0, span.get$text().length - 1);
      t1 = span.get$start();
      t2 = span.get$end().get$offset();
      t3 = span.get$sourceUrl();
      t4 = span.get$end().get$line();
      t3 = A.SourceLocation$(t2 - 1, text.length - B.JSString_methods.lastIndexOf$1(text, "\n") - 1, t4 - 1, t3);
      return A.SourceSpanWithContext$(t1, t3, text, B.JSString_methods.endsWith$1(span.get$context(), "\n") ? B.JSString_methods.substring$2(span.get$context(), 0, span.get$context().length - 1) : span.get$context());
    },
    _Highlight__lastLineLength(text) {
      var t2,
        t1 = text.length;
      if (t1 === 0)
        return 0;
      else {
        t2 = t1 - 1;
        if (!(t2 >= 0))
          return A.ioore(text, t2);
        if (text.charCodeAt(t2) === 10)
          return t1 === 1 ? 0 : t1 - B.JSString_methods.lastIndexOf$2(text, "\n", t1 - 2) - 1;
        else
          return t1 - B.JSString_methods.lastIndexOf$1(text, "\n") - 1;
      }
    },
    Highlighter: function Highlighter(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._lines = t0;
      _._primaryColor = t1;
      _._secondaryColor = t2;
      _._paddingBeforeSidebar = t3;
      _._maxMultilineSpans = t4;
      _._multipleFiles = t5;
      _._buffer = t6;
    },
    Highlighter_closure: function Highlighter_closure(t0) {
      this.color = t0;
    },
    Highlighter$__closure: function Highlighter$__closure() {
    },
    Highlighter$___closure: function Highlighter$___closure() {
    },
    Highlighter$__closure0: function Highlighter$__closure0() {
    },
    Highlighter__collateLines_closure: function Highlighter__collateLines_closure() {
    },
    Highlighter__collateLines_closure0: function Highlighter__collateLines_closure0() {
    },
    Highlighter__collateLines_closure1: function Highlighter__collateLines_closure1() {
    },
    Highlighter__collateLines__closure: function Highlighter__collateLines__closure(t0) {
      this.line = t0;
    },
    Highlighter_highlight_closure: function Highlighter_highlight_closure() {
    },
    Highlighter__writeFileStart_closure: function Highlighter__writeFileStart_closure(t0) {
      this.$this = t0;
    },
    Highlighter__writeMultilineHighlights_closure: function Highlighter__writeMultilineHighlights_closure(t0, t1, t2) {
      this.$this = t0;
      this.startLine = t1;
      this.line = t2;
    },
    Highlighter__writeMultilineHighlights_closure0: function Highlighter__writeMultilineHighlights_closure0(t0, t1) {
      this.$this = t0;
      this.highlight = t1;
    },
    Highlighter__writeMultilineHighlights_closure1: function Highlighter__writeMultilineHighlights_closure1(t0) {
      this.$this = t0;
    },
    Highlighter__writeMultilineHighlights_closure2: function Highlighter__writeMultilineHighlights_closure2(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._box_0 = t0;
      _.$this = t1;
      _.current = t2;
      _.startLine = t3;
      _.line = t4;
      _.highlight = t5;
      _.endLine = t6;
    },
    Highlighter__writeMultilineHighlights__closure: function Highlighter__writeMultilineHighlights__closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    Highlighter__writeMultilineHighlights__closure0: function Highlighter__writeMultilineHighlights__closure0(t0, t1) {
      this.$this = t0;
      this.vertical = t1;
    },
    Highlighter__writeHighlightedText_closure: function Highlighter__writeHighlightedText_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.text = t1;
      _.startColumn = t2;
      _.endColumn = t3;
    },
    Highlighter__writeIndicator_closure: function Highlighter__writeIndicator_closure(t0, t1, t2) {
      this.$this = t0;
      this.line = t1;
      this.highlight = t2;
    },
    Highlighter__writeIndicator_closure0: function Highlighter__writeIndicator_closure0(t0, t1, t2) {
      this.$this = t0;
      this.line = t1;
      this.highlight = t2;
    },
    Highlighter__writeIndicator_closure1: function Highlighter__writeIndicator_closure1(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.coversWholeLine = t1;
      _.line = t2;
      _.highlight = t3;
    },
    Highlighter__writeSidebar_closure: function Highlighter__writeSidebar_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.end = t2;
    },
    _Highlight: function _Highlight(t0, t1, t2) {
      this.span = t0;
      this.isPrimary = t1;
      this.label = t2;
    },
    _Highlight_closure: function _Highlight_closure(t0) {
      this.span = t0;
    },
    _Line: function _Line(t0, t1, t2, t3) {
      var _ = this;
      _.text = t0;
      _.number = t1;
      _.url = t2;
      _.highlights = t3;
    },
    SourceLocation$(offset, column, line, sourceUrl) {
      if (offset < 0)
        A.throwExpression(A.RangeError$("Offset may not be negative, was " + offset + "."));
      else if (line < 0)
        A.throwExpression(A.RangeError$("Line may not be negative, was " + line + "."));
      else if (column < 0)
        A.throwExpression(A.RangeError$("Column may not be negative, was " + column + "."));
      return new A.SourceLocation(sourceUrl, offset, line, column);
    },
    SourceLocation: function SourceLocation(t0, t1, t2, t3) {
      var _ = this;
      _.sourceUrl = t0;
      _.offset = t1;
      _.line = t2;
      _.column = t3;
    },
    SourceLocationMixin: function SourceLocationMixin() {
    },
    SourceSpanBase: function SourceSpanBase() {
    },
    SourceSpanFormatException$(message, span, source) {
      return new A.SourceSpanFormatException(source, message, span);
    },
    SourceSpanException: function SourceSpanException() {
    },
    SourceSpanFormatException: function SourceSpanFormatException(t0, t1, t2) {
      this.source = t0;
      this._span_exception$_message = t1;
      this._span = t2;
    },
    SourceSpanMixin: function SourceSpanMixin() {
    },
    SourceSpanWithContext$(start, end, text, _context) {
      var t1 = new A.SourceSpanWithContext(_context, start, end, text);
      t1.SourceSpanBase$3(start, end, text);
      if (!B.JSString_methods.contains$1(_context, text))
        A.throwExpression(A.ArgumentError$('The context line "' + _context + '" must contain "' + text + '".', null));
      if (A.findLineStart(_context, text, start.get$column()) == null)
        A.throwExpression(A.ArgumentError$('The span text "' + text + '" must start at column ' + (start.get$column() + 1) + ' in a line within "' + _context + '".', null));
      return t1;
    },
    SourceSpanWithContext: function SourceSpanWithContext(t0, t1, t2, t3) {
      var _ = this;
      _._context = t0;
      _.start = t1;
      _.end = t2;
      _.text = t3;
    },
    SseClient$(serverUrl, debugKey) {
      var t3, t4, t5, _null = null,
        t1 = type$.String,
        t2 = A.StreamController_StreamController(_null, _null, _null, false, t1);
      t1 = A.StreamController_StreamController(_null, _null, _null, false, t1);
      t3 = A.Logger_Logger("SseClient");
      t4 = $.Zone__current;
      t5 = A.generateId();
      t1 = new A.SseClient(debugKey + "-" + t5, t2, t1, t3, new A._AsyncCompleter(new A._Future(t4, type$._Future_void), type$._AsyncCompleter_void));
      t1.SseClient$2$debugKey(serverUrl, debugKey);
      return t1;
    },
    SseClient: function SseClient(t0, t1, t2, t3, t4) {
      var _ = this;
      _._clientId = t0;
      _._incomingController = t1;
      _._outgoingController = t2;
      _._logger = t3;
      _._onConnected = t4;
      _._lastMessageId = -1;
      _.__SseClient__serverUrl_A = _.__SseClient__eventSource_A = $;
      _._errorTimer = null;
    },
    SseClient_closure: function SseClient_closure(t0) {
      this.$this = t0;
    },
    SseClient_closure0: function SseClient_closure0(t0) {
      this.$this = t0;
    },
    SseClient_closure1: function SseClient_closure1(t0) {
      this.$this = t0;
    },
    SseClient__closure: function SseClient__closure(t0, t1) {
      this.$this = t0;
      this.error = t1;
    },
    SseClient__onOutgoingMessage_closure: function SseClient__onOutgoingMessage_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.message = t2;
    },
    GuaranteeChannel$(innerStream, innerSink, allowSinkErrors, $T) {
      var t2, t1 = {};
      t1.innerStream = innerStream;
      t2 = new A.GuaranteeChannel($T._eval$1("GuaranteeChannel<0>"));
      t2.GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, t1, $T);
      return t2;
    },
    GuaranteeChannel: function GuaranteeChannel(t0) {
      var _ = this;
      _.__GuaranteeChannel__streamController_F = _.__GuaranteeChannel__sink_F = $;
      _._guarantee_channel$_subscription = null;
      _._disconnected = false;
      _.$ti = t0;
    },
    GuaranteeChannel_closure: function GuaranteeChannel_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.T = t2;
    },
    GuaranteeChannel__closure: function GuaranteeChannel__closure(t0) {
      this.$this = t0;
    },
    _GuaranteeSink: function _GuaranteeSink(t0, t1, t2, t3, t4) {
      var _ = this;
      _._inner = t0;
      _._guarantee_channel$_channel = t1;
      _._doneCompleter = t2;
      _._closed = _._disconnected = false;
      _._addStreamCompleter = _._addStreamSubscription = null;
      _._allowErrors = t3;
      _.$ti = t4;
    },
    _GuaranteeSink__addError_closure: function _GuaranteeSink__addError_closure() {
    },
    StreamChannelController: function StreamChannelController(t0) {
      this.__StreamChannelController__foreign_F = this.__StreamChannelController__local_F = $;
      this.$ti = t0;
    },
    StreamChannelMixin: function StreamChannelMixin() {
    },
    StringScannerException: function StringScannerException(t0, t1, t2) {
      this.source = t0;
      this._span_exception$_message = t1;
      this._span = t2;
    },
    StringScanner: function StringScanner(t0, t1) {
      var _ = this;
      _.sourceUrl = t0;
      _.string = t1;
      _._string_scanner$_position = 0;
      _._lastMatchPosition = _._lastMatch = null;
    },
    RNG: function RNG() {
    },
    CryptoRNG: function CryptoRNG() {
    },
    UuidV1: function UuidV1(t0) {
      this.goptions = t0;
    },
    _EventStreamSubscription$(_target, _eventType, onData, _useCapture, $T) {
      var t1;
      if (onData == null)
        t1 = null;
      else {
        t1 = A._wrapZone(new A._EventStreamSubscription_closure(onData), type$.JSObject);
        t1 = t1 == null ? null : A._functionToJS1(t1);
      }
      t1 = new A._EventStreamSubscription(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription<0>"));
      t1._tryResume$0();
      return t1;
    },
    _wrapZone(callback, $T) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return callback;
      return t1.bindUnaryCallbackGuarded$1$1(callback, $T);
    },
    EventStreamProvider: function EventStreamProvider(t0, t1) {
      this._eventType = t0;
      this.$ti = t1;
    },
    _EventStream: function _EventStream(t0, t1, t2, t3) {
      var _ = this;
      _._target = t0;
      _._eventType = t1;
      _._useCapture = t2;
      _.$ti = t3;
    },
    _EventStreamSubscription: function _EventStreamSubscription(t0, t1, t2, t3, t4) {
      var _ = this;
      _._pauseCount = 0;
      _._target = t0;
      _._eventType = t1;
      _._onData = t2;
      _._useCapture = t3;
      _.$ti = t4;
    },
    _EventStreamSubscription_closure: function _EventStreamSubscription_closure(t0) {
      this.onData = t0;
    },
    _EventStreamSubscription_onData_closure: function _EventStreamSubscription_onData_closure(t0) {
      this.handleData = t0;
    },
    BrowserWebSocket_connect(url, protocols) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.BrowserWebSocket),
        $async$returnValue, t1, t2, t3, webSocket, browserSocket, webSocketConnected;
      var $async$BrowserWebSocket_connect = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              if (!url.isScheme$1("ws") && !url.isScheme$1("wss"))
                throw A.wrapException(A.ArgumentError$value(url, "url", "only ws: and wss: schemes are supported"));
              t1 = init.G;
              t2 = t1.WebSocket;
              t3 = url.toString$0(0);
              t1 = t1.Array;
              t1 = type$.JSArray_nullable_Object._as(new t1());
              webSocket = A._asJSObject(new t2(t3, t1));
              webSocket.binaryType = "arraybuffer";
              browserSocket = new A.BrowserWebSocket(webSocket, A.StreamController_StreamController(null, null, null, false, type$.WebSocketEvent));
              t1 = new A._Future($.Zone__current, type$._Future_BrowserWebSocket);
              webSocketConnected = new A._AsyncCompleter(t1, type$._AsyncCompleter_BrowserWebSocket);
              if (A._asInt(webSocket.readyState) === 1)
                webSocketConnected.complete$1(browserSocket);
              else if (A._asInt(webSocket.readyState) === 2 || A._asInt(webSocket.readyState) === 3)
                webSocketConnected.completeError$1(new A.WebSocketException("Unexpected WebSocket state: " + A._asInt(webSocket.readyState) + ", expected CONNECTING (0) or OPEN (1)"));
              else
                new A._EventStream(webSocket, "open", false, type$._EventStream_JSObject).get$first(0).then$1$1(new A.BrowserWebSocket_connect_closure(webSocketConnected, browserSocket), type$.void);
              t2 = type$._EventStream_JSObject;
              t3 = type$.void;
              new A._EventStream(webSocket, "error", false, t2).get$first(0).then$1$1(new A.BrowserWebSocket_connect_closure0(webSocketConnected, browserSocket), t3);
              A._EventStreamSubscription$(webSocket, "message", type$.nullable_void_Function_JSObject._as(new A.BrowserWebSocket_connect_closure1(browserSocket)), false, type$.JSObject);
              new A._EventStream(webSocket, "close", false, t2).get$first(0).then$1$1(new A.BrowserWebSocket_connect_closure2(webSocketConnected, browserSocket), t3);
              $async$returnValue = t1;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$BrowserWebSocket_connect, $async$completer);
    },
    BrowserWebSocket: function BrowserWebSocket(t0, t1) {
      this._webSocket = t0;
      this._browser_web_socket$_events = t1;
    },
    BrowserWebSocket_connect_closure: function BrowserWebSocket_connect_closure(t0, t1) {
      this.webSocketConnected = t0;
      this.browserSocket = t1;
    },
    BrowserWebSocket_connect_closure0: function BrowserWebSocket_connect_closure0(t0, t1) {
      this.webSocketConnected = t0;
      this.browserSocket = t1;
    },
    BrowserWebSocket_connect_closure1: function BrowserWebSocket_connect_closure1(t0) {
      this.browserSocket = t0;
    },
    BrowserWebSocket_connect_closure2: function BrowserWebSocket_connect_closure2(t0, t1) {
      this.webSocketConnected = t0;
      this.browserSocket = t1;
    },
    WebSocketConnectionClosed$() {
      return new A.WebSocketConnectionClosed("Connection Closed");
    },
    WebSocketEvent: function WebSocketEvent() {
    },
    TextDataReceived: function TextDataReceived(t0) {
      this.text = t0;
    },
    BinaryDataReceived: function BinaryDataReceived(t0) {
      this.data = t0;
    },
    CloseReceived: function CloseReceived(t0, t1) {
      this.code = t0;
      this.reason = t1;
    },
    WebSocketException: function WebSocketException(t0) {
      this.message = t0;
    },
    WebSocketConnectionClosed: function WebSocketConnectionClosed(t0) {
      this.message = t0;
    },
    AdapterWebSocketChannel$(webSocket) {
      var _null = null,
        t1 = $.Zone__current,
        t2 = new A.StreamChannelController(type$.StreamChannelController_nullable_Object),
        t3 = type$.nullable_Object,
        localToForeignController = A.StreamController_StreamController(_null, _null, _null, true, t3),
        foreignToLocalController = A.StreamController_StreamController(_null, _null, _null, true, t3),
        t4 = A._instanceType(foreignToLocalController),
        t5 = A._instanceType(localToForeignController);
      t2.__StreamChannelController__local_F = A.GuaranteeChannel$(new A._ControllerStream(foreignToLocalController, t4._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(localToForeignController, t5._eval$1("_StreamSinkWrapper<1>")), true, t3);
      t2.__StreamChannelController__foreign_F = A.GuaranteeChannel$(new A._ControllerStream(localToForeignController, t5._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(foreignToLocalController, t4._eval$1("_StreamSinkWrapper<1>")), false, t3);
      t2 = new A.AdapterWebSocketChannel(new A._AsyncCompleter(new A._Future(t1, type$._Future_void), type$._AsyncCompleter_void), t2);
      t2.AdapterWebSocketChannel$1(webSocket);
      return t2;
    },
    AdapterWebSocketChannel: function AdapterWebSocketChannel(t0, t1) {
      var _ = this;
      _._localCloseReason = _._localCloseCode = null;
      _._readyCompleter = t0;
      _._adapter_web_socket_channel$_controller = t1;
      _.__AdapterWebSocketChannel_sink_FI = $;
    },
    AdapterWebSocketChannel_closure: function AdapterWebSocketChannel_closure(t0) {
      this.$this = t0;
    },
    AdapterWebSocketChannel__closure: function AdapterWebSocketChannel__closure(t0) {
      this.$this = t0;
    },
    AdapterWebSocketChannel__closure0: function AdapterWebSocketChannel__closure0(t0) {
      this.webSocket = t0;
    },
    AdapterWebSocketChannel__closure1: function AdapterWebSocketChannel__closure1(t0, t1) {
      this.$this = t0;
      this.webSocket = t1;
    },
    AdapterWebSocketChannel_closure0: function AdapterWebSocketChannel_closure0(t0) {
      this.$this = t0;
    },
    _WebSocketSink: function _WebSocketSink(t0, t1) {
      this._adapter_web_socket_channel$_channel = t0;
      this._sink = t1;
    },
    WebSocketChannelException: function WebSocketChannelException(t0) {
      this.message = t0;
    },
    main() {
      return A.runZonedGuarded(new A.main_closure(), new A.main_closure0(), type$.Future_void);
    },
    _trySendEvent(sink, serialized, $T) {
      var exception;
      try {
        sink.add$1(0, serialized);
      } catch (exception) {
        if (A.unwrapException(exception) instanceof A.StateError)
          A.print("Cannot send event " + A.S(serialized) + ". Injected client connection is closed.");
        else
          throw exception;
      }
    },
    _sendConnectRequest(clientSink) {
      var t1 = $.$get$serializers(),
        t2 = new A.ConnectRequestBuilder();
      type$.nullable_void_Function_ConnectRequestBuilder._as(new A._sendConnectRequest_closure()).call$1(t2);
      A._trySendEvent(clientSink, B.C_JsonCodec.encode$2$toEncodable(t1.serialize$1(t2._connect_request$_build$0()), null), type$.dynamic);
    },
    _launchCommunicationWithDebugExtension() {
      var t1, t2;
      A._asJSObject(init.G.window).addEventListener("message", A._functionToJS1(A.client___handleAuthRequest$closure()));
      t1 = $.$get$serializers();
      t2 = new A.DebugInfoBuilder();
      type$.nullable_void_Function_DebugInfoBuilder._as(new A._launchCommunicationWithDebugExtension_closure()).call$1(t2);
      A._dispatchEvent("dart-app-ready", B.C_JsonCodec.encode$2$toEncodable(t1.serialize$1(t2._build$0()), null));
    },
    _dispatchEvent(message, detail) {
      var t1 = init.G,
        $event = A._asJSObject(new t1.CustomEvent(message, {detail: detail}));
      A._asBool(A._asJSObject(t1.document).dispatchEvent($event));
    },
    _handleAuthRequest($event) {
      var t1,
        data = A._asJSObject($event).data;
      if (!(typeof data === "string"))
        return;
      if (A._asString(data) !== "dart-auth-request")
        return;
      if (A._authUrl() != null) {
        t1 = A._authUrl();
        t1.toString;
        A._authenticateUser(t1).then$1$1(new A._handleAuthRequest_closure(), type$.void);
      }
    },
    _authenticateUser(authUrl) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, response, client;
      var $async$_authenticateUser = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              client = new A.BrowserClient(A._setArrayType([], type$.JSArray_JSObject));
              client.withCredentials = true;
              $async$goto = 3;
              return A._asyncAwait(client._sendUnstreamed$3("GET", A.Uri_parse(authUrl), null), $async$_authenticateUser);
            case 3:
              // returning from await.
              response = $async$result;
              $async$returnValue = B.JSString_methods.contains$1(A.encodingForContentTypeHeader(A._contentTypeForHeaders(response.headers)).decode$1(response.bodyBytes), "Dart Debug Authentication Success!");
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_authenticateUser, $async$completer);
    },
    _sendResponse(clientSink, builder, requestId, errorMessage, success, $T) {
      A._trySendEvent(clientSink, B.C_JsonCodec.encode$2$toEncodable($.$get$serializers().serialize$1(builder.call$1(new A._sendResponse_closure(requestId, success, errorMessage))), null), type$.dynamic);
    },
    _sendServiceExtensionResponse(clientSink, requestId, errorCode, errorMessage, result, success) {
      A._trySendEvent(clientSink, B.C_JsonCodec.encode$2$toEncodable($.$get$serializers().serialize$1(A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult(errorCode, errorMessage, requestId, result, success)), null), type$.dynamic);
    },
    handleWebSocketHotReloadRequest($event, manager, clientSink) {
      return A.handleWebSocketHotReloadRequest$body($event, manager, clientSink);
    },
    handleWebSocketHotReloadRequest$body($event, manager, clientSink) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$handler = 1, $async$errorStack = [], e, path, exception, t1, requestId, $async$exception;
      var $async$handleWebSocketHotReloadRequest = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              requestId = $event.id;
              $async$handler = 3;
              path = A._asStringQ(init.G.$reloadedSourcesPath);
              path.toString;
              $async$goto = 6;
              return A._asyncAwait(manager._restarter.hotReloadStart$1(path), $async$handleWebSocketHotReloadRequest);
            case 6:
              // returning from await.
              $async$goto = 7;
              return A._asyncAwait(manager.hotReloadEnd$0(), $async$handleWebSocketHotReloadRequest);
            case 7:
              // returning from await.
              A._sendResponse(clientSink, A.hot_reload_response_HotReloadResponse___new_tearOff$closure(), requestId, null, true, type$.HotReloadResponse);
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$errorStack.pop();
              e = A.unwrapException($async$exception);
              t1 = J.toString$0$(e);
              A._sendResponse(clientSink, A.hot_reload_response_HotReloadResponse___new_tearOff$closure(), requestId, t1, false, type$.HotReloadResponse);
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return A._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$handleWebSocketHotReloadRequest, $async$completer);
    },
    handleWebSocketHotRestartRequest($event, manager, clientSink) {
      return A.handleWebSocketHotRestartRequest$body($event, manager, clientSink);
    },
    handleWebSocketHotRestartRequest$body($event, manager, clientSink) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$returnValue, $async$handler = 2, $async$errorStack = [], runId, e, t1, rng, t2, exception, requestId, $async$exception;
      var $async$handleWebSocketHotRestartRequest = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              requestId = $event.id;
              $async$handler = 4;
              t1 = null;
              if (null == null)
                rng = t1;
              else
                rng = t1;
              if (rng == null)
                rng = $.$get$V4State_random().generate$0();
              t1 = rng.length;
              if (6 >= t1) {
                $async$returnValue = A.ioore(rng, 6);
                // goto return
                $async$goto = 1;
                break;
              }
              t2 = rng[6];
              rng.$flags & 2 && A.throwUnsupportedOperation(rng);
              rng[6] = t2 & 15 | 64;
              if (8 >= t1) {
                $async$returnValue = A.ioore(rng, 8);
                // goto return
                $async$goto = 1;
                break;
              }
              rng[8] = rng[8] & 63 | 128;
              runId = A.UuidParsing_unparse(rng);
              $async$goto = 7;
              return A._asyncAwait(manager.hotRestart$2$reloadedSourcesPath$runId(A._asStringQ(init.G.$reloadedSourcesPath), runId), $async$handleWebSocketHotRestartRequest);
            case 7:
              // returning from await.
              A._sendResponse(clientSink, A.hot_restart_response_HotRestartResponse___new_tearOff$closure(), requestId, null, true, type$.HotRestartResponse);
              $async$handler = 2;
              // goto after finally
              $async$goto = 6;
              break;
            case 4:
              // catch
              $async$handler = 3;
              $async$exception = $async$errorStack.pop();
              e = A.unwrapException($async$exception);
              t1 = J.toString$0$(e);
              A._sendResponse(clientSink, A.hot_restart_response_HotRestartResponse___new_tearOff$closure(), requestId, t1, false, type$.HotRestartResponse);
              // goto after finally
              $async$goto = 6;
              break;
            case 3:
              // uncaught
              // goto rethrow
              $async$goto = 2;
              break;
            case 6:
              // after finally
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$handleWebSocketHotRestartRequest, $async$completer);
    },
    handleServiceExtensionRequest(request, clientSink, manager) {
      return A.handleServiceExtensionRequest$body(request, clientSink, manager);
    },
    handleServiceExtensionRequest$body(request, clientSink, manager) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$handler = 1, $async$errorStack = [], result, e, t1, exception, $async$exception;
      var $async$handleServiceExtensionRequest = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$handler = 3;
              t1 = request.argsJson;
              t1 = t1.length === 0 ? A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic) : type$.Map_String_dynamic._as(B.C_JsonCodec.decode$1(t1));
              $async$goto = 6;
              return A._asyncAwait(manager.handleServiceExtension$2(request.method, t1), $async$handleServiceExtensionRequest);
            case 6:
              // returning from await.
              result = $async$result;
              t1 = request.id;
              if (result != null)
                A._sendServiceExtensionResponse(clientSink, t1, null, null, result, true);
              else
                A._sendServiceExtensionResponse(clientSink, t1, -32601, "Service extension not supported", null, false);
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$errorStack.pop();
              e = A.unwrapException($async$exception);
              A._sendServiceExtensionResponse(clientSink, request.id, null, J.toString$0$(e), null, false);
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return A._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$handleServiceExtensionRequest, $async$completer);
    },
    _isChromium() {
      return B.JSString_methods.contains$1(A._asString(A._asJSObject(A._asJSObject(init.G.window).navigator).vendor), "Google");
    },
    _authUrl() {
      var authUrl,
        extensionUrl = A._asStringQ(type$.JavaScriptObject._as(init.G.window).$dartExtensionUri);
      if (extensionUrl == null)
        return null;
      authUrl = A.Uri_parse(extensionUrl).replace$1$path("$dwdsExtensionAuthentication");
      switch (authUrl.scheme) {
        case "ws":
          return authUrl.replace$1$scheme("http").get$_text();
        case "wss":
          return authUrl.replace$1$scheme("https").get$_text();
        default:
          return authUrl.get$_text();
      }
    },
    main_closure: function main_closure() {
    },
    main__closure: function main__closure(t0) {
      this.manager = t0;
    },
    main__closure0: function main__closure0(t0) {
      this.manager = t0;
    },
    main__closure1: function main__closure1(t0, t1) {
      this._box_0 = t0;
      this.manager = t1;
    },
    main__closure2: function main__closure2(t0) {
      this._box_0 = t0;
    },
    main__closure3: function main__closure3(t0) {
      this.client = t0;
    },
    main___closure2: function main___closure2(t0) {
      this.events = t0;
    },
    main__closure4: function main__closure4(t0) {
      this.debugEventController = t0;
    },
    main___closure1: function main___closure1(t0, t1) {
      this.kind = t0;
      this.eventData = t1;
    },
    main__closure5: function main__closure5(t0) {
      this.client = t0;
    },
    main___closure0: function main___closure0(t0) {
      this.eventData = t0;
    },
    main__closure6: function main__closure6(t0) {
      this.client = t0;
    },
    main___closure: function main___closure() {
    },
    main__closure7: function main__closure7(t0, t1) {
      this.manager = t0;
      this.client = t1;
    },
    main__closure8: function main__closure8() {
    },
    main__closure9: function main__closure9() {
    },
    main_closure0: function main_closure0() {
    },
    _sendConnectRequest_closure: function _sendConnectRequest_closure() {
    },
    _launchCommunicationWithDebugExtension_closure: function _launchCommunicationWithDebugExtension_closure() {
    },
    _handleAuthRequest_closure: function _handleAuthRequest_closure() {
    },
    _sendResponse_closure: function _sendResponse_closure(t0, t1, t2) {
      this.requestId = t0;
      this.success = t1;
      this.errorMessage = t2;
    },
    _Debugger_maybeInvokeFlutterDisassemble(_this) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        t1;
      var $async$_Debugger_maybeInvokeFlutterDisassemble = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.JSArray_nullable_Object._as(_this.extensionNames);
              $async$goto = J.contains$1$asx(type$.List_String._is(t1) ? t1 : new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,String>")), "ext.flutter.disassemble") ? 2 : 3;
              break;
            case 2:
              // then
              $async$goto = 4;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(_this.invokeExtension("ext.flutter.disassemble", "{}")), type$.String), $async$_Debugger_maybeInvokeFlutterDisassemble);
            case 4:
              // returning from await.
            case 3:
              // join
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_Debugger_maybeInvokeFlutterDisassemble, $async$completer);
    },
    _Debugger_maybeInvokeFlutterReassemble(_this) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        t1;
      var $async$_Debugger_maybeInvokeFlutterReassemble = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.JSArray_nullable_Object._as(_this.extensionNames);
              $async$goto = J.contains$1$asx(type$.List_String._is(t1) ? t1 : new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,String>")), "ext.flutter.reassemble") ? 2 : 3;
              break;
            case 2:
              // then
              $async$goto = 4;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(_this.invokeExtension("ext.flutter.reassemble", "{}")), type$.String), $async$_Debugger_maybeInvokeFlutterReassemble);
            case 4:
              // returning from await.
            case 3:
              // join
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_Debugger_maybeInvokeFlutterReassemble, $async$completer);
    },
    DdcLibraryBundleRestarter: function DdcLibraryBundleRestarter() {
      this._capturedHotReloadEndCallback = null;
    },
    DdcLibraryBundleRestarter__getSrcModuleLibraries_closure: function DdcLibraryBundleRestarter__getSrcModuleLibraries_closure(t0, t1) {
      this.xhr = t0;
      this.completer = t1;
    },
    DdcLibraryBundleRestarter_restart_closure: function DdcLibraryBundleRestarter_restart_closure(t0, t1) {
      this.$this = t0;
      this.readyToRunMain = t1;
    },
    DdcLibraryBundleRestarter_hotReloadStart_closure: function DdcLibraryBundleRestarter_hotReloadStart_closure(t0) {
      this.$this = t0;
    },
    DdcRestarter: function DdcRestarter() {
    },
    DdcRestarter_restart_closure0: function DdcRestarter_restart_closure0(t0) {
      this.reloadCompleter = t0;
    },
    DdcRestarter_restart_closure: function DdcRestarter_restart_closure(t0) {
      this.sub = t0;
    },
    ReloadingManager: function ReloadingManager(t0, t1) {
      this._client = t0;
      this._restarter = t1;
    },
    SdkDeveloperExtension_maybeInvokeFlutterDisassemble(_this) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void);
      var $async$SdkDeveloperExtension_maybeInvokeFlutterDisassemble = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = A._asBool(type$.JavaScriptObject._as(_this._extensions).containsKey("ext.flutter.disassemble")) ? 2 : 3;
              break;
            case 2:
              // then
              $async$goto = 4;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(_this.invokeExtension("ext.flutter.disassemble", "{}")), type$.String), $async$SdkDeveloperExtension_maybeInvokeFlutterDisassemble);
            case 4:
              // returning from await.
            case 3:
              // join
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$SdkDeveloperExtension_maybeInvokeFlutterDisassemble, $async$completer);
    },
    HotReloadFailedException$(_s) {
      return new A.HotReloadFailedException(_s);
    },
    RequireRestarter_create() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.RequireRestarter),
        $async$returnValue, reloader, t1, t2, t3;
      var $async$RequireRestarter_create = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.String;
              t2 = A.HashMap_HashMap(null, null, null, t1, type$.int);
              t3 = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_bool), type$._AsyncCompleter_bool);
              t3.complete$1(true);
              reloader = new A.RequireRestarter(t2, t3);
              reloader.__RequireRestarter__dirtyModules_A = type$.SplayTreeSet_String._as(A.SplayTreeSet$(reloader.get$_moduleTopologicalCompare(), null, t1));
              $async$goto = 3;
              return A._asyncAwait(reloader._initialize$0(), $async$RequireRestarter_create);
            case 3:
              // returning from await.
              $async$returnValue = reloader;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$RequireRestarter_create, $async$completer);
    },
    HotReloadFailedException: function HotReloadFailedException(t0) {
      this._s = t0;
    },
    RequireRestarter: function RequireRestarter(t0, t1) {
      this._moduleOrdering = t0;
      this.__RequireRestarter__dirtyModules_A = $;
      this._running = t1;
    },
    RequireRestarter__reload_closure: function RequireRestarter__reload_closure(t0, t1) {
      this._box_0 = t0;
      this.dart = t1;
    },
    RequireRestarter__reloadModule_closure: function RequireRestarter__reloadModule_closure(t0) {
      this.completer = t0;
    },
    RequireRestarter__reloadModule_closure0: function RequireRestarter__reloadModule_closure0(t0, t1) {
      this.completer = t0;
      this.stackTrace = t1;
    },
    _findNonce() {
      var i, element, t1, nonceValue,
        elements = A._asJSObject(A._asJSObject(A._asJSObject(init.G.window).document).querySelectorAll("script"));
      for (i = 0; i < A._asInt(elements.length); ++i) {
        element = A._asJSObjectQ(elements.item(i));
        t1 = element == null ? A._asJSObject(element) : element;
        nonceValue = A._asString(t1.nonce);
        t1 = $.$get$_noncePattern();
        if (t1._nativeRegExp.test(nonceValue))
          return nonceValue;
      }
      return null;
    },
    runMain() {
      var t1, t2,
        scriptElement = $.$get$_createScript().call$0();
      scriptElement.innerHTML = "window.$dartRunMain();";
      t1 = A._asJSObjectQ(A._asJSObject(init.G.document).body);
      t1.toString;
      t2 = A.jsify(scriptElement);
      t2.toString;
      t1.append(t2);
      A.Future_Future$microtask(new A.runMain_closure(scriptElement), type$.void);
    },
    _createScript_closure: function _createScript_closure() {
    },
    _createScript__closure: function _createScript__closure() {
    },
    _createScript__closure0: function _createScript__closure0(t0) {
      this.nonce = t0;
    },
    runMain_closure: function runMain_closure(t0) {
      this.scriptElement = t0;
    },
    JSArrayExtension_toDartIterable(_this, $T) {
      return B.JSArray_methods.map$1$1(_this, new A.JSArrayExtension_toDartIterable_closure($T), $T);
    },
    JSArrayExtension_toDartIterable_closure: function JSArrayExtension_toDartIterable_closure(t0) {
      this.T = t0;
    },
    printString(string) {
      if (typeof dartPrint == "function") {
        dartPrint(string);
        return;
      }
      if (typeof console == "object" && typeof console.log != "undefined") {
        console.log(string);
        return;
      }
      if (typeof print == "function") {
        print(string);
        return;
      }
      throw "Unable to print message: " + String(string);
    },
    JSFunctionUnsafeUtilExtension_callAsConstructor(_this, arg1, $R) {
      return $R._as(A.callConstructor(_this, [arg1], type$.JSObject));
    },
    groupBy(values, key, $S, $T) {
      var t1, _i, element, t2, t3,
        map = A.LinkedHashMap_LinkedHashMap$_empty($T, $S._eval$1("List<0>"));
      for (t1 = $S._eval$1("JSArray<0>"), _i = 0; _i < 1; ++_i) {
        element = values[_i];
        t2 = key.call$1(element);
        t3 = map.$index(0, t2);
        if (t3 == null) {
          t3 = A._setArrayType([], t1);
          map.$indexSet(0, t2, t3);
          t2 = t3;
        } else
          t2 = t3;
        J.add$1$ax(t2, element);
      }
      return map;
    },
    decodeDigit(c) {
      var letter,
        digit = c ^ 48;
      if (digit < 10)
        return digit;
      letter = (c | 32) - 97;
      if (letter >= 0)
        return letter + 10;
      else
        return 255;
    },
    encodingForContentTypeHeader(contentTypeHeader) {
      var t1,
        charset = contentTypeHeader.parameters._collection$_map.$index(0, "charset");
      if (contentTypeHeader.type === "application" && contentTypeHeader.subtype === "json" && charset == null)
        return B.C_Utf8Codec;
      if (charset != null) {
        t1 = A.Encoding_getByName(charset);
        if (t1 == null)
          t1 = B.C_Latin1Codec;
      } else
        t1 = B.C_Latin1Codec;
      return t1;
    },
    toUint8List(input) {
      return input;
    },
    toByteStream(stream) {
      return new A.ByteStream(stream);
    },
    wrapFormatException($name, value, body, $T) {
      var error, error0, t1, exception;
      try {
        t1 = body.call$0();
        return t1;
      } catch (exception) {
        t1 = A.unwrapException(exception);
        if (t1 instanceof A.SourceSpanFormatException) {
          error = t1;
          throw A.wrapException(A.SourceSpanFormatException$("Invalid " + $name + ": " + error._span_exception$_message, error._span, error.get$source()));
        } else if (type$.FormatException._is(t1)) {
          error0 = t1;
          throw A.wrapException(A.FormatException$("Invalid " + $name + ' "' + value + '": ' + error0.get$message(), error0.get$source(), error0.get$offset()));
        } else
          throw exception;
      }
    },
    current() {
      var exception, t1, path, lastIndex, uri = null;
      try {
        uri = A.Uri_base();
      } catch (exception) {
        if (type$.Exception._is(A.unwrapException(exception))) {
          t1 = $._current;
          if (t1 != null)
            return t1;
          throw exception;
        } else
          throw exception;
      }
      if (J.$eq$(uri, $._currentUriBase)) {
        t1 = $._current;
        t1.toString;
        return t1;
      }
      $._currentUriBase = uri;
      if ($.$get$Style_platform() === $.$get$Style_url())
        t1 = $._current = uri.resolve$1(".").toString$0(0);
      else {
        path = uri.toFilePath$0();
        lastIndex = path.length - 1;
        t1 = $._current = lastIndex === 0 ? path : B.JSString_methods.substring$2(path, 0, lastIndex);
      }
      return t1;
    },
    isAlphabetic(char) {
      var t1;
      if (!(char >= 65 && char <= 90))
        t1 = char >= 97 && char <= 122;
      else
        t1 = true;
      return t1;
    },
    driveLetterEnd(path, index) {
      var t2, t3, _null = null,
        t1 = path.length,
        index0 = index + 2;
      if (t1 < index0)
        return _null;
      if (!(index >= 0 && index < t1))
        return A.ioore(path, index);
      if (!A.isAlphabetic(path.charCodeAt(index)))
        return _null;
      t2 = index + 1;
      if (!(t2 < t1))
        return A.ioore(path, t2);
      if (path.charCodeAt(t2) !== 58) {
        t3 = index + 4;
        if (t1 < t3)
          return _null;
        if (B.JSString_methods.substring$2(path, t2, t3).toLowerCase() !== "%3a")
          return _null;
        index = index0;
      }
      t2 = index + 2;
      if (t1 === t2)
        return t2;
      if (!(t2 >= 0 && t2 < t1))
        return A.ioore(path, t2);
      if (path.charCodeAt(t2) !== 47)
        return _null;
      return index + 3;
    },
    isAllTheSame(iter) {
      var firstValue, t1, t2, value;
      if (iter.get$length(0) === 0)
        return true;
      firstValue = iter.get$first(0);
      for (t1 = A.SubListIterable$(iter, 1, null, iter.$ti._eval$1("ListIterable.E")), t2 = t1.$ti, t1 = new A.ListIterator(t1, t1.get$length(0), t2._eval$1("ListIterator<ListIterable.E>")), t2 = t2._eval$1("ListIterable.E"); t1.moveNext$0();) {
        value = t1.__internal$_current;
        if (!J.$eq$(value == null ? t2._as(value) : value, firstValue))
          return false;
      }
      return true;
    },
    replaceFirstNull(list, element, $E) {
      var index = B.JSArray_methods.indexOf$1(list, null);
      if (index < 0)
        throw A.wrapException(A.ArgumentError$(A.S(list) + " contains no null elements.", null));
      B.JSArray_methods.$indexSet(list, index, element);
    },
    replaceWithNull(list, element, $E) {
      var index = B.JSArray_methods.indexOf$1(list, element);
      if (index < 0)
        throw A.wrapException(A.ArgumentError$(A.S(list) + " contains no elements matching " + element.toString$0(0) + ".", null));
      B.JSArray_methods.$indexSet(list, index, null);
    },
    countCodeUnits(string, codeUnit) {
      var t1, t2, count, t3;
      for (t1 = new A.CodeUnits(string), t2 = type$.CodeUnits, t1 = new A.ListIterator(t1, t1.get$length(0), t2._eval$1("ListIterator<ListBase.E>")), t2 = t2._eval$1("ListBase.E"), count = 0; t1.moveNext$0();) {
        t3 = t1.__internal$_current;
        if ((t3 == null ? t2._as(t3) : t3) === codeUnit)
          ++count;
      }
      return count;
    },
    findLineStart(context, text, column) {
      var beginningOfLine, index, lineStart;
      if (text.length === 0)
        for (beginningOfLine = 0;;) {
          index = B.JSString_methods.indexOf$2(context, "\n", beginningOfLine);
          if (index === -1)
            return context.length - beginningOfLine >= column ? beginningOfLine : null;
          if (index - beginningOfLine >= column)
            return beginningOfLine;
          beginningOfLine = index + 1;
        }
      index = B.JSString_methods.indexOf$1(context, text);
      while (index !== -1) {
        lineStart = index === 0 ? 0 : B.JSString_methods.lastIndexOf$2(context, "\n", index - 1) + 1;
        if (column === index - lineStart)
          return lineStart;
        index = B.JSString_methods.indexOf$2(context, text, index + 1);
      }
      return null;
    },
    generateId() {
      var i,
        chars = A.List_List$filled(6, 0, false, type$.int),
        bits = B.C__JSRandom.nextInt$1(4294967296);
      for (i = 0; i < 6; ++i) {
        B.JSArray_methods.$indexSet(chars, i, string$.ABCDEF.charCodeAt(bits & 63));
        bits = bits >>> 6;
      }
      return A.String_String$fromCharCodes(chars, 0, null);
    },
    UuidParsing_unparse(buffer) {
      var t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17,
        t1 = buffer.length;
      if (t1 < 16)
        throw A.wrapException(A.RangeError$("buffer too small: need 16: length=" + t1));
      t1 = $.$get$UuidParsing__byteToHex();
      t2 = buffer[0];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t1[t2];
      t3 = buffer[1];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t1[t3];
      t4 = buffer[2];
      if (!(t4 < 256))
        return A.ioore(t1, t4);
      t4 = t1[t4];
      t5 = buffer[3];
      if (!(t5 < 256))
        return A.ioore(t1, t5);
      t5 = t1[t5];
      t6 = buffer[4];
      if (!(t6 < 256))
        return A.ioore(t1, t6);
      t6 = t1[t6];
      t7 = buffer[5];
      if (!(t7 < 256))
        return A.ioore(t1, t7);
      t7 = t1[t7];
      t8 = buffer[6];
      if (!(t8 < 256))
        return A.ioore(t1, t8);
      t8 = t1[t8];
      t9 = buffer[7];
      if (!(t9 < 256))
        return A.ioore(t1, t9);
      t9 = t1[t9];
      t10 = buffer[8];
      if (!(t10 < 256))
        return A.ioore(t1, t10);
      t10 = t1[t10];
      t11 = buffer[9];
      if (!(t11 < 256))
        return A.ioore(t1, t11);
      t11 = t1[t11];
      t12 = buffer[10];
      if (!(t12 < 256))
        return A.ioore(t1, t12);
      t12 = t1[t12];
      t13 = buffer[11];
      if (!(t13 < 256))
        return A.ioore(t1, t13);
      t13 = t1[t13];
      t14 = buffer[12];
      if (!(t14 < 256))
        return A.ioore(t1, t14);
      t14 = t1[t14];
      t15 = buffer[13];
      if (!(t15 < 256))
        return A.ioore(t1, t15);
      t15 = t1[t15];
      t16 = buffer[14];
      if (!(t16 < 256))
        return A.ioore(t1, t16);
      t16 = t1[t16];
      t17 = buffer[15];
      if (!(t17 < 256))
        return A.ioore(t1, t17);
      return t2 + t3 + t4 + t5 + "-" + t6 + t7 + "-" + t8 + t9 + "-" + t10 + t11 + "-" + t12 + t13 + t14 + t15 + t16 + t1[t17];
    }
  },
  B = {};
  var holders = [A, J, B];
  var $ = {};
  A.JS_CONST.prototype = {};
  J.Interceptor.prototype = {
    $eq(receiver, other) {
      return receiver === other;
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    toString$0(receiver) {
      return "Instance of '" + A.Primitives_objectTypeName(receiver) + "'";
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(A._instanceTypeFromConstructor(this));
    }
  };
  J.JSBool.prototype = {
    toString$0(receiver) {
      return String(receiver);
    },
    get$hashCode(receiver) {
      return receiver ? 519018 : 218159;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.bool);
    },
    $isTrustedGetRuntimeType: 1,
    $isbool: 1
  };
  J.JSNull.prototype = {
    $eq(receiver, other) {
      return null == other;
    },
    toString$0(receiver) {
      return "null";
    },
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.Null);
    },
    $isTrustedGetRuntimeType: 1,
    $isNull: 1
  };
  J.JavaScriptObject.prototype = {$isJSObject: 1};
  J.LegacyJavaScriptObject.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return B.Type_JSObject_ttY;
    },
    toString$0(receiver) {
      return String(receiver);
    }
  };
  J.PlainJavaScriptObject.prototype = {};
  J.UnknownJavaScriptObject.prototype = {};
  J.JavaScriptFunction.prototype = {
    toString$0(receiver) {
      var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
      if (dartClosure == null)
        return this.super$LegacyJavaScriptObject$toString(receiver);
      return "JavaScript function for " + J.toString$0$(dartClosure);
    },
    $isFunction: 1
  };
  J.JavaScriptBigInt.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    toString$0(receiver) {
      return String(receiver);
    }
  };
  J.JavaScriptSymbol.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    toString$0(receiver) {
      return String(receiver);
    }
  };
  J.JSArray.prototype = {
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    add$1(receiver, value) {
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, 29);
      receiver.push(value);
    },
    removeAt$1(receiver, index) {
      var t1;
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "removeAt", 1);
      t1 = receiver.length;
      if (index >= t1)
        throw A.wrapException(A.RangeError$value(index, null));
      return receiver.splice(index, 1)[0];
    },
    insert$2(receiver, index, value) {
      var t1;
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "insert", 2);
      t1 = receiver.length;
      if (index > t1)
        throw A.wrapException(A.RangeError$value(index, null));
      receiver.splice(index, 0, value);
    },
    insertAll$2(receiver, index, iterable) {
      var insertionLength, end;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(iterable);
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "insertAll", 2);
      A.RangeError_checkValueInInterval(index, 0, receiver.length, "index");
      if (!type$.EfficientLengthIterable_dynamic._is(iterable))
        iterable = J.toList$0$ax(iterable);
      insertionLength = J.get$length$asx(iterable);
      receiver.length = receiver.length + insertionLength;
      end = index + insertionLength;
      this.setRange$4(receiver, end, receiver.length, receiver, index);
      this.setRange$3(receiver, index, end, iterable);
    },
    removeLast$0(receiver) {
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "removeLast", 1);
      if (receiver.length === 0)
        throw A.wrapException(A.diagnoseIndexError(receiver, -1));
      return receiver.pop();
    },
    remove$1(receiver, element) {
      var i;
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "remove", 1);
      for (i = 0; i < receiver.length; ++i)
        if (J.$eq$(receiver[i], element)) {
          receiver.splice(i, 1);
          return true;
        }
      return false;
    },
    _removeWhere$2(receiver, test, removeMatching) {
      var retained, end, i, element, t1;
      A._arrayInstanceType(receiver)._eval$1("bool(1)")._as(test);
      retained = [];
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        element = receiver[i];
        if (!test.call$1(element))
          retained.push(element);
        if (receiver.length !== end)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      t1 = retained.length;
      if (t1 === end)
        return;
      this.set$length(receiver, t1);
      for (i = 0; i < retained.length; ++i)
        receiver[i] = retained[i];
    },
    addAll$1(receiver, collection) {
      var t1;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(collection);
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "addAll", 2);
      if (Array.isArray(collection)) {
        this._addAllFromArray$1(receiver, collection);
        return;
      }
      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
        receiver.push(t1.get$current());
    },
    _addAllFromArray$1(receiver, array) {
      var len, i;
      type$.JSArray_dynamic._as(array);
      len = array.length;
      if (len === 0)
        return;
      if (receiver === array)
        throw A.wrapException(A.ConcurrentModificationError$(receiver));
      for (i = 0; i < len; ++i)
        receiver.push(array[i]);
    },
    clear$0(receiver) {
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "clear", "clear");
      receiver.length = 0;
    },
    map$1$1(receiver, f, $T) {
      var t1 = A._arrayInstanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(receiver, f) {
      return this.map$1$1(receiver, f, type$.dynamic);
    },
    join$1(receiver, separator) {
      var i,
        list = A.List_List$filled(receiver.length, "", false, type$.String);
      for (i = 0; i < receiver.length; ++i)
        this.$indexSet(list, i, A.S(receiver[i]));
      return list.join(separator);
    },
    take$1(receiver, n) {
      return A.SubListIterable$(receiver, 0, A.checkNotNullable(n, "count", type$.int), A._arrayInstanceType(receiver)._precomputed1);
    },
    skip$1(receiver, n) {
      return A.SubListIterable$(receiver, n, null, A._arrayInstanceType(receiver)._precomputed1);
    },
    fold$1$2(receiver, initialValue, combine, $T) {
      var $length, value, i;
      $T._as(initialValue);
      A._arrayInstanceType(receiver)._bind$1($T)._eval$1("1(1,2)")._as(combine);
      $length = receiver.length;
      for (value = initialValue, i = 0; i < $length; ++i) {
        value = combine.call$2(value, receiver[i]);
        if (receiver.length !== $length)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return value;
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      var t1 = receiver.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, "start", null));
      if (start === t1)
        return A._setArrayType([], A._arrayInstanceType(receiver));
      return A._setArrayType(receiver.slice(start, t1), A._arrayInstanceType(receiver));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, receiver.length);
      return A.SubListIterable$(receiver, start, end, A._arrayInstanceType(receiver)._precomputed1);
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    get$last(receiver) {
      var t1 = receiver.length;
      if (t1 > 0)
        return receiver[t1 - 1];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    setRange$4(receiver, start, end, iterable, skipCount) {
      var $length, otherList, otherStart, t1, i;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(iterable);
      receiver.$flags & 2 && A.throwUnsupportedOperation(receiver, 5);
      A.RangeError_checkValidRange(start, end, receiver.length);
      $length = end - start;
      if ($length === 0)
        return;
      A.RangeError_checkNotNegative(skipCount, "skipCount");
      if (type$.List_dynamic._is(iterable)) {
        otherList = iterable;
        otherStart = skipCount;
      } else {
        otherList = J.skip$1$ax(iterable, skipCount).toList$1$growable(0, false);
        otherStart = 0;
      }
      t1 = J.getInterceptor$asx(otherList);
      if (otherStart + $length > t1.get$length(otherList))
        throw A.wrapException(A.IterableElementError_tooFew());
      if (otherStart < start)
        for (i = $length - 1; i >= 0; --i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
      else
        for (i = 0; i < $length; ++i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
    },
    setRange$3(receiver, start, end, iterable) {
      return this.setRange$4(receiver, start, end, iterable, 0);
    },
    fillRange$3(receiver, start, end, fillValue) {
      var i;
      receiver.$flags & 2 && A.throwUnsupportedOperation(receiver, "fillRange");
      A.RangeError_checkValidRange(start, end, receiver.length);
      A._arrayInstanceType(receiver)._precomputed1._as(fillValue);
      for (i = start; i < end; ++i)
        receiver[i] = fillValue;
    },
    sort$1(receiver, compare) {
      var len, a, b, undefineds, i,
        t1 = A._arrayInstanceType(receiver);
      t1._eval$1("int(1,1)?")._as(compare);
      receiver.$flags & 2 && A.throwUnsupportedOperation(receiver, "sort");
      len = receiver.length;
      if (len < 2)
        return;
      if (compare == null)
        compare = J._interceptors_JSArray__compareAny$closure();
      if (len === 2) {
        a = receiver[0];
        b = receiver[1];
        t1 = compare.call$2(a, b);
        if (typeof t1 !== "number")
          return t1.$gt();
        if (t1 > 0) {
          receiver[0] = b;
          receiver[1] = a;
        }
        return;
      }
      undefineds = 0;
      if (t1._precomputed1._is(null))
        for (i = 0; i < receiver.length; ++i)
          if (receiver[i] === void 0) {
            receiver[i] = null;
            ++undefineds;
          }
      receiver.sort(A.convertDartClosureToJS(compare, 2));
      if (undefineds > 0)
        this._replaceSomeNullsWithUndefined$1(receiver, undefineds);
    },
    sort$0(receiver) {
      return this.sort$1(receiver, null);
    },
    _replaceSomeNullsWithUndefined$1(receiver, count) {
      var i0,
        i = receiver.length;
      for (; i0 = i - 1, i > 0; i = i0)
        if (receiver[i0] === null) {
          receiver[i0] = void 0;
          --count;
          if (count === 0)
            break;
        }
    },
    indexOf$2(receiver, element, start) {
      var i,
        $length = receiver.length;
      if (start >= $length)
        return -1;
      for (i = start; i < $length; ++i) {
        if (!(i < receiver.length))
          return A.ioore(receiver, i);
        if (J.$eq$(receiver[i], element))
          return i;
      }
      return -1;
    },
    indexOf$1(receiver, element) {
      return this.indexOf$2(receiver, element, 0);
    },
    contains$1(receiver, other) {
      var i;
      for (i = 0; i < receiver.length; ++i)
        if (J.$eq$(receiver[i], other))
          return true;
      return false;
    },
    get$isEmpty(receiver) {
      return receiver.length === 0;
    },
    get$isNotEmpty(receiver) {
      return receiver.length !== 0;
    },
    toString$0(receiver) {
      return A.Iterable_iterableToFullString(receiver, "[", "]");
    },
    toList$1$growable(receiver, growable) {
      var t1 = A._setArrayType(receiver.slice(0), A._arrayInstanceType(receiver));
      return t1;
    },
    toList$0(receiver) {
      return this.toList$1$growable(receiver, true);
    },
    get$iterator(receiver) {
      return new J.ArrayIterator(receiver, receiver.length, A._arrayInstanceType(receiver)._eval$1("ArrayIterator<1>"));
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    get$length(receiver) {
      return receiver.length;
    },
    set$length(receiver, newLength) {
      receiver.$flags & 1 && A.throwUnsupportedOperation(receiver, "set length", "change the length of");
      if (newLength < 0)
        throw A.wrapException(A.RangeError$range(newLength, 0, null, "newLength", null));
      if (newLength > receiver.length)
        A._arrayInstanceType(receiver)._precomputed1._as(null);
      receiver.length = newLength;
    },
    $index(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      receiver.$flags & 2 && A.throwUnsupportedOperation(receiver);
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      receiver[index] = value;
    },
    indexWhere$2(receiver, test, start) {
      var i;
      A._arrayInstanceType(receiver)._eval$1("bool(1)")._as(test);
      if (start >= receiver.length)
        return -1;
      for (i = start; i < receiver.length; ++i)
        if (test.call$1(receiver[i]))
          return i;
      return -1;
    },
    indexWhere$1(receiver, test) {
      return this.indexWhere$2(receiver, test, 0);
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(A._arrayInstanceType(receiver));
    },
    $isJSIndexable: 1,
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  J.JSArraySafeToStringHook.prototype = {
    tryFormat$1(array) {
      var flags, info, base;
      if (!Array.isArray(array))
        return null;
      flags = array.$flags | 0;
      if ((flags & 4) !== 0)
        info = "const, ";
      else if ((flags & 2) !== 0)
        info = "unmodifiable, ";
      else
        info = (flags & 1) !== 0 ? "fixed, " : "";
      base = "Instance of '" + A.Primitives_objectTypeName(array) + "'";
      if (info === "")
        return base;
      return base + " (" + info + "length: " + array.length + ")";
    }
  };
  J.JSUnmodifiableArray.prototype = {};
  J.ArrayIterator.prototype = {
    get$current() {
      var t1 = this._current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t2, _this = this,
        t1 = _this._iterable,
        $length = t1.length;
      if (_this._length !== $length) {
        t1 = A.throwConcurrentModificationError(t1);
        throw A.wrapException(t1);
      }
      t2 = _this._index;
      if (t2 >= $length) {
        _this._current = null;
        return false;
      }
      _this._current = t1[t2];
      _this._index = t2 + 1;
      return true;
    },
    $isIterator: 1
  };
  J.JSNumber.prototype = {
    compareTo$1(receiver, b) {
      var bIsNegative;
      A._asNum(b);
      if (receiver < b)
        return -1;
      else if (receiver > b)
        return 1;
      else if (receiver === b) {
        if (receiver === 0) {
          bIsNegative = this.get$isNegative(b);
          if (this.get$isNegative(receiver) === bIsNegative)
            return 0;
          if (this.get$isNegative(receiver))
            return -1;
          return 1;
        }
        return 0;
      } else if (isNaN(receiver)) {
        if (isNaN(b))
          return 0;
        return 1;
      } else
        return -1;
    },
    get$isNegative(receiver) {
      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
    },
    toInt$0(receiver) {
      var t1;
      if (receiver >= -2147483648 && receiver <= 2147483647)
        return receiver | 0;
      if (isFinite(receiver)) {
        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
        return t1 + 0;
      }
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".toInt()"));
    },
    ceil$0(receiver) {
      var truncated, d;
      if (receiver >= 0) {
        if (receiver <= 2147483647) {
          truncated = receiver | 0;
          return receiver === truncated ? truncated : truncated + 1;
        }
      } else if (receiver >= -2147483648)
        return receiver | 0;
      d = Math.ceil(receiver);
      if (isFinite(d))
        return d;
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".ceil()"));
    },
    floor$0(receiver) {
      var truncated, d;
      if (receiver >= 0) {
        if (receiver <= 2147483647)
          return receiver | 0;
      } else if (receiver >= -2147483648) {
        truncated = receiver | 0;
        return receiver === truncated ? truncated : truncated - 1;
      }
      d = Math.floor(receiver);
      if (isFinite(d))
        return d;
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".floor()"));
    },
    toRadixString$1(receiver, radix) {
      var result, t1, t2, match, exponent;
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", null));
      result = receiver.toString(radix);
      t1 = result.length;
      t2 = t1 - 1;
      if (!(t2 >= 0))
        return A.ioore(result, t2);
      if (result.charCodeAt(t2) !== 41)
        return result;
      match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null)
        A.throwExpression(A.UnsupportedError$("Unexpected toString result: " + result));
      t1 = match.length;
      if (1 >= t1)
        return A.ioore(match, 1);
      result = match[1];
      if (3 >= t1)
        return A.ioore(match, 3);
      exponent = +match[3];
      t1 = match[2];
      if (t1 != null) {
        result += t1;
        exponent -= t1.length;
      }
      return result + B.JSString_methods.$mul("0", exponent);
    },
    toString$0(receiver) {
      if (receiver === 0 && 1 / receiver < 0)
        return "-0.0";
      else
        return "" + receiver;
    },
    get$hashCode(receiver) {
      var absolute, floorLog2, factor, scaled,
        intValue = receiver | 0;
      if (receiver === intValue)
        return intValue & 536870911;
      absolute = Math.abs(receiver);
      floorLog2 = Math.log(absolute) / 0.6931471805599453 | 0;
      factor = Math.pow(2, floorLog2);
      scaled = absolute < 1 ? absolute / factor : factor / absolute;
      return ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259 & 536870911;
    },
    $add(receiver, other) {
      return receiver + other;
    },
    $mod(receiver, other) {
      var result = receiver % other;
      if (result === 0)
        return 0;
      if (result > 0)
        return result;
      return result + other;
    },
    $tdiv(receiver, other) {
      if ((receiver | 0) === receiver)
        if (other >= 1 || other < -1)
          return receiver / other | 0;
      return this._tdivSlow$1(receiver, other);
    },
    _tdivFast$1(receiver, other) {
      return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
    },
    _tdivSlow$1(receiver, other) {
      var quotient = receiver / other;
      if (quotient >= -2147483648 && quotient <= 2147483647)
        return quotient | 0;
      if (quotient > 0) {
        if (quotient !== 1 / 0)
          return Math.floor(quotient);
      } else if (quotient > -1 / 0)
        return Math.ceil(quotient);
      throw A.wrapException(A.UnsupportedError$("Result of truncating division is " + A.S(quotient) + ": " + A.S(receiver) + " ~/ " + other));
    },
    $shl(receiver, other) {
      if (other < 0)
        throw A.wrapException(A.argumentErrorValue(other));
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    $shr(receiver, other) {
      var t1;
      if (other < 0)
        throw A.wrapException(A.argumentErrorValue(other));
      if (receiver > 0)
        t1 = this._shrBothPositive$1(receiver, other);
      else {
        t1 = other > 31 ? 31 : other;
        t1 = receiver >> t1 >>> 0;
      }
      return t1;
    },
    _shrOtherPositive$1(receiver, other) {
      var t1;
      if (receiver > 0)
        t1 = this._shrBothPositive$1(receiver, other);
      else {
        t1 = other > 31 ? 31 : other;
        t1 = receiver >> t1 >>> 0;
      }
      return t1;
    },
    _shrReceiverPositive$1(receiver, other) {
      if (0 > other)
        throw A.wrapException(A.argumentErrorValue(other));
      return this._shrBothPositive$1(receiver, other);
    },
    _shrBothPositive$1(receiver, other) {
      return other > 31 ? 0 : receiver >>> other;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.num);
    },
    $isComparable: 1,
    $isdouble: 1,
    $isnum: 1
  };
  J.JSInt.prototype = {
    get$bitLength(receiver) {
      var wordBits,
        t1 = receiver < 0 ? -receiver - 1 : receiver,
        nonneg = t1;
      for (wordBits = 32; nonneg >= 4294967296;) {
        nonneg = this._tdivFast$1(nonneg, 4294967296);
        wordBits += 32;
      }
      return wordBits - Math.clz32(nonneg);
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.int);
    },
    $isTrustedGetRuntimeType: 1,
    $isint: 1
  };
  J.JSNumNotInt.prototype = {
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.double);
    },
    $isTrustedGetRuntimeType: 1
  };
  J.JSString.prototype = {
    allMatches$2(receiver, string, start) {
      var t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._StringAllMatchesIterable(string, receiver, start);
    },
    allMatches$1(receiver, string) {
      return this.allMatches$2(receiver, string, 0);
    },
    matchAsPrefix$2(receiver, string, start) {
      var t1, t2, i, t3, _null = null;
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, _null, _null));
      t1 = receiver.length;
      t2 = string.length;
      if (start + t1 > t2)
        return _null;
      for (i = 0; i < t1; ++i) {
        t3 = start + i;
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(string, t3);
        if (string.charCodeAt(t3) !== receiver.charCodeAt(i))
          return _null;
      }
      return new A.StringMatch(start, receiver);
    },
    endsWith$1(receiver, other) {
      var otherLength = other.length,
        t1 = receiver.length;
      if (otherLength > t1)
        return false;
      return other === this.substring$1(receiver, t1 - otherLength);
    },
    replaceFirst$2(receiver, from, to) {
      A.RangeError_checkValueInInterval(0, 0, receiver.length, "startIndex");
      return A.stringReplaceFirstUnchecked(receiver, from, to, 0);
    },
    replaceRange$3(receiver, start, end, replacement) {
      var e = A.RangeError_checkValidRange(start, end, receiver.length);
      return A.stringReplaceRangeUnchecked(receiver, start, e, replacement);
    },
    startsWith$2(receiver, pattern, index) {
      var endIndex;
      if (index < 0 || index > receiver.length)
        throw A.wrapException(A.RangeError$range(index, 0, receiver.length, null, null));
      if (typeof pattern == "string") {
        endIndex = index + pattern.length;
        if (endIndex > receiver.length)
          return false;
        return pattern === receiver.substring(index, endIndex);
      }
      return J.matchAsPrefix$2$s(pattern, receiver, index) != null;
    },
    startsWith$1(receiver, pattern) {
      return this.startsWith$2(receiver, pattern, 0);
    },
    substring$2(receiver, start, end) {
      return receiver.substring(start, A.RangeError_checkValidRange(start, end, receiver.length));
    },
    substring$1(receiver, start) {
      return this.substring$2(receiver, start, null);
    },
    $mul(receiver, times) {
      var s, result;
      if (0 >= times)
        return "";
      if (times === 1 || receiver.length === 0)
        return receiver;
      if (times !== times >>> 0)
        throw A.wrapException(B.C_OutOfMemoryError);
      for (s = receiver, result = "";;) {
        if ((times & 1) === 1)
          result = s + result;
        times = times >>> 1;
        if (times === 0)
          break;
        s += s;
      }
      return result;
    },
    padLeft$2(receiver, width, padding) {
      var delta = width - receiver.length;
      if (delta <= 0)
        return receiver;
      return this.$mul(padding, delta) + receiver;
    },
    padRight$1(receiver, width) {
      var delta = width - receiver.length;
      if (delta <= 0)
        return receiver;
      return receiver + this.$mul(" ", delta);
    },
    indexOf$2(receiver, pattern, start) {
      var t1;
      if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = receiver.indexOf(pattern, start);
      return t1;
    },
    indexOf$1(receiver, pattern) {
      return this.indexOf$2(receiver, pattern, 0);
    },
    lastIndexOf$2(receiver, pattern, start) {
      var t1, t2;
      if (start == null)
        start = receiver.length;
      else if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = pattern.length;
      t2 = receiver.length;
      if (start + t1 > t2)
        start = t2 - t1;
      return receiver.lastIndexOf(pattern, start);
    },
    lastIndexOf$1(receiver, pattern) {
      return this.lastIndexOf$2(receiver, pattern, null);
    },
    contains$1(receiver, other) {
      return A.stringContainsUnchecked(receiver, other, 0);
    },
    compareTo$1(receiver, other) {
      var t1;
      A._asString(other);
      if (receiver === other)
        t1 = 0;
      else
        t1 = receiver < other ? -1 : 1;
      return t1;
    },
    toString$0(receiver) {
      return receiver;
    },
    get$hashCode(receiver) {
      var t1, hash, i;
      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
        hash = hash + receiver.charCodeAt(i) & 536870911;
        hash = hash + ((hash & 524287) << 10) & 536870911;
        hash ^= hash >> 6;
      }
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.String);
    },
    get$length(receiver) {
      return receiver.length;
    },
    $isJSIndexable: 1,
    $isTrustedGetRuntimeType: 1,
    $isComparable: 1,
    $isPattern: 1,
    $isString: 1
  };
  A._CastIterableBase.prototype = {
    get$iterator(_) {
      return new A.CastIterator(J.get$iterator$ax(this.get$__internal$_source()), A._instanceType(this)._eval$1("CastIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.get$__internal$_source());
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.get$__internal$_source());
    },
    get$isNotEmpty(_) {
      return J.get$isNotEmpty$asx(this.get$__internal$_source());
    },
    skip$1(_, count) {
      var t1 = A._instanceType(this);
      return A.CastIterable_CastIterable(J.skip$1$ax(this.get$__internal$_source(), count), t1._precomputed1, t1._rest[1]);
    },
    take$1(_, count) {
      var t1 = A._instanceType(this);
      return A.CastIterable_CastIterable(J.take$1$ax(this.get$__internal$_source(), count), t1._precomputed1, t1._rest[1]);
    },
    elementAt$1(_, index) {
      return A._instanceType(this)._rest[1]._as(J.elementAt$1$ax(this.get$__internal$_source(), index));
    },
    get$first(_) {
      return A._instanceType(this)._rest[1]._as(J.get$first$ax(this.get$__internal$_source()));
    },
    contains$1(_, other) {
      return J.contains$1$asx(this.get$__internal$_source(), other);
    },
    toString$0(_) {
      return J.toString$0$(this.get$__internal$_source());
    }
  };
  A.CastIterator.prototype = {
    moveNext$0() {
      return this.__internal$_source.moveNext$0();
    },
    get$current() {
      return this.$ti._rest[1]._as(this.__internal$_source.get$current());
    },
    $isIterator: 1
  };
  A.CastIterable.prototype = {
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A._EfficientLengthCastIterable.prototype = {$isEfficientLengthIterable: 1};
  A._CastListBase.prototype = {
    $index(_, index) {
      return this.$ti._rest[1]._as(J.$index$asx(this.__internal$_source, index));
    },
    $indexSet(_, index, value) {
      var t1 = this.$ti;
      J.$indexSet$ax(this.__internal$_source, index, t1._precomputed1._as(t1._rest[1]._as(value)));
    },
    set$length(_, $length) {
      J.set$length$asx(this.__internal$_source, $length);
    },
    add$1(_, value) {
      var t1 = this.$ti;
      J.add$1$ax(this.__internal$_source, t1._precomputed1._as(t1._rest[1]._as(value)));
    },
    sort$1(_, compare) {
      var t1;
      this.$ti._eval$1("int(2,2)?")._as(compare);
      t1 = compare == null ? null : new A._CastListBase_sort_closure(this, compare);
      J.sort$1$ax(this.__internal$_source, t1);
    },
    getRange$2(_, start, end) {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(J.getRange$2$ax(this.__internal$_source, start, end), t1._precomputed1, t1._rest[1]);
    },
    fillRange$3(_, start, end, fillValue) {
      J.fillRange$3$ax(this.__internal$_source, start, end, this.$ti._precomputed1._as(fillValue));
    },
    $isEfficientLengthIterable: 1,
    $isList: 1
  };
  A._CastListBase_sort_closure.prototype = {
    call$2(v1, v2) {
      var t1 = this.$this.$ti,
        t2 = t1._precomputed1;
      t2._as(v1);
      t2._as(v2);
      t1 = t1._rest[1];
      return this.compare.call$2(t1._as(v1), t1._as(v2));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1,1)");
    }
  };
  A.CastList.prototype = {
    cast$1$0(_, $R) {
      return new A.CastList(this.__internal$_source, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A.CastMap.prototype = {
    cast$2$0(_, $RK, $RV) {
      return new A.CastMap(this.__internal$_source, this.$ti._eval$1("@<1,2>")._bind$1($RK)._bind$1($RV)._eval$1("CastMap<1,2,3,4>"));
    },
    containsKey$1(key) {
      return this.__internal$_source.containsKey$1(key);
    },
    $index(_, key) {
      return this.$ti._eval$1("4?")._as(this.__internal$_source.$index(0, key));
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      t1._rest[2]._as(key);
      t1._rest[3]._as(value);
      this.__internal$_source.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    forEach$1(_, f) {
      this.__internal$_source.forEach$1(0, new A.CastMap_forEach_closure(this, this.$ti._eval$1("~(3,4)")._as(f)));
    },
    get$keys() {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(this.__internal$_source.get$keys(), t1._precomputed1, t1._rest[2]);
    },
    get$length(_) {
      var t1 = this.__internal$_source;
      return t1.get$length(t1);
    },
    get$isEmpty(_) {
      var t1 = this.__internal$_source;
      return t1.get$isEmpty(t1);
    },
    get$isNotEmpty(_) {
      var t1 = this.__internal$_source;
      return t1.get$isNotEmpty(t1);
    }
  };
  A.CastMap_forEach_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      this.f.call$2(t1._rest[2]._as(key), t1._rest[3]._as(value));
    },
    $signature() {
      return this.$this.$ti._eval$1("~(1,2)");
    }
  };
  A.LateError.prototype = {
    toString$0(_) {
      return "LateInitializationError: " + this._message;
    }
  };
  A.CodeUnits.prototype = {
    get$length(_) {
      return this.__internal$_string.length;
    },
    $index(_, i) {
      var t1 = this.__internal$_string;
      if (!(i >= 0 && i < t1.length))
        return A.ioore(t1, i);
      return t1.charCodeAt(i);
    }
  };
  A.nullFuture_closure.prototype = {
    call$0() {
      return A.Future_Future$value(null, type$.void);
    },
    $signature: 19
  };
  A.SentinelValue.prototype = {};
  A.EfficientLengthIterable.prototype = {};
  A.ListIterable.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A.ListIterator(_this, _this.get$length(_this), A._instanceType(_this)._eval$1("ListIterator<ListIterable.E>"));
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$first(_) {
      if (this.get$length(this) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.elementAt$1(0, 0);
    },
    contains$1(_, element) {
      var i, _this = this,
        $length = _this.get$length(_this);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(_this.elementAt$1(0, i), element))
          return true;
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return false;
    },
    join$1(_, separator) {
      var first, t1, i, _this = this,
        $length = _this.get$length(_this);
      if (separator.length !== 0) {
        if ($length === 0)
          return "";
        first = A.S(_this.elementAt$1(0, 0));
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        for (t1 = first, i = 1; i < $length; ++i) {
          t1 = t1 + separator + A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      } else {
        for (i = 0, t1 = ""; i < $length; ++i) {
          t1 += A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      }
    },
    join$0(_) {
      return this.join$1(0, "");
    },
    map$1$1(_, toElement, $T) {
      var t1 = A._instanceType(this);
      return new A.MappedListIterable(this, t1._bind$1($T)._eval$1("1(ListIterable.E)")._as(toElement), t1._eval$1("@<ListIterable.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    },
    reduce$1(_, combine) {
      var $length, value, i, _this = this;
      A._instanceType(_this)._eval$1("ListIterable.E(ListIterable.E,ListIterable.E)")._as(combine);
      $length = _this.get$length(_this);
      if ($length === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      value = _this.elementAt$1(0, 0);
      for (i = 1; i < $length; ++i) {
        value = combine.call$2(value, _this.elementAt$1(0, i));
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return value;
    },
    skip$1(_, count) {
      return A.SubListIterable$(this, count, null, A._instanceType(this)._eval$1("ListIterable.E"));
    },
    take$1(_, count) {
      return A.SubListIterable$(this, 0, A.checkNotNullable(count, "count", type$.int), A._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$1$growable(_, growable) {
      var t1 = A.List_List$_of(this, A._instanceType(this)._eval$1("ListIterable.E"));
      return t1;
    },
    toList$0(_) {
      return this.toList$1$growable(0, true);
    }
  };
  A.SubListIterable.prototype = {
    SubListIterable$3(_iterable, _start, _endOrLength, $E) {
      var endOrLength,
        t1 = this._start;
      A.RangeError_checkNotNegative(t1, "start");
      endOrLength = this._endOrLength;
      if (endOrLength != null) {
        A.RangeError_checkNotNegative(endOrLength, "end");
        if (t1 > endOrLength)
          throw A.wrapException(A.RangeError$range(t1, 0, endOrLength, "start", null));
      }
    },
    get$_endIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength > $length)
        return $length;
      return endOrLength;
    },
    get$_startIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this._start;
      if (t1 > $length)
        return $length;
      return t1;
    },
    get$length(_) {
      var endOrLength,
        $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this._start;
      if (t1 >= $length)
        return 0;
      endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength >= $length)
        return $length - t1;
      return endOrLength - t1;
    },
    elementAt$1(_, index) {
      var _this = this,
        realIndex = _this.get$_startIndex() + index;
      if (index < 0 || realIndex >= _this.get$_endIndex())
        throw A.wrapException(A.IndexError$withLength(index, _this.get$length(0), _this, null, "index"));
      return J.elementAt$1$ax(_this.__internal$_iterable, realIndex);
    },
    skip$1(_, count) {
      var newStart, endOrLength, _this = this;
      A.RangeError_checkNotNegative(count, "count");
      newStart = _this._start + count;
      endOrLength = _this._endOrLength;
      if (endOrLength != null && newStart >= endOrLength)
        return new A.EmptyIterable(_this.$ti._eval$1("EmptyIterable<1>"));
      return A.SubListIterable$(_this.__internal$_iterable, newStart, endOrLength, _this.$ti._precomputed1);
    },
    take$1(_, count) {
      var endOrLength, t1, newEnd, _this = this;
      A.RangeError_checkNotNegative(count, "count");
      endOrLength = _this._endOrLength;
      t1 = _this._start;
      if (endOrLength == null)
        return A.SubListIterable$(_this.__internal$_iterable, t1, B.JSInt_methods.$add(t1, count), _this.$ti._precomputed1);
      else {
        newEnd = B.JSInt_methods.$add(t1, count);
        if (endOrLength < newEnd)
          return _this;
        return A.SubListIterable$(_this.__internal$_iterable, t1, newEnd, _this.$ti._precomputed1);
      }
    },
    toList$1$growable(_, growable) {
      var $length, result, i, _this = this,
        start = _this._start,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        end = t2.get$length(t1),
        endOrLength = _this._endOrLength;
      if (endOrLength != null && endOrLength < end)
        end = endOrLength;
      $length = end - start;
      if ($length <= 0) {
        t1 = J.JSArray_JSArray$fixed(0, _this.$ti._precomputed1);
        return t1;
      }
      result = A.List_List$filled($length, t2.elementAt$1(t1, start), false, _this.$ti._precomputed1);
      for (i = 1; i < $length; ++i) {
        B.JSArray_methods.$indexSet(result, i, t2.elementAt$1(t1, start + i));
        if (t2.get$length(t1) < end)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return result;
    }
  };
  A.ListIterator.prototype = {
    get$current() {
      var t1 = this.__internal$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t3, _this = this,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        $length = t2.get$length(t1);
      if (_this.__internal$_length !== $length)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      t3 = _this.__internal$_index;
      if (t3 >= $length) {
        _this.__internal$_current = null;
        return false;
      }
      _this.__internal$_current = t2.elementAt$1(t1, t3);
      ++_this.__internal$_index;
      return true;
    },
    $isIterator: 1
  };
  A.MappedIterable.prototype = {
    get$iterator(_) {
      return new A.MappedIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, A._instanceType(this)._eval$1("MappedIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.__internal$_iterable);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.__internal$_iterable);
    },
    get$first(_) {
      return this._f.call$1(J.get$first$ax(this.__internal$_iterable));
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_iterable, index));
    }
  };
  A.EfficientLengthMappedIterable.prototype = {$isEfficientLengthIterable: 1};
  A.MappedIterator.prototype = {
    moveNext$0() {
      var _this = this,
        t1 = _this._iterator;
      if (t1.moveNext$0()) {
        _this.__internal$_current = _this._f.call$1(t1.get$current());
        return true;
      }
      _this.__internal$_current = null;
      return false;
    },
    get$current() {
      var t1 = this.__internal$_current;
      return t1 == null ? this.$ti._rest[1]._as(t1) : t1;
    },
    $isIterator: 1
  };
  A.MappedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_source, index));
    }
  };
  A.WhereIterable.prototype = {
    get$iterator(_) {
      return new A.WhereIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, this.$ti._eval$1("WhereIterator<1>"));
    },
    map$1$1(_, toElement, $T) {
      var t1 = this.$ti;
      return new A.MappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(toElement), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    }
  };
  A.WhereIterator.prototype = {
    moveNext$0() {
      var t1, t2;
      for (t1 = this._iterator, t2 = this._f; t1.moveNext$0();)
        if (t2.call$1(t1.get$current()))
          return true;
      return false;
    },
    get$current() {
      return this._iterator.get$current();
    },
    $isIterator: 1
  };
  A.ExpandIterable.prototype = {
    get$iterator(_) {
      return new A.ExpandIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, B.C_EmptyIterator, this.$ti._eval$1("ExpandIterator<1,2>"));
    }
  };
  A.ExpandIterator.prototype = {
    get$current() {
      var t1 = this.__internal$_current;
      return t1 == null ? this.$ti._rest[1]._as(t1) : t1;
    },
    moveNext$0() {
      var t2, t3, _this = this,
        t1 = _this._currentExpansion;
      if (t1 == null)
        return false;
      for (t2 = _this._iterator, t3 = _this._f; !t1.moveNext$0();) {
        _this.__internal$_current = null;
        if (t2.moveNext$0()) {
          _this._currentExpansion = null;
          t1 = J.get$iterator$ax(t3.call$1(t2.get$current()));
          _this._currentExpansion = t1;
        } else
          return false;
      }
      _this.__internal$_current = _this._currentExpansion.get$current();
      return true;
    },
    $isIterator: 1
  };
  A.TakeIterable.prototype = {
    get$iterator(_) {
      return new A.TakeIterator(J.get$iterator$ax(this.__internal$_iterable), this._takeCount, A._instanceType(this)._eval$1("TakeIterator<1>"));
    }
  };
  A.EfficientLengthTakeIterable.prototype = {
    get$length(_) {
      var iterableLength = J.get$length$asx(this.__internal$_iterable),
        t1 = this._takeCount;
      if (iterableLength > t1)
        return t1;
      return iterableLength;
    },
    $isEfficientLengthIterable: 1
  };
  A.TakeIterator.prototype = {
    moveNext$0() {
      if (--this._remaining >= 0)
        return this._iterator.moveNext$0();
      this._remaining = -1;
      return false;
    },
    get$current() {
      if (this._remaining < 0) {
        this.$ti._precomputed1._as(null);
        return null;
      }
      return this._iterator.get$current();
    },
    $isIterator: 1
  };
  A.SkipIterable.prototype = {
    skip$1(_, count) {
      A.ArgumentError_checkNotNull(count, "count", type$.int);
      A.RangeError_checkNotNegative(count, "count");
      return new A.SkipIterable(this.__internal$_iterable, this._skipCount + count, A._instanceType(this)._eval$1("SkipIterable<1>"));
    },
    get$iterator(_) {
      return new A.SkipIterator(J.get$iterator$ax(this.__internal$_iterable), this._skipCount, A._instanceType(this)._eval$1("SkipIterator<1>"));
    }
  };
  A.EfficientLengthSkipIterable.prototype = {
    get$length(_) {
      var $length = J.get$length$asx(this.__internal$_iterable) - this._skipCount;
      if ($length >= 0)
        return $length;
      return 0;
    },
    skip$1(_, count) {
      A.ArgumentError_checkNotNull(count, "count", type$.int);
      A.RangeError_checkNotNegative(count, "count");
      return new A.EfficientLengthSkipIterable(this.__internal$_iterable, this._skipCount + count, this.$ti);
    },
    $isEfficientLengthIterable: 1
  };
  A.SkipIterator.prototype = {
    moveNext$0() {
      var t1, i;
      for (t1 = this._iterator, i = 0; i < this._skipCount; ++i)
        t1.moveNext$0();
      this._skipCount = 0;
      return t1.moveNext$0();
    },
    get$current() {
      return this._iterator.get$current();
    },
    $isIterator: 1
  };
  A.EmptyIterable.prototype = {
    get$iterator(_) {
      return B.C_EmptyIterator;
    },
    get$isEmpty(_) {
      return true;
    },
    get$length(_) {
      return 0;
    },
    get$first(_) {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    elementAt$1(_, index) {
      throw A.wrapException(A.RangeError$range(index, 0, 0, "index", null));
    },
    contains$1(_, element) {
      return false;
    },
    map$1$1(_, toElement, $T) {
      this.$ti._bind$1($T)._eval$1("1(2)")._as(toElement);
      return new A.EmptyIterable($T._eval$1("EmptyIterable<0>"));
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    },
    skip$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return this;
    },
    take$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return this;
    },
    toList$1$growable(_, growable) {
      var t1 = this.$ti._precomputed1;
      return growable ? J.JSArray_JSArray$growable(0, t1) : J.JSArray_JSArray$fixed(0, t1);
    },
    toList$0(_) {
      return this.toList$1$growable(0, true);
    }
  };
  A.EmptyIterator.prototype = {
    moveNext$0() {
      return false;
    },
    get$current() {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    $isIterator: 1
  };
  A.WhereTypeIterable.prototype = {
    get$iterator(_) {
      return new A.WhereTypeIterator(J.get$iterator$ax(this.__internal$_source), this.$ti._eval$1("WhereTypeIterator<1>"));
    }
  };
  A.WhereTypeIterator.prototype = {
    moveNext$0() {
      var t1, t2;
      for (t1 = this.__internal$_source, t2 = this.$ti._precomputed1; t1.moveNext$0();)
        if (t2._is(t1.get$current()))
          return true;
      return false;
    },
    get$current() {
      return this.$ti._precomputed1._as(this.__internal$_source.get$current());
    },
    $isIterator: 1
  };
  A.FixedLengthListMixin.prototype = {
    set$length(receiver, newLength) {
      throw A.wrapException(A.UnsupportedError$("Cannot change the length of a fixed-length list"));
    },
    add$1(receiver, value) {
      A.instanceType(receiver)._eval$1("FixedLengthListMixin.E")._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot add to a fixed-length list"));
    }
  };
  A.UnmodifiableListMixin.prototype = {
    $indexSet(_, index, value) {
      A._instanceType(this)._eval$1("UnmodifiableListMixin.E")._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    },
    set$length(_, newLength) {
      throw A.wrapException(A.UnsupportedError$("Cannot change the length of an unmodifiable list"));
    },
    add$1(_, value) {
      A._instanceType(this)._eval$1("UnmodifiableListMixin.E")._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot add to an unmodifiable list"));
    },
    sort$1(_, compare) {
      A._instanceType(this)._eval$1("int(UnmodifiableListMixin.E,UnmodifiableListMixin.E)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    },
    fillRange$3(_, start, end, fillValue) {
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    }
  };
  A.UnmodifiableListBase.prototype = {};
  A.ReversedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      var t1 = this.__internal$_source,
        t2 = J.getInterceptor$asx(t1);
      return t2.elementAt$1(t1, t2.get$length(t1) - 1 - index);
    }
  };
  A.__CastListBase__CastIterableBase_ListMixin.prototype = {};
  A._Record_2.prototype = {$recipe: "+(1,2)", $shape: 1};
  A.ConstantMap.prototype = {
    cast$2$0(_, $RK, $RV) {
      var t1 = A._instanceType(this);
      return A.Map_castFrom(this, t1._precomputed1, t1._rest[1], $RK, $RV);
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$isNotEmpty(_) {
      return this.get$length(this) !== 0;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      A.ConstantMap__throwUnmodifiable();
    },
    map$2$1(_, transform, $K2, $V2) {
      var result = A.LinkedHashMap_LinkedHashMap$_empty($K2, $V2);
      this.forEach$1(0, new A.ConstantMap_map_closure(this, A._instanceType(this)._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result));
      return result;
    },
    map$1(_, transform) {
      var t1 = type$.dynamic;
      return this.map$2$1(0, transform, t1, t1);
    },
    $isMap: 1
  };
  A.ConstantMap_map_closure.prototype = {
    call$2(key, value) {
      var t1 = A._instanceType(this.$this),
        entry = this.transform.call$2(t1._precomputed1._as(key), t1._rest[1]._as(value));
      this.result.$indexSet(0, entry.key, entry.value);
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.ConstantStringMap.prototype = {
    get$length(_) {
      return this._values.length;
    },
    get$__js_helper$_keys() {
      var keys = this.$keys;
      if (keys == null) {
        keys = Object.keys(this._jsIndex);
        this.$keys = keys;
      }
      return keys;
    },
    containsKey$1(key) {
      if (typeof key != "string")
        return false;
      if ("__proto__" === key)
        return false;
      return this._jsIndex.hasOwnProperty(key);
    },
    $index(_, key) {
      if (!this.containsKey$1(key))
        return null;
      return this._values[this._jsIndex[key]];
    },
    forEach$1(_, f) {
      var keys, values, t1, i;
      this.$ti._eval$1("~(1,2)")._as(f);
      keys = this.get$__js_helper$_keys();
      values = this._values;
      for (t1 = keys.length, i = 0; i < t1; ++i)
        f.call$2(keys[i], values[i]);
    },
    get$keys() {
      return new A._KeysOrValues(this.get$__js_helper$_keys(), this.$ti._eval$1("_KeysOrValues<1>"));
    }
  };
  A._KeysOrValues.prototype = {
    get$length(_) {
      return this._elements.length;
    },
    get$isEmpty(_) {
      return 0 === this._elements.length;
    },
    get$isNotEmpty(_) {
      return 0 !== this._elements.length;
    },
    get$iterator(_) {
      var t1 = this._elements;
      return new A._KeysOrValuesOrElementsIterator(t1, t1.length, this.$ti._eval$1("_KeysOrValuesOrElementsIterator<1>"));
    }
  };
  A._KeysOrValuesOrElementsIterator.prototype = {
    get$current() {
      var t1 = this.__js_helper$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        t1 = _this.__js_helper$_index;
      if (t1 >= _this.__js_helper$_length) {
        _this.__js_helper$_current = null;
        return false;
      }
      _this.__js_helper$_current = _this._elements[t1];
      _this.__js_helper$_index = t1 + 1;
      return true;
    },
    $isIterator: 1
  };
  A.Instantiation.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Instantiation1 && this._genericClosure.$eq(0, other._genericClosure) && A.getRuntimeTypeOfClosure(this) === A.getRuntimeTypeOfClosure(other);
    },
    get$hashCode(_) {
      return A.Object_hash(this._genericClosure, A.getRuntimeTypeOfClosure(this), B.C_SentinelValue, B.C_SentinelValue);
    },
    toString$0(_) {
      var t1 = B.JSArray_methods.join$1([A.createRuntimeType(this.$ti._precomputed1)], ", ");
      return this._genericClosure.toString$0(0) + " with " + ("<" + t1 + ">");
    }
  };
  A.Instantiation1.prototype = {
    call$2(a0, a1) {
      return this._genericClosure.call$1$2(a0, a1, this.$ti._rest[0]);
    },
    call$4(a0, a1, a2, a3) {
      return this._genericClosure.call$1$4(a0, a1, a2, a3, this.$ti._rest[0]);
    },
    $signature() {
      return A.instantiatedGenericFunctionType(A.closureFunctionType(this._genericClosure), this.$ti);
    }
  };
  A.SafeToStringHook.prototype = {};
  A.TypeErrorDecoder.prototype = {
    matchTypeError$1(message) {
      var result, t1, _this = this,
        match = new RegExp(_this._pattern).exec(message);
      if (match == null)
        return null;
      result = Object.create(null);
      t1 = _this._arguments;
      if (t1 !== -1)
        result.arguments = match[t1 + 1];
      t1 = _this._argumentsExpr;
      if (t1 !== -1)
        result.argumentsExpr = match[t1 + 1];
      t1 = _this._expr;
      if (t1 !== -1)
        result.expr = match[t1 + 1];
      t1 = _this._method;
      if (t1 !== -1)
        result.method = match[t1 + 1];
      t1 = _this._receiver;
      if (t1 !== -1)
        result.receiver = match[t1 + 1];
      return result;
    }
  };
  A.NullError.prototype = {
    toString$0(_) {
      return "Null check operator used on a null value";
    }
  };
  A.JsNoSuchMethodError.prototype = {
    toString$0(_) {
      var t2, _this = this,
        _s38_ = "NoSuchMethodError: method not found: '",
        t1 = _this._method;
      if (t1 == null)
        return "NoSuchMethodError: " + _this.__js_helper$_message;
      t2 = _this._receiver;
      if (t2 == null)
        return _s38_ + t1 + "' (" + _this.__js_helper$_message + ")";
      return _s38_ + t1 + "' on '" + t2 + "' (" + _this.__js_helper$_message + ")";
    }
  };
  A.UnknownJsTypeError.prototype = {
    toString$0(_) {
      var t1 = this.__js_helper$_message;
      return t1.length === 0 ? "Error" : "Error: " + t1;
    }
  };
  A.NullThrownFromJavaScriptException.prototype = {
    toString$0(_) {
      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
    },
    $isException: 1
  };
  A.ExceptionAndStackTrace.prototype = {};
  A._StackTrace.prototype = {
    toString$0(_) {
      var trace,
        t1 = this._trace;
      if (t1 != null)
        return t1;
      t1 = this._exception;
      trace = t1 !== null && typeof t1 === "object" ? t1.stack : null;
      return this._trace = trace == null ? "" : trace;
    },
    $isStackTrace: 1
  };
  A.Closure.prototype = {
    toString$0(_) {
      var $constructor = this.constructor,
        $name = $constructor == null ? null : $constructor.name;
      return "Closure '" + A.unminifyOrTag($name == null ? "unknown" : $name) + "'";
    },
    get$runtimeType(_) {
      var rti = A.closureFunctionType(this);
      return A.createRuntimeType(rti == null ? A.instanceType(this) : rti);
    },
    $isFunction: 1,
    get$$call() {
      return this;
    },
    "call*": "call$1",
    $requiredArgCount: 1,
    $defaultValues: null
  };
  A.Closure0Args.prototype = {"call*": "call$0", $requiredArgCount: 0};
  A.Closure2Args.prototype = {"call*": "call$2", $requiredArgCount: 2};
  A.TearOffClosure.prototype = {};
  A.StaticClosure.prototype = {
    toString$0(_) {
      var $name = this.$static_name;
      if ($name == null)
        return "Closure of unknown static method";
      return "Closure '" + A.unminifyOrTag($name) + "'";
    }
  };
  A.BoundClosure.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      if (!(other instanceof A.BoundClosure))
        return false;
      return this.$_target === other.$_target && this._receiver === other._receiver;
    },
    get$hashCode(_) {
      return (A.objectHashCode(this._receiver) ^ A.Primitives_objectHashCode(this.$_target)) >>> 0;
    },
    toString$0(_) {
      return "Closure '" + this.$_name + "' of " + ("Instance of '" + A.Primitives_objectTypeName(this._receiver) + "'");
    }
  };
  A.RuntimeError.prototype = {
    toString$0(_) {
      return "RuntimeError: " + this.message;
    }
  };
  A.JsLinkedHashMap.prototype = {
    get$length(_) {
      return this.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this.__js_helper$_length === 0;
    },
    get$isNotEmpty(_) {
      return this.__js_helper$_length !== 0;
    },
    get$keys() {
      return new A.LinkedHashMapKeysIterable(this, A._instanceType(this)._eval$1("LinkedHashMapKeysIterable<1>"));
    },
    containsKey$1(key) {
      var strings, nums;
      if (typeof key == "string") {
        strings = this.__js_helper$_strings;
        if (strings == null)
          return false;
        return strings[key] != null;
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = this.__js_helper$_nums;
        if (nums == null)
          return false;
        return nums[key] != null;
      } else
        return this.internalContainsKey$1(key);
    },
    internalContainsKey$1(key) {
      var rest = this.__js_helper$_rest;
      if (rest == null)
        return false;
      return this.internalFindBucketIndex$2(rest[this.internalComputeHashCode$1(key)], key) >= 0;
    },
    addAll$1(_, other) {
      A._instanceType(this)._eval$1("Map<1,2>")._as(other).forEach$1(0, new A.JsLinkedHashMap_addAll_closure(this));
    },
    $index(_, key) {
      var strings, cell, t1, nums, _null = null;
      if (typeof key == "string") {
        strings = this.__js_helper$_strings;
        if (strings == null)
          return _null;
        cell = strings[key];
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = this.__js_helper$_nums;
        if (nums == null)
          return _null;
        cell = nums[key];
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else
        return this.internalGet$1(key);
    },
    internalGet$1(key) {
      var bucket, index,
        rest = this.__js_helper$_rest;
      if (rest == null)
        return null;
      bucket = rest[this.internalComputeHashCode$1(key)];
      index = this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      return bucket[index].hashMapCellValue;
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string") {
        strings = _this.__js_helper$_strings;
        _this._addHashTableEntry$3(strings == null ? _this.__js_helper$_strings = _this._newHashTable$0() : strings, key, value);
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = _this.__js_helper$_nums;
        _this._addHashTableEntry$3(nums == null ? _this.__js_helper$_nums = _this._newHashTable$0() : nums, key, value);
      } else
        _this.internalSet$2(key, value);
    },
    internalSet$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this.__js_helper$_rest;
      if (rest == null)
        rest = _this.__js_helper$_rest = _this._newHashTable$0();
      hash = _this.internalComputeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [_this._newLinkedCell$2(key, value)];
      else {
        index = _this.internalFindBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index].hashMapCellValue = value;
        else
          bucket.push(_this._newLinkedCell$2(key, value));
      }
    },
    putIfAbsent$2(key, ifAbsent) {
      var t2, value, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._eval$1("2()")._as(ifAbsent);
      if (_this.containsKey$1(key)) {
        t2 = _this.$index(0, key);
        return t2 == null ? t1._rest[1]._as(t2) : t2;
      }
      value = ifAbsent.call$0();
      _this.$indexSet(0, key, value);
      return value;
    },
    remove$1(_, key) {
      var _this = this;
      if (typeof key == "string")
        return _this._removeHashTableEntry$2(_this.__js_helper$_strings, key);
      else if (typeof key == "number" && (key & 0x3fffffff) === key)
        return _this._removeHashTableEntry$2(_this.__js_helper$_nums, key);
      else
        return _this.internalRemove$1(key);
    },
    internalRemove$1(key) {
      var hash, bucket, index, cell, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      hash = _this.internalComputeHashCode$1(key);
      bucket = rest[hash];
      index = _this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      cell = bucket.splice(index, 1)[0];
      _this._unlinkCell$1(cell);
      if (bucket.length === 0)
        delete rest[hash];
      return cell.hashMapCellValue;
    },
    forEach$1(_, action) {
      var cell, modifications, _this = this;
      A._instanceType(_this)._eval$1("~(1,2)")._as(action);
      cell = _this._first;
      modifications = _this._modifications;
      while (cell != null) {
        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
        if (modifications !== _this._modifications)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        cell = cell._next;
      }
    },
    _addHashTableEntry$3(table, key, value) {
      var cell,
        t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      cell = table[key];
      if (cell == null)
        table[key] = this._newLinkedCell$2(key, value);
      else
        cell.hashMapCellValue = value;
    },
    _removeHashTableEntry$2(table, key) {
      var cell;
      if (table == null)
        return null;
      cell = table[key];
      if (cell == null)
        return null;
      this._unlinkCell$1(cell);
      delete table[key];
      return cell.hashMapCellValue;
    },
    _modified$0() {
      this._modifications = this._modifications + 1 & 1073741823;
    },
    _newLinkedCell$2(key, value) {
      var _this = this,
        t1 = A._instanceType(_this),
        cell = new A.LinkedHashMapCell(t1._precomputed1._as(key), t1._rest[1]._as(value));
      if (_this._first == null)
        _this._first = _this._last = cell;
      else {
        t1 = _this._last;
        t1.toString;
        cell._previous = t1;
        _this._last = t1._next = cell;
      }
      ++_this.__js_helper$_length;
      _this._modified$0();
      return cell;
    },
    _unlinkCell$1(cell) {
      var _this = this,
        previous = cell._previous,
        next = cell._next;
      if (previous == null)
        _this._first = next;
      else
        previous._next = next;
      if (next == null)
        _this._last = previous;
      else
        next._previous = previous;
      --_this.__js_helper$_length;
      _this._modified$0();
    },
    internalComputeHashCode$1(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i].hashMapCellKey, key))
          return i;
      return -1;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    _newHashTable$0() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    $isLinkedHashMap: 1
  };
  A.JsLinkedHashMap_addAll_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this,
        t2 = A._instanceType(t1);
      t1.$indexSet(0, t2._precomputed1._as(key), t2._rest[1]._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.LinkedHashMapCell.prototype = {};
  A.LinkedHashMapKeysIterable.prototype = {
    get$length(_) {
      return this.__js_helper$_map.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this.__js_helper$_map.__js_helper$_length === 0;
    },
    get$iterator(_) {
      var t1 = this.__js_helper$_map;
      return new A.LinkedHashMapKeyIterator(t1, t1._modifications, t1._first, this.$ti._eval$1("LinkedHashMapKeyIterator<1>"));
    },
    contains$1(_, element) {
      return this.__js_helper$_map.containsKey$1(element);
    }
  };
  A.LinkedHashMapKeyIterator.prototype = {
    get$current() {
      return this.__js_helper$_current;
    },
    moveNext$0() {
      var cell, _this = this,
        t1 = _this.__js_helper$_map;
      if (_this._modifications !== t1._modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      cell = _this._cell;
      if (cell == null) {
        _this.__js_helper$_current = null;
        return false;
      } else {
        _this.__js_helper$_current = cell.hashMapCellKey;
        _this._cell = cell._next;
        return true;
      }
    },
    $isIterator: 1
  };
  A.LinkedHashMapValuesIterable.prototype = {
    get$length(_) {
      return this.__js_helper$_map.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this.__js_helper$_map.__js_helper$_length === 0;
    },
    get$iterator(_) {
      var t1 = this.__js_helper$_map;
      return new A.LinkedHashMapValueIterator(t1, t1._modifications, t1._first, this.$ti._eval$1("LinkedHashMapValueIterator<1>"));
    }
  };
  A.LinkedHashMapValueIterator.prototype = {
    get$current() {
      return this.__js_helper$_current;
    },
    moveNext$0() {
      var cell, _this = this,
        t1 = _this.__js_helper$_map;
      if (_this._modifications !== t1._modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      cell = _this._cell;
      if (cell == null) {
        _this.__js_helper$_current = null;
        return false;
      } else {
        _this.__js_helper$_current = cell.hashMapCellValue;
        _this._cell = cell._next;
        return true;
      }
    },
    $isIterator: 1
  };
  A.LinkedHashMapEntriesIterable.prototype = {
    get$length(_) {
      return this.__js_helper$_map.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this.__js_helper$_map.__js_helper$_length === 0;
    },
    get$iterator(_) {
      var t1 = this.__js_helper$_map;
      return new A.LinkedHashMapEntryIterator(t1, t1._modifications, t1._first, this.$ti._eval$1("LinkedHashMapEntryIterator<1,2>"));
    }
  };
  A.LinkedHashMapEntryIterator.prototype = {
    get$current() {
      var t1 = this.__js_helper$_current;
      t1.toString;
      return t1;
    },
    moveNext$0() {
      var cell, _this = this,
        t1 = _this.__js_helper$_map;
      if (_this._modifications !== t1._modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      cell = _this._cell;
      if (cell == null) {
        _this.__js_helper$_current = null;
        return false;
      } else {
        _this.__js_helper$_current = new A.MapEntry(cell.hashMapCellKey, cell.hashMapCellValue, _this.$ti._eval$1("MapEntry<1,2>"));
        _this._cell = cell._next;
        return true;
      }
    },
    $isIterator: 1
  };
  A.JsIdentityLinkedHashMap.prototype = {
    internalComputeHashCode$1(key) {
      return A.objectHashCode(key) & 1073741823;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, i, t1;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i) {
        t1 = bucket[i].hashMapCellKey;
        if (t1 == null ? key == null : t1 === key)
          return i;
      }
      return -1;
    }
  };
  A.initHooks_closure.prototype = {
    call$1(o) {
      return this.getTag(o);
    },
    $signature: 5
  };
  A.initHooks_closure0.prototype = {
    call$2(o, tag) {
      return this.getUnknownTag(o, tag);
    },
    $signature: 93
  };
  A.initHooks_closure1.prototype = {
    call$1(tag) {
      return this.prototypeForTag(A._asString(tag));
    },
    $signature: 86
  };
  A._Record.prototype = {
    get$runtimeType(_) {
      return A.createRuntimeType(this._getRti$0());
    },
    _getRti$0() {
      return A.evaluateRtiForRecord(this.$recipe, this._getFieldValues$0());
    },
    toString$0(_) {
      return this._toString$1(false);
    },
    _toString$1(safe) {
      var t2, separator, i, key, value,
        keys = this._fieldKeys$0(),
        values = this._getFieldValues$0(),
        t1 = (safe ? "Record " : "") + "(";
      for (t2 = keys.length, separator = "", i = 0; i < t2; ++i, separator = ", ") {
        t1 += separator;
        key = keys[i];
        if (typeof key == "string")
          t1 = t1 + key + ": ";
        if (!(i < values.length))
          return A.ioore(values, i);
        value = values[i];
        t1 = safe ? t1 + A.Primitives_safeToString(value) : t1 + A.S(value);
      }
      t1 += ")";
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _fieldKeys$0() {
      var t1,
        shapeTag = this.$shape;
      while ($._Record__computedFieldKeys.length <= shapeTag)
        B.JSArray_methods.add$1($._Record__computedFieldKeys, null);
      t1 = $._Record__computedFieldKeys[shapeTag];
      if (t1 == null) {
        t1 = this._computeFieldKeys$0();
        B.JSArray_methods.$indexSet($._Record__computedFieldKeys, shapeTag, t1);
      }
      return t1;
    },
    _computeFieldKeys$0() {
      var i, names, last,
        recipe = this.$recipe,
        position = recipe.indexOf("("),
        joinedNames = recipe.substring(1, position),
        fields = recipe.substring(position),
        arity = fields === "()" ? 0 : fields.replace(/[^,]/g, "").length + 1,
        t1 = type$.Object,
        result = J.JSArray_JSArray$allocateGrowable(arity, t1);
      for (i = 0; i < arity; ++i)
        result[i] = i;
      if (joinedNames !== "") {
        names = joinedNames.split(",");
        i = names.length;
        for (last = arity; i > 0;) {
          --last;
          --i;
          B.JSArray_methods.$indexSet(result, last, names[i]);
        }
      }
      return A.List_List$unmodifiable(result, t1);
    }
  };
  A._Record2.prototype = {
    _getFieldValues$0() {
      return [this._0, this._1];
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A._Record2 && this.$shape === other.$shape && J.$eq$(this._0, other._0) && J.$eq$(this._1, other._1);
    },
    get$hashCode(_) {
      return A.Object_hash(this.$shape, this._0, this._1, B.C_SentinelValue);
    }
  };
  A.JSSyntaxRegExp.prototype = {
    toString$0(_) {
      return "RegExp/" + this.pattern + "/" + this._nativeRegExp.flags;
    },
    get$_nativeGlobalVersion() {
      var _this = this,
        t1 = _this._nativeGlobalRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeGlobalRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern, t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, "g");
    },
    get$_nativeAnchoredVersion() {
      var _this = this,
        t1 = _this._nativeAnchoredRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeAnchoredRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern, t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, "y");
    },
    firstMatch$1(string) {
      var m = this._nativeRegExp.exec(string);
      if (m == null)
        return null;
      return new A._MatchImplementation(m);
    },
    allMatches$2(_, string, start) {
      var t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._AllMatchesIterable(this, string, start);
    },
    allMatches$1(_, string) {
      return this.allMatches$2(0, string, 0);
    },
    _execGlobal$2(string, start) {
      var match,
        regexp = this.get$_nativeGlobalVersion();
      if (regexp == null)
        regexp = A._asObject(regexp);
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      return new A._MatchImplementation(match);
    },
    _execAnchored$2(string, start) {
      var match,
        regexp = this.get$_nativeAnchoredVersion();
      if (regexp == null)
        regexp = A._asObject(regexp);
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      return new A._MatchImplementation(match);
    },
    matchAsPrefix$2(_, string, start) {
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, null, null));
      return this._execAnchored$2(string, start);
    },
    $isPattern: 1,
    $isRegExp: 1
  };
  A._MatchImplementation.prototype = {
    get$start() {
      return this._match.index;
    },
    get$end() {
      var t1 = this._match;
      return t1.index + t1[0].length;
    },
    $index(_, index) {
      var t1 = this._match;
      if (!(index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    },
    $isMatch: 1,
    $isRegExpMatch: 1
  };
  A._AllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._AllMatchesIterator(this._re, this._string, this.__js_helper$_start);
    }
  };
  A._AllMatchesIterator.prototype = {
    get$current() {
      var t1 = this.__js_helper$_current;
      return t1 == null ? type$.RegExpMatch._as(t1) : t1;
    },
    moveNext$0() {
      var t1, t2, t3, match, nextIndex, t4, _this = this,
        string = _this._string;
      if (string == null)
        return false;
      t1 = _this._nextIndex;
      t2 = string.length;
      if (t1 <= t2) {
        t3 = _this._regExp;
        match = t3._execGlobal$2(string, t1);
        if (match != null) {
          _this.__js_helper$_current = match;
          nextIndex = match.get$end();
          if (match._match.index === nextIndex) {
            t1 = false;
            if (t3._nativeRegExp.unicode) {
              t3 = _this._nextIndex;
              t4 = t3 + 1;
              if (t4 < t2) {
                if (!(t3 >= 0 && t3 < t2))
                  return A.ioore(string, t3);
                t3 = string.charCodeAt(t3);
                if (t3 >= 55296 && t3 <= 56319) {
                  if (!(t4 >= 0))
                    return A.ioore(string, t4);
                  t1 = string.charCodeAt(t4);
                  t1 = t1 >= 56320 && t1 <= 57343;
                }
              }
            }
            nextIndex = (t1 ? nextIndex + 1 : nextIndex) + 1;
          }
          _this._nextIndex = nextIndex;
          return true;
        }
      }
      _this._string = _this.__js_helper$_current = null;
      return false;
    },
    $isIterator: 1
  };
  A.StringMatch.prototype = {
    get$end() {
      return this.start + this.pattern.length;
    },
    $index(_, g) {
      if (g !== 0)
        A.throwExpression(A.RangeError$value(g, null));
      return this.pattern;
    },
    $isMatch: 1,
    get$start() {
      return this.start;
    }
  };
  A._StringAllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._StringAllMatchesIterator(this._input, this._pattern, this.__js_helper$_index);
    },
    get$first(_) {
      var t1 = this._pattern,
        index = this._input.indexOf(t1, this.__js_helper$_index);
      if (index >= 0)
        return new A.StringMatch(index, t1);
      throw A.wrapException(A.IterableElementError_noElement());
    }
  };
  A._StringAllMatchesIterator.prototype = {
    moveNext$0() {
      var index, end, _this = this,
        t1 = _this.__js_helper$_index,
        t2 = _this._pattern,
        t3 = t2.length,
        t4 = _this._input,
        t5 = t4.length;
      if (t1 + t3 > t5) {
        _this.__js_helper$_current = null;
        return false;
      }
      index = t4.indexOf(t2, t1);
      if (index < 0) {
        _this.__js_helper$_index = t5 + 1;
        _this.__js_helper$_current = null;
        return false;
      }
      end = index + t3;
      _this.__js_helper$_current = new A.StringMatch(index, t2);
      _this.__js_helper$_index = end === _this.__js_helper$_index ? end + 1 : end;
      return true;
    },
    get$current() {
      var t1 = this.__js_helper$_current;
      t1.toString;
      return t1;
    },
    $isIterator: 1
  };
  A._Cell.prototype = {
    readLocal$1$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        A.throwExpression(new A.LateError("Local '" + this._name + "' has not been initialized."));
      return t1;
    },
    readLocal$0() {
      return this.readLocal$1$0(type$.dynamic);
    },
    _readLocal$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        throw A.wrapException(new A.LateError("Local '" + this._name + "' has not been initialized."));
      return t1;
    },
    _readField$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        throw A.wrapException(A.LateError$fieldNI(this._name));
      return t1;
    }
  };
  A.NativeByteBuffer.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteBuffer_rqD;
    },
    asUint8List$2(receiver, offsetInBytes, $length) {
      return $length == null ? new Uint8Array(receiver, offsetInBytes) : new Uint8Array(receiver, offsetInBytes, $length);
    },
    $isTrustedGetRuntimeType: 1,
    $isNativeByteBuffer: 1,
    $isByteBuffer: 1
  };
  A.NativeArrayBuffer.prototype = {$isNativeArrayBuffer: 1};
  A.NativeTypedData.prototype = {
    get$buffer(receiver) {
      if (((receiver.$flags | 0) & 2) !== 0)
        return new A._UnmodifiableNativeByteBufferView(receiver.buffer);
      else
        return receiver.buffer;
    },
    _invalidPosition$3(receiver, position, $length, $name) {
      var t1 = A.RangeError$range(position, 0, $length, $name, null);
      throw A.wrapException(t1);
    },
    _checkPosition$3(receiver, position, $length, $name) {
      if (position >>> 0 !== position || position > $length)
        this._invalidPosition$3(receiver, position, $length, $name);
    }
  };
  A._UnmodifiableNativeByteBufferView.prototype = {
    asUint8List$2(_, offsetInBytes, $length) {
      var result = A.NativeUint8List_NativeUint8List$view(this._data, offsetInBytes, $length);
      result.$flags = 3;
      return result;
    },
    $isByteBuffer: 1
  };
  A.NativeByteData.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteData_9dB;
    },
    $isTrustedGetRuntimeType: 1,
    $isByteData: 1
  };
  A.NativeTypedArray.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    _setRangeFast$4(receiver, start, end, source, skipCount) {
      var count, sourceLength,
        targetLength = receiver.length;
      this._checkPosition$3(receiver, start, targetLength, "start");
      this._checkPosition$3(receiver, end, targetLength, "end");
      if (start > end)
        throw A.wrapException(A.RangeError$range(start, 0, end, null, null));
      count = end - start;
      if (skipCount < 0)
        throw A.wrapException(A.ArgumentError$(skipCount, null));
      sourceLength = source.length;
      if (sourceLength - skipCount < count)
        throw A.wrapException(A.StateError$("Not enough elements"));
      if (skipCount !== 0 || sourceLength !== count)
        source = source.subarray(skipCount, skipCount + count);
      receiver.set(source, start);
    },
    $isJSIndexable: 1,
    $isJavaScriptIndexingBehavior: 1
  };
  A.NativeTypedArrayOfDouble.prototype = {
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asDouble(value);
      receiver.$flags & 2 && A.throwUnsupportedOperation(receiver);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeTypedArrayOfInt.prototype = {
    $indexSet(receiver, index, value) {
      A._asInt(value);
      receiver.$flags & 2 && A.throwUnsupportedOperation(receiver);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    setRange$4(receiver, start, end, iterable, skipCount) {
      type$.Iterable_int._as(iterable);
      receiver.$flags & 2 && A.throwUnsupportedOperation(receiver, 5);
      if (type$.NativeTypedArrayOfInt._is(iterable)) {
        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
        return;
      }
      this.super$ListBase$setRange(receiver, start, end, iterable, skipCount);
    },
    setRange$3(receiver, start, end, iterable) {
      return this.setRange$4(receiver, start, end, iterable, 0);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeFloat32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float32List_9Kz;
    },
    sublist$2(receiver, start, end) {
      return new Float32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isFloat32List: 1
  };
  A.NativeFloat64List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float64List_9Kz;
    },
    sublist$2(receiver, start, end) {
      return new Float64Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isFloat64List: 1
  };
  A.NativeInt16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int16List_s5h;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isInt16List: 1
  };
  A.NativeInt32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int32List_O8Z;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isInt32List: 1
  };
  A.NativeInt8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int8List_rFV;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isInt8List: 1
  };
  A.NativeUint16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint16List_kmP;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isUint16List: 1
  };
  A.NativeUint32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint32List_kmP;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isUint32List: 1
  };
  A.NativeUint8ClampedList.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8ClampedList_04U;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8ClampedArray(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isUint8ClampedList: 1
  };
  A.NativeUint8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8List_8Eb;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isNativeUint8List: 1,
    $isUint8List: 1
  };
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A.Rti.prototype = {
    _eval$1(recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
    },
    _bind$1(typeOrTuple) {
      return A._Universe_bind(init.typeUniverse, this, typeOrTuple);
    }
  };
  A._FunctionParameters.prototype = {};
  A._Type.prototype = {
    toString$0(_) {
      return A._rtiToString(this._rti, null);
    },
    $isType: 1
  };
  A._Error.prototype = {
    toString$0(_) {
      return this.__rti$_message;
    }
  };
  A._TypeError.prototype = {$isTypeError: 1};
  A._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
    call$1(__wc0_formal) {
      var t1 = this._box_0,
        f = t1.storedCallback;
      t1.storedCallback = null;
      f.call$0();
    },
    $signature: 6
  };
  A._AsyncRun__initializeScheduleImmediate_closure.prototype = {
    call$1(callback) {
      var t1, t2;
      this._box_0.storedCallback = type$.void_Function._as(callback);
      t1 = this.div;
      t2 = this.span;
      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
    },
    $signature: 69
  };
  A._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 1
  };
  A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 1
  };
  A._TimerImpl.prototype = {
    _TimerImpl$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setTimeout(A.convertDartClosureToJS(new A._TimerImpl_internalCallback(this, callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("`setTimeout()` not found."));
    },
    _TimerImpl$periodic$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setInterval(A.convertDartClosureToJS(new A._TimerImpl$periodic_closure(this, milliseconds, Date.now(), callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("Periodic timer."));
    },
    get$isActive() {
      return this._handle != null;
    },
    cancel$0() {
      if (self.setTimeout != null) {
        var t1 = this._handle;
        if (t1 == null)
          return;
        if (this._once)
          self.clearTimeout(t1);
        else
          self.clearInterval(t1);
        this._handle = null;
      } else
        throw A.wrapException(A.UnsupportedError$("Canceling a timer."));
    },
    $isTimer: 1
  };
  A._TimerImpl_internalCallback.prototype = {
    call$0() {
      var t1 = this.$this;
      t1._handle = null;
      t1._tick = 1;
      this.callback.call$0();
    },
    $signature: 0
  };
  A._TimerImpl$periodic_closure.prototype = {
    call$0() {
      var duration, _this = this,
        t1 = _this.$this,
        tick = t1._tick + 1,
        t2 = _this.milliseconds;
      if (t2 > 0) {
        duration = Date.now() - _this.start;
        if (duration > (tick + 1) * t2)
          tick = B.JSInt_methods.$tdiv(duration, t2);
      }
      t1._tick = tick;
      _this.callback.call$1(t1);
    },
    $signature: 1
  };
  A._AsyncAwaitCompleter.prototype = {
    complete$1(value) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/?")._as(value);
      if (value == null)
        value = t1._precomputed1._as(value);
      if (!_this.isSync)
        _this._future._asyncComplete$1(value);
      else {
        t2 = _this._future;
        if (t1._eval$1("Future<1>")._is(value))
          t2._chainFuture$1(value);
        else
          t2._completeWithValue$1(value);
      }
    },
    completeError$2(e, st) {
      var t1 = this._future;
      if (this.isSync)
        t1._completeErrorObject$1(new A.AsyncError(e, st));
      else
        t1._asyncCompleteErrorObject$1(new A.AsyncError(e, st));
    },
    $isCompleter: 1
  };
  A._awaitOnObject_closure.prototype = {
    call$1(result) {
      return this.bodyFunction.call$2(0, result);
    },
    $signature: 7
  };
  A._awaitOnObject_closure0.prototype = {
    call$2(error, stackTrace) {
      this.bodyFunction.call$2(1, new A.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
    },
    $signature: 66
  };
  A._wrapJsFunctionForAsync_closure.prototype = {
    call$2(errorCode, result) {
      this.$protected(A._asInt(errorCode), result);
    },
    $signature: 64
  };
  A._asyncStarHelper_closure.prototype = {
    call$0() {
      var t3,
        t1 = this.controller,
        t2 = t1.___AsyncStarStreamController_controller_A;
      t2 === $ && A.throwLateFieldNI("controller");
      t3 = t2._state;
      if ((t3 & 1) !== 0 ? (t2.get$_subscription()._state & 4) !== 0 : (t3 & 2) === 0) {
        t1.isSuspended = true;
        return;
      }
      t1 = t1.cancelationFuture != null ? 2 : 0;
      this.bodyFunction.call$2(t1, null);
    },
    $signature: 0
  };
  A._asyncStarHelper_closure0.prototype = {
    call$1(__wc0_formal) {
      var errorCode = this.controller.cancelationFuture != null ? 2 : 0;
      this.bodyFunction.call$2(errorCode, null);
    },
    $signature: 6
  };
  A._AsyncStarStreamController.prototype = {
    _AsyncStarStreamController$1(body, $T) {
      var _this = this,
        t1 = new A._AsyncStarStreamController__resumeBody(body);
      _this.___AsyncStarStreamController_controller_A = _this.$ti._eval$1("StreamController<1>")._as(A.StreamController_StreamController(new A._AsyncStarStreamController_closure(_this, body), new A._AsyncStarStreamController_closure0(t1), new A._AsyncStarStreamController_closure1(_this, t1), false, $T));
    }
  };
  A._AsyncStarStreamController__resumeBody.prototype = {
    call$0() {
      A.scheduleMicrotask(new A._AsyncStarStreamController__resumeBody_closure(this.body));
    },
    $signature: 1
  };
  A._AsyncStarStreamController__resumeBody_closure.prototype = {
    call$0() {
      this.body.call$2(0, null);
    },
    $signature: 0
  };
  A._AsyncStarStreamController_closure0.prototype = {
    call$0() {
      this._resumeBody.call$0();
    },
    $signature: 0
  };
  A._AsyncStarStreamController_closure1.prototype = {
    call$0() {
      var t1 = this.$this;
      if (t1.isSuspended) {
        t1.isSuspended = false;
        this._resumeBody.call$0();
      }
    },
    $signature: 0
  };
  A._AsyncStarStreamController_closure.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1.___AsyncStarStreamController_controller_A;
      t2 === $ && A.throwLateFieldNI("controller");
      if ((t2._state & 4) === 0) {
        t1.cancelationFuture = new A._Future($.Zone__current, type$._Future_dynamic);
        if (t1.isSuspended) {
          t1.isSuspended = false;
          A.scheduleMicrotask(new A._AsyncStarStreamController__closure(this.body));
        }
        return t1.cancelationFuture;
      }
    },
    $signature: 59
  };
  A._AsyncStarStreamController__closure.prototype = {
    call$0() {
      this.body.call$2(2, null);
    },
    $signature: 0
  };
  A._IterationMarker.prototype = {
    toString$0(_) {
      return "IterationMarker(" + this.state + ", " + A.S(this.value) + ")";
    }
  };
  A.AsyncError.prototype = {
    toString$0(_) {
      return A.S(this.error);
    },
    $isError: 1,
    get$stackTrace() {
      return this.stackTrace;
    }
  };
  A.Future_Future$microtask_closure.prototype = {
    call$0() {
      var e, s, exception, t1, t2, t3, computationResult = null;
      try {
        computationResult = this.computation.call$0();
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = e;
        t2 = s;
        t3 = A._interceptError(t1, t2);
        if (t3 == null)
          t1 = new A.AsyncError(t1, t2);
        else
          t1 = t3;
        this.result._completeErrorObject$1(t1);
        return;
      }
      this.result._complete$1(computationResult);
    },
    $signature: 0
  };
  A.TimeoutException.prototype = {};
  A._Completer.prototype = {
    completeError$2(error, stackTrace) {
      A._asObject(error);
      type$.nullable_StackTrace._as(stackTrace);
      if ((this.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      this._completeErrorObject$1(A._interceptUserError(error, stackTrace));
    },
    completeError$1(error) {
      return this.completeError$2(error, null);
    },
    $isCompleter: 1
  };
  A._AsyncCompleter.prototype = {
    complete$1(value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._asyncComplete$1(t1._eval$1("1/")._as(value));
    },
    complete$0() {
      return this.complete$1(null);
    },
    _completeErrorObject$1(error) {
      this.future._asyncCompleteErrorObject$1(error);
    }
  };
  A._SyncCompleter.prototype = {
    complete$1(value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._complete$1(t1._eval$1("1/")._as(value));
    },
    _completeErrorObject$1(error) {
      this.future._completeErrorObject$1(error);
    }
  };
  A._FutureListener.prototype = {
    matchesErrorTest$1(asyncError) {
      if ((this.state & 15) !== 6)
        return true;
      return this.result._zone.runUnary$2$2(type$.bool_Function_Object._as(this.callback), asyncError.error, type$.bool, type$.Object);
    },
    handleError$1(asyncError) {
      var exception, _this = this,
        errorCallback = _this.errorCallback,
        result = null,
        t1 = type$.dynamic,
        t2 = type$.Object,
        t3 = asyncError.error,
        t4 = _this.result._zone;
      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
        result = t4.runBinary$3$3(errorCallback, t3, asyncError.stackTrace, t1, t2, type$.StackTrace);
      else
        result = t4.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), t3, t1, t2);
      try {
        t1 = _this.$ti._eval$1("2/")._as(result);
        return t1;
      } catch (exception) {
        if (type$.TypeError._is(A.unwrapException(exception))) {
          if ((_this.state & 1) !== 0)
            throw A.wrapException(A.ArgumentError$("The error handler of Future.then must return a value of the returned future's type", "onError"));
          throw A.wrapException(A.ArgumentError$("The error handler of Future.catchError must return a value of the future's type", "onError"));
        } else
          throw exception;
      }
    }
  };
  A._Future.prototype = {
    then$1$2$onError(f, onError, $R) {
      var currentZone, result, t2,
        t1 = this.$ti;
      t1._bind$1($R)._eval$1("1/(2)")._as(f);
      currentZone = $.Zone__current;
      if (currentZone === B.C__RootZone) {
        if (onError != null && !type$.dynamic_Function_Object_StackTrace._is(onError) && !type$.dynamic_Function_Object._is(onError))
          throw A.wrapException(A.ArgumentError$value(onError, "onError", string$.Error_));
      } else {
        f = currentZone.registerUnaryCallback$2$1(f, $R._eval$1("0/"), t1._precomputed1);
        if (onError != null)
          onError = A._registerErrorHandler(onError, currentZone);
      }
      result = new A._Future($.Zone__current, $R._eval$1("_Future<0>"));
      t2 = onError == null ? 1 : 3;
      this._addListener$1(new A._FutureListener(result, t2, f, onError, t1._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    then$1$1(f, $R) {
      return this.then$1$2$onError(f, null, $R);
    },
    _thenAwait$1$2(f, onError, $E) {
      var result,
        t1 = this.$ti;
      t1._bind$1($E)._eval$1("1/(2)")._as(f);
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this._addListener$1(new A._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    catchError$2$test(onError, test) {
      var t1, t2, result;
      type$.nullable_bool_Function_Object._as(test);
      t1 = this.$ti;
      t2 = $.Zone__current;
      result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone) {
        onError = A._registerErrorHandler(onError, t2);
        if (test != null)
          test = t2.registerUnaryCallback$2$1(test, type$.bool, type$.Object);
      }
      t2 = test == null ? 2 : 6;
      this._addListener$1(new A._FutureListener(result, t2, test, onError, t1._eval$1("_FutureListener<1,1>")));
      return result;
    },
    catchError$1(onError) {
      return this.catchError$2$test(onError, null);
    },
    whenComplete$1(action) {
      var t1, t2, result;
      type$.dynamic_Function._as(action);
      t1 = this.$ti;
      t2 = $.Zone__current;
      result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone)
        action = t2.registerCallback$1$1(action, type$.dynamic);
      this._addListener$1(new A._FutureListener(result, 8, action, null, t1._eval$1("_FutureListener<1,1>")));
      return result;
    },
    _setErrorObject$1(error) {
      this._state = this._state & 1 | 16;
      this._resultOrListeners = error;
    },
    _cloneResult$1(source) {
      this._state = source._state & 30 | this._state & 1;
      this._resultOrListeners = source._resultOrListeners;
    },
    _addListener$1(listener) {
      var source, _this = this,
        t1 = _this._state;
      if (t1 <= 3) {
        listener._nextListener = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listener;
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._addListener$1(listener);
            return;
          }
          _this._cloneResult$1(source);
        }
        _this._zone.scheduleMicrotask$1(new A._Future__addListener_closure(_this, listener));
      }
    },
    _prependListeners$1(listeners) {
      var t1, existingListeners, next, cursor, next0, source, _this = this, _box_0 = {};
      _box_0.listeners = listeners;
      if (listeners == null)
        return;
      t1 = _this._state;
      if (t1 <= 3) {
        existingListeners = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listeners;
        if (existingListeners != null) {
          next = listeners._nextListener;
          for (cursor = listeners; next != null; cursor = next, next = next0)
            next0 = next._nextListener;
          cursor._nextListener = existingListeners;
        }
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._prependListeners$1(listeners);
            return;
          }
          _this._cloneResult$1(source);
        }
        _box_0.listeners = _this._reverseListeners$1(listeners);
        _this._zone.scheduleMicrotask$1(new A._Future__prependListeners_closure(_box_0, _this));
      }
    },
    _removeListeners$0() {
      var current = type$.nullable__FutureListener_dynamic_dynamic._as(this._resultOrListeners);
      this._resultOrListeners = null;
      return this._reverseListeners$1(current);
    },
    _reverseListeners$1(listeners) {
      var current, prev, next;
      for (current = listeners, prev = null; current != null; prev = current, current = next) {
        next = current._nextListener;
        current._nextListener = prev;
      }
      return prev;
    },
    _complete$1(value) {
      var listeners, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value))
        A._Future__chainCoreFuture(value, _this, true);
      else {
        listeners = _this._removeListeners$0();
        t1._precomputed1._as(value);
        _this._state = 8;
        _this._resultOrListeners = value;
        A._Future__propagateToListeners(_this, listeners);
      }
    },
    _completeWithValue$1(value) {
      var listeners, _this = this;
      _this.$ti._precomputed1._as(value);
      listeners = _this._removeListeners$0();
      _this._state = 8;
      _this._resultOrListeners = value;
      A._Future__propagateToListeners(_this, listeners);
    },
    _completeWithResultOf$1(source) {
      var t1, t2, listeners, _this = this;
      if ((source._state & 16) !== 0) {
        t1 = _this._zone;
        t2 = source._zone;
        t1 = !(t1 === t2 || t1.get$errorZone() === t2.get$errorZone());
      } else
        t1 = false;
      if (t1)
        return;
      listeners = _this._removeListeners$0();
      _this._cloneResult$1(source);
      A._Future__propagateToListeners(_this, listeners);
    },
    _completeErrorObject$1(error) {
      var listeners = this._removeListeners$0();
      this._setErrorObject$1(error);
      A._Future__propagateToListeners(this, listeners);
    },
    _completeError$2(error, stackTrace) {
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      this._completeErrorObject$1(new A.AsyncError(error, stackTrace));
    },
    _asyncComplete$1(value) {
      var t1 = this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value)) {
        this._chainFuture$1(value);
        return;
      }
      this._asyncCompleteWithValue$1(value);
    },
    _asyncCompleteWithValue$1(value) {
      var _this = this;
      _this.$ti._precomputed1._as(value);
      _this._state ^= 2;
      _this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteWithValue_closure(_this, value));
    },
    _chainFuture$1(value) {
      A._Future__chainCoreFuture(this.$ti._eval$1("Future<1>")._as(value), this, false);
      return;
    },
    _asyncCompleteErrorObject$1(error) {
      this._state ^= 2;
      this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteErrorObject_closure(this, error));
    },
    timeout$2$onTimeout(timeLimit, onTimeout) {
      var t3, _future, _this = this, t1 = {},
        t2 = _this.$ti;
      t2._eval$1("1/()?")._as(onTimeout);
      if ((_this._state & 24) !== 0) {
        t1 = new A._Future($.Zone__current, t2);
        t1._asyncComplete$1(_this);
        return t1;
      }
      t3 = $.Zone__current;
      _future = new A._Future(t3, t2);
      t1.timer = null;
      t1.timer = A.Timer_Timer(timeLimit, new A._Future_timeout_closure(_this, _future, t3, t3.registerCallback$1$1(onTimeout, t2._eval$1("1/"))));
      _this.then$1$2$onError(new A._Future_timeout_closure0(t1, _this, _future), new A._Future_timeout_closure1(t1, _future), type$.Null);
      return _future;
    },
    $isFuture: 1
  };
  A._Future__addListener_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this.listener);
    },
    $signature: 0
  };
  A._Future__prependListeners_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this._box_0.listeners);
    },
    $signature: 0
  };
  A._Future__chainCoreFuture_closure.prototype = {
    call$0() {
      A._Future__chainCoreFuture(this._box_0.source, this.target, true);
    },
    $signature: 0
  };
  A._Future__asyncCompleteWithValue_closure.prototype = {
    call$0() {
      this.$this._completeWithValue$1(this.value);
    },
    $signature: 0
  };
  A._Future__asyncCompleteErrorObject_closure.prototype = {
    call$0() {
      this.$this._completeErrorObject$1(this.error);
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
    call$0() {
      var e, s, t1, exception, t2, t3, originalSource, joinedResult, _this = this, completeResult = null;
      try {
        t1 = _this._box_0.listener;
        completeResult = t1.result._zone.run$1$1(type$.dynamic_Function._as(t1.callback), type$.dynamic);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        if (_this.hasError && type$.AsyncError._as(_this._box_1.source._resultOrListeners).error === e) {
          t1 = _this._box_0;
          t1.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        } else {
          t1 = e;
          t2 = s;
          if (t2 == null)
            t2 = A.AsyncError_defaultStackTrace(t1);
          t3 = _this._box_0;
          t3.listenerValueOrError = new A.AsyncError(t1, t2);
          t1 = t3;
        }
        t1.listenerHasError = true;
        return;
      }
      if (completeResult instanceof A._Future && (completeResult._state & 24) !== 0) {
        if ((completeResult._state & 16) !== 0) {
          t1 = _this._box_0;
          t1.listenerValueOrError = type$.AsyncError._as(completeResult._resultOrListeners);
          t1.listenerHasError = true;
        }
        return;
      }
      if (completeResult instanceof A._Future) {
        originalSource = _this._box_1.source;
        joinedResult = new A._Future(originalSource._zone, originalSource.$ti);
        completeResult.then$1$2$onError(new A._Future__propagateToListeners_handleWhenCompleteCallback_closure(joinedResult, originalSource), new A._Future__propagateToListeners_handleWhenCompleteCallback_closure0(joinedResult), type$.void);
        t1 = _this._box_0;
        t1.listenerValueOrError = joinedResult;
        t1.listenerHasError = false;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
    call$1(__wc0_formal) {
      this.joinedResult._completeWithResultOf$1(this.originalSource);
    },
    $signature: 6
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback_closure0.prototype = {
    call$2(e, s) {
      A._asObject(e);
      type$.StackTrace._as(s);
      this.joinedResult._completeErrorObject$1(new A.AsyncError(e, s));
    },
    $signature: 4
  };
  A._Future__propagateToListeners_handleValueCallback.prototype = {
    call$0() {
      var e, s, t1, t2, t3, t4, t5, exception;
      try {
        t1 = this._box_0;
        t2 = t1.listener;
        t3 = t2.$ti;
        t4 = t3._precomputed1;
        t5 = t4._as(this.sourceResult);
        t1.listenerValueOrError = t2.result._zone.runUnary$2$2(t3._eval$1("2/(1)")._as(t2.callback), t5, t3._eval$1("2/"), t4);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = e;
        t2 = s;
        if (t2 == null)
          t2 = A.AsyncError_defaultStackTrace(t1);
        t3 = this._box_0;
        t3.listenerValueOrError = new A.AsyncError(t1, t2);
        t3.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleError.prototype = {
    call$0() {
      var asyncError, e, s, t1, exception, t2, t3, _this = this;
      try {
        asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t1 = _this._box_0;
        if (t1.listener.matchesErrorTest$1(asyncError) && t1.listener.errorCallback != null) {
          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
          t1.listenerHasError = false;
        }
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        if (t1.error === e) {
          t2 = _this._box_0;
          t2.listenerValueOrError = t1;
          t1 = t2;
        } else {
          t1 = e;
          t2 = s;
          if (t2 == null)
            t2 = A.AsyncError_defaultStackTrace(t1);
          t3 = _this._box_0;
          t3.listenerValueOrError = new A.AsyncError(t1, t2);
          t1 = t3;
        }
        t1.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._Future_timeout_closure.prototype = {
    call$0() {
      var e, s, exception, t1, t2, _this = this;
      try {
        _this._future._complete$1(_this.zone.run$1$1(_this.onTimeoutHandler, _this.$this.$ti._eval$1("1/")));
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = e;
        t2 = s;
        if (t2 == null)
          t2 = A.AsyncError_defaultStackTrace(t1);
        _this._future._completeErrorObject$1(new A.AsyncError(t1, t2));
      }
    },
    $signature: 0
  };
  A._Future_timeout_closure0.prototype = {
    call$1(v) {
      var t1;
      this.$this.$ti._precomputed1._as(v);
      t1 = this._box_0;
      if (t1.timer.get$isActive()) {
        t1.timer.cancel$0();
        this._future._completeWithValue$1(v);
      }
    },
    $signature() {
      return this.$this.$ti._eval$1("Null(1)");
    }
  };
  A._Future_timeout_closure1.prototype = {
    call$2(e, s) {
      var t1;
      A._asObject(e);
      type$.StackTrace._as(s);
      t1 = this._box_0;
      if (t1.timer.get$isActive()) {
        t1.timer.cancel$0();
        this._future._completeErrorObject$1(new A.AsyncError(e, s));
      }
    },
    $signature: 4
  };
  A._AsyncCallbackEntry.prototype = {};
  A.Stream.prototype = {
    map$1$1(_, convert, $S) {
      var t1 = A._instanceType(this);
      return new A._MapStream(t1._bind$1($S)._eval$1("1(Stream.T)")._as(convert), this, t1._eval$1("@<Stream.T>")._bind$1($S)._eval$1("_MapStream<1,2>"));
    },
    map$1(_, convert) {
      return this.map$1$1(0, convert, type$.dynamic);
    },
    get$length(_) {
      var t1 = {},
        future = new A._Future($.Zone__current, type$._Future_int);
      t1.count = 0;
      this.listen$4$cancelOnError$onDone$onError(new A.Stream_length_closure(t1, this), true, new A.Stream_length_closure0(t1, future), future.get$_completeError());
      return future;
    },
    get$first(_) {
      var future = new A._Future($.Zone__current, A._instanceType(this)._eval$1("_Future<Stream.T>")),
        subscription = this.listen$4$cancelOnError$onDone$onError(null, true, new A.Stream_first_closure(future), future.get$_completeError());
      subscription.onData$1(new A.Stream_first_closure0(this, subscription, future));
      return future;
    }
  };
  A.Stream_length_closure.prototype = {
    call$1(__wc0_formal) {
      A._instanceType(this.$this)._eval$1("Stream.T")._as(__wc0_formal);
      ++this._box_0.count;
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A.Stream_length_closure0.prototype = {
    call$0() {
      this.future._complete$1(this._box_0.count);
    },
    $signature: 0
  };
  A.Stream_first_closure.prototype = {
    call$0() {
      var t1,
        error = new A.StateError("No element");
      A.Primitives_trySetStackTrace(error, B._StringStackTrace_OdL);
      t1 = A._interceptError(error, B._StringStackTrace_OdL);
      if (t1 == null)
        t1 = new A.AsyncError(error, B._StringStackTrace_OdL);
      this.future._completeErrorObject$1(t1);
    },
    $signature: 0
  };
  A.Stream_first_closure0.prototype = {
    call$1(value) {
      A._cancelAndValue(this.subscription, this.future, A._instanceType(this.$this)._eval$1("Stream.T")._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A.StreamView.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      return this._stream.listen$4$cancelOnError$onDone$onError(A._instanceType(this)._eval$1("~(StreamView.T)?")._as(onData), cancelOnError, type$.nullable_void_Function._as(onDone), onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._StreamController.prototype = {
    get$_pendingEvents() {
      var t1, _this = this;
      if ((_this._state & 8) === 0)
        return A._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData);
      t1 = A._instanceType(_this);
      return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData)._varData);
    },
    _ensurePendingEvents$0() {
      var events, t1, state, _this = this;
      if ((_this._state & 8) === 0) {
        events = _this._varData;
        if (events == null)
          events = _this._varData = new A._PendingEvents(A._instanceType(_this)._eval$1("_PendingEvents<1>"));
        return A._instanceType(_this)._eval$1("_PendingEvents<1>")._as(events);
      }
      t1 = A._instanceType(_this);
      state = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
      events = state._varData;
      if (events == null)
        events = state._varData = new A._PendingEvents(t1._eval$1("_PendingEvents<1>"));
      return t1._eval$1("_PendingEvents<1>")._as(events);
    },
    get$_subscription() {
      var varData = this._varData;
      if ((this._state & 8) !== 0)
        varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData)._varData;
      return A._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData);
    },
    _badEventState$0() {
      if ((this._state & 4) !== 0)
        return new A.StateError("Cannot add event after closing");
      return new A.StateError("Cannot add event while adding a stream");
    },
    addStream$2$cancelOnError(source, cancelOnError) {
      var t2, t3, t4, t5, t6, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("Stream<1>")._as(source);
      t2 = _this._state;
      if (t2 >= 4)
        throw A.wrapException(_this._badEventState$0());
      if ((t2 & 2) !== 0) {
        t1 = new A._Future($.Zone__current, type$._Future_dynamic);
        t1._asyncComplete$1(null);
        return t1;
      }
      t2 = _this._varData;
      t3 = cancelOnError === true;
      t4 = new A._Future($.Zone__current, type$._Future_dynamic);
      t5 = t1._eval$1("~(1)")._as(_this.get$_add());
      t6 = t3 ? A._AddStreamState_makeErrorHandler(_this) : _this.get$_addError();
      t6 = source.listen$4$cancelOnError$onDone$onError(t5, t3, _this.get$_close(), t6);
      t3 = _this._state;
      if ((t3 & 1) !== 0 ? (_this.get$_subscription()._state & 4) !== 0 : (t3 & 2) === 0)
        t6.pause$0();
      _this._varData = new A._StreamControllerAddStreamState(t2, t4, t6, t1._eval$1("_StreamControllerAddStreamState<1>"));
      _this._state |= 8;
      return t4;
    },
    _ensureDoneFuture$0() {
      var t1 = this._doneFuture;
      if (t1 == null)
        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new A._Future($.Zone__current, type$._Future_void);
      return t1;
    },
    add$1(_, value) {
      var _this = this;
      A._instanceType(_this)._precomputed1._as(value);
      if (_this._state >= 4)
        throw A.wrapException(_this._badEventState$0());
      _this._add$1(value);
    },
    addError$2(error, stackTrace) {
      var _0_0;
      A._asObject(error);
      type$.nullable_StackTrace._as(stackTrace);
      if (this._state >= 4)
        throw A.wrapException(this._badEventState$0());
      _0_0 = A._interceptUserError(error, stackTrace);
      this._addError$2(_0_0.error, _0_0.stackTrace);
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    close$0() {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 4) !== 0)
        return _this._ensureDoneFuture$0();
      if (t1 >= 4)
        throw A.wrapException(_this._badEventState$0());
      _this._closeUnchecked$0();
      return _this._ensureDoneFuture$0();
    },
    _closeUnchecked$0() {
      var t1 = this._state |= 4;
      if ((t1 & 1) !== 0)
        this._sendDone$0();
      else if ((t1 & 3) === 0)
        this._ensurePendingEvents$0().add$1(0, B.C__DelayedDone);
    },
    _add$1(value) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(value);
      t2 = _this._state;
      if ((t2 & 1) !== 0)
        _this._sendData$1(value);
      else if ((t2 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new A._DelayedData(value, t1._eval$1("_DelayedData<1>")));
    },
    _addError$2(error, stackTrace) {
      var t1;
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      t1 = this._state;
      if ((t1 & 1) !== 0)
        this._sendError$2(error, stackTrace);
      else if ((t1 & 3) === 0)
        this._ensurePendingEvents$0().add$1(0, new A._DelayedError(error, stackTrace));
    },
    _close$0() {
      var _this = this,
        addState = A._instanceType(_this)._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
      _this._varData = addState._varData;
      _this._state &= 4294967287;
      addState.addStreamFuture._asyncComplete$1(null);
    },
    _subscribe$4(onData, onError, onDone, cancelOnError) {
      var t2, t3, t4, t5, t6, t7, subscription, pendingEvents, addState, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      if ((_this._state & 3) !== 0)
        throw A.wrapException(A.StateError$("Stream has already been listened to."));
      t2 = $.Zone__current;
      t3 = cancelOnError ? 1 : 0;
      t4 = onError != null ? 32 : 0;
      t5 = A._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._precomputed1);
      t6 = A._BufferingStreamSubscription__registerErrorHandler(t2, onError);
      t7 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      subscription = new A._ControllerSubscription(_this, t5, t6, t2.registerCallback$1$1(t7, type$.void), t2, t3 | t4, t1._eval$1("_ControllerSubscription<1>"));
      pendingEvents = _this.get$_pendingEvents();
      if (((_this._state |= 1) & 8) !== 0) {
        addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
        addState._varData = subscription;
        addState.addSubscription.resume$0();
      } else
        _this._varData = subscription;
      subscription._setPendingEvents$1(pendingEvents);
      subscription._guardCallback$1(new A._StreamController__subscribe_closure(_this));
      return subscription;
    },
    _recordCancel$1(subscription) {
      var result, onCancel, cancelResult, e, s, exception, result0, t2, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("StreamSubscription<1>")._as(subscription);
      result = null;
      if ((_this._state & 8) !== 0)
        result = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).cancel$0();
      _this._varData = null;
      _this._state = _this._state & 4294967286 | 2;
      onCancel = _this.onCancel;
      if (onCancel != null)
        if (result == null)
          try {
            cancelResult = onCancel.call$0();
            if (cancelResult instanceof A._Future)
              result = cancelResult;
          } catch (exception) {
            e = A.unwrapException(exception);
            s = A.getTraceFromException(exception);
            result0 = new A._Future($.Zone__current, type$._Future_void);
            t1 = A._asObject(e);
            t2 = type$.StackTrace._as(s);
            result0._asyncCompleteErrorObject$1(new A.AsyncError(t1, t2));
            result = result0;
          }
        else
          result = result.whenComplete$1(onCancel);
      t1 = new A._StreamController__recordCancel_complete(_this);
      if (result != null)
        result = result.whenComplete$1(t1);
      else
        t1.call$0();
      return result;
    },
    $isStreamSink: 1,
    $isStreamController: 1,
    $is_StreamControllerLifecycle: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._StreamController__subscribe_closure.prototype = {
    call$0() {
      A._runGuarded(this.$this.onListen);
    },
    $signature: 0
  };
  A._StreamController__recordCancel_complete.prototype = {
    call$0() {
      var doneFuture = this.$this._doneFuture;
      if (doneFuture != null && (doneFuture._state & 30) === 0)
        doneFuture._asyncComplete$1(null);
    },
    $signature: 0
  };
  A._SyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      this.$ti._precomputed1._as(data);
      this.get$_subscription()._add$1(data);
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addError$2(error, stackTrace);
    },
    _sendDone$0() {
      this.get$_subscription()._close$0();
    }
  };
  A._AsyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      var t1 = this.$ti;
      t1._precomputed1._as(data);
      this.get$_subscription()._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<1>")));
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _sendDone$0() {
      this.get$_subscription()._addPending$1(B.C__DelayedDone);
    }
  };
  A._AsyncStreamController.prototype = {};
  A._SyncStreamController.prototype = {};
  A._ControllerStream.prototype = {
    get$hashCode(_) {
      return (A.Primitives_objectHashCode(this._controller) ^ 892482866) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return other instanceof A._ControllerStream && other._controller === this._controller;
    }
  };
  A._ControllerSubscription.prototype = {
    _onCancel$0() {
      return this._controller._recordCancel$1(this);
    },
    _onPause$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).addSubscription.pause$0();
      A._runGuarded(t1.onPause);
    },
    _onResume$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).addSubscription.resume$0();
      A._runGuarded(t1.onResume);
    }
  };
  A._StreamSinkWrapper.prototype = {
    add$1(_, data) {
      this._async$_target.add$1(0, this.$ti._precomputed1._as(data));
    },
    $isStreamSink: 1
  };
  A._AddStreamState.prototype = {
    cancel$0() {
      var cancel = this.addSubscription.cancel$0();
      return cancel.whenComplete$1(new A._AddStreamState_cancel_closure(this));
    }
  };
  A._AddStreamState_makeErrorHandler_closure.prototype = {
    call$2(e, s) {
      var t1 = this.controller;
      t1._addError$2(A._asObject(e), type$.StackTrace._as(s));
      t1._close$0();
    },
    $signature: 4
  };
  A._AddStreamState_cancel_closure.prototype = {
    call$0() {
      this.$this.addStreamFuture._asyncComplete$1(null);
    },
    $signature: 1
  };
  A._StreamControllerAddStreamState.prototype = {};
  A._BufferingStreamSubscription.prototype = {
    _setPendingEvents$1(pendingEvents) {
      var _this = this;
      A._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(pendingEvents);
      if (pendingEvents == null)
        return;
      _this._pending = pendingEvents;
      if (pendingEvents.lastPendingEvent != null) {
        _this._state = (_this._state | 128) >>> 0;
        pendingEvents.schedule$1(_this);
      }
    },
    onData$1(handleData) {
      var t1 = A._instanceType(this);
      this._async$_onData = A._BufferingStreamSubscription__registerDataHandler(this._zone, t1._eval$1("~(_BufferingStreamSubscription.T)?")._as(handleData), t1._eval$1("_BufferingStreamSubscription.T"));
    },
    pause$0() {
      var t2, t3, _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t2 = (t1 + 256 | 4) >>> 0;
      _this._state = t2;
      if (t1 < 256) {
        t3 = _this._pending;
        if (t3 != null)
          if (t3._state === 1)
            t3._state = 3;
      }
      if ((t1 & 4) === 0 && (t2 & 64) === 0)
        _this._guardCallback$1(_this.get$_onPause());
    },
    resume$0() {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 >= 256) {
        t1 = _this._state = t1 - 256;
        if (t1 < 256)
          if ((t1 & 128) !== 0 && _this._pending.lastPendingEvent != null)
            _this._pending.schedule$1(_this);
          else {
            t1 = (t1 & 4294967291) >>> 0;
            _this._state = t1;
            if ((t1 & 64) === 0)
              _this._guardCallback$1(_this.get$_onResume());
          }
      }
    },
    cancel$0() {
      var _this = this,
        t1 = (_this._state & 4294967279) >>> 0;
      _this._state = t1;
      if ((t1 & 8) === 0)
        _this._cancel$0();
      t1 = _this._cancelFuture;
      return t1 == null ? $.$get$Future__nullFuture() : t1;
    },
    asFuture$1$1(futureValue, $E) {
      var result, _this = this, t1 = {};
      t1.resultValue = null;
      if (!$E._is(null))
        throw A.wrapException(A.ArgumentError$notNull("futureValue"));
      $E._as(futureValue);
      t1.resultValue = futureValue;
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      _this._onDone = new A._BufferingStreamSubscription_asFuture_closure(t1, result);
      _this._state = (_this._state | 32) >>> 0;
      _this._onError = new A._BufferingStreamSubscription_asFuture_closure0(_this, result);
      return result;
    },
    _cancel$0() {
      var t2, _this = this,
        t1 = _this._state = (_this._state | 8) >>> 0;
      if ((t1 & 128) !== 0) {
        t2 = _this._pending;
        if (t2._state === 1)
          t2._state = 3;
      }
      if ((t1 & 64) === 0)
        _this._pending = null;
      _this._cancelFuture = _this._onCancel$0();
    },
    _add$1(data) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("_BufferingStreamSubscription.T")._as(data);
      t2 = _this._state;
      if ((t2 & 8) !== 0)
        return;
      if (t2 < 64)
        _this._sendData$1(data);
      else
        _this._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<_BufferingStreamSubscription.T>")));
    },
    _addError$2(error, stackTrace) {
      var t1;
      if (type$.Error._is(error))
        A.Primitives_trySetStackTrace(error, stackTrace);
      t1 = this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 < 64)
        this._sendError$2(error, stackTrace);
      else
        this._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _close$0() {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t1 = (t1 | 2) >>> 0;
      _this._state = t1;
      if (t1 < 64)
        _this._sendDone$0();
      else
        _this._addPending$1(B.C__DelayedDone);
    },
    _onPause$0() {
    },
    _onResume$0() {
    },
    _onCancel$0() {
      return null;
    },
    _addPending$1($event) {
      var t1, _this = this,
        pending = _this._pending;
      if (pending == null)
        pending = _this._pending = new A._PendingEvents(A._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>"));
      pending.add$1(0, $event);
      t1 = _this._state;
      if ((t1 & 128) === 0) {
        t1 = (t1 | 128) >>> 0;
        _this._state = t1;
        if (t1 < 256)
          pending.schedule$1(_this);
      }
    },
    _sendData$1(data) {
      var t2, _this = this,
        t1 = A._instanceType(_this)._eval$1("_BufferingStreamSubscription.T");
      t1._as(data);
      t2 = _this._state;
      _this._state = (t2 | 64) >>> 0;
      _this._zone.runUnaryGuarded$1$2(_this._async$_onData, data, t1);
      _this._state = (_this._state & 4294967231) >>> 0;
      _this._checkState$1((t2 & 4) !== 0);
    },
    _sendError$2(error, stackTrace) {
      var cancelFuture, _this = this,
        t1 = _this._state,
        t2 = new A._BufferingStreamSubscription__sendError_sendError(_this, error, stackTrace);
      if ((t1 & 1) !== 0) {
        _this._state = (t1 | 16) >>> 0;
        _this._cancel$0();
        cancelFuture = _this._cancelFuture;
        if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
          cancelFuture.whenComplete$1(t2);
        else
          t2.call$0();
      } else {
        t2.call$0();
        _this._checkState$1((t1 & 4) !== 0);
      }
    },
    _sendDone$0() {
      var cancelFuture, _this = this,
        t1 = new A._BufferingStreamSubscription__sendDone_sendDone(_this);
      _this._cancel$0();
      _this._state = (_this._state | 16) >>> 0;
      cancelFuture = _this._cancelFuture;
      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(t1);
      else
        t1.call$0();
    },
    _guardCallback$1(callback) {
      var t1, _this = this;
      type$.void_Function._as(callback);
      t1 = _this._state;
      _this._state = (t1 | 64) >>> 0;
      callback.call$0();
      _this._state = (_this._state & 4294967231) >>> 0;
      _this._checkState$1((t1 & 4) !== 0);
    },
    _checkState$1(wasInputPaused) {
      var t2, isInputPaused, _this = this,
        t1 = _this._state;
      if ((t1 & 128) !== 0 && _this._pending.lastPendingEvent == null) {
        t1 = _this._state = (t1 & 4294967167) >>> 0;
        t2 = false;
        if ((t1 & 4) !== 0)
          if (t1 < 256) {
            t2 = _this._pending;
            t2 = t2 == null ? null : t2.lastPendingEvent == null;
            t2 = t2 !== false;
          }
        if (t2) {
          t1 = (t1 & 4294967291) >>> 0;
          _this._state = t1;
        }
      }
      for (;; wasInputPaused = isInputPaused) {
        if ((t1 & 8) !== 0) {
          _this._pending = null;
          return;
        }
        isInputPaused = (t1 & 4) !== 0;
        if (wasInputPaused === isInputPaused)
          break;
        _this._state = (t1 ^ 64) >>> 0;
        if (isInputPaused)
          _this._onPause$0();
        else
          _this._onResume$0();
        t1 = (_this._state & 4294967231) >>> 0;
        _this._state = t1;
      }
      if ((t1 & 128) !== 0 && t1 < 256)
        _this._pending.schedule$1(_this);
    },
    $isStreamSubscription: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._BufferingStreamSubscription_asFuture_closure.prototype = {
    call$0() {
      this.result._complete$1(this._box_0.resultValue);
    },
    $signature: 0
  };
  A._BufferingStreamSubscription_asFuture_closure0.prototype = {
    call$2(error, stackTrace) {
      var cancelFuture, t1;
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      cancelFuture = this.$this.cancel$0();
      t1 = this.result;
      if (cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new A._BufferingStreamSubscription_asFuture__closure(t1, error, stackTrace));
      else
        t1._completeErrorObject$1(new A.AsyncError(error, stackTrace));
    },
    $signature: 4
  };
  A._BufferingStreamSubscription_asFuture__closure.prototype = {
    call$0() {
      this.result._completeErrorObject$1(new A.AsyncError(this.error, this.stackTrace));
    },
    $signature: 1
  };
  A._BufferingStreamSubscription__sendError_sendError.prototype = {
    call$0() {
      var onError, t3, t4,
        t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
        return;
      t1._state = (t2 | 64) >>> 0;
      onError = t1._onError;
      t2 = this.error;
      t3 = type$.Object;
      t4 = t1._zone;
      if (type$.void_Function_Object_StackTrace._is(onError))
        t4.runBinaryGuarded$2$3(onError, t2, this.stackTrace, t3, type$.StackTrace);
      else
        t4.runUnaryGuarded$1$2(type$.void_Function_Object._as(onError), t2, t3);
      t1._state = (t1._state & 4294967231) >>> 0;
    },
    $signature: 0
  };
  A._BufferingStreamSubscription__sendDone_sendDone.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 16) === 0)
        return;
      t1._state = (t2 | 74) >>> 0;
      t1._zone.runGuarded$1(t1._onDone);
      t1._state = (t1._state & 4294967231) >>> 0;
    },
    $signature: 0
  };
  A._StreamImpl.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return this._controller._subscribe$4(t1._eval$1("~(1)?")._as(onData), onError, onDone, cancelOnError === true);
    },
    listen$1(onData) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    },
    listen$2$cancelOnError(onData, cancelOnError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, cancelOnError, null, null);
    },
    listen$2$onDone(onData, onDone) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, null);
    }
  };
  A._DelayedEvent.prototype = {
    set$next(next) {
      this.next = type$.nullable__DelayedEvent_dynamic._as(next);
    },
    get$next() {
      return this.next;
    }
  };
  A._DelayedData.prototype = {
    perform$1(dispatch) {
      this.$ti._eval$1("_EventDispatch<1>")._as(dispatch)._sendData$1(this.value);
    }
  };
  A._DelayedError.prototype = {
    perform$1(dispatch) {
      dispatch._sendError$2(this.error, this.stackTrace);
    }
  };
  A._DelayedDone.prototype = {
    perform$1(dispatch) {
      dispatch._sendDone$0();
    },
    get$next() {
      return null;
    },
    set$next(__wc0_formal) {
      throw A.wrapException(A.StateError$("No events after a done."));
    },
    $is_DelayedEvent: 1
  };
  A._PendingEvents.prototype = {
    schedule$1(dispatch) {
      var t1, _this = this;
      _this.$ti._eval$1("_EventDispatch<1>")._as(dispatch);
      t1 = _this._state;
      if (t1 === 1)
        return;
      if (t1 >= 1) {
        _this._state = 1;
        return;
      }
      A.scheduleMicrotask(new A._PendingEvents_schedule_closure(_this, dispatch));
      _this._state = 1;
    },
    add$1(_, $event) {
      var _this = this,
        lastEvent = _this.lastPendingEvent;
      if (lastEvent == null)
        _this.firstPendingEvent = _this.lastPendingEvent = $event;
      else {
        lastEvent.set$next($event);
        _this.lastPendingEvent = $event;
      }
    }
  };
  A._PendingEvents_schedule_closure.prototype = {
    call$0() {
      var t2, $event, nextEvent,
        t1 = this.$this,
        oldState = t1._state;
      t1._state = 0;
      if (oldState === 3)
        return;
      t2 = t1.$ti._eval$1("_EventDispatch<1>")._as(this.dispatch);
      $event = t1.firstPendingEvent;
      nextEvent = $event.get$next();
      t1.firstPendingEvent = nextEvent;
      if (nextEvent == null)
        t1.lastPendingEvent = null;
      $event.perform$1(t2);
    },
    $signature: 0
  };
  A._DoneStreamSubscription.prototype = {
    onData$1(handleData) {
      this.$ti._eval$1("~(1)?")._as(handleData);
    },
    pause$0() {
      var t1 = this._state;
      if (t1 >= 0)
        this._state = t1 + 2;
    },
    resume$0() {
      var _this = this,
        resumeState = _this._state - 2;
      if (resumeState < 0)
        return;
      if (resumeState === 0) {
        _this._state = 1;
        A.scheduleMicrotask(_this.get$_onMicrotask());
      } else
        _this._state = resumeState;
    },
    cancel$0() {
      this._state = -1;
      this._onDone = null;
      return $.$get$Future__nullFuture();
    },
    _onMicrotask$0() {
      var _0_0, _this = this,
        unscheduledState = _this._state - 1;
      if (unscheduledState === 0) {
        _this._state = -1;
        _0_0 = _this._onDone;
        if (_0_0 != null) {
          _this._onDone = null;
          _this._zone.runGuarded$1(_0_0);
        }
      } else
        _this._state = unscheduledState;
    },
    $isStreamSubscription: 1
  };
  A._StreamIterator.prototype = {};
  A._EmptyStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      t2 = $.Zone__current;
      t1 = new A._DoneStreamSubscription(t2, t1._eval$1("_DoneStreamSubscription<1>"));
      A.scheduleMicrotask(t1.get$_onMicrotask());
      if (onDone != null)
        t1._onDone = t2.registerCallback$1$1(onDone, type$.void);
      return t1;
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._cancelAndValue_closure.prototype = {
    call$0() {
      return this.future._complete$1(this.value);
    },
    $signature: 0
  };
  A._ForwardingStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t2, t3, t4, t5, t6, t7,
        t1 = this.$ti;
      t1._eval$1("~(2)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      t2 = $.Zone__current;
      t3 = cancelOnError === true ? 1 : 0;
      t4 = onError != null ? 32 : 0;
      t5 = A._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._rest[1]);
      t6 = A._BufferingStreamSubscription__registerErrorHandler(t2, onError);
      t7 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      t1 = new A._ForwardingStreamSubscription(this, t5, t6, t2.registerCallback$1$1(t7, type$.void), t2, t3 | t4, t1._eval$1("_ForwardingStreamSubscription<1,2>"));
      t1._subscription = this._source.listen$3$onDone$onError(t1.get$_handleData(), t1.get$_handleDone(), t1.get$_handleError());
      return t1;
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._ForwardingStreamSubscription.prototype = {
    _add$1(data) {
      this.$ti._rest[1]._as(data);
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_add(data);
    },
    _addError$2(error, stackTrace) {
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_addError(error, stackTrace);
    },
    _onPause$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.pause$0();
    },
    _onResume$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.resume$0();
    },
    _onCancel$0() {
      var subscription = this._subscription;
      if (subscription != null) {
        this._subscription = null;
        return subscription.cancel$0();
      }
      return null;
    },
    _handleData$1(data) {
      this._stream._handleData$2(this.$ti._precomputed1._as(data), this);
    },
    _handleError$2(error, stackTrace) {
      var t1;
      type$.StackTrace._as(stackTrace);
      t1 = error == null ? A._asObject(error) : error;
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._addError$2(t1, stackTrace);
    },
    _handleDone$0() {
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._close$0();
    }
  };
  A._MapStream.prototype = {
    _handleData$2(inputEvent, sink) {
      var outputEvent, e, s, exception, error, stackTrace, replacement,
        t1 = this.$ti;
      t1._precomputed1._as(inputEvent);
      t1._eval$1("_EventSink<2>")._as(sink);
      outputEvent = null;
      try {
        outputEvent = this._transform.call$1(inputEvent);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        error = e;
        stackTrace = s;
        replacement = A._interceptError(error, stackTrace);
        if (replacement != null) {
          error = replacement.error;
          stackTrace = replacement.stackTrace;
        }
        sink._addError$2(error, stackTrace);
        return;
      }
      sink._add$1(outputEvent);
    }
  };
  A._ZoneFunction.prototype = {};
  A._ZoneSpecification.prototype = {$isZoneSpecification: 1};
  A._ZoneDelegate.prototype = {$isZoneDelegate: 1};
  A._Zone.prototype = {
    _processUncaughtError$3(zone, error, stackTrace) {
      var implZone, handler, parentDelegate, parentZone, currentZone, e, s, implementation, t1, exception;
      type$.StackTrace._as(stackTrace);
      implementation = this.get$_handleUncaughtError();
      implZone = implementation.zone;
      if (implZone === B.C__RootZone) {
        A._rootHandleError(error, stackTrace);
        return;
      }
      handler = implementation.$function;
      parentDelegate = implZone.get$_parentDelegate();
      t1 = implZone.get$parent();
      t1.toString;
      parentZone = t1;
      currentZone = $.Zone__current;
      try {
        $.Zone__current = parentZone;
        handler.call$5(implZone, parentDelegate, zone, error, stackTrace);
        $.Zone__current = currentZone;
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current = currentZone;
        t1 = error === e ? stackTrace : s;
        parentZone._processUncaughtError$3(implZone, e, t1);
      }
    },
    $isZone: 1
  };
  A._CustomZone.prototype = {
    get$_delegate() {
      var t1 = this._delegateCache;
      return t1 == null ? this._delegateCache = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      return this.parent.get$_delegate();
    },
    get$errorZone() {
      return this._handleUncaughtError.zone;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        this.run$1$1(f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, A._asObject(e), type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        this.runUnary$2$2(f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, A._asObject(e), type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, $T1, $T2) {
      var e, s, exception;
      $T1._eval$1("@<0>")._bind$1($T2)._eval$1("~(1,2)")._as(f);
      $T1._as(arg1);
      $T2._as(arg2);
      try {
        this.runBinary$3$3(f, arg1, arg2, type$.void, $T1, $T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, A._asObject(e), type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._CustomZone_bindCallback_closure(this, this.registerCallback$1$1($R._eval$1("0()")._as(f), $R), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._CustomZone_bindUnaryCallback_closure(this, this.registerUnaryCallback$2$1($R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $R, $T), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._CustomZone_bindCallbackGuarded_closure(this, this.registerCallback$1$1(type$.void_Function._as(f), type$.void));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._CustomZone_bindUnaryCallbackGuarded_closure(this, this.registerUnaryCallback$2$1($T._eval$1("~(0)")._as(f), type$.void, $T), $T);
    },
    handleUncaughtError$2(error, stackTrace) {
      this._processUncaughtError$3(this, error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      var implementation = this._fork,
        t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(f);
      implementation = this._run;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      implementation = this._runUnary;
      t1 = implementation.zone;
      return implementation.$function.call$2$5(t1, t1.get$_parentDelegate(), this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, $T1, $T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f);
      $T1._as(arg1);
      $T2._as(arg2);
      implementation = this._runBinary;
      t1 = implementation.zone;
      return implementation.$function.call$3$6(t1, t1.get$_parentDelegate(), this, f, arg1, arg2, $R, $T1, $T2);
    },
    registerCallback$1$1(callback, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(callback);
      implementation = this._registerCallback;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, callback, $R);
    },
    registerUnaryCallback$2$1(callback, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(callback);
      implementation = this._registerUnaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$2$4(t1, t1.get$_parentDelegate(), this, callback, $R, $T);
    },
    registerBinaryCallback$3$1(callback, $R, $T1, $T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(callback);
      implementation = this._registerBinaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$3$4(t1, t1.get$_parentDelegate(), this, callback, $R, $T1, $T2);
    },
    errorCallback$2(error, stackTrace) {
      var implementation = this._errorCallback,
        implementationZone = implementation.zone;
      if (implementationZone === B.C__RootZone)
        return null;
      return implementation.$function.call$5(implementationZone, implementationZone.get$_parentDelegate(), this, error, stackTrace);
    },
    scheduleMicrotask$1(f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._scheduleMicrotask;
      t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, f);
    },
    createTimer$2(duration, f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._createTimer;
      t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, duration, f);
    },
    print$1(line) {
      var implementation = this._print,
        t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, line);
    },
    get$_run() {
      return this._run;
    },
    get$_runUnary() {
      return this._runUnary;
    },
    get$_runBinary() {
      return this._runBinary;
    },
    get$_registerCallback() {
      return this._registerCallback;
    },
    get$_registerUnaryCallback() {
      return this._registerUnaryCallback;
    },
    get$_registerBinaryCallback() {
      return this._registerBinaryCallback;
    },
    get$_errorCallback() {
      return this._errorCallback;
    },
    get$_scheduleMicrotask() {
      return this._scheduleMicrotask;
    },
    get$_createTimer() {
      return this._createTimer;
    },
    get$_createPeriodicTimer() {
      return this._createPeriodicTimer;
    },
    get$_print() {
      return this._print;
    },
    get$_fork() {
      return this._fork;
    },
    get$_handleUncaughtError() {
      return this._handleUncaughtError;
    },
    get$parent() {
      return this.parent;
    },
    get$_map() {
      return this._map;
    }
  };
  A._CustomZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.registered, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._CustomZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.registered, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._CustomZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.registered);
    },
    $signature: 0
  };
  A._CustomZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.registered, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A._rootHandleError_closure.prototype = {
    call$0() {
      A.Error_throwWithStackTrace(this.error, this.stackTrace);
    },
    $signature: 0
  };
  A._RootZone.prototype = {
    get$_run() {
      return B._ZoneFunction__RootZone__rootRun;
    },
    get$_runUnary() {
      return B._ZoneFunction__RootZone__rootRunUnary;
    },
    get$_runBinary() {
      return B._ZoneFunction__RootZone__rootRunBinary;
    },
    get$_registerCallback() {
      return B._ZoneFunction__RootZone__rootRegisterCallback;
    },
    get$_registerUnaryCallback() {
      return B._ZoneFunction_Xkh;
    },
    get$_registerBinaryCallback() {
      return B._ZoneFunction_e9o;
    },
    get$_errorCallback() {
      return B._ZoneFunction__RootZone__rootErrorCallback;
    },
    get$_scheduleMicrotask() {
      return B._ZoneFunction__RootZone__rootScheduleMicrotask;
    },
    get$_createTimer() {
      return B._ZoneFunction__RootZone__rootCreateTimer;
    },
    get$_createPeriodicTimer() {
      return B._ZoneFunction_PAY;
    },
    get$_print() {
      return B._ZoneFunction__RootZone__rootPrint;
    },
    get$_fork() {
      return B._ZoneFunction__RootZone__rootFork;
    },
    get$_handleUncaughtError() {
      return B._ZoneFunction_KjJ;
    },
    get$parent() {
      return null;
    },
    get$_map() {
      return $.$get$_RootZone__rootMap();
    },
    get$_delegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$errorZone() {
      return this;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$0();
          return;
        }
        A._rootRun(null, null, this, f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(A._asObject(e), type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$1(arg);
          return;
        }
        A._rootRunUnary(null, null, this, f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(A._asObject(e), type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, $T1, $T2) {
      var e, s, exception;
      $T1._eval$1("@<0>")._bind$1($T2)._eval$1("~(1,2)")._as(f);
      $T1._as(arg1);
      $T2._as(arg2);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$2(arg1, arg2);
          return;
        }
        A._rootRunBinary(null, null, this, f, arg1, arg2, type$.void, $T1, $T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(A._asObject(e), type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._RootZone_bindUnaryCallback_closure(this, $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
    },
    handleUncaughtError$2(error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      return A._rootFork(null, null, this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      $R._eval$1("0()")._as(f);
      if ($.Zone__current === B.C__RootZone)
        return f.call$0();
      return A._rootRun(null, null, this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      if ($.Zone__current === B.C__RootZone)
        return f.call$1(arg);
      return A._rootRunUnary(null, null, this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, $T1, $T2) {
      $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f);
      $T1._as(arg1);
      $T2._as(arg2);
      if ($.Zone__current === B.C__RootZone)
        return f.call$2(arg1, arg2);
      return A._rootRunBinary(null, null, this, f, arg1, arg2, $R, $T1, $T2);
    },
    registerCallback$1$1(f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    registerUnaryCallback$2$1(f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    registerBinaryCallback$3$1(f, $R, $T1, $T2) {
      return $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f);
    },
    errorCallback$2(error, stackTrace) {
      return null;
    },
    scheduleMicrotask$1(f) {
      A._rootScheduleMicrotask(null, null, this, type$.void_Function._as(f));
    },
    createTimer$2(duration, f) {
      return A.Timer__createTimer(duration, type$.void_Function._as(f));
    },
    print$1(line) {
      A.printString(line);
    }
  };
  A._RootZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.f, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._RootZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.f, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._RootZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.f);
    },
    $signature: 0
  };
  A._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.f, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A.runZonedGuarded_closure.prototype = {
    call$5($self, $parent, zone, error, stackTrace) {
      var e, s, exception, t2,
        t1 = type$.StackTrace;
      t1._as(stackTrace);
      try {
        this.parentZone.runBinary$3$3(this.onError, error, stackTrace, type$.void, type$.Object, t1);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t2 = $parent._delegationTarget;
        if (e === error)
          t2._processUncaughtError$3(zone, error, stackTrace);
        else
          t2._processUncaughtError$3(zone, A._asObject(e), t1._as(s));
      }
    },
    $signature: 55
  };
  A._HashMap.prototype = {
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    get$keys() {
      return new A._HashMapKeyIterable(this, A._instanceType(this)._eval$1("_HashMapKeyIterable<1>"));
    },
    containsKey$1(key) {
      var strings, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._strings;
        return strings == null ? false : strings[key] != null;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._nums;
        return nums == null ? false : nums[key] != null;
      } else
        return this._containsKey$1(key);
    },
    _containsKey$1(key) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(this._getBucket$2(rest, key), key) >= 0;
    },
    $index(_, key) {
      var strings, t1, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._strings;
        t1 = strings == null ? null : A._HashMap__getTableEntry(strings, key);
        return t1;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._nums;
        t1 = nums == null ? null : A._HashMap__getTableEntry(nums, key);
        return t1;
      } else
        return this._get$1(key);
    },
    _get$1(key) {
      var bucket, index,
        rest = this._collection$_rest;
      if (rest == null)
        return null;
      bucket = this._getBucket$2(rest, key);
      index = this._findBucketIndex$2(bucket, key);
      return index < 0 ? null : bucket[index + 1];
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string" && key !== "__proto__") {
        strings = _this._strings;
        _this._collection$_addHashTableEntry$3(strings == null ? _this._strings = A._HashMap__newHashTable() : strings, key, value);
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = _this._nums;
        _this._collection$_addHashTableEntry$3(nums == null ? _this._nums = A._HashMap__newHashTable() : nums, key, value);
      } else
        _this._set$2(key, value);
    },
    _set$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashMap__newHashTable();
      hash = _this._computeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null) {
        A._HashMap__setTableEntry(rest, hash, [key, value]);
        ++_this._collection$_length;
        _this._keys = null;
      } else {
        index = _this._findBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index + 1] = value;
        else {
          bucket.push(key, value);
          ++_this._collection$_length;
          _this._keys = null;
        }
      }
    },
    forEach$1(_, action) {
      var keys, $length, t2, i, key, t3, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1,2)")._as(action);
      keys = _this._computeKeys$0();
      for ($length = keys.length, t2 = t1._precomputed1, t1 = t1._rest[1], i = 0; i < $length; ++i) {
        key = keys[i];
        t2._as(key);
        t3 = _this.$index(0, key);
        action.call$2(key, t3 == null ? t1._as(t3) : t3);
        if (keys !== _this._keys)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _computeKeys$0() {
      var strings, index, names, entries, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._keys;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._strings;
      index = 0;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      }
      nums = _this._nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_rest;
      if (rest != null) {
        names = Object.getOwnPropertyNames(rest);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          bucket = rest[names[i]];
          $length = bucket.length;
          for (i0 = 0; i0 < $length; i0 += 2) {
            result[index] = bucket[i0];
            ++index;
          }
        }
      }
      return _this._keys = result;
    },
    _collection$_addHashTableEntry$3(table, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (table[key] == null) {
        ++this._collection$_length;
        this._keys = null;
      }
      A._HashMap__setTableEntry(table, key, value);
    },
    _computeHashCode$1(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    _getBucket$2(table, key) {
      return table[this._computeHashCode$1(key)];
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2)
        if (J.$eq$(bucket[i], key))
          return i;
      return -1;
    },
    $isHashMap: 1
  };
  A._IdentityHashMap.prototype = {
    _computeHashCode$1(key) {
      return A.objectHashCode(key) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i, t1;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2) {
        t1 = bucket[i];
        if (t1 == null ? key == null : t1 === key)
          return i;
      }
      return -1;
    }
  };
  A._CustomHashMap.prototype = {
    $index(_, key) {
      if (!this._validKey.call$1(key))
        return null;
      return this.super$_HashMap$_get(key);
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      this.super$_HashMap$_set(t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(key) {
      if (!this._validKey.call$1(key))
        return false;
      return this.super$_HashMap$_containsKey(key);
    },
    _computeHashCode$1(key) {
      return this._hashCode.call$1(this.$ti._precomputed1._as(key)) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, t1, t2, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (t1 = this.$ti._precomputed1, t2 = this._equals, i = 0; i < $length; i += 2)
        if (t2.call$2(bucket[i], t1._as(key)))
          return i;
      return -1;
    }
  };
  A._CustomHashMap_closure.prototype = {
    call$1(v) {
      return this.K._is(v);
    },
    $signature: 15
  };
  A._HashMapKeyIterable.prototype = {
    get$length(_) {
      return this._collection$_map._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_map._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_map._collection$_length !== 0;
    },
    get$iterator(_) {
      var t1 = this._collection$_map;
      return new A._HashMapKeyIterator(t1, t1._computeKeys$0(), this.$ti._eval$1("_HashMapKeyIterator<1>"));
    },
    contains$1(_, element) {
      return this._collection$_map.containsKey$1(element);
    }
  };
  A._HashMapKeyIterator.prototype = {
    get$current() {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        keys = _this._keys,
        offset = _this._offset,
        t1 = _this._collection$_map;
      if (keys !== t1._keys)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= keys.length) {
        _this._collection$_current = null;
        return false;
      } else {
        _this._collection$_current = keys[offset];
        _this._offset = offset + 1;
        return true;
      }
    },
    $isIterator: 1
  };
  A._LinkedCustomHashMap.prototype = {
    $index(_, key) {
      if (!this._validKey.call$1(key))
        return null;
      return this.super$JsLinkedHashMap$internalGet(key);
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      this.super$JsLinkedHashMap$internalSet(t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(key) {
      if (!this._validKey.call$1(key))
        return false;
      return this.super$JsLinkedHashMap$internalContainsKey(key);
    },
    remove$1(_, key) {
      if (!this._validKey.call$1(key))
        return null;
      return this.super$JsLinkedHashMap$internalRemove(key);
    },
    internalComputeHashCode$1(key) {
      return this._hashCode.call$1(this.$ti._precomputed1._as(key)) & 1073741823;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, t1, t2, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (t1 = this.$ti._precomputed1, t2 = this._equals, i = 0; i < $length; ++i)
        if (t2.call$2(t1._as(bucket[i].hashMapCellKey), t1._as(key)))
          return i;
      return -1;
    }
  };
  A._LinkedCustomHashMap_closure.prototype = {
    call$1(v) {
      return this.K._is(v);
    },
    $signature: 15
  };
  A._HashSet.prototype = {
    get$iterator(_) {
      return new A._HashSetIterator(this, this._computeElements$0(), A._instanceType(this)._eval$1("_HashSetIterator<1>"));
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._strings;
        return strings == null ? false : strings[object] != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._nums;
        return nums == null ? false : nums[object] != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._strings = A._HashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._nums = A._HashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(element);
    },
    _collection$_add$1(element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [element];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(element);
      }
      ++_this._collection$_length;
      _this._collection$_elements = null;
      return true;
    },
    remove$1(_, object) {
      var _this = this;
      if (typeof object == "string" && object !== "__proto__")
        return _this._collection$_removeHashTableEntry$2(_this._strings, object);
      else if (typeof object == "number" && (object & 1073741823) === object)
        return _this._collection$_removeHashTableEntry$2(_this._nums, object);
      else
        return _this._remove$1(object);
    },
    _remove$1(object) {
      var hash, bucket, index, _this = this,
        rest = _this._collection$_rest;
      if (rest == null)
        return false;
      hash = _this._computeHashCode$1(object);
      bucket = rest[hash];
      index = _this._findBucketIndex$2(bucket, object);
      if (index < 0)
        return false;
      --_this._collection$_length;
      _this._collection$_elements = null;
      bucket.splice(index, 1);
      if (0 === bucket.length)
        delete rest[hash];
      return true;
    },
    _computeElements$0() {
      var strings, index, names, entries, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._collection$_elements;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._strings;
      index = 0;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      }
      nums = _this._nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_rest;
      if (rest != null) {
        names = Object.getOwnPropertyNames(rest);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          bucket = rest[names[i]];
          $length = bucket.length;
          for (i0 = 0; i0 < $length; ++i0) {
            result[index] = bucket[i0];
            ++index;
          }
        }
      }
      return _this._collection$_elements = result;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (table[element] != null)
        return false;
      table[element] = 0;
      ++this._collection$_length;
      this._collection$_elements = null;
      return true;
    },
    _collection$_removeHashTableEntry$2(table, element) {
      if (table != null && table[element] != null) {
        delete table[element];
        --this._collection$_length;
        this._collection$_elements = null;
        return true;
      } else
        return false;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i], element))
          return i;
      return -1;
    }
  };
  A._HashSetIterator.prototype = {
    get$current() {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        elements = _this._collection$_elements,
        offset = _this._offset,
        t1 = _this._set;
      if (elements !== t1._collection$_elements)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= elements.length) {
        _this._collection$_current = null;
        return false;
      } else {
        _this._collection$_current = elements[offset];
        _this._offset = offset + 1;
        return true;
      }
    },
    $isIterator: 1
  };
  A._LinkedHashSet.prototype = {
    get$iterator(_) {
      var _this = this,
        t1 = new A._LinkedHashSetIterator(_this, _this._collection$_modifications, A._instanceType(_this)._eval$1("_LinkedHashSetIterator<1>"));
      t1._collection$_cell = _this._collection$_first;
      return t1;
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._strings;
        if (strings == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(strings[object]) != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._nums;
        if (nums == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(nums[object]) != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    get$first(_) {
      var first = this._collection$_first;
      if (first == null)
        throw A.wrapException(A.StateError$("No elements"));
      return A._instanceType(this)._precomputed1._as(first._element);
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._strings = A._LinkedHashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._nums = A._LinkedHashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(element);
    },
    _collection$_add$1(element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._LinkedHashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [_this._collection$_newLinkedCell$1(element)];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(_this._collection$_newLinkedCell$1(element));
      }
      return true;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (type$.nullable__LinkedHashSetCell._as(table[element]) != null)
        return false;
      table[element] = this._collection$_newLinkedCell$1(element);
      return true;
    },
    _collection$_newLinkedCell$1(element) {
      var _this = this,
        cell = new A._LinkedHashSetCell(A._instanceType(_this)._precomputed1._as(element));
      if (_this._collection$_first == null)
        _this._collection$_first = _this._collection$_last = cell;
      else
        _this._collection$_last = _this._collection$_last._collection$_next = cell;
      ++_this._collection$_length;
      _this._collection$_modifications = _this._collection$_modifications + 1 & 1073741823;
      return cell;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i]._element, element))
          return i;
      return -1;
    }
  };
  A._LinkedHashSetCell.prototype = {};
  A._LinkedHashSetIterator.prototype = {
    get$current() {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        cell = _this._collection$_cell,
        t1 = _this._set;
      if (_this._collection$_modifications !== t1._collection$_modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (cell == null) {
        _this._collection$_current = null;
        return false;
      } else {
        _this._collection$_current = _this.$ti._eval$1("1?")._as(cell._element);
        _this._collection$_cell = cell._collection$_next;
        return true;
      }
    },
    $isIterator: 1
  };
  A.UnmodifiableListView.prototype = {
    cast$1$0(_, $R) {
      return new A.UnmodifiableListView(J.cast$1$0$ax(this._collection$_source, $R), $R._eval$1("UnmodifiableListView<0>"));
    },
    get$length(_) {
      return J.get$length$asx(this._collection$_source);
    },
    $index(_, index) {
      return J.elementAt$1$ax(this._collection$_source, index);
    }
  };
  A.LinkedHashMap_LinkedHashMap$from_closure.prototype = {
    call$2(k, v) {
      this.result.$indexSet(0, this.K._as(k), this.V._as(v));
    },
    $signature: 24
  };
  A.ListBase.prototype = {
    get$iterator(receiver) {
      return new A.ListIterator(receiver, this.get$length(receiver), A.instanceType(receiver)._eval$1("ListIterator<ListBase.E>"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    get$isEmpty(receiver) {
      return this.get$length(receiver) === 0;
    },
    get$isNotEmpty(receiver) {
      return !this.get$isEmpty(receiver);
    },
    get$first(receiver) {
      if (this.get$length(receiver) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.$index(receiver, 0);
    },
    contains$1(receiver, element) {
      var i,
        $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(this.$index(receiver, i), element))
          return true;
        if ($length !== this.get$length(receiver))
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    map$1$1(receiver, f, $T) {
      var t1 = A.instanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(ListBase.E)")._as(f), t1._eval$1("@<ListBase.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(receiver, f) {
      return this.map$1$1(receiver, f, type$.dynamic);
    },
    skip$1(receiver, count) {
      return A.SubListIterable$(receiver, count, null, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    take$1(receiver, count) {
      return A.SubListIterable$(receiver, 0, A.checkNotNullable(count, "count", type$.int), A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    toList$1$growable(receiver, growable) {
      var t1, first, result, i, _this = this;
      if (_this.get$isEmpty(receiver)) {
        t1 = J.JSArray_JSArray$growable(0, A.instanceType(receiver)._eval$1("ListBase.E"));
        return t1;
      }
      first = _this.$index(receiver, 0);
      result = A.List_List$filled(_this.get$length(receiver), first, true, A.instanceType(receiver)._eval$1("ListBase.E"));
      for (i = 1; i < _this.get$length(receiver); ++i)
        B.JSArray_methods.$indexSet(result, i, _this.$index(receiver, i));
      return result;
    },
    toList$0(receiver) {
      return this.toList$1$growable(receiver, true);
    },
    add$1(receiver, element) {
      var t1;
      A.instanceType(receiver)._eval$1("ListBase.E")._as(element);
      t1 = this.get$length(receiver);
      this.set$length(receiver, t1 + 1);
      this.$indexSet(receiver, t1, element);
    },
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A.instanceType(receiver)._eval$1("@<ListBase.E>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    sort$1(receiver, compare) {
      var t2,
        t1 = A.instanceType(receiver);
      t1._eval$1("int(ListBase.E,ListBase.E)?")._as(compare);
      t2 = compare == null ? A.collection_ListBase__compareAny$closure() : compare;
      A.Sort__doSort(receiver, 0, this.get$length(receiver) - 1, t2, t1._eval$1("ListBase.E"));
    },
    sublist$2(receiver, start, end) {
      var t1,
        listLength = this.get$length(receiver);
      if (end == null)
        end = listLength;
      A.RangeError_checkValidRange(start, end, listLength);
      t1 = A.List_List$_of(this.getRange$2(receiver, start, end), A.instanceType(receiver)._eval$1("ListBase.E"));
      return t1;
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      return A.SubListIterable$(receiver, start, end, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    fillRange$3(receiver, start, end, fill) {
      var value, i,
        t1 = A.instanceType(receiver);
      t1._eval$1("ListBase.E?")._as(fill);
      value = fill == null ? t1._eval$1("ListBase.E")._as(fill) : fill;
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      for (i = start; i < end; ++i)
        this.$indexSet(receiver, i, value);
    },
    setRange$4(receiver, start, end, iterable, skipCount) {
      var $length, otherStart, otherList, t1, i;
      A.instanceType(receiver)._eval$1("Iterable<ListBase.E>")._as(iterable);
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      $length = end - start;
      if ($length === 0)
        return;
      A.RangeError_checkNotNegative(skipCount, "skipCount");
      if (type$.List_dynamic._is(iterable)) {
        otherStart = skipCount;
        otherList = iterable;
      } else {
        otherList = J.skip$1$ax(iterable, skipCount).toList$1$growable(0, false);
        otherStart = 0;
      }
      t1 = J.getInterceptor$asx(otherList);
      if (otherStart + $length > t1.get$length(otherList))
        throw A.wrapException(A.IterableElementError_tooFew());
      if (otherStart < start)
        for (i = $length - 1; i >= 0; --i)
          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
      else
        for (i = 0; i < $length; ++i)
          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
    },
    toString$0(receiver) {
      return A.Iterable_iterableToFullString(receiver, "[", "]");
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.MapBase.prototype = {
    cast$2$0(_, $RK, $RV) {
      var t1 = A._instanceType(this);
      return A.Map_castFrom(this, t1._eval$1("MapBase.K"), t1._eval$1("MapBase.V"), $RK, $RV);
    },
    forEach$1(_, action) {
      var t2, key, t3,
        t1 = A._instanceType(this);
      t1._eval$1("~(MapBase.K,MapBase.V)")._as(action);
      for (t2 = this.get$keys(), t2 = t2.get$iterator(t2), t1 = t1._eval$1("MapBase.V"); t2.moveNext$0();) {
        key = t2.get$current();
        t3 = this.$index(0, key);
        action.call$2(key, t3 == null ? t1._as(t3) : t3);
      }
    },
    map$2$1(_, transform, $K2, $V2) {
      var result, t2, key, t3, entry,
        t1 = A._instanceType(this);
      t1._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(MapBase.K,MapBase.V)")._as(transform);
      result = A.LinkedHashMap_LinkedHashMap$_empty($K2, $V2);
      for (t2 = this.get$keys(), t2 = t2.get$iterator(t2), t1 = t1._eval$1("MapBase.V"); t2.moveNext$0();) {
        key = t2.get$current();
        t3 = this.$index(0, key);
        entry = transform.call$2(key, t3 == null ? t1._as(t3) : t3);
        result.$indexSet(0, entry.key, entry.value);
      }
      return result;
    },
    map$1(_, transform) {
      var t1 = type$.dynamic;
      return this.map$2$1(0, transform, t1, t1);
    },
    containsKey$1(key) {
      return this.get$keys().contains$1(0, key);
    },
    get$length(_) {
      var t1 = this.get$keys();
      return t1.get$length(t1);
    },
    get$isEmpty(_) {
      var t1 = this.get$keys();
      return t1.get$isEmpty(t1);
    },
    get$isNotEmpty(_) {
      var t1 = this.get$keys();
      return t1.get$isNotEmpty(t1);
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    $isMap: 1
  };
  A.MapBase_mapToString_closure.prototype = {
    call$2(k, v) {
      var t2,
        t1 = this._box_0;
      if (!t1.first)
        this.result._contents += ", ";
      t1.first = false;
      t1 = this.result;
      t2 = A.S(k);
      t1._contents = (t1._contents += t2) + ": ";
      t2 = A.S(v);
      t1._contents += t2;
    },
    $signature: 25
  };
  A._UnmodifiableMapMixin.prototype = {
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable map"));
    }
  };
  A.MapView.prototype = {
    cast$2$0(_, $RK, $RV) {
      return this._collection$_map.cast$2$0(0, $RK, $RV);
    },
    $index(_, key) {
      return this._collection$_map.$index(0, key);
    },
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      this._collection$_map.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(key) {
      return this._collection$_map.containsKey$1(key);
    },
    forEach$1(_, action) {
      this._collection$_map.forEach$1(0, A._instanceType(this)._eval$1("~(1,2)")._as(action));
    },
    get$isEmpty(_) {
      var t1 = this._collection$_map;
      return t1.get$isEmpty(t1);
    },
    get$isNotEmpty(_) {
      var t1 = this._collection$_map;
      return t1.get$isNotEmpty(t1);
    },
    get$length(_) {
      var t1 = this._collection$_map;
      return t1.get$length(t1);
    },
    get$keys() {
      return this._collection$_map.get$keys();
    },
    toString$0(_) {
      return this._collection$_map.toString$0(0);
    },
    map$2$1(_, transform, $K2, $V2) {
      return this._collection$_map.map$2$1(0, A._instanceType(this)._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), $K2, $V2);
    },
    map$1(_, transform) {
      var t1 = type$.dynamic;
      return this.map$2$1(0, transform, t1, t1);
    },
    $isMap: 1
  };
  A.UnmodifiableMapView.prototype = {
    cast$2$0(_, $RK, $RV) {
      return new A.UnmodifiableMapView(this._collection$_map.cast$2$0(0, $RK, $RV), $RK._eval$1("@<0>")._bind$1($RV)._eval$1("UnmodifiableMapView<1,2>"));
    }
  };
  A.ListQueue.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A._ListQueueIterator(_this, _this._tail, _this._modificationCount, _this._head, _this.$ti._eval$1("_ListQueueIterator<1>"));
    },
    get$isEmpty(_) {
      return this._head === this._tail;
    },
    get$length(_) {
      return (this._tail - this._head & this._table.length - 1) >>> 0;
    },
    get$first(_) {
      var t2, _this = this,
        t1 = _this._head;
      if (t1 === _this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      t2 = _this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      t1 = t2[t1];
      return t1 == null ? _this.$ti._precomputed1._as(t1) : t1;
    },
    elementAt$1(_, index) {
      var t2, t3, _this = this,
        t1 = _this.get$length(0);
      if (0 > index || index >= t1)
        A.throwExpression(A.IndexError$withLength(index, t1, _this, null, "index"));
      t1 = _this._table;
      t2 = t1.length;
      t3 = (_this._head + index & t2 - 1) >>> 0;
      if (!(t3 >= 0 && t3 < t2))
        return A.ioore(t1, t3);
      t3 = t1[t3];
      return t3 == null ? _this.$ti._precomputed1._as(t3) : t3;
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    removeFirst$0() {
      var t2, result, _this = this,
        t1 = _this._head;
      if (t1 === _this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      ++_this._modificationCount;
      t2 = _this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      result = t2[t1];
      if (result == null)
        result = _this.$ti._precomputed1._as(result);
      B.JSArray_methods.$indexSet(t2, t1, null);
      _this._head = (_this._head + 1 & _this._table.length - 1) >>> 0;
      return result;
    },
    removeLast$0(_) {
      var t3, result, _this = this,
        t1 = _this._head,
        t2 = _this._tail;
      if (t1 === t2)
        throw A.wrapException(A.IterableElementError_noElement());
      ++_this._modificationCount;
      t1 = _this._table;
      t3 = t1.length;
      t2 = (t2 - 1 & t3 - 1) >>> 0;
      _this._tail = t2;
      if (!(t2 >= 0 && t2 < t3))
        return A.ioore(t1, t2);
      result = t1[t2];
      if (result == null)
        result = _this.$ti._precomputed1._as(result);
      B.JSArray_methods.$indexSet(t1, t2, null);
      return result;
    },
    _collection$_add$1(element) {
      var t2, t3, newTable, split, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(element);
      B.JSArray_methods.$indexSet(_this._table, _this._tail, element);
      t2 = _this._tail;
      t3 = _this._table.length;
      t2 = (t2 + 1 & t3 - 1) >>> 0;
      _this._tail = t2;
      if (_this._head === t2) {
        newTable = A.List_List$filled(t3 * 2, null, false, t1._eval$1("1?"));
        t1 = _this._table;
        t2 = _this._head;
        split = t1.length - t2;
        B.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
        B.JSArray_methods.setRange$4(newTable, split, split + _this._head, _this._table, 0);
        _this._head = 0;
        _this._tail = _this._table.length;
        _this._table = newTable;
      }
      ++_this._modificationCount;
    },
    $isQueue: 1
  };
  A._ListQueueIterator.prototype = {
    get$current() {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t2, t3, _this = this,
        t1 = _this._queue;
      if (_this._modificationCount !== t1._modificationCount)
        A.throwExpression(A.ConcurrentModificationError$(t1));
      t2 = _this._position;
      if (t2 === _this._end) {
        _this._collection$_current = null;
        return false;
      }
      t1 = t1._table;
      t3 = t1.length;
      if (!(t2 < t3))
        return A.ioore(t1, t2);
      _this._collection$_current = t1[t2];
      _this._position = (t2 + 1 & t3 - 1) >>> 0;
      return true;
    },
    $isIterator: 1
  };
  A.SetBase.prototype = {
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$isNotEmpty(_) {
      return this.get$length(this) !== 0;
    },
    addAll$1(_, elements) {
      var t1;
      A._instanceType(this)._eval$1("Iterable<1>")._as(elements);
      for (t1 = elements.get$iterator(elements); t1.moveNext$0();)
        this.add$1(0, t1.get$current());
    },
    containsAll$1(other) {
      var t1, t2, o;
      for (t1 = other._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1), t2 = t1.$ti._precomputed1; t1.moveNext$0();) {
        o = t1._collection$_current;
        if (!this.contains$1(0, o == null ? t2._as(o) : o))
          return false;
      }
      return true;
    },
    map$1$1(_, f, $T) {
      var t1 = A._instanceType(this);
      return new A.EfficientLengthMappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1(_, f) {
      return this.map$1$1(0, f, type$.dynamic);
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    take$1(_, n) {
      return A.TakeIterable_TakeIterable(this, n, A._instanceType(this)._precomputed1);
    },
    skip$1(_, n) {
      return A.SkipIterable_SkipIterable(this, n, A._instanceType(this)._precomputed1);
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current();
    },
    elementAt$1(_, index) {
      var iterator, skipCount;
      A.RangeError_checkNotNegative(index, "index");
      iterator = this.get$iterator(this);
      for (skipCount = index; iterator.moveNext$0();) {
        if (skipCount === 0)
          return iterator.get$current();
        --skipCount;
      }
      throw A.wrapException(A.IndexError$withLength(index, index - skipCount, this, null, "index"));
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isSet: 1
  };
  A._SetBase.prototype = {};
  A._SplayTreeNode.prototype = {
    set$_left(_left) {
      this._left = this.$ti._eval$1("_SplayTreeNode.1?")._as(_left);
    },
    set$_right(_right) {
      this._right = this.$ti._eval$1("_SplayTreeNode.1?")._as(_right);
    }
  };
  A._SplayTreeSetNode.prototype = {};
  A._SplayTree.prototype = {
    _splay$1(key) {
      var root, compare, comparison, current, newTreeLeft, left, newTreeRight, right, currentLeft, currentLeft0, currentRight, currentRight0, _this = this, _null = null;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      root = _this._root;
      if (root == null) {
        _this._compare.call$2(key, key);
        return -1;
      }
      compare = _this._compare;
      for (comparison = _null, current = root, newTreeLeft = comparison, left = newTreeLeft, newTreeRight = left, right = newTreeRight;;) {
        comparison = compare.call$2(current.key, key);
        if (comparison > 0) {
          currentLeft = current._left;
          if (currentLeft == null)
            break;
          comparison = compare.call$2(currentLeft.key, key);
          if (comparison > 0) {
            current.set$_left(currentLeft._right);
            currentLeft.set$_right(current);
            currentLeft0 = currentLeft._left;
            if (currentLeft0 == null) {
              current = currentLeft;
              break;
            }
            current = currentLeft;
            currentLeft = currentLeft0;
          }
          if (right == null)
            newTreeRight = current;
          else
            right.set$_left(current);
          right = current;
          current = currentLeft;
        } else {
          if (comparison < 0) {
            currentRight = current._right;
            if (currentRight == null)
              break;
            comparison = compare.call$2(currentRight.key, key);
            if (comparison < 0) {
              current.set$_right(currentRight._left);
              currentRight.set$_left(current);
              currentRight0 = currentRight._right;
              if (currentRight0 == null) {
                current = currentRight;
                break;
              }
              current = currentRight;
              currentRight = currentRight0;
            }
            if (left == null)
              newTreeLeft = current;
            else
              left.set$_right(current);
          } else
            break;
          left = current;
          current = currentRight;
        }
      }
      if (left != null) {
        left.set$_right(current._left);
        current.set$_left(newTreeLeft);
      }
      if (right != null) {
        right.set$_left(current._right);
        current.set$_right(newTreeRight);
      }
      if (_this._root !== current) {
        _this._root = current;
        ++_this._splayCount;
      }
      return comparison;
    },
    _splayMin$1(node) {
      var current, modified, left;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      for (current = node, modified = 0;; current = left, modified = 1) {
        left = current._left;
        if (left != null) {
          current.set$_left(left._right);
          left.set$_right(current);
        } else
          break;
      }
      this._splayCount += modified;
      return current;
    },
    _splayMax$1(node) {
      var current, modified, right;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      for (current = node, modified = 0;; current = right, modified = 1) {
        right = current._right;
        if (right != null) {
          current.set$_right(right._left);
          right.set$_left(current);
        } else
          break;
      }
      this._splayCount += modified;
      return current;
    },
    _untypedLookup$1(key) {
      if (!this.$ti._eval$1("_SplayTree.K")._is(key))
        return null;
      if (this._splay$1(key) === 0)
        return this._root;
      return null;
    }
  };
  A._SplayTreeIterator.prototype = {
    get$current() {
      var t1 = this._path;
      if (t1.length === 0) {
        this.$ti._eval$1("_SplayTreeIterator.T")._as(null);
        return null;
      }
      return this.$ti._rest[1]._as(B.JSArray_methods.get$last(t1)).key;
    },
    _rebuildPath$1(key) {
      var t1, t2, t3, _this = this;
      _this.$ti._eval$1("_SplayTreeIterator.K")._as(key);
      t1 = _this._path;
      B.JSArray_methods.clear$0(t1);
      t2 = _this._tree;
      if (t2._splay$1(key) === 0) {
        t3 = t2._root;
        t3.toString;
        B.JSArray_methods.add$1(t1, t3);
        _this._splayCount = t2._splayCount;
        return;
      }
      throw A.wrapException(A.ConcurrentModificationError$(_this));
    },
    moveNext$0() {
      var node, next, _this = this,
        t1 = _this._modificationCount,
        t2 = _this._tree,
        t3 = t2._modificationCount;
      if (t1 !== t3) {
        if (t1 == null) {
          _this._modificationCount = t3;
          node = t2._root;
          for (t1 = _this._path; node != null;) {
            B.JSArray_methods.add$1(t1, node);
            node = node._left;
          }
          return t1.length !== 0;
        }
        throw A.wrapException(A.ConcurrentModificationError$(t2));
      }
      t1 = _this._path;
      if (t1.length === 0)
        return false;
      if (_this._splayCount !== t2._splayCount)
        _this._rebuildPath$1(B.JSArray_methods.get$last(t1).key);
      node = B.JSArray_methods.get$last(t1);
      next = node._right;
      if (next != null) {
        while (next != null) {
          B.JSArray_methods.add$1(t1, next);
          next = next._left;
        }
        return true;
      }
      if (0 >= t1.length)
        return A.ioore(t1, -1);
      t1.pop();
      for (;;) {
        if (!(t1.length !== 0 && B.JSArray_methods.get$last(t1)._right === node))
          break;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        node = t1.pop();
      }
      return t1.length !== 0;
    },
    $isIterator: 1
  };
  A._SplayTreeKeyIterator.prototype = {};
  A.SplayTreeSet.prototype = {
    get$iterator(_) {
      var t1 = this.$ti;
      return new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("_SplayTreeKeyIterator<1,_SplayTreeSetNode<1>>"));
    },
    get$length(_) {
      return this._count;
    },
    get$isEmpty(_) {
      return this._root == null;
    },
    get$isNotEmpty(_) {
      return this._root != null;
    },
    get$first(_) {
      var t1,
        root = this._root;
      if (root == null)
        throw A.wrapException(A.IterableElementError_noElement());
      t1 = this._splayMin$1(root);
      this._root = t1;
      return t1.key;
    },
    contains$1(_, element) {
      return this._untypedLookup$1(element) != null;
    },
    add$1(_, element) {
      return this._collection$_add$1(this.$ti._precomputed1._as(element));
    },
    _collection$_add$1(element) {
      var compare, root, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(element);
      compare = _this._splay$1(element);
      if (compare === 0)
        return false;
      t1 = t1._eval$1("_SplayTree.1")._as(new A._SplayTreeSetNode(element, t1._eval$1("_SplayTreeSetNode<1>")));
      root = _this._root;
      if (root != null)
        if (compare < 0) {
          t1.set$_left(root);
          t1.set$_right(root._right);
          root.set$_right(null);
        } else {
          t1.set$_right(root);
          t1.set$_left(root._left);
          root.set$_left(null);
        }
      ++_this._modificationCount;
      ++_this._count;
      _this._root = t1;
      return true;
    },
    remove$1(_, object) {
      var root, left, right, t1, _this = this;
      if (_this._untypedLookup$1(object) == null)
        return false;
      root = _this._root;
      left = root._left;
      right = root._right;
      if (left == null)
        _this._root = right;
      else if (right == null)
        _this._root = left;
      else {
        t1 = _this._splayMax$1(left);
        t1.set$_right(right);
        _this._root = t1;
      }
      --_this._count;
      ++_this._modificationCount;
      return true;
    },
    addAll$1(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(this.$ti._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this._collection$_add$1(t1.get$current());
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    $isEfficientLengthIterable: 1,
    $isSet: 1
  };
  A._SplayTreeSet__SplayTree_Iterable.prototype = {};
  A._SplayTreeSet__SplayTree_Iterable_SetMixin.prototype = {};
  A._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
  A._JsonMap.prototype = {
    $index(_, key) {
      var result,
        t1 = this._processed;
      if (t1 == null)
        return this._convert$_data.$index(0, key);
      else if (typeof key != "string")
        return null;
      else {
        result = t1[key];
        return typeof result == "undefined" ? this._process$1(key) : result;
      }
    },
    get$length(_) {
      return this._processed == null ? this._convert$_data.__js_helper$_length : this._convert$_computeKeys$0().length;
    },
    get$isEmpty(_) {
      return this.get$length(0) === 0;
    },
    get$isNotEmpty(_) {
      return this.get$length(0) > 0;
    },
    get$keys() {
      if (this._processed == null) {
        var t1 = this._convert$_data;
        return new A.LinkedHashMapKeysIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>"));
      }
      return new A._JsonMapKeyIterable(this);
    },
    $indexSet(_, key, value) {
      var processed, original, _this = this;
      A._asString(key);
      if (_this._processed == null)
        _this._convert$_data.$indexSet(0, key, value);
      else if (_this.containsKey$1(key)) {
        processed = _this._processed;
        processed[key] = value;
        original = _this._original;
        if (original == null ? processed != null : original !== processed)
          original[key] = null;
      } else
        _this._upgrade$0().$indexSet(0, key, value);
    },
    containsKey$1(key) {
      if (this._processed == null)
        return this._convert$_data.containsKey$1(key);
      if (typeof key != "string")
        return false;
      return Object.prototype.hasOwnProperty.call(this._original, key);
    },
    forEach$1(_, f) {
      var keys, i, key, value, _this = this;
      type$.void_Function_String_dynamic._as(f);
      if (_this._processed == null)
        return _this._convert$_data.forEach$1(0, f);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; i < keys.length; ++i) {
        key = keys[i];
        value = _this._processed[key];
        if (typeof value == "undefined") {
          value = A._convertJsonToDartLazy(_this._original[key]);
          _this._processed[key] = value;
        }
        f.call$2(key, value);
        if (keys !== _this._convert$_data)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _convert$_computeKeys$0() {
      var keys = type$.nullable_List_dynamic._as(this._convert$_data);
      if (keys == null)
        keys = this._convert$_data = A._setArrayType(Object.keys(this._original), type$.JSArray_String);
      return keys;
    },
    _upgrade$0() {
      var result, keys, i, t1, key, _this = this;
      if (_this._processed == null)
        return _this._convert$_data;
      result = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; t1 = keys.length, i < t1; ++i) {
        key = keys[i];
        result.$indexSet(0, key, _this.$index(0, key));
      }
      if (t1 === 0)
        B.JSArray_methods.add$1(keys, "");
      else
        B.JSArray_methods.clear$0(keys);
      _this._original = _this._processed = null;
      return _this._convert$_data = result;
    },
    _process$1(key) {
      var result;
      if (!Object.prototype.hasOwnProperty.call(this._original, key))
        return null;
      result = A._convertJsonToDartLazy(this._original[key]);
      return this._processed[key] = result;
    }
  };
  A._JsonMapKeyIterable.prototype = {
    get$length(_) {
      return this._parent.get$length(0);
    },
    elementAt$1(_, index) {
      var t1 = this._parent;
      if (t1._processed == null)
        t1 = t1.get$keys().elementAt$1(0, index);
      else {
        t1 = t1._convert$_computeKeys$0();
        if (!(index >= 0 && index < t1.length))
          return A.ioore(t1, index);
        t1 = t1[index];
      }
      return t1;
    },
    get$iterator(_) {
      var t1 = this._parent;
      if (t1._processed == null) {
        t1 = t1.get$keys();
        t1 = t1.get$iterator(t1);
      } else {
        t1 = t1._convert$_computeKeys$0();
        t1 = new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
      }
      return t1;
    },
    contains$1(_, key) {
      return this._parent.containsKey$1(key);
    }
  };
  A._Utf8Decoder__decoder_closure.prototype = {
    call$0() {
      var t1, exception;
      try {
        t1 = new TextDecoder("utf-8", {fatal: true});
        return t1;
      } catch (exception) {
      }
      return null;
    },
    $signature: 26
  };
  A._Utf8Decoder__decoderNonfatal_closure.prototype = {
    call$0() {
      var t1, exception;
      try {
        t1 = new TextDecoder("utf-8", {fatal: false});
        return t1;
      } catch (exception) {
      }
      return null;
    },
    $signature: 26
  };
  A.AsciiCodec.prototype = {
    encode$1(source) {
      return B.AsciiEncoder_127.convert$1(source);
    },
    decode$1(bytes) {
      var t1;
      type$.List_int._as(bytes);
      t1 = B.AsciiDecoder_false_127.convert$1(bytes);
      return t1;
    }
  };
  A._UnicodeSubsetEncoder.prototype = {
    convert$1(string) {
      var stringLength, end, result, t1, i, codeUnit;
      A._asString(string);
      stringLength = string.length;
      end = A.RangeError_checkValidRange(0, null, stringLength);
      result = new Uint8Array(end);
      for (t1 = ~this._subsetMask, i = 0; i < end; ++i) {
        if (!(i < stringLength))
          return A.ioore(string, i);
        codeUnit = string.charCodeAt(i);
        if ((codeUnit & t1) !== 0)
          throw A.wrapException(A.ArgumentError$value(string, "string", "Contains invalid characters."));
        if (!(i < end))
          return A.ioore(result, i);
        result[i] = codeUnit;
      }
      return result;
    }
  };
  A.AsciiEncoder.prototype = {};
  A._UnicodeSubsetDecoder.prototype = {
    convert$1(bytes) {
      var t1, end, t2, i, byte;
      type$.List_int._as(bytes);
      t1 = J.getInterceptor$asx(bytes);
      end = A.RangeError_checkValidRange(0, null, t1.get$length(bytes));
      for (t2 = ~this._subsetMask, i = 0; i < end; ++i) {
        byte = t1.$index(bytes, i);
        if ((byte & t2) >>> 0 !== 0) {
          if (!this._allowInvalid)
            throw A.wrapException(A.FormatException$("Invalid value in input: " + byte, null, null));
          return this._convertInvalid$3(bytes, 0, end);
        }
      }
      return A.String_String$fromCharCodes(bytes, 0, end);
    },
    _convertInvalid$3(bytes, start, end) {
      var t1, t2, i, t3, value;
      type$.List_int._as(bytes);
      for (t1 = ~this._subsetMask, t2 = J.getInterceptor$asx(bytes), i = start, t3 = ""; i < end; ++i) {
        value = t2.$index(bytes, i);
        t3 += A.Primitives_stringFromCharCode((value & t1) >>> 0 !== 0 ? 65533 : value);
      }
      return t3.charCodeAt(0) == 0 ? t3 : t3;
    }
  };
  A.AsciiDecoder.prototype = {};
  A.Base64Codec.prototype = {
    get$encoder() {
      return B.C_Base64Encoder;
    },
    normalize$3(source, start, end) {
      var inverseAlphabet, t2, i, sliceStart, buffer, firstPadding, firstPaddingSourceIndex, paddingCount, i0, char, i1, digit1, t3, digit2, char0, value, t4, endLength, $length,
        _s64_ = string$.ABCDEF,
        _s31_ = "Invalid base64 encoding length ",
        t1 = source.length;
      end = A.RangeError_checkValidRange(start, end, t1);
      inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (t2 = inverseAlphabet.length, i = start, sliceStart = i, buffer = null, firstPadding = -1, firstPaddingSourceIndex = -1, paddingCount = 0; i < end; i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(source, i);
        char = source.charCodeAt(i);
        if (char === 37) {
          i1 = i0 + 2;
          if (i1 <= end) {
            if (!(i0 < t1))
              return A.ioore(source, i0);
            digit1 = A.hexDigitValue(source.charCodeAt(i0));
            t3 = i0 + 1;
            if (!(t3 < t1))
              return A.ioore(source, t3);
            digit2 = A.hexDigitValue(source.charCodeAt(t3));
            char0 = digit1 * 16 + digit2 - (digit2 & 256);
            if (char0 === 37)
              char0 = -1;
            i0 = i1;
          } else
            char0 = -1;
        } else
          char0 = char;
        if (0 <= char0 && char0 <= 127) {
          if (!(char0 >= 0 && char0 < t2))
            return A.ioore(inverseAlphabet, char0);
          value = inverseAlphabet[char0];
          if (value >= 0) {
            if (!(value < 64))
              return A.ioore(_s64_, value);
            char0 = _s64_.charCodeAt(value);
            if (char0 === char)
              continue;
            char = char0;
          } else {
            if (value === -1) {
              if (firstPadding < 0) {
                t3 = buffer == null ? null : buffer._contents.length;
                if (t3 == null)
                  t3 = 0;
                firstPadding = t3 + (i - sliceStart);
                firstPaddingSourceIndex = i;
              }
              ++paddingCount;
              if (char === 61)
                continue;
            }
            char = char0;
          }
          if (value !== -2) {
            if (buffer == null) {
              buffer = new A.StringBuffer("");
              t3 = buffer;
            } else
              t3 = buffer;
            t3._contents += B.JSString_methods.substring$2(source, sliceStart, i);
            t4 = A.Primitives_stringFromCharCode(char);
            t3._contents += t4;
            sliceStart = i0;
            continue;
          }
        }
        throw A.wrapException(A.FormatException$("Invalid base64 data", source, i));
      }
      if (buffer != null) {
        t1 = B.JSString_methods.substring$2(source, sliceStart, end);
        t1 = buffer._contents += t1;
        t2 = t1.length;
        if (firstPadding >= 0)
          A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, t2);
        else {
          endLength = B.JSInt_methods.$mod(t2 - 1, 4) + 1;
          if (endLength === 1)
            throw A.wrapException(A.FormatException$(_s31_, source, end));
          while (endLength < 4) {
            t1 += "=";
            buffer._contents = t1;
            ++endLength;
          }
        }
        t1 = buffer._contents;
        return B.JSString_methods.replaceRange$3(source, start, end, t1.charCodeAt(0) == 0 ? t1 : t1);
      }
      $length = end - start;
      if (firstPadding >= 0)
        A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, $length);
      else {
        endLength = B.JSInt_methods.$mod($length, 4);
        if (endLength === 1)
          throw A.wrapException(A.FormatException$(_s31_, source, end));
        if (endLength > 1)
          source = B.JSString_methods.replaceRange$3(source, end, end, endLength === 2 ? "==" : "=");
      }
      return source;
    }
  };
  A.Base64Encoder.prototype = {
    convert$1(input) {
      var t1;
      type$.List_int._as(input);
      t1 = J.getInterceptor$asx(input);
      if (t1.get$isEmpty(input))
        return "";
      t1 = new A._Base64Encoder(string$.ABCDEF).encode$4(input, 0, t1.get$length(input), true);
      t1.toString;
      return A.String_String$fromCharCodes(t1, 0, null);
    }
  };
  A._Base64Encoder.prototype = {
    createBuffer$1(bufferLength) {
      return new Uint8Array(bufferLength);
    },
    encode$4(bytes, start, end, isLast) {
      var byteCount, fullChunks, bufferLength, output, _this = this;
      type$.List_int._as(bytes);
      byteCount = (_this._convert$_state & 3) + (end - start);
      fullChunks = B.JSInt_methods._tdivFast$1(byteCount, 3);
      bufferLength = fullChunks * 4;
      if (isLast && byteCount - fullChunks * 3 > 0)
        bufferLength += 4;
      output = _this.createBuffer$1(bufferLength);
      _this._convert$_state = A._Base64Encoder_encodeChunk(_this._alphabet, bytes, start, end, isLast, output, 0, _this._convert$_state);
      if (bufferLength > 0)
        return output;
      return null;
    }
  };
  A.Base64Decoder.prototype = {
    convert$1(input) {
      var end, decoder, t1;
      A._asString(input);
      end = A.RangeError_checkValidRange(0, null, input.length);
      if (0 === end)
        return new Uint8Array(0);
      decoder = new A._Base64Decoder();
      t1 = decoder.decode$3(input, 0, end);
      t1.toString;
      decoder.close$2(input, end);
      return t1;
    }
  };
  A._Base64Decoder.prototype = {
    decode$3(input, start, end) {
      var buffer, _this = this,
        t1 = _this._convert$_state;
      if (t1 < 0) {
        _this._convert$_state = A._Base64Decoder__checkPadding(input, start, end, t1);
        return null;
      }
      if (start === end)
        return new Uint8Array(0);
      buffer = A._Base64Decoder__allocateBuffer(input, start, end, t1);
      _this._convert$_state = A._Base64Decoder_decodeChunk(input, start, end, buffer, 0, _this._convert$_state);
      return buffer;
    },
    close$2(input, end) {
      var t1 = this._convert$_state;
      if (t1 < -1)
        throw A.wrapException(A.FormatException$("Missing padding character", input, end));
      if (t1 > 0)
        throw A.wrapException(A.FormatException$("Invalid length, must be multiple of four", input, end));
      this._convert$_state = -1;
    }
  };
  A.ByteConversionSink.prototype = {};
  A._ByteCallbackSink.prototype = {
    add$1(_, chunk) {
      var t1, t2, t3, v, grown, _this = this;
      type$.Iterable_int._as(chunk);
      t1 = _this._convert$_buffer;
      t2 = _this._bufferIndex;
      t3 = J.getInterceptor$asx(chunk);
      if (t3.get$length(chunk) > t1.length - t2) {
        t1 = _this._convert$_buffer;
        v = t3.get$length(chunk) + t1.length - 1;
        v |= B.JSInt_methods._shrOtherPositive$1(v, 1);
        v |= v >>> 2;
        v |= v >>> 4;
        v |= v >>> 8;
        grown = new Uint8Array((((v | v >>> 16) >>> 0) + 1) * 2);
        t1 = _this._convert$_buffer;
        B.NativeUint8List_methods.setRange$3(grown, 0, t1.length, t1);
        _this._convert$_buffer = grown;
      }
      t1 = _this._convert$_buffer;
      t2 = _this._bufferIndex;
      B.NativeUint8List_methods.setRange$3(t1, t2, t2 + t3.get$length(chunk), chunk);
      _this._bufferIndex = _this._bufferIndex + t3.get$length(chunk);
    },
    close$0() {
      this._callback.call$1(B.NativeUint8List_methods.sublist$2(this._convert$_buffer, 0, this._bufferIndex));
    }
  };
  A.Codec.prototype = {};
  A.Converter.prototype = {$isStreamTransformer: 1};
  A.Encoding.prototype = {};
  A.JsonUnsupportedObjectError.prototype = {
    toString$0(_) {
      var safeString = A.Error_safeToString(this.unsupportedObject);
      return (this.cause != null ? "Converting object to an encodable object failed:" : "Converting object did not return an encodable object:") + " " + safeString;
    }
  };
  A.JsonCyclicError.prototype = {
    toString$0(_) {
      return "Cyclic error in JSON stringify";
    }
  };
  A.JsonCodec.prototype = {
    decode$2$reviver(source, reviver) {
      var t1 = A._parseJson(source, this.get$decoder()._reviver);
      return t1;
    },
    decode$1(source) {
      return this.decode$2$reviver(source, null);
    },
    encode$2$toEncodable(value, toEncodable) {
      var t1 = A._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
      return t1;
    },
    encode$1(value) {
      return this.encode$2$toEncodable(value, null);
    },
    get$encoder() {
      return B.JsonEncoder_null;
    },
    get$decoder() {
      return B.JsonDecoder_null;
    }
  };
  A.JsonEncoder.prototype = {};
  A.JsonDecoder.prototype = {};
  A._JsonStringifier.prototype = {
    writeStringContent$1(s) {
      var offset, i, charCode, t1, t2, _this = this,
        $length = s.length;
      for (offset = 0, i = 0; i < $length; ++i) {
        charCode = s.charCodeAt(i);
        if (charCode > 92) {
          if (charCode >= 55296) {
            t1 = charCode & 64512;
            if (t1 === 55296) {
              t2 = i + 1;
              t2 = !(t2 < $length && (s.charCodeAt(t2) & 64512) === 56320);
            } else
              t2 = false;
            if (!t2)
              if (t1 === 56320) {
                t1 = i - 1;
                t1 = !(t1 >= 0 && (s.charCodeAt(t1) & 64512) === 55296);
              } else
                t1 = false;
            else
              t1 = true;
            if (t1) {
              if (i > offset)
                _this.writeStringSlice$3(s, offset, i);
              offset = i + 1;
              _this.writeCharCode$1(92);
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(100);
              t1 = charCode >>> 8 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
            }
          }
          continue;
        }
        if (charCode < 32) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          switch (charCode) {
            case 8:
              _this.writeCharCode$1(98);
              break;
            case 9:
              _this.writeCharCode$1(116);
              break;
            case 10:
              _this.writeCharCode$1(110);
              break;
            case 12:
              _this.writeCharCode$1(102);
              break;
            case 13:
              _this.writeCharCode$1(114);
              break;
            default:
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(48);
              _this.writeCharCode$1(48);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              break;
          }
        } else if (charCode === 34 || charCode === 92) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          _this.writeCharCode$1(charCode);
        }
      }
      if (offset === 0)
        _this.writeString$1(s);
      else if (offset < $length)
        _this.writeStringSlice$3(s, offset, $length);
    },
    _checkCycle$1(object) {
      var t1, t2, i, t3;
      for (t1 = this._seen, t2 = t1.length, i = 0; i < t2; ++i) {
        t3 = t1[i];
        if (object == null ? t3 == null : object === t3)
          throw A.wrapException(new A.JsonCyclicError(object, null));
      }
      B.JSArray_methods.add$1(t1, object);
    },
    writeObject$1(object) {
      var customJson, e, t1, exception, _this = this;
      if (_this.writeJsonValue$1(object))
        return;
      _this._checkCycle$1(object);
      try {
        customJson = _this._toEncodable.call$1(object);
        if (!_this.writeJsonValue$1(customJson)) {
          t1 = A.JsonUnsupportedObjectError$(object, null, _this.get$_partialResult());
          throw A.wrapException(t1);
        }
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.JsonUnsupportedObjectError$(object, e, _this.get$_partialResult());
        throw A.wrapException(t1);
      }
    },
    writeJsonValue$1(object) {
      var t1, success, _this = this;
      if (typeof object == "number") {
        if (!isFinite(object))
          return false;
        _this.writeNumber$1(object);
        return true;
      } else if (object === true) {
        _this.writeString$1("true");
        return true;
      } else if (object === false) {
        _this.writeString$1("false");
        return true;
      } else if (object == null) {
        _this.writeString$1("null");
        return true;
      } else if (typeof object == "string") {
        _this.writeString$1('"');
        _this.writeStringContent$1(object);
        _this.writeString$1('"');
        return true;
      } else if (type$.List_dynamic._is(object)) {
        _this._checkCycle$1(object);
        _this.writeList$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return true;
      } else if (type$.Map_dynamic_dynamic._is(object)) {
        _this._checkCycle$1(object);
        success = _this.writeMap$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return success;
      } else
        return false;
    },
    writeList$1(list) {
      var t1, i, _this = this;
      _this.writeString$1("[");
      t1 = J.getInterceptor$asx(list);
      if (t1.get$isNotEmpty(list)) {
        _this.writeObject$1(t1.$index(list, 0));
        for (i = 1; i < t1.get$length(list); ++i) {
          _this.writeString$1(",");
          _this.writeObject$1(t1.$index(list, i));
        }
      }
      _this.writeString$1("]");
    },
    writeMap$1(map) {
      var t1, keyValueList, i, separator, t2, _this = this, _box_0 = {};
      if (map.get$isEmpty(map)) {
        _this.writeString$1("{}");
        return true;
      }
      t1 = map.get$length(map) * 2;
      keyValueList = A.List_List$filled(t1, null, false, type$.nullable_Object);
      i = _box_0.i = 0;
      _box_0.allStringKeys = true;
      map.forEach$1(0, new A._JsonStringifier_writeMap_closure(_box_0, keyValueList));
      if (!_box_0.allStringKeys)
        return false;
      _this.writeString$1("{");
      for (separator = '"'; i < t1; i += 2, separator = ',"') {
        _this.writeString$1(separator);
        _this.writeStringContent$1(A._asString(keyValueList[i]));
        _this.writeString$1('":');
        t2 = i + 1;
        if (!(t2 < t1))
          return A.ioore(keyValueList, t2);
        _this.writeObject$1(keyValueList[t2]);
      }
      _this.writeString$1("}");
      return true;
    }
  };
  A._JsonStringifier_writeMap_closure.prototype = {
    call$2(key, value) {
      var t1, t2;
      if (typeof key != "string")
        this._box_0.allStringKeys = false;
      t1 = this.keyValueList;
      t2 = this._box_0;
      B.JSArray_methods.$indexSet(t1, t2.i++, key);
      B.JSArray_methods.$indexSet(t1, t2.i++, value);
    },
    $signature: 25
  };
  A._JsonStringStringifier.prototype = {
    get$_partialResult() {
      var t1 = this._convert$_sink;
      return t1 instanceof A.StringBuffer ? t1.toString$0(0) : null;
    },
    writeNumber$1(number) {
      this._convert$_sink.write$1(B.JSNumber_methods.toString$0(number));
    },
    writeString$1(string) {
      this._convert$_sink.write$1(string);
    },
    writeStringSlice$3(string, start, end) {
      this._convert$_sink.write$1(B.JSString_methods.substring$2(string, start, end));
    },
    writeCharCode$1(charCode) {
      this._convert$_sink.writeCharCode$1(charCode);
    }
  };
  A.Latin1Codec.prototype = {
    encode$1(source) {
      return B.Latin1Encoder_255.convert$1(source);
    },
    decode$1(bytes) {
      var t1;
      type$.List_int._as(bytes);
      t1 = B.Latin1Decoder_false_255.convert$1(bytes);
      return t1;
    }
  };
  A.Latin1Encoder.prototype = {};
  A.Latin1Decoder.prototype = {};
  A.Utf8Codec.prototype = {
    decode$1(codeUnits) {
      type$.List_int._as(codeUnits);
      return B.Utf8Decoder_false.convert$1(codeUnits);
    },
    encode$1(string) {
      return B.C_Utf8Encoder.convert$1(string);
    }
  };
  A.Utf8Encoder.prototype = {
    convert$1(string) {
      var stringLength, end, t1, encoder, t2;
      A._asString(string);
      stringLength = string.length;
      end = A.RangeError_checkValidRange(0, null, stringLength);
      if (end === 0)
        return new Uint8Array(0);
      t1 = new Uint8Array(end * 3);
      encoder = new A._Utf8Encoder(t1);
      if (encoder._fillBuffer$3(string, 0, end) !== end) {
        t2 = end - 1;
        if (!(t2 >= 0 && t2 < stringLength))
          return A.ioore(string, t2);
        encoder._writeReplacementCharacter$0();
      }
      return B.NativeUint8List_methods.sublist$2(t1, 0, encoder._bufferIndex);
    }
  };
  A._Utf8Encoder.prototype = {
    _writeReplacementCharacter$0() {
      var t4, _this = this,
        t1 = _this._convert$_buffer,
        t2 = _this._bufferIndex,
        t3 = _this._bufferIndex = t2 + 1;
      t1.$flags & 2 && A.throwUnsupportedOperation(t1);
      t4 = t1.length;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 239;
      t2 = _this._bufferIndex = t3 + 1;
      if (!(t3 < t4))
        return A.ioore(t1, t3);
      t1[t3] = 191;
      _this._bufferIndex = t2 + 1;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 189;
    },
    _writeSurrogate$2(leadingSurrogate, nextCodeUnit) {
      var rune, t1, t2, t3, t4, _this = this;
      if ((nextCodeUnit & 64512) === 56320) {
        rune = 65536 + ((leadingSurrogate & 1023) << 10) | nextCodeUnit & 1023;
        t1 = _this._convert$_buffer;
        t2 = _this._bufferIndex;
        t3 = _this._bufferIndex = t2 + 1;
        t1.$flags & 2 && A.throwUnsupportedOperation(t1);
        t4 = t1.length;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 18 | 240;
        t2 = _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune >>> 12 & 63 | 128;
        t3 = _this._bufferIndex = t2 + 1;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 6 & 63 | 128;
        _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune & 63 | 128;
        return true;
      } else {
        _this._writeReplacementCharacter$0();
        return false;
      }
    },
    _fillBuffer$3(str, start, end) {
      var t1, t2, t3, t4, stringIndex, codeUnit, t5, t6, _this = this;
      if (start !== end) {
        t1 = end - 1;
        if (!(t1 >= 0 && t1 < str.length))
          return A.ioore(str, t1);
        t1 = (str.charCodeAt(t1) & 64512) === 55296;
      } else
        t1 = false;
      if (t1)
        --end;
      for (t1 = _this._convert$_buffer, t2 = t1.$flags | 0, t3 = t1.length, t4 = str.length, stringIndex = start; stringIndex < end; ++stringIndex) {
        if (!(stringIndex < t4))
          return A.ioore(str, stringIndex);
        codeUnit = str.charCodeAt(stringIndex);
        if (codeUnit <= 127) {
          t5 = _this._bufferIndex;
          if (t5 >= t3)
            break;
          _this._bufferIndex = t5 + 1;
          t2 & 2 && A.throwUnsupportedOperation(t1);
          t1[t5] = codeUnit;
        } else {
          t5 = codeUnit & 64512;
          if (t5 === 55296) {
            if (_this._bufferIndex + 4 > t3)
              break;
            t5 = stringIndex + 1;
            if (!(t5 < t4))
              return A.ioore(str, t5);
            if (_this._writeSurrogate$2(codeUnit, str.charCodeAt(t5)))
              stringIndex = t5;
          } else if (t5 === 56320) {
            if (_this._bufferIndex + 3 > t3)
              break;
            _this._writeReplacementCharacter$0();
          } else if (codeUnit <= 2047) {
            t5 = _this._bufferIndex;
            t6 = t5 + 1;
            if (t6 >= t3)
              break;
            _this._bufferIndex = t6;
            t2 & 2 && A.throwUnsupportedOperation(t1);
            if (!(t5 < t3))
              return A.ioore(t1, t5);
            t1[t5] = codeUnit >>> 6 | 192;
            _this._bufferIndex = t6 + 1;
            t1[t6] = codeUnit & 63 | 128;
          } else {
            t5 = _this._bufferIndex;
            if (t5 + 2 >= t3)
              break;
            t6 = _this._bufferIndex = t5 + 1;
            t2 & 2 && A.throwUnsupportedOperation(t1);
            if (!(t5 < t3))
              return A.ioore(t1, t5);
            t1[t5] = codeUnit >>> 12 | 224;
            t5 = _this._bufferIndex = t6 + 1;
            if (!(t6 < t3))
              return A.ioore(t1, t6);
            t1[t6] = codeUnit >>> 6 & 63 | 128;
            _this._bufferIndex = t5 + 1;
            if (!(t5 < t3))
              return A.ioore(t1, t5);
            t1[t5] = codeUnit & 63 | 128;
          }
        }
      }
      return stringIndex;
    }
  };
  A.Utf8Decoder.prototype = {
    convert$1(codeUnits) {
      return new A._Utf8Decoder(this._allowMalformed)._convertGeneral$4(type$.List_int._as(codeUnits), 0, null, true);
    }
  };
  A._Utf8Decoder.prototype = {
    _convertGeneral$4(codeUnits, start, maybeEnd, single) {
      var end, casted, bytes, errorOffset, t1, result, message, _this = this;
      type$.List_int._as(codeUnits);
      end = A.RangeError_checkValidRange(start, maybeEnd, J.get$length$asx(codeUnits));
      if (start === end)
        return "";
      if (codeUnits instanceof Uint8Array) {
        casted = codeUnits;
        bytes = casted;
        errorOffset = 0;
      } else {
        bytes = A._Utf8Decoder__makeNativeUint8List(codeUnits, start, end);
        end -= start;
        errorOffset = start;
        start = 0;
      }
      if (single && end - start >= 15) {
        t1 = _this.allowMalformed;
        result = A._Utf8Decoder__convertInterceptedUint8List(t1, bytes, start, end);
        if (result != null) {
          if (!t1)
            return result;
          if (result.indexOf("\ufffd") < 0)
            return result;
        }
      }
      result = _this._decodeRecursive$4(bytes, start, end, single);
      t1 = _this._convert$_state;
      if ((t1 & 1) !== 0) {
        message = A._Utf8Decoder_errorDescription(t1);
        _this._convert$_state = 0;
        throw A.wrapException(A.FormatException$(message, codeUnits, errorOffset + _this._charOrIndex));
      }
      return result;
    },
    _decodeRecursive$4(bytes, start, end, single) {
      var mid, s1, _this = this;
      if (end - start > 1000) {
        mid = B.JSInt_methods._tdivFast$1(start + end, 2);
        s1 = _this._decodeRecursive$4(bytes, start, mid, false);
        if ((_this._convert$_state & 1) !== 0)
          return s1;
        return s1 + _this._decodeRecursive$4(bytes, mid, end, single);
      }
      return _this.decodeGeneral$4(bytes, start, end, single);
    },
    decodeGeneral$4(bytes, start, end, single) {
      var byte, t2, type, t3, i0, markEnd, i1, m, _this = this,
        _s256_ = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE",
        _s144_ = " \x000:XECCCCCN:lDb \x000:XECCCCCNvlDb \x000:XECCCCCN:lDb AAAAA\x00\x00\x00\x00\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\x800AAAAA\x00\x00\x00\x00 AAAAA",
        _65533 = 65533,
        state = _this._convert$_state,
        char = _this._charOrIndex,
        buffer = new A.StringBuffer(""),
        i = start + 1,
        t1 = bytes.length;
      if (!(start >= 0 && start < t1))
        return A.ioore(bytes, start);
      byte = bytes[start];
      $label0$0:
        for (t2 = _this.allowMalformed;;) {
          for (;; i = i0) {
            if (!(byte >= 0 && byte < 256))
              return A.ioore(_s256_, byte);
            type = _s256_.charCodeAt(byte) & 31;
            char = state <= 32 ? byte & 61694 >>> type : (byte & 63 | char << 6) >>> 0;
            t3 = state + type;
            if (!(t3 >= 0 && t3 < 144))
              return A.ioore(_s144_, t3);
            state = _s144_.charCodeAt(t3);
            if (state === 0) {
              t3 = A.Primitives_stringFromCharCode(char);
              buffer._contents += t3;
              if (i === end)
                break $label0$0;
              break;
            } else if ((state & 1) !== 0) {
              if (t2)
                switch (state) {
                  case 69:
                  case 67:
                    t3 = A.Primitives_stringFromCharCode(_65533);
                    buffer._contents += t3;
                    break;
                  case 65:
                    t3 = A.Primitives_stringFromCharCode(_65533);
                    buffer._contents += t3;
                    --i;
                    break;
                  default:
                    t3 = A.Primitives_stringFromCharCode(_65533);
                    buffer._contents = (buffer._contents += t3) + t3;
                    break;
                }
              else {
                _this._convert$_state = state;
                _this._charOrIndex = i - 1;
                return "";
              }
              state = 0;
            }
            if (i === end)
              break $label0$0;
            i0 = i + 1;
            if (!(i >= 0 && i < t1))
              return A.ioore(bytes, i);
            byte = bytes[i];
          }
          i0 = i + 1;
          if (!(i >= 0 && i < t1))
            return A.ioore(bytes, i);
          byte = bytes[i];
          if (byte < 128) {
            for (;;) {
              if (!(i0 < end)) {
                markEnd = end;
                break;
              }
              i1 = i0 + 1;
              if (!(i0 >= 0 && i0 < t1))
                return A.ioore(bytes, i0);
              byte = bytes[i0];
              if (byte >= 128) {
                markEnd = i1 - 1;
                i0 = i1;
                break;
              }
              i0 = i1;
            }
            if (markEnd - i < 20)
              for (m = i; m < markEnd; ++m) {
                if (!(m < t1))
                  return A.ioore(bytes, m);
                t3 = A.Primitives_stringFromCharCode(bytes[m]);
                buffer._contents += t3;
              }
            else {
              t3 = A.String_String$fromCharCodes(bytes, i, markEnd);
              buffer._contents += t3;
            }
            if (markEnd === end)
              break $label0$0;
            i = i0;
          } else
            i = i0;
        }
      if (single && state > 32)
        if (t2) {
          t1 = A.Primitives_stringFromCharCode(_65533);
          buffer._contents += t1;
        } else {
          _this._convert$_state = 77;
          _this._charOrIndex = end;
          return "";
        }
      _this._convert$_state = state;
      _this._charOrIndex = char;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    }
  };
  A._BigIntImpl.prototype = {
    $negate(_) {
      var t2, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return _this;
      t2 = !_this._isNegative;
      t3 = _this._digits;
      t1 = A._BigIntImpl__normalize(t1, t3);
      return new A._BigIntImpl(t1 === 0 ? false : t2, t3, t1);
    },
    _drShift$1(n) {
      var resultUsed, digits, resultDigits, t1, i, t2, t3, result, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used - n;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = digits.length, i = n; i < used; ++i) {
        t2 = i - n;
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        t3 = digits[i];
        if (!(t2 < resultUsed))
          return A.ioore(resultDigits, t2);
        resultDigits[t2] = t3;
      }
      t2 = _this._isNegative;
      t3 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t3 === 0 ? false : t2, resultDigits, t3);
      if (t2)
        for (i = 0; i < n; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      return result;
    },
    $shr(_, shiftAmount) {
      var t1, digitShift, bitShift, resultUsed, digits, resultDigits, t2, result, i, _this = this;
      if (shiftAmount < 0)
        throw A.wrapException(A.ArgumentError$("shift-amount must be posititve " + shiftAmount, null));
      t1 = _this._used;
      if (t1 === 0)
        return _this;
      digitShift = B.JSInt_methods._tdivFast$1(shiftAmount, 16);
      bitShift = B.JSInt_methods.$mod(shiftAmount, 16);
      if (bitShift === 0)
        return _this._drShift$1(digitShift);
      resultUsed = t1 - digitShift;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__rsh(digits, t1, shiftAmount, resultDigits);
      t1 = _this._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
      if (t1) {
        t1 = digits.length;
        if (!(digitShift >= 0 && digitShift < t1))
          return A.ioore(digits, digitShift);
        if ((digits[digitShift] & B.JSInt_methods.$shl(1, bitShift) - 1) >>> 0 !== 0)
          return result.$sub(0, $.$get$_BigIntImpl_one());
        for (i = 0; i < digitShift; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      }
      return result;
    },
    compareTo$1(_, other) {
      var t1, result;
      type$._BigIntImpl._as(other);
      t1 = this._isNegative;
      if (t1 === other._isNegative) {
        result = A._BigIntImpl__compareDigits(this._digits, this._used, other._digits, other._used);
        return t1 ? 0 - result : result;
      }
      return t1 ? -1 : 1;
    },
    _absAddSetSign$2(other, isNegative) {
      var resultUsed, resultDigits, t1, _this = this,
        used = _this._used,
        otherUsed = other._used;
      if (used < otherUsed)
        return other._absAddSetSign$2(_this, isNegative);
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultUsed = used + 1;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__absAdd(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    _absSubSetSign$2(other, isNegative) {
      var otherUsed, resultDigits, t1, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      otherUsed = other._used;
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultDigits = new Uint16Array(used);
      A._BigIntImpl__absSub(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(used, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    $add(_, other) {
      var t2, isNegative, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return other;
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative === other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $sub(_, other) {
      var t2, isNegative, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return other.$negate(0);
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative !== other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $mul(_, other) {
      var resultUsed, digits, otherDigits, resultDigits, t1, i, t2,
        used = this._used,
        otherUsed = other._used;
      if (used === 0 || otherUsed === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used + otherUsed;
      digits = this._digits;
      otherDigits = other._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = otherDigits.length, i = 0; i < otherUsed;) {
        if (!(i < t1))
          return A.ioore(otherDigits, i);
        A._BigIntImpl__mulAdd(otherDigits[i], digits, 0, resultDigits, i, used);
        ++i;
      }
      t1 = this._isNegative !== other._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
    },
    _div$1(other) {
      var lastQuo_used, quo_digits, t1, quo;
      if (this._used < other._used)
        return $.$get$_BigIntImpl_zero();
      this._divRem$1(other);
      lastQuo_used = $._BigIntImpl____lastQuoRemUsed._readField$0() - $._BigIntImpl____lastRemUsed._readField$0();
      quo_digits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastQuoRemUsed._readField$0(), lastQuo_used);
      t1 = A._BigIntImpl__normalize(lastQuo_used, quo_digits);
      quo = new A._BigIntImpl(false, quo_digits, t1);
      return this._isNegative !== other._isNegative && t1 > 0 ? quo.$negate(0) : quo;
    },
    _rem$1(other) {
      var remDigits, t1, rem, _this = this;
      if (_this._used < other._used)
        return _this;
      _this._divRem$1(other);
      remDigits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), 0, $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastRemUsed._readField$0());
      t1 = A._BigIntImpl__normalize($._BigIntImpl____lastRemUsed._readField$0(), remDigits);
      rem = new A._BigIntImpl(false, remDigits, t1);
      if ($._BigIntImpl____lastRem_nsh._readField$0() > 0)
        rem = rem.$shr(0, $._BigIntImpl____lastRem_nsh._readField$0());
      return _this._isNegative && rem._used > 0 ? rem.$negate(0) : rem;
    },
    _divRem$1(other) {
      var yDigits, yUsed, t1, nsh, yDigits0, yUsed0, resultDigits, resultUsed0, topDigitDivisor, j, tmpDigits, tmpUsed, resultUsed1, nyDigits, i, estimatedQuotientDigit, _this = this,
        resultUsed = _this._used;
      if (resultUsed === $._BigIntImpl__lastDividendUsed && other._used === $._BigIntImpl__lastDivisorUsed && _this._digits === $._BigIntImpl__lastDividendDigits && other._digits === $._BigIntImpl__lastDivisorDigits)
        return;
      yDigits = other._digits;
      yUsed = other._used;
      t1 = yUsed - 1;
      if (!(t1 >= 0 && t1 < yDigits.length))
        return A.ioore(yDigits, t1);
      nsh = 16 - B.JSInt_methods.get$bitLength(yDigits[t1]);
      if (nsh > 0) {
        yDigits0 = new Uint16Array(yUsed + 5);
        yUsed0 = A._BigIntImpl__lShiftDigits(yDigits, yUsed, nsh, yDigits0);
        resultDigits = new Uint16Array(resultUsed + 5);
        resultUsed0 = A._BigIntImpl__lShiftDigits(_this._digits, resultUsed, nsh, resultDigits);
      } else {
        resultDigits = A._BigIntImpl__cloneDigits(_this._digits, 0, resultUsed, resultUsed + 2);
        yUsed0 = yUsed;
        yDigits0 = yDigits;
        resultUsed0 = resultUsed;
      }
      t1 = yUsed0 - 1;
      if (!(t1 >= 0 && t1 < yDigits0.length))
        return A.ioore(yDigits0, t1);
      topDigitDivisor = yDigits0[t1];
      j = resultUsed0 - yUsed0;
      tmpDigits = new Uint16Array(resultUsed0);
      tmpUsed = A._BigIntImpl__dlShiftDigits(yDigits0, yUsed0, j, tmpDigits);
      resultUsed1 = resultUsed0 + 1;
      t1 = resultDigits.$flags | 0;
      if (A._BigIntImpl__compareDigits(resultDigits, resultUsed0, tmpDigits, tmpUsed) >= 0) {
        t1 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(resultUsed0 >= 0 && resultUsed0 < resultDigits.length))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 1;
        A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
      } else {
        t1 & 2 && A.throwUnsupportedOperation(resultDigits);
        if (!(resultUsed0 >= 0 && resultUsed0 < resultDigits.length))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 0;
      }
      t1 = yUsed0 + 2;
      nyDigits = new Uint16Array(t1);
      if (!(yUsed0 >= 0 && yUsed0 < t1))
        return A.ioore(nyDigits, yUsed0);
      nyDigits[yUsed0] = 1;
      A._BigIntImpl__absSub(nyDigits, yUsed0 + 1, yDigits0, yUsed0, nyDigits);
      i = resultUsed0 - 1;
      for (t1 = resultDigits.length; j > 0;) {
        estimatedQuotientDigit = A._BigIntImpl__estimateQuotientDigit(topDigitDivisor, resultDigits, i);
        --j;
        A._BigIntImpl__mulAdd(estimatedQuotientDigit, nyDigits, 0, resultDigits, j, yUsed0);
        if (!(i >= 0 && i < t1))
          return A.ioore(resultDigits, i);
        if (resultDigits[i] < estimatedQuotientDigit) {
          tmpUsed = A._BigIntImpl__dlShiftDigits(nyDigits, yUsed0, j, tmpDigits);
          A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
          while (--estimatedQuotientDigit, resultDigits[i] < estimatedQuotientDigit)
            A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
        }
        --i;
      }
      $._BigIntImpl__lastDividendDigits = _this._digits;
      $._BigIntImpl__lastDividendUsed = resultUsed;
      $._BigIntImpl__lastDivisorDigits = yDigits;
      $._BigIntImpl__lastDivisorUsed = yUsed;
      $._BigIntImpl____lastQuoRemDigits.__late_helper$_value = resultDigits;
      $._BigIntImpl____lastQuoRemUsed.__late_helper$_value = resultUsed1;
      $._BigIntImpl____lastRemUsed.__late_helper$_value = yUsed0;
      $._BigIntImpl____lastRem_nsh.__late_helper$_value = nsh;
    },
    get$hashCode(_) {
      var hash, t2, t3, i,
        combine = new A._BigIntImpl_hashCode_combine(),
        t1 = this._used;
      if (t1 === 0)
        return 6707;
      hash = this._isNegative ? 83585 : 429689;
      for (t2 = this._digits, t3 = t2.length, i = 0; i < t1; ++i) {
        if (!(i < t3))
          return A.ioore(t2, i);
        hash = combine.call$2(hash, t2[i]);
      }
      return new A._BigIntImpl_hashCode_finish().call$1(hash);
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A._BigIntImpl && this.compareTo$1(0, other) === 0;
    },
    toString$0(_) {
      var decimalDigitChunks, rest, t2, digits4, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return "0";
      if (t1 === 1) {
        if (_this._isNegative) {
          t1 = _this._digits;
          if (0 >= t1.length)
            return A.ioore(t1, 0);
          return B.JSInt_methods.toString$0(-t1[0]);
        }
        t1 = _this._digits;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        return B.JSInt_methods.toString$0(t1[0]);
      }
      decimalDigitChunks = A._setArrayType([], type$.JSArray_String);
      t1 = _this._isNegative;
      rest = t1 ? _this.$negate(0) : _this;
      while (rest._used > 1) {
        t2 = $.$get$_BigIntImpl__bigInt10000();
        if (t2._used === 0)
          A.throwExpression(B.C_IntegerDivisionByZeroException);
        digits4 = rest._rem$1(t2).toString$0(0);
        B.JSArray_methods.add$1(decimalDigitChunks, digits4);
        t3 = digits4.length;
        if (t3 === 1)
          B.JSArray_methods.add$1(decimalDigitChunks, "000");
        if (t3 === 2)
          B.JSArray_methods.add$1(decimalDigitChunks, "00");
        if (t3 === 3)
          B.JSArray_methods.add$1(decimalDigitChunks, "0");
        rest = rest._div$1(t2);
      }
      t2 = rest._digits;
      if (0 >= t2.length)
        return A.ioore(t2, 0);
      B.JSArray_methods.add$1(decimalDigitChunks, B.JSInt_methods.toString$0(t2[0]));
      if (t1)
        B.JSArray_methods.add$1(decimalDigitChunks, "-");
      return new A.ReversedListIterable(decimalDigitChunks, type$.ReversedListIterable_String).join$0(0);
    },
    $isBigInt: 1,
    $isComparable: 1
  };
  A._BigIntImpl_hashCode_combine.prototype = {
    call$2(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $signature: 54
  };
  A._BigIntImpl_hashCode_finish.prototype = {
    call$1(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    $signature: 52
  };
  A.DateTime.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.DateTime && this._value === other._value && this._microsecond === other._microsecond && this.isUtc === other.isUtc;
    },
    get$hashCode(_) {
      return A.Object_hash(this._value, this._microsecond, B.C_SentinelValue, B.C_SentinelValue);
    },
    compareTo$1(_, other) {
      var r;
      type$.DateTime._as(other);
      r = B.JSInt_methods.compareTo$1(this._value, other._value);
      if (r !== 0)
        return r;
      return B.JSInt_methods.compareTo$1(this._microsecond, other._microsecond);
    },
    toString$0(_) {
      var _this = this,
        y = A.DateTime__fourDigits(A.Primitives_getYear(_this)),
        m = A.DateTime__twoDigits(A.Primitives_getMonth(_this)),
        d = A.DateTime__twoDigits(A.Primitives_getDay(_this)),
        h = A.DateTime__twoDigits(A.Primitives_getHours(_this)),
        min = A.DateTime__twoDigits(A.Primitives_getMinutes(_this)),
        sec = A.DateTime__twoDigits(A.Primitives_getSeconds(_this)),
        ms = A.DateTime__threeDigits(A.Primitives_getMilliseconds(_this)),
        t1 = _this._microsecond,
        us = t1 === 0 ? "" : A.DateTime__threeDigits(t1);
      t1 = y + "-" + m;
      if (_this.isUtc)
        return t1 + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + us + "Z";
      else
        return t1 + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + us;
    },
    $isComparable: 1
  };
  A.Duration.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Duration && this._duration === other._duration;
    },
    get$hashCode(_) {
      return B.JSInt_methods.get$hashCode(this._duration);
    },
    compareTo$1(_, other) {
      return B.JSInt_methods.compareTo$1(this._duration, type$.Duration._as(other)._duration);
    },
    toString$0(_) {
      var sign, minutes, minutesPadding, seconds, secondsPadding,
        microseconds = this._duration,
        hours = B.JSInt_methods._tdivFast$1(microseconds, 3600000000),
        microseconds0 = microseconds % 3600000000;
      if (microseconds < 0) {
        hours = 0 - hours;
        microseconds = 0 - microseconds0;
        sign = "-";
      } else {
        microseconds = microseconds0;
        sign = "";
      }
      minutes = B.JSInt_methods._tdivFast$1(microseconds, 60000000);
      microseconds %= 60000000;
      minutesPadding = minutes < 10 ? "0" : "";
      seconds = B.JSInt_methods._tdivFast$1(microseconds, 1000000);
      secondsPadding = seconds < 10 ? "0" : "";
      return sign + hours + ":" + minutesPadding + minutes + ":" + secondsPadding + seconds + "." + B.JSString_methods.padLeft$2(B.JSInt_methods.toString$0(microseconds % 1000000), 6, "0");
    },
    $isComparable: 1
  };
  A.Error.prototype = {
    get$stackTrace() {
      return A.Primitives_extractStackTrace(this);
    }
  };
  A.AssertionError.prototype = {
    toString$0(_) {
      var t1 = this.message;
      if (t1 != null)
        return "Assertion failed: " + A.Error_safeToString(t1);
      return "Assertion failed";
    }
  };
  A.TypeError.prototype = {};
  A.ArgumentError.prototype = {
    get$_errorName() {
      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
    },
    get$_errorExplanation() {
      return "";
    },
    toString$0(_) {
      var _this = this,
        $name = _this.name,
        nameString = $name == null ? "" : " (" + $name + ")",
        message = _this.message,
        messageString = message == null ? "" : ": " + A.S(message),
        prefix = _this.get$_errorName() + nameString + messageString;
      if (!_this._hasValue)
        return prefix;
      return prefix + _this.get$_errorExplanation() + ": " + A.Error_safeToString(_this.get$invalidValue());
    },
    get$invalidValue() {
      return this.invalidValue;
    }
  };
  A.RangeError.prototype = {
    get$invalidValue() {
      return A._asNumQ(this.invalidValue);
    },
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      var explanation,
        start = this.start,
        end = this.end;
      if (start == null)
        explanation = end != null ? ": Not less than or equal to " + A.S(end) : "";
      else if (end == null)
        explanation = ": Not greater than or equal to " + A.S(start);
      else if (end > start)
        explanation = ": Not in inclusive range " + A.S(start) + ".." + A.S(end);
      else
        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + A.S(start);
      return explanation;
    }
  };
  A.IndexError.prototype = {
    get$invalidValue() {
      return A._asInt(this.invalidValue);
    },
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      if (A._asInt(this.invalidValue) < 0)
        return ": index must not be negative";
      var t1 = this.length;
      if (t1 === 0)
        return ": no indices are valid";
      return ": index should be less than " + t1;
    },
    get$length(receiver) {
      return this.length;
    }
  };
  A.UnsupportedError.prototype = {
    toString$0(_) {
      return "Unsupported operation: " + this.message;
    }
  };
  A.UnimplementedError.prototype = {
    toString$0(_) {
      var message = this.message;
      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
    }
  };
  A.StateError.prototype = {
    toString$0(_) {
      return "Bad state: " + this.message;
    }
  };
  A.ConcurrentModificationError.prototype = {
    toString$0(_) {
      var t1 = this.modifiedObject;
      if (t1 == null)
        return "Concurrent modification during iteration.";
      return "Concurrent modification during iteration: " + A.Error_safeToString(t1) + ".";
    }
  };
  A.OutOfMemoryError.prototype = {
    toString$0(_) {
      return "Out of Memory";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A.StackOverflowError.prototype = {
    toString$0(_) {
      return "Stack Overflow";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A._Exception.prototype = {
    toString$0(_) {
      return "Exception: " + this.message;
    },
    $isException: 1
  };
  A.FormatException.prototype = {
    toString$0(_) {
      var t1, lineEnd, lineNum, lineStart, previousCharWasCR, i, char, prefix, postfix, end, start,
        message = this.message,
        report = "" !== message ? "FormatException: " + message : "FormatException",
        offset = this.offset,
        source = this.source;
      if (typeof source == "string") {
        if (offset != null)
          t1 = offset < 0 || offset > source.length;
        else
          t1 = false;
        if (t1)
          offset = null;
        if (offset == null) {
          if (source.length > 78)
            source = B.JSString_methods.substring$2(source, 0, 75) + "...";
          return report + "\n" + source;
        }
        for (lineEnd = source.length, lineNum = 1, lineStart = 0, previousCharWasCR = false, i = 0; i < offset; ++i) {
          if (!(i < lineEnd))
            return A.ioore(source, i);
          char = source.charCodeAt(i);
          if (char === 10) {
            if (lineStart !== i || !previousCharWasCR)
              ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = false;
          } else if (char === 13) {
            ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = true;
          }
        }
        report = lineNum > 1 ? report + (" (at line " + lineNum + ", character " + (offset - lineStart + 1) + ")\n") : report + (" (at character " + (offset + 1) + ")\n");
        for (i = offset; i < lineEnd; ++i) {
          if (!(i >= 0))
            return A.ioore(source, i);
          char = source.charCodeAt(i);
          if (char === 10 || char === 13) {
            lineEnd = i;
            break;
          }
        }
        prefix = "";
        if (lineEnd - lineStart > 78) {
          postfix = "...";
          if (offset - lineStart < 75) {
            end = lineStart + 75;
            start = lineStart;
          } else {
            if (lineEnd - offset < 75) {
              start = lineEnd - 75;
              end = lineEnd;
              postfix = "";
            } else {
              start = offset - 36;
              end = offset + 36;
            }
            prefix = "...";
          }
        } else {
          end = lineEnd;
          start = lineStart;
          postfix = "";
        }
        return report + prefix + B.JSString_methods.substring$2(source, start, end) + postfix + "\n" + B.JSString_methods.$mul(" ", offset - start + prefix.length) + "^\n";
      } else
        return offset != null ? report + (" (at offset " + A.S(offset) + ")") : report;
    },
    $isException: 1,
    get$message() {
      return this.message;
    },
    get$source() {
      return this.source;
    },
    get$offset() {
      return this.offset;
    }
  };
  A.IntegerDivisionByZeroException.prototype = {
    get$stackTrace() {
      return null;
    },
    toString$0(_) {
      return "IntegerDivisionByZeroException";
    },
    $isError: 1,
    $isException: 1
  };
  A.Iterable.prototype = {
    cast$1$0(_, $R) {
      return A.CastIterable_CastIterable(this, A.instanceType(this)._eval$1("Iterable.E"), $R);
    },
    map$1$1(_, toElement, $T) {
      var t1 = A.instanceType(this);
      return A.MappedIterable_MappedIterable(this, t1._bind$1($T)._eval$1("1(Iterable.E)")._as(toElement), t1._eval$1("Iterable.E"), $T);
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    },
    contains$1(_, element) {
      var t1;
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        if (J.$eq$(t1.get$current(), element))
          return true;
      return false;
    },
    toList$1$growable(_, growable) {
      var t1 = A.instanceType(this)._eval$1("Iterable.E");
      if (growable)
        t1 = A.List_List$_of(this, t1);
      else {
        t1 = A.List_List$_of(this, t1);
        t1.$flags = 1;
        t1 = t1;
      }
      return t1;
    },
    toList$0(_) {
      return this.toList$1$growable(0, true);
    },
    get$length(_) {
      var count,
        it = this.get$iterator(this);
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    get$isEmpty(_) {
      return !this.get$iterator(this).moveNext$0();
    },
    get$isNotEmpty(_) {
      return !this.get$isEmpty(this);
    },
    take$1(_, count) {
      return A.TakeIterable_TakeIterable(this, count, A.instanceType(this)._eval$1("Iterable.E"));
    },
    skip$1(_, count) {
      return A.SkipIterable_SkipIterable(this, count, A.instanceType(this)._eval$1("Iterable.E"));
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current();
    },
    elementAt$1(_, index) {
      var iterator, skipCount;
      A.RangeError_checkNotNegative(index, "index");
      iterator = this.get$iterator(this);
      for (skipCount = index; iterator.moveNext$0();) {
        if (skipCount === 0)
          return iterator.get$current();
        --skipCount;
      }
      throw A.wrapException(A.IndexError$withLength(index, index - skipCount, this, null, "index"));
    },
    toString$0(_) {
      return A.Iterable_iterableToShortString(this, "(", ")");
    }
  };
  A.MapEntry.prototype = {
    toString$0(_) {
      return "MapEntry(" + A.S(this.key) + ": " + A.S(this.value) + ")";
    }
  };
  A.Null.prototype = {
    get$hashCode(_) {
      return A.Object.prototype.get$hashCode.call(this, 0);
    },
    toString$0(_) {
      return "null";
    }
  };
  A.Object.prototype = {$isObject: 1,
    $eq(_, other) {
      return this === other;
    },
    get$hashCode(_) {
      return A.Primitives_objectHashCode(this);
    },
    toString$0(_) {
      return "Instance of '" + A.Primitives_objectTypeName(this) + "'";
    },
    get$runtimeType(_) {
      return A.getRuntimeTypeOfDartObject(this);
    },
    toString() {
      return this.toString$0(this);
    }
  };
  A._StringStackTrace.prototype = {
    toString$0(_) {
      return this._stackTrace;
    },
    $isStackTrace: 1
  };
  A.StringBuffer.prototype = {
    get$length(_) {
      return this._contents.length;
    },
    write$1(obj) {
      var t1 = A.S(obj);
      this._contents += t1;
    },
    writeCharCode$1(charCode) {
      var t1 = A.Primitives_stringFromCharCode(charCode);
      this._contents += t1;
    },
    toString$0(_) {
      var t1 = this._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    $isStringSink: 1
  };
  A.Uri_parseIPv6Address_error.prototype = {
    call$2(msg, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv6 address, " + msg, this.host, position));
    },
    $signature: 43
  };
  A._Uri.prototype = {
    get$_text() {
      var t1, t2, t3, t4, _this = this,
        value = _this.___Uri__text_FI;
      if (value === $) {
        t1 = _this.scheme;
        t2 = t1.length !== 0 ? t1 + ":" : "";
        t3 = _this._host;
        t4 = t3 == null;
        if (!t4 || t1 === "file") {
          t1 = t2 + "//";
          t2 = _this._userInfo;
          if (t2.length !== 0)
            t1 = t1 + t2 + "@";
          if (!t4)
            t1 += t3;
          t2 = _this._port;
          if (t2 != null)
            t1 = t1 + ":" + A.S(t2);
        } else
          t1 = t2;
        t1 += _this.path;
        t2 = _this._query;
        if (t2 != null)
          t1 = t1 + "?" + t2;
        t2 = _this._fragment;
        if (t2 != null)
          t1 = t1 + "#" + t2;
        value = _this.___Uri__text_FI = t1.charCodeAt(0) == 0 ? t1 : t1;
      }
      return value;
    },
    get$pathSegments() {
      var pathToSplit, t1, result, _this = this,
        value = _this.___Uri_pathSegments_FI;
      if (value === $) {
        pathToSplit = _this.path;
        t1 = pathToSplit.length;
        if (t1 !== 0) {
          if (0 >= t1)
            return A.ioore(pathToSplit, 0);
          t1 = pathToSplit.charCodeAt(0) === 47;
        } else
          t1 = false;
        if (t1)
          pathToSplit = B.JSString_methods.substring$1(pathToSplit, 1);
        result = pathToSplit.length === 0 ? B.List_empty : A.List_List$unmodifiable(new A.MappedListIterable(A._setArrayType(pathToSplit.split("/"), type$.JSArray_String), type$.dynamic_Function_String._as(A.core_Uri_decodeComponent$closure()), type$.MappedListIterable_String_dynamic), type$.String);
        _this.___Uri_pathSegments_FI !== $ && A.throwLateFieldADI("pathSegments");
        value = _this.___Uri_pathSegments_FI = result;
      }
      return value;
    },
    get$hashCode(_) {
      var result, _this = this,
        value = _this.___Uri_hashCode_FI;
      if (value === $) {
        result = B.JSString_methods.get$hashCode(_this.get$_text());
        _this.___Uri_hashCode_FI !== $ && A.throwLateFieldADI("hashCode");
        _this.___Uri_hashCode_FI = result;
        value = result;
      }
      return value;
    },
    get$userInfo() {
      return this._userInfo;
    },
    get$host() {
      var host = this._host;
      if (host == null)
        return "";
      if (B.JSString_methods.startsWith$1(host, "[") && !B.JSString_methods.startsWith$2(host, "v", 1))
        return B.JSString_methods.substring$2(host, 1, host.length - 1);
      return host;
    },
    get$port() {
      var t1 = this._port;
      return t1 == null ? A._Uri__defaultPort(this.scheme) : t1;
    },
    get$query() {
      var t1 = this._query;
      return t1 == null ? "" : t1;
    },
    get$fragment() {
      var t1 = this._fragment;
      return t1 == null ? "" : t1;
    },
    isScheme$1(scheme) {
      var thisScheme = this.scheme;
      if (scheme.length !== thisScheme.length)
        return false;
      return A._caseInsensitiveCompareStart(scheme, thisScheme, 0) >= 0;
    },
    replace$2$path$scheme(path, scheme) {
      var schemeChanged, isFile, userInfo, port, host, hasAuthority, t1, currentPath, _this = this,
        scheme0 = _this.scheme;
      if (scheme != null) {
        scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
        schemeChanged = scheme !== scheme0;
      } else {
        scheme = scheme0;
        schemeChanged = false;
      }
      isFile = scheme === "file";
      userInfo = _this._userInfo;
      port = _this._port;
      if (schemeChanged)
        port = A._Uri__makePort(port, scheme);
      host = _this._host;
      if (!(host != null))
        host = userInfo.length !== 0 || port != null || isFile ? "" : null;
      hasAuthority = host != null;
      if (path != null) {
        t1 = path.length;
        path = A._Uri__makePath(path, 0, t1, null, scheme, hasAuthority);
      } else {
        currentPath = _this.path;
        if (!isFile)
          t1 = hasAuthority && currentPath.length !== 0;
        else
          t1 = true;
        if (t1 && !B.JSString_methods.startsWith$1(currentPath, "/"))
          currentPath = "/" + currentPath;
        path = currentPath;
      }
      return A._Uri$_internal(scheme, userInfo, host, port, path, _this._query, _this._fragment);
    },
    replace$1$scheme(scheme) {
      return this.replace$2$path$scheme(null, scheme);
    },
    replace$1$path(path) {
      return this.replace$2$path$scheme(path, null);
    },
    _mergePaths$2(base, reference) {
      var backCount, refStart, baseEnd, t1, newEnd, delta, t2, t3, t4;
      for (backCount = 0, refStart = 0; B.JSString_methods.startsWith$2(reference, "../", refStart);) {
        refStart += 3;
        ++backCount;
      }
      baseEnd = B.JSString_methods.lastIndexOf$1(base, "/");
      t1 = base.length;
      for (;;) {
        if (!(baseEnd > 0 && backCount > 0))
          break;
        newEnd = B.JSString_methods.lastIndexOf$2(base, "/", baseEnd - 1);
        if (newEnd < 0)
          break;
        delta = baseEnd - newEnd;
        t2 = delta !== 2;
        t3 = false;
        if (!t2 || delta === 3) {
          t4 = newEnd + 1;
          if (!(t4 < t1))
            return A.ioore(base, t4);
          if (base.charCodeAt(t4) === 46)
            if (t2) {
              t2 = newEnd + 2;
              if (!(t2 < t1))
                return A.ioore(base, t2);
              t2 = base.charCodeAt(t2) === 46;
            } else
              t2 = true;
          else
            t2 = t3;
        } else
          t2 = t3;
        if (t2)
          break;
        --backCount;
        baseEnd = newEnd;
      }
      return B.JSString_methods.replaceRange$3(base, baseEnd + 1, null, B.JSString_methods.substring$1(reference, refStart - 3 * backCount));
    },
    resolve$1(reference) {
      return this.resolveUri$1(A.Uri_parse(reference));
    },
    resolveUri$1(reference) {
      var targetScheme, t1, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, packageNameEnd, packageName, mergedPath, fragment, _this = this;
      if (reference.get$scheme().length !== 0)
        return reference;
      else {
        targetScheme = _this.scheme;
        if (reference.get$hasAuthority()) {
          t1 = reference.replace$1$scheme(targetScheme);
          return t1;
        } else {
          targetUserInfo = _this._userInfo;
          targetHost = _this._host;
          targetPort = _this._port;
          targetPath = _this.path;
          if (reference.get$hasEmptyPath())
            targetQuery = reference.get$hasQuery() ? reference.get$query() : _this._query;
          else {
            packageNameEnd = A._Uri__packageNameEnd(_this, targetPath);
            if (packageNameEnd > 0) {
              packageName = B.JSString_methods.substring$2(targetPath, 0, packageNameEnd);
              targetPath = reference.get$hasAbsolutePath() ? packageName + A._Uri__removeDotSegments(reference.get$path()) : packageName + A._Uri__removeDotSegments(_this._mergePaths$2(B.JSString_methods.substring$1(targetPath, packageName.length), reference.get$path()));
            } else if (reference.get$hasAbsolutePath())
              targetPath = A._Uri__removeDotSegments(reference.get$path());
            else if (targetPath.length === 0)
              if (targetHost == null)
                targetPath = targetScheme.length === 0 ? reference.get$path() : A._Uri__removeDotSegments(reference.get$path());
              else
                targetPath = A._Uri__removeDotSegments("/" + reference.get$path());
            else {
              mergedPath = _this._mergePaths$2(targetPath, reference.get$path());
              t1 = targetScheme.length === 0;
              if (!t1 || targetHost != null || B.JSString_methods.startsWith$1(targetPath, "/"))
                targetPath = A._Uri__removeDotSegments(mergedPath);
              else
                targetPath = A._Uri__normalizeRelativePath(mergedPath, !t1 || targetHost != null);
            }
            targetQuery = reference.get$hasQuery() ? reference.get$query() : null;
          }
        }
      }
      fragment = reference.get$hasFragment() ? reference.get$fragment() : null;
      return A._Uri$_internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
    },
    get$hasAuthority() {
      return this._host != null;
    },
    get$hasQuery() {
      return this._query != null;
    },
    get$hasFragment() {
      return this._fragment != null;
    },
    get$hasEmptyPath() {
      return this.path.length === 0;
    },
    get$hasAbsolutePath() {
      return B.JSString_methods.startsWith$1(this.path, "/");
    },
    toFilePath$0() {
      var pathSegments, _this = this,
        t1 = _this.scheme;
      if (t1 !== "" && t1 !== "file")
        throw A.wrapException(A.UnsupportedError$("Cannot extract a file path from a " + t1 + " URI"));
      t1 = _this._query;
      if ((t1 == null ? "" : t1) !== "")
        throw A.wrapException(A.UnsupportedError$(string$.Cannotfq));
      t1 = _this._fragment;
      if ((t1 == null ? "" : t1) !== "")
        throw A.wrapException(A.UnsupportedError$(string$.Cannotff));
      if (_this._host != null && _this.get$host() !== "")
        A.throwExpression(A.UnsupportedError$(string$.Cannotn));
      pathSegments = _this.get$pathSegments();
      A._Uri__checkNonWindowsPathReservedCharacters(pathSegments, false);
      t1 = A.StringBuffer__writeAll(B.JSString_methods.startsWith$1(_this.path, "/") ? "/" : "", pathSegments, "/");
      t1 = t1.charCodeAt(0) == 0 ? t1 : t1;
      return t1;
    },
    toString$0(_) {
      return this.get$_text();
    },
    $eq(_, other) {
      var t1, t2, t3, _this = this;
      if (other == null)
        return false;
      if (_this === other)
        return true;
      t1 = false;
      if (type$.Uri._is(other))
        if (_this.scheme === other.get$scheme())
          if (_this._host != null === other.get$hasAuthority())
            if (_this._userInfo === other.get$userInfo())
              if (_this.get$host() === other.get$host())
                if (_this.get$port() === other.get$port())
                  if (_this.path === other.get$path()) {
                    t2 = _this._query;
                    t3 = t2 == null;
                    if (!t3 === other.get$hasQuery()) {
                      if (t3)
                        t2 = "";
                      if (t2 === other.get$query()) {
                        t2 = _this._fragment;
                        t3 = t2 == null;
                        if (!t3 === other.get$hasFragment()) {
                          t1 = t3 ? "" : t2;
                          t1 = t1 === other.get$fragment();
                        }
                      }
                    }
                  }
      return t1;
    },
    $isUri: 1,
    get$scheme() {
      return this.scheme;
    },
    get$path() {
      return this.path;
    }
  };
  A._Uri__makePath_closure.prototype = {
    call$1(s) {
      return A._Uri__uriEncode(64, A._asString(s), B.C_Utf8Codec, false);
    },
    $signature: 16
  };
  A.UriData.prototype = {
    get$uri() {
      var t2, queryIndex, end, query, _this = this, _null = null,
        t1 = _this._uriCache;
      if (t1 == null) {
        t1 = _this._separatorIndices;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        t2 = _this._text;
        t1 = t1[0] + 1;
        queryIndex = B.JSString_methods.indexOf$2(t2, "?", t1);
        end = t2.length;
        if (queryIndex >= 0) {
          query = A._Uri__normalizeOrSubstring(t2, queryIndex + 1, end, 256, false, false);
          end = queryIndex;
        } else
          query = _null;
        t1 = _this._uriCache = new A._DataUri("data", "", _null, _null, A._Uri__normalizeOrSubstring(t2, t1, end, 128, false, false), query, _null);
      }
      return t1;
    },
    toString$0(_) {
      var t2,
        t1 = this._separatorIndices;
      if (0 >= t1.length)
        return A.ioore(t1, 0);
      t2 = this._text;
      return t1[0] === -1 ? "data:" + t2 : t2;
    }
  };
  A._SimpleUri.prototype = {
    get$hasAuthority() {
      return this._hostStart > 0;
    },
    get$hasPort() {
      return this._hostStart > 0 && this._portStart + 1 < this._pathStart;
    },
    get$hasQuery() {
      return this._queryStart < this._fragmentStart;
    },
    get$hasFragment() {
      return this._fragmentStart < this._uri.length;
    },
    get$hasAbsolutePath() {
      return B.JSString_methods.startsWith$2(this._uri, "/", this._pathStart);
    },
    get$hasEmptyPath() {
      return this._pathStart === this._queryStart;
    },
    isScheme$1(scheme) {
      var t1 = scheme.length;
      if (t1 === 0)
        return this._schemeEnd < 0;
      if (t1 !== this._schemeEnd)
        return false;
      return A._caseInsensitiveCompareStart(scheme, this._uri, 0) >= 0;
    },
    get$scheme() {
      var t1 = this._schemeCache;
      return t1 == null ? this._schemeCache = this._computeScheme$0() : t1;
    },
    _computeScheme$0() {
      var t2, _this = this,
        t1 = _this._schemeEnd;
      if (t1 <= 0)
        return "";
      t2 = t1 === 4;
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return "http";
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return "https";
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "file"))
        return "file";
      if (t1 === 7 && B.JSString_methods.startsWith$1(_this._uri, "package"))
        return "package";
      return B.JSString_methods.substring$2(_this._uri, 0, t1);
    },
    get$userInfo() {
      var t1 = this._hostStart,
        t2 = this._schemeEnd + 3;
      return t1 > t2 ? B.JSString_methods.substring$2(this._uri, t2, t1 - 1) : "";
    },
    get$host() {
      var t1 = this._hostStart;
      return t1 > 0 ? B.JSString_methods.substring$2(this._uri, t1, this._portStart) : "";
    },
    get$port() {
      var t1, _this = this;
      if (_this.get$hasPort())
        return A.int_parse(B.JSString_methods.substring$2(_this._uri, _this._portStart + 1, _this._pathStart), null);
      t1 = _this._schemeEnd;
      if (t1 === 4 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return 80;
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return 443;
      return 0;
    },
    get$path() {
      return B.JSString_methods.substring$2(this._uri, this._pathStart, this._queryStart);
    },
    get$query() {
      var t1 = this._queryStart,
        t2 = this._fragmentStart;
      return t1 < t2 ? B.JSString_methods.substring$2(this._uri, t1 + 1, t2) : "";
    },
    get$fragment() {
      var t1 = this._fragmentStart,
        t2 = this._uri;
      return t1 < t2.length ? B.JSString_methods.substring$1(t2, t1 + 1) : "";
    },
    _isPort$1(port) {
      var portDigitStart = this._portStart + 1;
      return portDigitStart + port.length === this._pathStart && B.JSString_methods.startsWith$2(this._uri, port, portDigitStart);
    },
    removeFragment$0() {
      var _this = this,
        t1 = _this._fragmentStart,
        t2 = _this._uri;
      if (t1 >= t2.length)
        return _this;
      return new A._SimpleUri(B.JSString_methods.substring$2(t2, 0, t1), _this._schemeEnd, _this._hostStart, _this._portStart, _this._pathStart, _this._queryStart, t1, _this._schemeCache);
    },
    replace$2$path$scheme(path, scheme) {
      var schemeChanged, isFile, t1, userInfo, port, host, hasAuthority, t2, query, fragment, _this = this, _null = null;
      if (scheme != null) {
        scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
        schemeChanged = !(_this._schemeEnd === scheme.length && B.JSString_methods.startsWith$1(_this._uri, scheme));
      } else {
        scheme = _this.get$scheme();
        schemeChanged = false;
      }
      isFile = scheme === "file";
      t1 = _this._hostStart;
      userInfo = t1 > 0 ? B.JSString_methods.substring$2(_this._uri, _this._schemeEnd + 3, t1) : "";
      port = _this.get$hasPort() ? _this.get$port() : _null;
      if (schemeChanged)
        port = A._Uri__makePort(port, scheme);
      t1 = _this._hostStart;
      if (t1 > 0)
        host = B.JSString_methods.substring$2(_this._uri, t1, _this._portStart);
      else
        host = userInfo.length !== 0 || port != null || isFile ? "" : _null;
      hasAuthority = host != null;
      if (path != null) {
        t1 = path.length;
        path = A._Uri__makePath(path, 0, t1, _null, scheme, hasAuthority);
      } else {
        path = B.JSString_methods.substring$2(_this._uri, _this._pathStart, _this._queryStart);
        if (!isFile)
          t1 = hasAuthority && path.length !== 0;
        else
          t1 = true;
        if (t1 && !B.JSString_methods.startsWith$1(path, "/"))
          path = "/" + path;
      }
      t1 = _this._queryStart;
      t2 = _this._fragmentStart;
      query = t1 < t2 ? B.JSString_methods.substring$2(_this._uri, t1 + 1, t2) : _null;
      t1 = _this._fragmentStart;
      t2 = _this._uri;
      fragment = t1 < t2.length ? B.JSString_methods.substring$1(t2, t1 + 1) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragment);
    },
    replace$1$scheme(scheme) {
      return this.replace$2$path$scheme(null, scheme);
    },
    replace$1$path(path) {
      return this.replace$2$path$scheme(path, null);
    },
    resolve$1(reference) {
      return this.resolveUri$1(A.Uri_parse(reference));
    },
    resolveUri$1(reference) {
      if (reference instanceof A._SimpleUri)
        return this._simpleMerge$2(this, reference);
      return this._toNonSimple$0().resolveUri$1(reference);
    },
    _simpleMerge$2(base, ref) {
      var t2, t3, t4, isSimple, delta, refStart, basePathStart, packageNameEnd, basePathStart0, baseStart, baseEnd, baseUri, baseStart0, backCount, refStart0, insert,
        t1 = ref._schemeEnd;
      if (t1 > 0)
        return ref;
      t2 = ref._hostStart;
      if (t2 > 0) {
        t3 = base._schemeEnd;
        if (t3 <= 0)
          return ref;
        t4 = t3 === 4;
        if (t4 && B.JSString_methods.startsWith$1(base._uri, "file"))
          isSimple = ref._pathStart !== ref._queryStart;
        else if (t4 && B.JSString_methods.startsWith$1(base._uri, "http"))
          isSimple = !ref._isPort$1("80");
        else
          isSimple = !(t3 === 5 && B.JSString_methods.startsWith$1(base._uri, "https")) || !ref._isPort$1("443");
        if (isSimple) {
          delta = t3 + 1;
          return new A._SimpleUri(B.JSString_methods.substring$2(base._uri, 0, delta) + B.JSString_methods.substring$1(ref._uri, t1 + 1), t3, t2 + delta, ref._portStart + delta, ref._pathStart + delta, ref._queryStart + delta, ref._fragmentStart + delta, base._schemeCache);
        } else
          return this._toNonSimple$0().resolveUri$1(ref);
      }
      refStart = ref._pathStart;
      t1 = ref._queryStart;
      if (refStart === t1) {
        t2 = ref._fragmentStart;
        if (t1 < t2) {
          t3 = base._queryStart;
          delta = t3 - t1;
          return new A._SimpleUri(B.JSString_methods.substring$2(base._uri, 0, t3) + B.JSString_methods.substring$1(ref._uri, t1), base._schemeEnd, base._hostStart, base._portStart, base._pathStart, t1 + delta, t2 + delta, base._schemeCache);
        }
        t1 = ref._uri;
        if (t2 < t1.length) {
          t3 = base._fragmentStart;
          return new A._SimpleUri(B.JSString_methods.substring$2(base._uri, 0, t3) + B.JSString_methods.substring$1(t1, t2), base._schemeEnd, base._hostStart, base._portStart, base._pathStart, base._queryStart, t2 + (t3 - t2), base._schemeCache);
        }
        return base.removeFragment$0();
      }
      t2 = ref._uri;
      if (B.JSString_methods.startsWith$2(t2, "/", refStart)) {
        basePathStart = base._pathStart;
        packageNameEnd = A._SimpleUri__packageNameEnd(this);
        basePathStart0 = packageNameEnd > 0 ? packageNameEnd : basePathStart;
        delta = basePathStart0 - refStart;
        return new A._SimpleUri(B.JSString_methods.substring$2(base._uri, 0, basePathStart0) + B.JSString_methods.substring$1(t2, refStart), base._schemeEnd, base._hostStart, base._portStart, basePathStart, t1 + delta, ref._fragmentStart + delta, base._schemeCache);
      }
      baseStart = base._pathStart;
      baseEnd = base._queryStart;
      if (baseStart === baseEnd && base._hostStart > 0) {
        while (B.JSString_methods.startsWith$2(t2, "../", refStart))
          refStart += 3;
        delta = baseStart - refStart + 1;
        return new A._SimpleUri(B.JSString_methods.substring$2(base._uri, 0, baseStart) + "/" + B.JSString_methods.substring$1(t2, refStart), base._schemeEnd, base._hostStart, base._portStart, baseStart, t1 + delta, ref._fragmentStart + delta, base._schemeCache);
      }
      baseUri = base._uri;
      packageNameEnd = A._SimpleUri__packageNameEnd(this);
      if (packageNameEnd >= 0)
        baseStart0 = packageNameEnd;
      else
        for (baseStart0 = baseStart; B.JSString_methods.startsWith$2(baseUri, "../", baseStart0);)
          baseStart0 += 3;
      backCount = 0;
      for (;;) {
        refStart0 = refStart + 3;
        if (!(refStart0 <= t1 && B.JSString_methods.startsWith$2(t2, "../", refStart)))
          break;
        ++backCount;
        refStart = refStart0;
      }
      for (t3 = baseUri.length, insert = ""; baseEnd > baseStart0;) {
        --baseEnd;
        if (!(baseEnd >= 0 && baseEnd < t3))
          return A.ioore(baseUri, baseEnd);
        if (baseUri.charCodeAt(baseEnd) === 47) {
          if (backCount === 0) {
            insert = "/";
            break;
          }
          --backCount;
          insert = "/";
        }
      }
      if (baseEnd === baseStart0 && base._schemeEnd <= 0 && !B.JSString_methods.startsWith$2(baseUri, "/", baseStart)) {
        refStart -= backCount * 3;
        insert = "";
      }
      delta = baseEnd - refStart + insert.length;
      return new A._SimpleUri(B.JSString_methods.substring$2(baseUri, 0, baseEnd) + insert + B.JSString_methods.substring$1(t2, refStart), base._schemeEnd, base._hostStart, base._portStart, baseStart, t1 + delta, ref._fragmentStart + delta, base._schemeCache);
    },
    toFilePath$0() {
      var t2, _this = this,
        t1 = _this._schemeEnd;
      if (t1 >= 0) {
        t2 = !(t1 === 4 && B.JSString_methods.startsWith$1(_this._uri, "file"));
        t1 = t2;
      } else
        t1 = false;
      if (t1)
        throw A.wrapException(A.UnsupportedError$("Cannot extract a file path from a " + _this.get$scheme() + " URI"));
      t1 = _this._queryStart;
      t2 = _this._uri;
      if (t1 < t2.length) {
        if (t1 < _this._fragmentStart)
          throw A.wrapException(A.UnsupportedError$(string$.Cannotfq));
        throw A.wrapException(A.UnsupportedError$(string$.Cannotff));
      }
      if (_this._hostStart < _this._portStart)
        A.throwExpression(A.UnsupportedError$(string$.Cannotn));
      t1 = B.JSString_methods.substring$2(t2, _this._pathStart, t1);
      return t1;
    },
    get$hashCode(_) {
      var t1 = this._hashCodeCache;
      return t1 == null ? this._hashCodeCache = B.JSString_methods.get$hashCode(this._uri) : t1;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return type$.Uri._is(other) && this._uri === other.toString$0(0);
    },
    _toNonSimple$0() {
      var _this = this, _null = null,
        t1 = _this.get$scheme(),
        t2 = _this.get$userInfo(),
        t3 = _this._hostStart > 0 ? _this.get$host() : _null,
        t4 = _this.get$hasPort() ? _this.get$port() : _null,
        t5 = _this._uri,
        t6 = _this._queryStart,
        t7 = B.JSString_methods.substring$2(t5, _this._pathStart, t6),
        t8 = _this._fragmentStart;
      t6 = t6 < t8 ? _this.get$query() : _null;
      return A._Uri$_internal(t1, t2, t3, t4, t7, t6, t8 < t5.length ? _this.get$fragment() : _null);
    },
    toString$0(_) {
      return this._uri;
    },
    $isUri: 1
  };
  A._DataUri.prototype = {};
  A.NullRejectionException.prototype = {
    toString$0(_) {
      return "Promise was rejected with a value of `" + (this.isUndefined ? "undefined" : "null") + "`.";
    },
    $isException: 1
  };
  A.FutureOfJSAnyToJSPromise_get_toJS_closure.prototype = {
    call$2(resolve, reject) {
      var t1 = type$.JavaScriptFunction;
      this._this.then$1$2$onError(new A.FutureOfJSAnyToJSPromise_get_toJS__closure(t1._as(resolve)), new A.FutureOfJSAnyToJSPromise_get_toJS__closure0(t1._as(reject)), type$.nullable_Object);
    },
    $signature: 30
  };
  A.FutureOfJSAnyToJSPromise_get_toJS__closure.prototype = {
    call$1(value) {
      var t1 = this.resolve;
      t1.call(t1, value);
      return value;
    },
    $signature: 11
  };
  A.FutureOfJSAnyToJSPromise_get_toJS__closure0.prototype = {
    call$2(error, stackTrace) {
      var wrapper, box, t1;
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      wrapper = A.JSFunctionUnsafeUtilExtension_callAsConstructor(type$.JavaScriptFunction._as(init.G.Error), string$.Dart_e, type$.JSObject);
      if (type$.JavaScriptObject._is(error))
        A.throwExpression("Attempting to box non-Dart object.");
      box = {};
      box[$.$get$_jsBoxedDartObjectProperty()] = error;
      wrapper.error = box;
      wrapper.stack = stackTrace.toString$0(0);
      t1 = this.reject;
      t1.call(t1, wrapper);
      return wrapper;
    },
    $signature: 39
  };
  A.FutureOfVoidToJSPromise_get_toJS_closure.prototype = {
    call$2(resolve, reject) {
      var t1 = type$.JavaScriptFunction;
      this._this.then$1$2$onError(new A.FutureOfVoidToJSPromise_get_toJS__closure(t1._as(resolve)), new A.FutureOfVoidToJSPromise_get_toJS__closure0(t1._as(reject)), type$.nullable_Object);
    },
    $signature: 30
  };
  A.FutureOfVoidToJSPromise_get_toJS__closure.prototype = {
    call$1(__wc0_formal) {
      var t1 = this.resolve;
      return t1.call(t1);
    },
    $signature: 38
  };
  A.FutureOfVoidToJSPromise_get_toJS__closure0.prototype = {
    call$2(error, stackTrace) {
      var wrapper, box, t1;
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      wrapper = A.JSFunctionUnsafeUtilExtension_callAsConstructor(type$.JavaScriptFunction._as(init.G.Error), string$.Dart_e, type$.JSObject);
      if (type$.JavaScriptObject._is(error))
        A.throwExpression("Attempting to box non-Dart object.");
      box = {};
      box[$.$get$_jsBoxedDartObjectProperty()] = error;
      wrapper.error = box;
      wrapper.stack = stackTrace.toString$0(0);
      t1 = this.reject;
      t1.call(t1, wrapper);
    },
    $signature: 4
  };
  A.jsify__convert.prototype = {
    call$1(o) {
      var t1, convertedMap, key, convertedList;
      if (A._noJsifyRequired(o))
        return o;
      t1 = this._convertedObjects;
      if (t1.containsKey$1(o))
        return t1.$index(0, o);
      if (type$.Map_dynamic_dynamic._is(o)) {
        convertedMap = {};
        t1.$indexSet(0, o, convertedMap);
        for (t1 = o.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
          key = t1.get$current();
          convertedMap[key] = this.call$1(o.$index(0, key));
        }
        return convertedMap;
      } else if (type$.Iterable_dynamic._is(o)) {
        convertedList = [];
        t1.$indexSet(0, o, convertedList);
        B.JSArray_methods.addAll$1(convertedList, J.map$1$1$ax(o, this, type$.dynamic));
        return convertedList;
      } else
        return o;
    },
    $signature: 11
  };
  A.promiseToFuture_closure.prototype = {
    call$1(r) {
      return this.completer.complete$1(this.T._eval$1("0/?")._as(r));
    },
    $signature: 7
  };
  A.promiseToFuture_closure0.prototype = {
    call$1(e) {
      if (e == null)
        return this.completer.completeError$1(new A.NullRejectionException(e === undefined));
      return this.completer.completeError$1(e);
    },
    $signature: 7
  };
  A.dartify_convert.prototype = {
    call$1(o) {
      var t1, millisSinceEpoch, proto, t2, dartObject, originalKeys, dartKeys, i, jsKey, dartKey, l, $length;
      if (A._noDartifyRequired(o))
        return o;
      t1 = this._convertedObjects;
      o.toString;
      if (t1.containsKey$1(o))
        return t1.$index(0, o);
      if (o instanceof Date) {
        millisSinceEpoch = o.getTime();
        if (millisSinceEpoch < -864e13 || millisSinceEpoch > 864e13)
          A.throwExpression(A.RangeError$range(millisSinceEpoch, -864e13, 864e13, "millisecondsSinceEpoch", null));
        A.checkNotNullable(true, "isUtc", type$.bool);
        return new A.DateTime(millisSinceEpoch, 0, true);
      }
      if (o instanceof RegExp)
        throw A.wrapException(A.ArgumentError$("structured clone of RegExp", null));
      if (o instanceof Promise)
        return A.promiseToFuture(o, type$.nullable_Object);
      proto = Object.getPrototypeOf(o);
      if (proto === Object.prototype || proto === null) {
        t2 = type$.nullable_Object;
        dartObject = A.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
        t1.$indexSet(0, o, dartObject);
        originalKeys = Object.keys(o);
        dartKeys = [];
        for (t1 = J.getInterceptor$ax(originalKeys), t2 = t1.get$iterator(originalKeys); t2.moveNext$0();)
          dartKeys.push(A.dartify(t2.get$current()));
        for (i = 0; i < t1.get$length(originalKeys); ++i) {
          jsKey = t1.$index(originalKeys, i);
          if (!(i < dartKeys.length))
            return A.ioore(dartKeys, i);
          dartKey = dartKeys[i];
          if (jsKey != null)
            dartObject.$indexSet(0, dartKey, this.call$1(o[jsKey]));
        }
        return dartObject;
      }
      if (o instanceof Array) {
        l = o;
        dartObject = [];
        t1.$indexSet(0, o, dartObject);
        $length = A._asInt(o.length);
        for (t1 = J.getInterceptor$asx(l), i = 0; i < $length; ++i)
          dartObject.push(this.call$1(t1.$index(l, i)));
        return dartObject;
      }
      return o;
    },
    $signature: 11
  };
  A._JSRandom.prototype = {
    nextInt$1(max) {
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      return Math.random() * max >>> 0;
    }
  };
  A._JSSecureRandom.prototype = {
    _JSSecureRandom$0() {
      var $crypto = self.crypto;
      if ($crypto != null)
        if ($crypto.getRandomValues != null)
          return;
      throw A.wrapException(A.UnsupportedError$("No source of cryptographically secure random numbers available."));
    },
    nextInt$1(max) {
      var byteCount, t1, start, randomLimit, t2, t3, random, result;
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      if (max > 255)
        if (max > 65535)
          byteCount = max > 16777215 ? 4 : 3;
        else
          byteCount = 2;
      else
        byteCount = 1;
      t1 = this._math$_buffer;
      t1.$flags & 2 && A.throwUnsupportedOperation(t1, 11);
      t1.setUint32(0, 0, false);
      start = 4 - byteCount;
      randomLimit = A._asInt(Math.pow(256, byteCount));
      for (t2 = max - 1, t3 = (max & t2) >>> 0 === 0;;) {
        crypto.getRandomValues(J.asUint8List$2$x(B.NativeByteData_methods.get$buffer(t1), start, byteCount));
        random = t1.getUint32(0, false);
        if (t3)
          return (random & t2) >>> 0;
        result = random % max;
        if (random - result + max < randomLimit)
          return result;
      }
    }
  };
  A.AsyncMemoizer.prototype = {};
  A.DelegatingStreamSink.prototype = {
    add$1(_, data) {
      this._sink.add$1(0, A._instanceType(this)._eval$1("DelegatingStreamSink.T")._as(data));
    },
    $isStreamSink: 1
  };
  A.ErrorResult.prototype = {
    complete$1(completer) {
      completer.completeError$2(this.error, this.stackTrace);
    },
    get$hashCode(_) {
      return (J.get$hashCode$(this.error) ^ A.Primitives_objectHashCode(this.stackTrace) ^ 492929599) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.ErrorResult && J.$eq$(this.error, other.error) && this.stackTrace === other.stackTrace;
    },
    $isResult: 1
  };
  A.ValueResult.prototype = {
    complete$1(completer) {
      this.$ti._eval$1("Completer<1>")._as(completer).complete$1(this.value);
    },
    get$hashCode(_) {
      return (J.get$hashCode$(this.value) ^ 842997089) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.ValueResult && J.$eq$(this.value, other.value);
    },
    $isResult: 1
  };
  A.StreamQueue.prototype = {
    get$hasNext() {
      var t1 = new A._Future($.Zone__current, type$._Future_bool);
      this._addRequest$1(new A._HasNextRequest(new A._AsyncCompleter(t1, type$._AsyncCompleter_bool), this.$ti._eval$1("_HasNextRequest<1>")));
      return t1;
    },
    _updateRequests$0() {
      var t1, t2, t3, t4, t5, _this = this;
      for (t1 = _this._requestQueue, t2 = _this._eventQueue, t3 = t1.$ti._precomputed1; !t1.get$isEmpty(0);) {
        t4 = t1._head;
        if (t4 === t1._tail)
          A.throwExpression(A.IterableElementError_noElement());
        t5 = t1._table;
        if (!(t4 < t5.length))
          return A.ioore(t5, t4);
        t4 = t5[t4];
        if (t4 == null)
          t4 = t3._as(t4);
        if (t4.update$2(t2, _this._isDone))
          t1.removeFirst$0();
        else
          return;
      }
      if (!_this._isDone)
        _this._stream_queue$_subscription.pause$0();
    },
    _ensureListening$0() {
      var t1, _this = this;
      if (_this._isDone)
        return;
      t1 = _this._stream_queue$_subscription;
      if (t1 == null)
        _this._stream_queue$_subscription = _this._stream_queue$_source.listen$3$onDone$onError(new A.StreamQueue__ensureListening_closure(_this), new A.StreamQueue__ensureListening_closure0(_this), new A.StreamQueue__ensureListening_closure1(_this));
      else
        t1.resume$0();
    },
    _addResult$1(result) {
      var t1, _this = this;
      _this.$ti._eval$1("Result<1>")._as(result);
      ++_this._eventsReceived;
      t1 = _this._eventQueue;
      t1._queue_list$_add$1(t1.$ti._eval$1("QueueList.E")._as(result));
      _this._updateRequests$0();
    },
    _addRequest$1(request) {
      var t1, _this = this;
      _this.$ti._eval$1("_EventRequest<1>")._as(request);
      t1 = _this._requestQueue;
      if (t1._head === t1._tail) {
        if (request.update$2(_this._eventQueue, _this._isDone))
          return;
        _this._ensureListening$0();
      }
      t1._collection$_add$1(t1.$ti._precomputed1._as(request));
    }
  };
  A.StreamQueue__ensureListening_closure.prototype = {
    call$1(data) {
      var t1 = this.$this,
        t2 = t1.$ti;
      t1._addResult$1(new A.ValueResult(t2._precomputed1._as(data), t2._eval$1("ValueResult<1>")));
    },
    $signature() {
      return this.$this.$ti._eval$1("~(1)");
    }
  };
  A.StreamQueue__ensureListening_closure1.prototype = {
    call$2(error, stackTrace) {
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      this.$this._addResult$1(new A.ErrorResult(error, stackTrace));
    },
    $signature: 4
  };
  A.StreamQueue__ensureListening_closure0.prototype = {
    call$0() {
      var t1 = this.$this;
      t1._stream_queue$_subscription = null;
      t1._isDone = true;
      t1._updateRequests$0();
    },
    $signature: 0
  };
  A._NextRequest.prototype = {
    update$2(events, isDone) {
      var t1, result;
      this.$ti._eval$1("QueueList<Result<1>>")._as(events);
      if (!events.get$isEmpty(events)) {
        t1 = events._queue_list$_head;
        if (t1 === events._queue_list$_tail)
          A.throwExpression(A.StateError$("No element"));
        result = J.$index$asx(events._queue_list$_table, t1);
        if (result == null)
          result = events.$ti._eval$1("QueueList.E")._as(result);
        J.$indexSet$ax(events._queue_list$_table, events._queue_list$_head, null);
        events._queue_list$_head = (events._queue_list$_head + 1 & J.get$length$asx(events._queue_list$_table) - 1) >>> 0;
        result.complete$1(this._stream_queue$_completer);
        return true;
      }
      if (isDone) {
        this._stream_queue$_completer.completeError$2(new A.StateError("No elements"), A.StackTrace_current());
        return true;
      }
      return false;
    },
    $is_EventRequest: 1
  };
  A._HasNextRequest.prototype = {
    update$2(events, isDone) {
      this.$ti._eval$1("QueueList<Result<1>>")._as(events);
      if (!events.get$isEmpty(events)) {
        this._stream_queue$_completer.complete$1(true);
        return true;
      }
      if (isDone) {
        this._stream_queue$_completer.complete$1(false);
        return true;
      }
      return false;
    },
    $is_EventRequest: 1
  };
  A.hashObjects_closure.prototype = {
    call$2(h, i) {
      return A._combine(A._asInt(h), J.get$hashCode$(i));
    },
    $signature: 37
  };
  A.BuiltList.prototype = {
    toBuilder$0() {
      return A.ListBuilder_ListBuilder(this, this.$ti._precomputed1);
    },
    get$hashCode(_) {
      var t1 = this._list$_hashCode;
      return t1 == null ? this._list$_hashCode = A.hashObjects(this._list) : t1;
    },
    $eq(_, other) {
      var t1, t2, i, t3, t4;
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A._BuiltList))
        return false;
      t1 = other._list;
      t2 = this._list;
      if (t1.length !== t2.length)
        return false;
      if (other.get$hashCode(0) !== this.get$hashCode(0))
        return false;
      for (i = 0; t3 = t2.length, i !== t3; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        t4 = t1[i];
        if (!(i < t3))
          return A.ioore(t2, i);
        if (!J.$eq$(t4, t2[i]))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this._list, "[", "]");
    },
    get$length(_) {
      return this._list.length;
    },
    get$iterator(_) {
      var t1 = this._list;
      return new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    map$1$1(_, f, $T) {
      var t1 = this._list,
        t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(_, f) {
      return this.map$1$1(0, f, type$.dynamic);
    },
    contains$1(_, element) {
      return B.JSArray_methods.contains$1(this._list, element);
    },
    get$isEmpty(_) {
      return this._list.length === 0;
    },
    get$isNotEmpty(_) {
      return this._list.length !== 0;
    },
    take$1(_, n) {
      var t1 = this._list;
      return A.SubListIterable$(t1, 0, A.checkNotNullable(n, "count", type$.int), A._arrayInstanceType(t1)._precomputed1);
    },
    skip$1(_, n) {
      var t1 = this._list;
      return A.SubListIterable$(t1, n, null, A._arrayInstanceType(t1)._precomputed1);
    },
    get$first(_) {
      return B.JSArray_methods.get$first(this._list);
    },
    elementAt$1(_, index) {
      var t1 = this._list;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    },
    $isIterable: 1
  };
  A._BuiltList.prototype = {
    _list$_maybeCheckForNull$0() {
      var t1, t2, _i;
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (t1 = this._list, t2 = t1.length, _i = 0; _i < t2; ++_i)
        if (t1[_i] == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
    }
  };
  A.ListBuilder.prototype = {
    build$0() {
      var t2, t3, _this = this,
        t1 = _this._listOwner;
      if (t1 == null) {
        t1 = _this.__ListBuilder__list_A;
        t1 === $ && A.throwLateFieldNI("_list");
        t2 = _this.$ti;
        t3 = t2._eval$1("_BuiltList<1>");
        t3 = t3._as(new A._BuiltList(t1, t3));
        _this.__ListBuilder__list_A = t2._eval$1("List<1>")._as(t1);
        _this._listOwner = t3;
        t1 = t3;
      }
      return t1;
    },
    replace$1(iterable) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_BuiltList<1>"),
        t3 = t1._eval$1("List<1>");
      if (t2._is(iterable)) {
        t2._as(iterable);
        _this.__ListBuilder__list_A = t3._as(iterable._list);
        _this._listOwner = iterable;
      } else {
        _this.__ListBuilder__list_A = t3._as(A.List_List$from(iterable, true, t1._precomputed1));
        _this._listOwner = null;
      }
    },
    get$length(_) {
      var t1 = this.__ListBuilder__list_A;
      t1 === $ && A.throwLateFieldNI("_list");
      return t1.length;
    },
    map$1(_, f) {
      var t2, t3, t4, t5, result, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      t2 = _this.__ListBuilder__list_A;
      t2 === $ && A.throwLateFieldNI("_list");
      t3 = t1._precomputed1;
      t4 = A._arrayInstanceType(t2);
      t5 = t4._eval$1("@<1>")._bind$1(t3)._eval$1("MappedListIterable<1,2>");
      result = A.List_List$_of(new A.MappedListIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t5), t5._eval$1("ListIterable.E"));
      _this._list$_maybeCheckElements$1(result);
      _this.__ListBuilder__list_A = t1._eval$1("List<1>")._as(result);
      _this._listOwner = null;
    },
    _list$_maybeCheckElements$1(elements) {
      var t2, _i,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = elements.length, t1 = t1._precomputed1, _i = 0; _i < t2; ++_i)
        if (t1._as(elements[_i]) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
    }
  };
  A.BuiltListMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._list_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._list_multimap$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeysIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltListMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t1 = A.List_List$_of(t2, A._instanceType(t2)._eval$1("Iterable.E"));
        t1.$flags = 1;
        t1 = t1;
        B.JSArray_methods.sort$0(t1);
        t1 = _this._list_multimap$_hashCode = A.hashObjects(t1);
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltListMultimap))
        return false;
      t1 = other._list_multimap$_map;
      t2 = _this._list_multimap$_map;
      if (t1.__js_helper$_length !== t2.__js_helper$_length)
        return false;
      if (other.get$hashCode(0) !== _this.get$hashCode(0))
        return false;
      for (t3 = _this.get$keys(), t4 = t3.__js_helper$_map, t3 = new A.LinkedHashMapKeyIterator(t4, t4._modifications, t4._first, t3.$ti._eval$1("LinkedHashMapKeyIterator<1>")), t4 = other._emptyList, t5 = _this._emptyList; t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._list_multimap$_map);
    },
    get$keys() {
      var t1 = this._list_multimap$_keys;
      if (t1 == null) {
        t1 = this._list_multimap$_map;
        t1 = this._list_multimap$_keys = new A.LinkedHashMapKeysIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>"));
      }
      return t1;
    },
    get$length(_) {
      return this._list_multimap$_map.__js_helper$_length;
    }
  };
  A.BuiltListMultimap_BuiltListMultimap_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 5
  };
  A.BuiltListMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._list_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltListMultimap.prototype = {
    _BuiltListMultimap$copy$2(keys, lookup, $K, $V) {
      var t1, t2, t3, key;
      for (t1 = keys.get$iterator(keys), t2 = this._list_multimap$_map, t3 = type$.Iterable_dynamic; t1.moveNext$0();) {
        key = t1.get$current();
        if ($K._is(key))
          t2.$indexSet(0, key, A.BuiltList_BuiltList$from(t3._as(lookup.call$1(key)), $V));
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.ListMultimapBuilder.prototype = {
    build$0() {
      var key, t2, builtList, t3, t4, t5, _this = this,
        _s9_ = "_builtMap",
        t1 = _this._list_multimap$_builtMapOwner;
      if (t1 == null) {
        t1 = _this.__ListMultimapBuilder__builderMap_A;
        t1 === $ && A.throwLateFieldNI("_builderMap");
        t1 = new A.LinkedHashMapKeyIterator(t1, t1._modifications, t1._first, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterator<1>"));
        while (t1.moveNext$0()) {
          key = t1.__js_helper$_current;
          t2 = _this.__ListMultimapBuilder__builderMap_A.$index(0, key);
          builtList = t2._listOwner;
          if (builtList == null) {
            t3 = t2.__ListBuilder__list_A;
            t3 === $ && A.throwLateFieldNI("_list");
            t4 = A._instanceType(t2);
            t5 = t4._eval$1("_BuiltList<1>");
            builtList = t5._as(new A._BuiltList(t3, t5));
            t2.__ListBuilder__list_A = t4._eval$1("List<1>")._as(t3);
            t2._listOwner = builtList;
          }
          t2 = builtList._list.length;
          t3 = _this.__ListMultimapBuilder__builtMap_A;
          if (t2 === 0) {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.remove$1(0, key);
          } else {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.$indexSet(0, key, builtList);
          }
        }
        t1 = _this.__ListMultimapBuilder__builtMap_A;
        t1 === $ && A.throwLateFieldNI(_s9_);
        t2 = _this.$ti;
        t2 = _this._list_multimap$_builtMapOwner = new A._BuiltListMultimap(t1, A.BuiltList_BuiltList$from(B.List_empty0, t2._rest[1]), t2._eval$1("_BuiltListMultimap<1,2>"));
        t1 = t2;
      }
      return t1;
    },
    replace$1(multimap) {
      this._list_multimap$_setWithCopyAndCheck$2(multimap.get$keys(), new A.ListMultimapBuilder_replace_closure(multimap));
    },
    _list_multimap$_getValuesBuilder$1(key) {
      var t2, result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t2 = _this.__ListMultimapBuilder__builderMap_A;
      t2 === $ && A.throwLateFieldNI("_builderMap");
      result = t2.$index(0, key);
      if (result == null) {
        t2 = _this.__ListMultimapBuilder__builtMap_A;
        t2 === $ && A.throwLateFieldNI("_builtMap");
        builtValues = t2.$index(0, key);
        result = builtValues == null ? A.ListBuilder_ListBuilder(B.List_empty0, t1._rest[1]) : A.ListBuilder_ListBuilder(builtValues, builtValues.$ti._precomputed1);
        _this.__ListMultimapBuilder__builderMap_A.$indexSet(0, key, result);
      }
      return result;
    },
    _list_multimap$_setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, t10, t11, _this = this;
      _this._list_multimap$_builtMapOwner = null;
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltList<2>");
      t4 = t1._eval$1("Map<1,BuiltList<2>>");
      _this.__ListMultimapBuilder__builtMap_A = t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3));
      _this.__ListMultimapBuilder__builderMap_A = t1._eval$1("Map<1,ListBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("ListBuilder<2>")));
      for (t5 = keys.get$iterator(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current();
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current();
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._list_multimap$_builtMapOwner != null) {
                _this.__ListMultimapBuilder__builtMap_A = t4._as(A.LinkedHashMap_LinkedHashMap$from(_this.__ListMultimapBuilder__builtMap_A, t2, t3));
                _this._list_multimap$_builtMapOwner = null;
              }
              _this._list_multimap$_checkKey$1(key);
              _this._list_multimap$_checkValue$1(value);
              t8 = _this._list_multimap$_getValuesBuilder$1(key);
              t9 = t8.$ti;
              t10 = t9._precomputed1;
              t10._as(value);
              if (!$.$get$isSoundMode() && !t10._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", null));
              if (t8._listOwner != null) {
                t11 = t8.__ListBuilder__list_A;
                t11 === $ && A.throwLateFieldNI("_list");
                t8.__ListBuilder__list_A = t9._eval$1("List<1>")._as(A.List_List$from(t11, true, t10));
                t8._listOwner = null;
              }
              t8 = t8.__ListBuilder__list_A;
              t8 === $ && A.throwLateFieldNI("_list");
              B.JSArray_methods.add$1(t8, value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    },
    _list_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _list_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    }
  };
  A.ListMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 5
  };
  A.BuiltMap.prototype = {
    toBuilder$0() {
      var t1 = this.$ti;
      t1._eval$1("_BuiltMap<1,2>")._as(this);
      return new A.MapBuilder(this._mapFactory, this._map$_map, this, t1._eval$1("MapBuilder<1,2>"));
    },
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._map$_hashCode;
      if (t1 == null) {
        t1 = _this._map$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeysIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltMap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t1 = A.List_List$_of(t2, A._instanceType(t2)._eval$1("Iterable.E"));
        t1.$flags = 1;
        t1 = t1;
        B.JSArray_methods.sort$0(t1);
        t1 = _this._map$_hashCode = A.hashObjects(t1);
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, key, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltMap))
        return false;
      t1 = other._map$_map;
      t2 = _this._map$_map;
      if (t1.__js_helper$_length !== t2.__js_helper$_length)
        return false;
      if (other.get$hashCode(0) !== _this.get$hashCode(0))
        return false;
      for (t3 = _this.get$keys(), t4 = t3.__js_helper$_map, t3 = new A.LinkedHashMapKeyIterator(t4, t4._modifications, t4._first, t3.$ti._eval$1("LinkedHashMapKeyIterator<1>")); t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        if (!J.$eq$(t1.$index(0, key), t2.$index(0, key)))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._map$_map);
    },
    get$keys() {
      var t1 = this._map$_keys;
      if (t1 == null) {
        t1 = this._map$_map;
        t1 = this._map$_keys = new A.LinkedHashMapKeysIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>"));
      }
      return t1;
    },
    get$length(_) {
      return this._map$_map.__js_helper$_length;
    },
    map$1(_, f) {
      var t1 = type$.dynamic;
      return new A._BuiltMap(null, this._map$_map.map$2$1(0, this.$ti._eval$1("MapEntry<@,@>(1,2)")._as(f), t1, t1), type$._BuiltMap_dynamic_dynamic);
    }
  };
  A.BuiltMap_BuiltMap_closure.prototype = {
    call$1(k) {
      return this.map.$index(0, k);
    },
    $signature: 5
  };
  A.BuiltMap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._map$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltMap.prototype = {
    _BuiltMap$copyAndCheckTypes$2(keys, lookup, $K, $V) {
      var t1, t2, key, value;
      for (t1 = keys.get$iterator(keys), t2 = this._map$_map; t1.moveNext$0();) {
        key = t1.get$current();
        if ($K._is(key)) {
          value = lookup.call$1(key);
          if ($V._is(value))
            t2.$indexSet(0, key, value);
          else
            throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value), null));
        } else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.MapBuilder.prototype = {
    build$0() {
      var _this = this,
        t1 = _this._mapOwner;
      if (t1 == null) {
        t1 = _this.__MapBuilder__map_A;
        t1 === $ && A.throwLateFieldNI("_map");
        t1 = _this._mapOwner = new A._BuiltMap(_this._mapFactory, t1, _this.$ti._eval$1("_BuiltMap<1,2>"));
      }
      return t1;
    },
    replace$1(map) {
      var _this = this,
        replacement = _this._createMap$0();
      map.forEach$1(0, new A.MapBuilder_replace_closure(_this, replacement));
      _this.$ti._eval$1("Map<1,2>")._as(replacement);
      _this._mapOwner = null;
      _this.__MapBuilder__map_A = replacement;
    },
    $indexSet(_, key, value) {
      var t2, t3, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      _this._checkKey$1(key);
      _this._checkValue$1(value);
      if (_this._mapOwner != null) {
        t2 = _this._createMap$0();
        t3 = _this.__MapBuilder__map_A;
        t3 === $ && A.throwLateFieldNI("_map");
        t2.addAll$1(0, t3);
        _this.__MapBuilder__map_A = t1._eval$1("Map<1,2>")._as(t2);
        _this._mapOwner = null;
      }
      t1 = _this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      t1.$indexSet(0, key, value);
    },
    get$length(_) {
      var t1 = this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      return t1.__js_helper$_length;
    },
    get$_safeMap() {
      var t1, t2, _this = this;
      if (_this._mapOwner != null) {
        t1 = _this._createMap$0();
        t2 = _this.__MapBuilder__map_A;
        t2 === $ && A.throwLateFieldNI("_map");
        t1.addAll$1(0, t2);
        _this.__MapBuilder__map_A = _this.$ti._eval$1("Map<1,2>")._as(t1);
        _this._mapOwner = null;
      }
      t1 = _this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      return t1;
    },
    _createMap$0() {
      var t1 = this.$ti;
      return A.LinkedHashMap_LinkedHashMap$_empty(t1._precomputed1, t1._rest[1]);
    },
    _checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    }
  };
  A.MapBuilder_replace_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      this.replacement.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    $signature: 24
  };
  A.BuiltSet.prototype = {
    get$hashCode(_) {
      var t2, t3, _this = this,
        t1 = _this._set$_hashCode;
      if (t1 == null) {
        t1 = _this._set$_set;
        t2 = A._instanceType(t1);
        t3 = t2._eval$1("EfficientLengthMappedIterable<1,int>");
        t1 = A.List_List$_of(new A.EfficientLengthMappedIterable(t1, t2._eval$1("int(1)")._as(new A.BuiltSet_hashCode_closure(_this)), t3), t3._eval$1("Iterable.E"));
        t1.$flags = 1;
        t1 = t1;
        B.JSArray_methods.sort$0(t1);
        t1 = _this._set$_hashCode = A.hashObjects(t1);
      }
      return t1;
    },
    $eq(_, other) {
      var t1;
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A._BuiltSet))
        return false;
      t1 = this._set$_set;
      if (other._set$_set._collection$_length !== t1._collection$_length)
        return false;
      if (other.get$hashCode(0) !== this.get$hashCode(0))
        return false;
      return t1.containsAll$1(other);
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this._set$_set, "{", "}");
    },
    get$length(_) {
      return this._set$_set._collection$_length;
    },
    get$iterator(_) {
      var t1 = this._set$_set;
      return A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1);
    },
    map$1$1(_, f, $T) {
      var t1 = this._set$_set,
        t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1(_, f) {
      return this.map$1$1(0, f, type$.dynamic);
    },
    contains$1(_, element) {
      return this._set$_set.contains$1(0, element);
    },
    get$isEmpty(_) {
      return this._set$_set._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._set$_set._collection$_length !== 0;
    },
    take$1(_, n) {
      var t1 = this._set$_set;
      return A.TakeIterable_TakeIterable(t1, n, A._instanceType(t1)._precomputed1);
    },
    skip$1(_, n) {
      var t1 = this._set$_set;
      return A.SkipIterable_SkipIterable(t1, n, A._instanceType(t1)._precomputed1);
    },
    get$first(_) {
      return this._set$_set.get$first(0);
    },
    elementAt$1(_, index) {
      return this._set$_set.elementAt$1(0, index);
    },
    $isIterable: 1
  };
  A.BuiltSet_hashCode_closure.prototype = {
    call$1(e) {
      return J.get$hashCode$(this.$this.$ti._precomputed1._as(e));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSet.prototype = {
    _maybeCheckForNull$0() {
      var t1, t2, element;
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (t1 = this._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1), t2 = t1.$ti._precomputed1; t1.moveNext$0();) {
        element = t1._collection$_current;
        if ((element == null ? t2._as(element) : element) == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
      }
    }
  };
  A.SetBuilder.prototype = {
    build$0() {
      var _this = this,
        t1 = _this._setOwner;
      if (t1 == null) {
        t1 = _this.__SetBuilder__set_A;
        t1 === $ && A.throwLateFieldNI("_set");
        t1 = _this._setOwner = new A._BuiltSet(_this._setFactory, t1, _this.$ti._eval$1("_BuiltSet<1>"));
      }
      return t1;
    },
    replace$1(iterable) {
      var t1, t2, t3, element, _this = this,
        set = _this._createSet$0();
      for (t1 = J.get$iterator$ax(iterable), t2 = _this.$ti, t3 = t2._precomputed1; t1.moveNext$0();) {
        element = t1.get$current();
        if (t3._is(element))
          set.add$1(0, element);
        else
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: " + A.S(element), null));
      }
      t2._eval$1("Set<1>")._as(set);
      _this._setOwner = null;
      _this.__SetBuilder__set_A = set;
    },
    get$length(_) {
      var t1 = this.__SetBuilder__set_A;
      t1 === $ && A.throwLateFieldNI("_set");
      return t1._collection$_length;
    },
    map$1(_, f) {
      var result, t2, t3, t4, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      result = _this._createSet$0();
      t2 = _this.__SetBuilder__set_A;
      t2 === $ && A.throwLateFieldNI("_set");
      t3 = t1._precomputed1;
      t4 = A._instanceType(t2);
      result.addAll$1(0, new A.EfficientLengthMappedIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t4._eval$1("@<1>")._bind$1(t3)._eval$1("EfficientLengthMappedIterable<1,2>")));
      _this._maybeCheckElements$1(result);
      t1._eval$1("Set<1>")._as(result);
      _this._setOwner = null;
      _this.__SetBuilder__set_A = result;
    },
    get$_safeSet() {
      var t1, t2, _this = this;
      if (_this._setOwner != null) {
        t1 = _this._createSet$0();
        t2 = _this.__SetBuilder__set_A;
        t2 === $ && A.throwLateFieldNI("_set");
        t1.addAll$1(0, t2);
        _this.__SetBuilder__set_A = _this.$ti._eval$1("Set<1>")._as(t1);
        _this._setOwner = null;
      }
      t1 = _this.__SetBuilder__set_A;
      t1 === $ && A.throwLateFieldNI("_set");
      return t1;
    },
    _createSet$0() {
      return A.LinkedHashSet_LinkedHashSet$_empty(this.$ti._precomputed1);
    },
    _maybeCheckElements$1(elements) {
      var t2, t3, element,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = A._LinkedHashSetIterator$(elements, elements._collection$_modifications, A._instanceType(elements)._precomputed1), t1 = t1._precomputed1, t3 = t2.$ti._precomputed1; t2.moveNext$0();) {
        element = t2._collection$_current;
        if (t1._as(element == null ? t3._as(element) : element) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
      }
    }
  };
  A.BuiltSetMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._set_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._set_multimap$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeysIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltSetMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t1 = A.List_List$_of(t2, A._instanceType(t2)._eval$1("Iterable.E"));
        t1.$flags = 1;
        t1 = t1;
        B.JSArray_methods.sort$0(t1);
        t1 = _this._set_multimap$_hashCode = A.hashObjects(t1);
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltSetMultimap))
        return false;
      t1 = other._set_multimap$_map;
      t2 = _this._set_multimap$_map;
      if (t1.__js_helper$_length !== t2.__js_helper$_length)
        return false;
      if (other.get$hashCode(0) !== _this.get$hashCode(0))
        return false;
      for (t3 = _this.get$keys(), t4 = t3.__js_helper$_map, t3 = new A.LinkedHashMapKeyIterator(t4, t4._modifications, t4._first, t3.$ti._eval$1("LinkedHashMapKeyIterator<1>")), t4 = other._emptySet, t5 = _this._emptySet; t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._set_multimap$_map);
    },
    get$keys() {
      var t1 = this._set_multimap$_keys;
      if (t1 == null) {
        t1 = this._set_multimap$_map;
        t1 = this._set_multimap$_keys = new A.LinkedHashMapKeysIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>"));
      }
      return t1;
    },
    get$length(_) {
      return this._set_multimap$_map.__js_helper$_length;
    }
  };
  A.BuiltSetMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._set_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSetMultimap.prototype = {};
  A.SetMultimapBuilder.prototype = {
    build$0() {
      var key, t2, builtSet, t3, t4, _this = this,
        _s9_ = "_builtMap",
        t1 = _this._builtMapOwner;
      if (t1 == null) {
        t1 = _this.__SetMultimapBuilder__builderMap_A;
        t1 === $ && A.throwLateFieldNI("_builderMap");
        t1 = new A.LinkedHashMapKeyIterator(t1, t1._modifications, t1._first, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterator<1>"));
        while (t1.moveNext$0()) {
          key = t1.__js_helper$_current;
          t2 = _this.__SetMultimapBuilder__builderMap_A.$index(0, key);
          builtSet = t2._setOwner;
          if (builtSet == null) {
            t3 = t2._setFactory;
            t4 = t2.__SetBuilder__set_A;
            t4 === $ && A.throwLateFieldNI("_set");
            builtSet = t2._setOwner = new A._BuiltSet(t3, t4, A._instanceType(t2)._eval$1("_BuiltSet<1>"));
          }
          t2 = builtSet._set$_set._collection$_length;
          t3 = _this.__SetMultimapBuilder__builtMap_A;
          if (t2 === 0) {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.remove$1(0, key);
          } else {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.$indexSet(0, key, builtSet);
          }
        }
        t1 = _this.__SetMultimapBuilder__builtMap_A;
        t1 === $ && A.throwLateFieldNI(_s9_);
        t2 = _this.$ti;
        t2 = _this._builtMapOwner = new A._BuiltSetMultimap(t1, A.BuiltSet_BuiltSet$from(B.List_empty0, t2._rest[1]), t2._eval$1("_BuiltSetMultimap<1,2>"));
        t1 = t2;
      }
      return t1;
    },
    replace$1(multimap) {
      this._setWithCopyAndCheck$2(multimap.get$keys(), new A.SetMultimapBuilder_replace_closure(multimap));
    },
    _getValuesBuilder$1(key) {
      var t2, result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t2 = _this.__SetMultimapBuilder__builderMap_A;
      t2 === $ && A.throwLateFieldNI("_builderMap");
      result = t2.$index(0, key);
      if (result == null) {
        t2 = _this.__SetMultimapBuilder__builtMap_A;
        t2 === $ && A.throwLateFieldNI("_builtMap");
        builtValues = t2.$index(0, key);
        if (builtValues == null)
          result = A.SetBuilder_SetBuilder(t1._rest[1]);
        else {
          t1 = builtValues.$ti;
          t1._eval$1("_BuiltSet<1>")._as(builtValues);
          result = new A.SetBuilder(builtValues._setFactory, builtValues._set$_set, builtValues, t1._eval$1("SetBuilder<1>"));
        }
        _this.__SetMultimapBuilder__builderMap_A.$indexSet(0, key, result);
      }
      return result;
    },
    _setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, _this = this;
      _this._builtMapOwner = null;
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltSet<2>");
      t4 = t1._eval$1("Map<1,BuiltSet<2>>");
      _this.__SetMultimapBuilder__builtMap_A = t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3));
      _this.__SetMultimapBuilder__builderMap_A = t1._eval$1("Map<1,SetBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("SetBuilder<2>")));
      for (t5 = keys.get$iterator(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current();
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current();
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._builtMapOwner != null) {
                _this.__SetMultimapBuilder__builtMap_A = t4._as(A.LinkedHashMap_LinkedHashMap$from(_this.__SetMultimapBuilder__builtMap_A, t2, t3));
                _this._builtMapOwner = null;
              }
              _this._set_multimap$_checkKey$1(key);
              _this._set_multimap$_checkValue$1(value);
              t8 = _this._getValuesBuilder$1(key);
              t9 = t8.$ti._precomputed1;
              t9._as(value);
              if (!$.$get$isSoundMode() && !t9._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", null));
              t8.get$_safeSet().add$1(0, value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    },
    _set_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("invalid key: " + A.S(key), null));
    },
    _set_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("invalid value: " + A.S(value), null));
    }
  };
  A.SetMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 5
  };
  A.EnumClass.prototype = {
    toString$0(_) {
      return this.name;
    }
  };
  A.newBuiltValueToStringHelper_closure.prototype = {
    call$1(className) {
      var t1 = new A.StringBuffer("");
      t1._contents = className;
      t1._contents = className + " {\n";
      $._indentingBuiltValueToStringHelperIndent = $._indentingBuiltValueToStringHelperIndent + 2;
      return new A.IndentingBuiltValueToStringHelper(t1);
    },
    $signature: 84
  };
  A.IndentingBuiltValueToStringHelper.prototype = {
    add$2(_, field, value) {
      var t1, t2;
      if (value != null) {
        t1 = this._result;
        t1.toString;
        t2 = (t1._contents += B.JSString_methods.$mul(" ", $._indentingBuiltValueToStringHelperIndent)) + field;
        t1._contents = t2;
        t1._contents = t2 + "=";
        t2 = A.S(value);
        t1._contents = (t1._contents += t2) + ",\n";
      }
    },
    toString$0(_) {
      var t2, stringResult,
        t1 = $._indentingBuiltValueToStringHelperIndent - 2;
      $._indentingBuiltValueToStringHelperIndent = t1;
      t2 = this._result;
      t2.toString;
      t2._contents = (t2._contents += B.JSString_methods.$mul(" ", t1)) + "}";
      stringResult = t2.toString$0(0);
      this._result = null;
      return stringResult;
    }
  };
  A.BuiltValueNullFieldError.prototype = {
    toString$0(_) {
      return 'Tried to construct class "' + this.type + '" with null for non-nullable field "' + this.field + '".';
    }
  };
  A.BuiltValueNestedFieldError.prototype = {
    toString$0(_) {
      return 'Tried to build class "' + this.type + '" but nested builder for field "' + this.field + '" threw: ' + this.error;
    }
  };
  A.JsonObject.prototype = {
    toString$0(_) {
      return J.toString$0$(this.get$value());
    }
  };
  A.BoolJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.BoolJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSBool_methods.get$hashCode(this.value);
    },
    get$value() {
      return this.value;
    }
  };
  A.ListJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.ListJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(this.value);
    },
    get$value() {
      return this.value;
    }
  };
  A.MapJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.MapJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(this.value);
    },
    get$value() {
      return this.value;
    }
  };
  A.NumJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.NumJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSNumber_methods.get$hashCode(this.value);
    },
    get$value() {
      return this.value;
    }
  };
  A.StringJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.StringJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSString_methods.get$hashCode(this.value);
    },
    get$value() {
      return this.value;
    }
  };
  A.Serializers_Serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty0, type$.Object);
    },
    $signature: 58
  };
  A.Serializers_Serializers_closure0.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.ListMultimapBuilder_ListMultimapBuilder(t1, t1);
    },
    $signature: 33
  };
  A.Serializers_Serializers_closure1.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.MapBuilder_MapBuilder(t1, t1);
    },
    $signature: 34
  };
  A.Serializers_Serializers_closure2.prototype = {
    call$0() {
      return A.SetBuilder_SetBuilder(type$.Object);
    },
    $signature: 35
  };
  A.Serializers_Serializers_closure3.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.SetMultimapBuilder_SetMultimapBuilder(t1, t1);
    },
    $signature: 36
  };
  A.FullType.prototype = {
    $eq(_, other) {
      var t1, t2, t3, t4, i, t5, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.FullType))
        return false;
      if (_this.root != other.root)
        return false;
      if (_this.nullable !== other.nullable)
        return false;
      t1 = _this.parameters;
      t2 = t1.length;
      t3 = other.parameters;
      t4 = t3.length;
      if (t2 !== t4)
        return false;
      for (i = 0; i !== t2; ++i) {
        if (!(i < t2))
          return A.ioore(t1, i);
        t5 = t1[i];
        if (!(i < t4))
          return A.ioore(t3, i);
        if (!t5.$eq(0, t3[i]))
          return false;
      }
      return true;
    },
    get$hashCode(_) {
      var t1 = A.hashObjects(this.parameters);
      t1 = A._finish(A._combine(A._combine(0, J.get$hashCode$(this.root)), B.JSInt_methods.get$hashCode(t1)));
      return t1 ^ (this.nullable ? 1768878041 : 0);
    },
    toString$0(_) {
      var t2,
        t1 = this.root;
      if (t1 == null)
        t1 = "unspecified";
      else {
        t2 = this.parameters;
        t1 = t2.length === 0 ? A.FullType__getRawName(t1) : A.FullType__getRawName(t1) + "<" + B.JSArray_methods.join$1(t2, ", ") + ">";
        t1 += this.nullable ? "?" : "";
      }
      return t1;
    }
  };
  A.DeserializationError.prototype = {
    toString$0(_) {
      return "Deserializing to '" + this.type.toString$0(0) + "' failed due to: " + this.error.toString$0(0);
    }
  };
  A.BigIntSerializer.prototype = {
    serialize$3$specifiedType(serializers, bigInt, specifiedType) {
      return type$.BigInt._as(bigInt).toString$0(0);
    },
    serialize$2(serializers, bigInt) {
      return this.serialize$3$specifiedType(serializers, bigInt, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var result;
      A._asString(serialized);
      result = A._BigIntImpl__tryParse(serialized, null);
      if (result == null)
        A.throwExpression(A.FormatException$("Could not parse BigInt", serialized, null));
      return result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "BigInt";
    }
  };
  A.BoolSerializer.prototype = {
    serialize$3$specifiedType(serializers, boolean, specifiedType) {
      return A._asBool(boolean);
    },
    serialize$2(serializers, boolean) {
      return this.serialize$3$specifiedType(serializers, boolean, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asBool(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "bool";
    }
  };
  A.BuiltJsonSerializers.prototype = {
    serialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, t4, transformedObject, t5, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1), t3 = t2._eval$1("ArrayIterator<1>"), t4 = new J.ArrayIterator(t1, t1.length, t3), t2 = t2._precomputed1, transformedObject = object; t4.moveNext$0();) {
        t5 = t4._current;
        transformedObject = (t5 == null ? t2._as(t5) : t5).beforeSerialize$2(transformedObject, specifiedType);
      }
      result = this._serialize$2(transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t3); t1.moveNext$0();) {
        t3 = t1._current;
        result = (t3 == null ? t2._as(t3) : t3).afterSerialize$2(result, specifiedType);
      }
      return result;
    },
    serialize$1(object) {
      return this.serialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _serialize$2(object, specifiedType) {
      var serializer, result, _this = this,
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        t1 = J.getInterceptor$(object);
        serializer = _this.serializerForType$1(t1.get$runtimeType(object));
        if (serializer == null)
          throw A.wrapException(A.StateError$(A._noSerializerMessageFor(t1.get$runtimeType(object).toString$0(0))));
        if (type$.StructuredSerializer_dynamic._is(serializer)) {
          result = [serializer.get$wireName()];
          B.JSArray_methods.addAll$1(result, serializer.serialize$2(_this, object));
          return result;
        } else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? [serializer.get$wireName(), null] : A._setArrayType([serializer.get$wireName(), serializer.serialize$2(_this, object)], type$.JSArray_Object);
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer = _this.serializerForType$1(t1);
        if (serializer == null)
          return _this.serialize$1(object);
        if (type$.StructuredSerializer_dynamic._is(serializer))
          return object == null ? null : J.toList$0$ax(serializer.serialize$3$specifiedType(_this, object, specifiedType));
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? null : serializer.serialize$3$specifiedType(_this, object, specifiedType);
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    deserialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, t4, transformedObject, t5, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1), t3 = t2._eval$1("ArrayIterator<1>"), t4 = new J.ArrayIterator(t1, t1.length, t3), t2 = t2._precomputed1, transformedObject = object; t4.moveNext$0();) {
        t5 = t4._current;
        transformedObject = (t5 == null ? t2._as(t5) : t5).beforeDeserialize$2(transformedObject, specifiedType);
      }
      result = this._deserialize$3(object, transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t3); t1.moveNext$0();) {
        t3 = t1._current;
        result = (t3 == null ? t2._as(t3) : t3).afterDeserialize$2(result, specifiedType);
      }
      return result;
    },
    deserialize$1(object) {
      return this.deserialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _deserialize$3(objectBeforePlugins, object, specifiedType) {
      var serializer, error, primitive, error0, serializer0, error1, error2, wireName, exception, _this = this,
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        type$.List_nullable_Object._as(object);
        t1 = J.getInterceptor$ax(object);
        wireName = A._asString(t1.get$first(object));
        serializer = _this._wireNameToSerializer._map$_map.$index(0, wireName);
        if (serializer == null)
          throw A.wrapException(A.StateError$(A._noSerializerMessageFor(wireName)));
        if (type$.StructuredSerializer_dynamic._is(serializer))
          try {
            t1 = serializer.deserialize$2(_this, t1.sublist$1(object, 1));
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          try {
            primitive = t1.$index(object, 1);
            t1 = primitive == null ? null : serializer.deserialize$2(_this, primitive);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error0 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error0));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer0 = _this.serializerForType$1(t1);
        if (serializer0 == null)
          if (type$.List_dynamic._is(object) && typeof J.get$first$ax(object) == "string")
            return _this.deserialize$1(objectBeforePlugins);
          else
            throw A.wrapException(A.StateError$(A._noSerializerMessageFor(t1.toString$0(0))));
        if (type$.StructuredSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, type$.Iterable_nullable_Object._as(object), specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error1 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error1));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, object, specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error2 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error2));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    serializerForType$1(type) {
      var t1 = this._typeToSerializer._map$_map.$index(0, type);
      return t1 == null ? this._typeNameToSerializer._map$_map.$index(0, A._getRawName(type)) : t1;
    },
    newBuilder$1(fullType) {
      var t1,
        builderFactory = this.builderFactories._map$_map.$index(0, fullType);
      if (builderFactory == null)
        this._throwMissingBuilderFactory$1(fullType);
      t1 = builderFactory.call$0();
      return t1 == null ? A._asObject(t1) : t1;
    },
    _throwMissingBuilderFactory$1(fullType) {
      throw A.wrapException(A.StateError$("No builder factory for " + fullType.toString$0(0) + ". Fix by adding one, see SerializersBuilder.addBuilderFactory."));
    },
    $isSerializers: 1
  };
  A.BuiltJsonSerializersBuilder.prototype = {
    add$1(_, serializer) {
      var t1, t2, t3, t4, t5, t6, $name, genericsStart, t7;
      if (!type$.StructuredSerializer_dynamic._is(serializer) && !type$.PrimitiveSerializer_dynamic._is(serializer))
        throw A.wrapException(A.ArgumentError$(string$.serial, null));
      this._wireNameToSerializer.$indexSet(0, serializer.get$wireName(), serializer);
      for (t1 = J.get$iterator$ax(serializer.get$types()), t2 = this._typeToSerializer, t3 = t2.$ti, t4 = t3._precomputed1, t3 = t3._rest[1], t5 = this._typeNameToSerializer; t1.moveNext$0();) {
        t6 = t1.get$current();
        t4._as(t6);
        t3._as(serializer);
        t2._checkKey$1(t6);
        t2._checkValue$1(serializer);
        t2.get$_safeMap().$indexSet(0, t6, serializer);
        $name = t6.toString$0(0);
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
        t6 = genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
        t7 = t5.$ti;
        t7._precomputed1._as(t6);
        t7._rest[1]._as(serializer);
        t5._checkKey$1(t6);
        t5._checkValue$1(serializer);
        t5.get$_safeMap().$indexSet(0, t6, serializer);
      }
    },
    addBuilderFactory$2(types, $function) {
      var t2, t3,
        t1 = this._builderFactories;
      t1.$indexSet(0, types, $function);
      t2 = types.root;
      t3 = types.parameters;
      t1.$indexSet(0, !types.nullable ? new A.FullType(t2, t3, true) : new A.FullType(t2, t3, false), $function);
    },
    build$0() {
      var _this = this;
      return new A.BuiltJsonSerializers(_this._typeToSerializer.build$0(), _this._wireNameToSerializer.build$0(), _this._typeNameToSerializer.build$0(), _this._builderFactories.build$0(), _this._plugins.build$0());
    }
  };
  A.BuiltListMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtListMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltListMultimap_dynamic_dynamic._as(builtListMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtListMultimap.get$keys(), t2 = t1.__js_helper$_map, t1 = new A.LinkedHashMapKeyIterator(t2, t2._modifications, t2._first, t1.$ti._eval$1("LinkedHashMapKeyIterator<1>")), t2 = builtListMultimap._list_multimap$_map, t3 = builtListMultimap._emptyList; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._list;
        t6 = A._arrayInstanceType(t5);
        t7 = t6._eval$1("MappedListIterable<1,Object?>");
        t4 = A.List_List$_of(new A.MappedListIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltListMultimapSerializer_serialize_closure(serializers, valueType))), t7), t7._eval$1("ListIterable.E"));
        result.push(t4);
      }
      return result;
    },
    serialize$2(serializers, builtListMultimap) {
      return this.serialize$3$specifiedType(serializers, builtListMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, t5, t6, t7, i, key, values, t8, value, t9, t10, t11, t12,
        t1 = type$.Iterable_nullable_Object;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.ListMultimapBuilder_ListMultimapBuilder(t2, t2);
      } else
        result = type$.ListMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (t3 = result.$ti, t4 = t3._precomputed1, t5 = t3._rest[1], t6 = t3._eval$1("BuiltList<2>"), t3 = t3._eval$1("Map<1,BuiltList<2>>"), t7 = type$.nullable_Object, i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        values = J.map$1$1$ax(t1._as(t2.elementAt$1(serialized, i + 1)), new A.BuiltListMultimapSerializer_deserialize_closure(serializers, valueType), t7);
        for (t8 = values.get$iterator(values); t8.moveNext$0();) {
          value = t8.get$current();
          t4._as(key);
          t5._as(value);
          if (result._list_multimap$_builtMapOwner != null) {
            t9 = result.__ListMultimapBuilder__builtMap_A;
            t9 === $ && A.throwLateFieldNI("_builtMap");
            result.__ListMultimapBuilder__builtMap_A = t3._as(A.LinkedHashMap_LinkedHashMap$from(t9, t4, t6));
            result._list_multimap$_builtMapOwner = null;
          }
          result._list_multimap$_checkKey$1(key);
          result._list_multimap$_checkValue$1(value);
          t9 = result._list_multimap$_getValuesBuilder$1(key);
          t10 = t9.$ti;
          t11 = t10._precomputed1;
          t11._as(value);
          if (!$.$get$isSoundMode() && !t11._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", null));
          if (t9._listOwner != null) {
            t12 = t9.__ListBuilder__list_A;
            t12 === $ && A.throwLateFieldNI("_list");
            t9.__ListBuilder__list_A = t10._eval$1("List<1>")._as(A.List_List$from(t12, true, t11));
            t9._listOwner = null;
          }
          t9 = t9.__ListBuilder__list_A;
          t9 === $ && A.throwLateFieldNI("_list");
          B.JSArray_methods.add$1(t9, value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "listMultimap";
    }
  };
  A.BuiltListMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  A.BuiltListMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 11
  };
  A.BuiltListSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtList, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltList_dynamic._as(builtList);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      t1 = builtList._list;
      t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._eval$1("Object?(1)")._as(builtList.$ti._eval$1("Object?(1)")._as(new A.BuiltListSerializer_serialize_closure(serializers, elementType))), t2._eval$1("MappedListIterable<1,Object?>"));
    },
    serialize$2(serializers, builtList) {
      return this.serialize$3$specifiedType(serializers, builtList, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.ListBuilder_ListBuilder(B.List_empty0, type$.Object) : type$.ListBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(J.map$1$1$ax(serialized, new A.BuiltListSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "list";
    }
  };
  A.BuiltListSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.BuiltListSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.BuiltMapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtMap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key;
      type$.BuiltMap_dynamic_dynamic._as(builtMap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtMap.get$keys(), t2 = t1.__js_helper$_map, t1 = new A.LinkedHashMapKeyIterator(t2, t2._modifications, t2._first, t1.$ti._eval$1("LinkedHashMapKeyIterator<1>")), t2 = builtMap._map$_map; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result.push(serializers.serialize$2$specifiedType(t2.$index(0, key), valueType));
      }
      return result;
    },
    serialize$2(serializers, builtMap) {
      return this.serialize$3$specifiedType(serializers, builtMap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, t3, keyType, valueType, result, i, key, value;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      if (isUnderspecified) {
        t1 = type$.Object;
        result = A.MapBuilder_MapBuilder(t1, t1);
      } else
        result = type$.MapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t1 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t1.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (t2 = result.$ti, t3 = t2._precomputed1, t2 = t2._rest[1], i = 0; i !== t1.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i), keyType);
        value = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i + 1), valueType);
        t3._as(key);
        t2._as(value);
        result._checkKey$1(key);
        result._checkValue$1(value);
        result.get$_safeMap().$indexSet(0, key, value);
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "map";
    }
  };
  A.BuiltSetMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSetMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltSetMultimap_dynamic_dynamic._as(builtSetMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtSetMultimap.get$keys(), t2 = t1.__js_helper$_map, t1 = new A.LinkedHashMapKeyIterator(t2, t2._modifications, t2._first, t1.$ti._eval$1("LinkedHashMapKeyIterator<1>")), t2 = builtSetMultimap._set_multimap$_map, t3 = builtSetMultimap._emptySet; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._set$_set;
        t6 = A._instanceType(t5);
        t7 = t6._eval$1("EfficientLengthMappedIterable<1,Object?>");
        t4 = A.List_List$_of(new A.EfficientLengthMappedIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltSetMultimapSerializer_serialize_closure(serializers, valueType))), t7), t7._eval$1("Iterable.E"));
        result.push(t4);
      }
      return result;
    },
    serialize$2(serializers, builtSetMultimap) {
      return this.serialize$3$specifiedType(serializers, builtSetMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, t5, t6, i, key, t7, value, t8, t9,
        t1 = type$.Iterable_dynamic;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.SetMultimapBuilder_SetMultimapBuilder(t2, t2);
      } else
        result = type$.SetMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (t3 = result.$ti, t4 = t3._precomputed1, t5 = t3._rest[1], t6 = t3._eval$1("BuiltSet<2>"), t3 = t3._eval$1("Map<1,BuiltSet<2>>"), i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        for (t7 = t1._as(J.map$1$ax(t2.elementAt$1(serialized, i + 1), new A.BuiltSetMultimapSerializer_deserialize_closure(serializers, valueType))), t7 = t7.get$iterator(t7); t7.moveNext$0();) {
          value = t7.get$current();
          t4._as(key);
          t5._as(value);
          if (result._builtMapOwner != null) {
            t8 = result.__SetMultimapBuilder__builtMap_A;
            t8 === $ && A.throwLateFieldNI("_builtMap");
            result.__SetMultimapBuilder__builtMap_A = t3._as(A.LinkedHashMap_LinkedHashMap$from(t8, t4, t6));
            result._builtMapOwner = null;
          }
          result._set_multimap$_checkKey$1(key);
          result._set_multimap$_checkValue$1(value);
          t8 = result._getValuesBuilder$1(key);
          t9 = t8.$ti._precomputed1;
          t9._as(value);
          if (!$.$get$isSoundMode() && !t9._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", null));
          t8.get$_safeSet().add$1(0, value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "setMultimap";
    }
  };
  A.BuiltSetMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  A.BuiltSetMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  A.BuiltSetSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSet, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltSet_dynamic._as(builtSet);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      t1 = builtSet._set$_set;
      t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._eval$1("Object?(1)")._as(builtSet.$ti._eval$1("Object?(1)")._as(new A.BuiltSetSerializer_serialize_closure(serializers, elementType))), t2._eval$1("EfficientLengthMappedIterable<1,Object?>"));
    },
    serialize$2(serializers, builtSet) {
      return this.serialize$3$specifiedType(serializers, builtSet, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.SetBuilder_SetBuilder(type$.Object) : type$.SetBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(J.map$1$1$ax(serialized, new A.BuiltSetSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "set";
    }
  };
  A.BuiltSetSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.BuiltSetSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.DateTimeSerializer.prototype = {
    serialize$3$specifiedType(serializers, dateTime, specifiedType) {
      type$.DateTime._as(dateTime);
      if (!dateTime.isUtc)
        throw A.wrapException(A.ArgumentError$value(dateTime, "dateTime", "Must be in utc for serialization."));
      return 1000 * dateTime._value + dateTime._microsecond;
    },
    serialize$2(serializers, dateTime) {
      return this.serialize$3$specifiedType(serializers, dateTime, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2;
      A._asInt(serialized);
      t1 = B.JSInt_methods.$mod(serialized, 1000);
      t2 = B.JSInt_methods._tdivFast$1(serialized - t1, 1000);
      if (t2 < -864e13 || t2 > 864e13)
        A.throwExpression(A.RangeError$range(t2, -864e13, 864e13, "millisecondsSinceEpoch", null));
      if (t2 === 864e13 && t1 !== 0)
        A.throwExpression(A.ArgumentError$value(t1, "microsecond", "Time including microseconds is outside valid range"));
      A.checkNotNullable(true, "isUtc", type$.bool);
      return new A.DateTime(t2, t1, true);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "DateTime";
    }
  };
  A.DoubleSerializer.prototype = {
    serialize$3$specifiedType(serializers, aDouble, specifiedType) {
      A._asDouble(aDouble);
      if (isNaN(aDouble))
        return "NaN";
      else if (aDouble == 1 / 0 || aDouble == -1 / 0)
        return B.JSNumber_methods.get$isNegative(aDouble) ? "-INF" : "INF";
      else
        return aDouble;
    },
    serialize$2(serializers, aDouble) {
      return this.serialize$3$specifiedType(serializers, aDouble, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNum(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "double";
    }
  };
  A.DurationSerializer.prototype = {
    serialize$3$specifiedType(serializers, duration, specifiedType) {
      return type$.Duration._as(duration)._duration;
    },
    serialize$2(serializers, duration) {
      return this.serialize$3$specifiedType(serializers, duration, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Duration$(A._asInt(serialized), 0);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "Duration";
    }
  };
  A.Int32Serializer.prototype = {
    serialize$3$specifiedType(serializers, int32, specifiedType) {
      return type$.Int32._as(int32)._i;
    },
    serialize$2(serializers, int32) {
      return this.serialize$3$specifiedType(serializers, int32, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      A._asInt(serialized);
      return new A.Int32((serialized & 2147483647) - ((serialized & 2147483648) >>> 0));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "Int32";
    }
  };
  A.Int64Serializer.prototype = {
    serialize$3$specifiedType(serializers, int64, specifiedType) {
      return type$.Int64._as(int64)._toRadixString$1(10);
    },
    serialize$2(serializers, int64) {
      return this.serialize$3$specifiedType(serializers, int64, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = A.Int64__parseRadix(A._asString(serialized), 10, true);
      t1.toString;
      return t1;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "Int64";
    }
  };
  A.IntSerializer.prototype = {
    serialize$3$specifiedType(serializers, integer, specifiedType) {
      return A._asInt(integer);
    },
    serialize$2(serializers, integer) {
      return this.serialize$3$specifiedType(serializers, integer, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asInt(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "int";
    }
  };
  A.JsonObjectSerializer.prototype = {
    serialize$3$specifiedType(serializers, jsonObject, specifiedType) {
      return type$.JsonObject._as(jsonObject).get$value();
    },
    serialize$2(serializers, jsonObject) {
      return this.serialize$3$specifiedType(serializers, jsonObject, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.JsonObject_JsonObject(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "JsonObject";
    }
  };
  A.ListSerializer.prototype = {
    serialize$3$specifiedType(serializers, list, specifiedType) {
      var t1, t2, elementType;
      type$.List_dynamic._as(list);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      return J.map$1$1$ax(list, new A.ListSerializer_serialize_closure(serializers, elementType), type$.nullable_Object);
    },
    serialize$2(serializers, list) {
      return this.serialize$3$specifiedType(serializers, list, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A._setArrayType([], type$.JSArray_Object) : type$.List_dynamic._as(serializers.newBuilder$1(specifiedType));
      for (t1 = J.get$iterator$ax(serialized), t2 = J.getInterceptor$ax(result); t1.moveNext$0();)
        t2.add$1(result, serializers.deserialize$2$specifiedType(t1.get$current(), elementType));
      return result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "List";
    }
  };
  A.ListSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.MapSerializer.prototype = {
    serialize$3$specifiedType(serializers, $Map, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key;
      type$.Map_dynamic_dynamic._as($Map);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = $Map.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
        key = t1.get$current();
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result.push(serializers.serialize$2$specifiedType($Map.$index(0, key), valueType));
      }
      return result;
    },
    serialize$2(serializers, $Map) {
      return this.serialize$3$specifiedType(serializers, $Map, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, t3, keyType, valueType, result, i;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      if (isUnderspecified) {
        t1 = type$.Object;
        result = A.LinkedHashMap_LinkedHashMap$_empty(t1, t1);
      } else
        result = type$.Map_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t1 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t1.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (i = 0; i !== t1.get$length(serialized); i += 2)
        result.$indexSet(0, serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i), keyType), serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i + 1), valueType));
      return result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "Map";
    }
  };
  A.NullSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      type$.Null._as(value);
      throw A.wrapException(A.UnimplementedError$(null));
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      throw A.wrapException(A.UnimplementedError$(null));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "Null";
    }
  };
  A.NumSerializer.prototype = {
    serialize$3$specifiedType(serializers, number, specifiedType) {
      A._asNum(number);
      if (isNaN(number))
        return "NaN";
      else if (number == 1 / 0 || number == -1 / 0)
        return B.JSNumber_methods.get$isNegative(number) ? "-INF" : "INF";
      else
        return number;
    },
    serialize$2(serializers, number) {
      return this.serialize$3$specifiedType(serializers, number, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNum(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "num";
    }
  };
  A.RegExpSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      return type$.RegExp._as(value).pattern;
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.RegExp_RegExp(A._asString(serialized), true, false);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "RegExp";
    }
  };
  A.SetSerializer.prototype = {
    serialize$3$specifiedType(serializers, set, specifiedType) {
      var t1, t2, elementType;
      type$.Set_dynamic._as(set);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      return set.map$1$1(0, new A.SetSerializer_serialize_closure(serializers, elementType), type$.nullable_Object);
    },
    serialize$2(serializers, set) {
      return this.serialize$3$specifiedType(serializers, set, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.LinkedHashSet_LinkedHashSet$_empty(type$.Object) : type$.Set_dynamic._as(serializers.newBuilder$1(specifiedType));
      for (t1 = J.get$iterator$ax(serialized); t1.moveNext$0();)
        result.add$1(0, serializers.deserialize$2$specifiedType(t1.get$current(), elementType));
      return result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "Set";
    }
  };
  A.SetSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.StringSerializer.prototype = {
    serialize$3$specifiedType(serializers, string, specifiedType) {
      return A._asString(string);
    },
    serialize$2(serializers, string) {
      return this.serialize$3$specifiedType(serializers, string, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asString(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "String";
    }
  };
  A.Uint8ListSerializer.prototype = {
    serialize$3$specifiedType(serializers, uint8list, specifiedType) {
      uint8list = type$.Base64Codec._eval$1("Codec.S")._as(type$.Uint8List._as(uint8list));
      return B.C_Base64Codec.get$encoder().convert$1(uint8list);
    },
    serialize$2(serializers, uint8list) {
      return this.serialize$3$specifiedType(serializers, uint8list, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return B.C_Base64Decoder.convert$1(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    get$types() {
      return A.BuiltList_BuiltList$from([B.Type_Uint8List_8Eb], type$.Type);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$wireName() {
      return "UInt8List";
    }
  };
  A.UriSerializer.prototype = {
    serialize$3$specifiedType(serializers, uri, specifiedType) {
      return type$.Uri._as(uri).toString$0(0);
    },
    serialize$2(serializers, uri) {
      return this.serialize$3$specifiedType(serializers, uri, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Uri_parse(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return this.types;
    },
    get$wireName() {
      return "Uri";
    }
  };
  A.CanonicalizedMap.prototype = {
    $index(_, key) {
      var pair, _this = this;
      if (!_this._isValidKey$1(key))
        return null;
      pair = _this._base.$index(0, _this._canonicalize.call$1(_this.$ti._eval$1("CanonicalizedMap.K")._as(key)));
      return pair == null ? null : pair.value;
    },
    $indexSet(_, key, value) {
      var _this = this,
        t1 = _this.$ti;
      t1._eval$1("CanonicalizedMap.K")._as(key);
      t1._eval$1("CanonicalizedMap.V")._as(value);
      if (!_this._isValidKey$1(key))
        return;
      _this._base.$indexSet(0, _this._canonicalize.call$1(key), new A.MapEntry(key, value, t1._eval$1("MapEntry<CanonicalizedMap.K,CanonicalizedMap.V>")));
    },
    addAll$1(_, other) {
      this.$ti._eval$1("Map<CanonicalizedMap.K,CanonicalizedMap.V>")._as(other).forEach$1(0, new A.CanonicalizedMap_addAll_closure(this));
    },
    cast$2$0(_, $K2, $V2) {
      return this._base.cast$2$0(0, $K2, $V2);
    },
    containsKey$1(key) {
      var _this = this;
      if (!_this._isValidKey$1(key))
        return false;
      return _this._base.containsKey$1(_this._canonicalize.call$1(_this.$ti._eval$1("CanonicalizedMap.K")._as(key)));
    },
    forEach$1(_, f) {
      this._base.forEach$1(0, new A.CanonicalizedMap_forEach_closure(this, this.$ti._eval$1("~(CanonicalizedMap.K,CanonicalizedMap.V)")._as(f)));
    },
    get$isEmpty(_) {
      return this._base.__js_helper$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._base.__js_helper$_length !== 0;
    },
    get$keys() {
      var t1 = this._base,
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapValuesIterable<2>"),
        t3 = this.$ti._eval$1("CanonicalizedMap.K");
      return A.MappedIterable_MappedIterable(new A.LinkedHashMapValuesIterable(t1, t2), t2._bind$1(t3)._eval$1("1(Iterable.E)")._as(new A.CanonicalizedMap_keys_closure(this)), t2._eval$1("Iterable.E"), t3);
    },
    get$length(_) {
      return this._base.__js_helper$_length;
    },
    map$2$1(_, transform, $K2, $V2) {
      return this._base.map$2$1(0, new A.CanonicalizedMap_map_closure(this, this.$ti._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(CanonicalizedMap.K,CanonicalizedMap.V)")._as(transform), $K2, $V2), $K2, $V2);
    },
    map$1(_, transform) {
      var t1 = type$.dynamic;
      return this.map$2$1(0, transform, t1, t1);
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    _isValidKey$1(key) {
      return this.$ti._eval$1("CanonicalizedMap.K")._is(key);
    },
    $isMap: 1
  };
  A.CanonicalizedMap_addAll_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this,
        t2 = t1.$ti;
      t2._eval$1("CanonicalizedMap.K")._as(key);
      t2._eval$1("CanonicalizedMap.V")._as(value);
      t1.$indexSet(0, key, value);
      return value;
    },
    $signature() {
      return this.$this.$ti._eval$1("~(CanonicalizedMap.K,CanonicalizedMap.V)");
    }
  };
  A.CanonicalizedMap_forEach_closure.prototype = {
    call$2(key, pair) {
      var t1 = this.$this.$ti;
      t1._eval$1("CanonicalizedMap.C")._as(key);
      t1._eval$1("MapEntry<CanonicalizedMap.K,CanonicalizedMap.V>")._as(pair);
      return this.f.call$2(pair.key, pair.value);
    },
    $signature() {
      return this.$this.$ti._eval$1("~(CanonicalizedMap.C,MapEntry<CanonicalizedMap.K,CanonicalizedMap.V>)");
    }
  };
  A.CanonicalizedMap_keys_closure.prototype = {
    call$1(pair) {
      return this.$this.$ti._eval$1("MapEntry<CanonicalizedMap.K,CanonicalizedMap.V>")._as(pair).key;
    },
    $signature() {
      return this.$this.$ti._eval$1("CanonicalizedMap.K(MapEntry<CanonicalizedMap.K,CanonicalizedMap.V>)");
    }
  };
  A.CanonicalizedMap_map_closure.prototype = {
    call$2(_, pair) {
      var t1 = this.$this.$ti;
      t1._eval$1("CanonicalizedMap.C")._as(_);
      t1._eval$1("MapEntry<CanonicalizedMap.K,CanonicalizedMap.V>")._as(pair);
      return this.transform.call$2(pair.key, pair.value);
    },
    $signature() {
      return this.$this.$ti._bind$1(this.K2)._bind$1(this.V2)._eval$1("MapEntry<1,2>(CanonicalizedMap.C,MapEntry<CanonicalizedMap.K,CanonicalizedMap.V>)");
    }
  };
  A.DefaultEquality.prototype = {$isEquality: 1};
  A.IterableEquality.prototype = {
    equals$2(elements1, elements2) {
      var it1, it2, hasNext,
        t1 = this.$ti._eval$1("Iterable<1>?");
      t1._as(elements1);
      t1._as(elements2);
      if (elements1 === elements2)
        return true;
      it1 = J.get$iterator$ax(elements1);
      it2 = J.get$iterator$ax(elements2);
      for (t1 = this._elementEquality;;) {
        hasNext = it1.moveNext$0();
        if (hasNext !== it2.moveNext$0())
          return false;
        if (!hasNext)
          return true;
        if (!t1.equals$2(it1.get$current(), it2.get$current()))
          return false;
      }
    },
    hash$1(elements) {
      var t1, t2, hash;
      this.$ti._eval$1("Iterable<1>?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();) {
        hash = hash + t2.hash$1(t1.get$current()) & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.ListEquality.prototype = {
    equals$2(list1, list2) {
      var $length, t2, t3, i,
        t1 = this.$ti._eval$1("List<1>?");
      t1._as(list1);
      t1._as(list2);
      if (list1 === list2)
        return true;
      t1 = J.getInterceptor$asx(list1);
      $length = t1.get$length(list1);
      t2 = J.getInterceptor$asx(list2);
      if ($length !== t2.get$length(list2))
        return false;
      for (t3 = this._elementEquality, i = 0; i < $length; ++i)
        if (!t3.equals$2(t1.$index(list1, i), t2.$index(list2, i)))
          return false;
      return true;
    },
    hash$1(list) {
      var t1, t2, hash, i;
      this.$ti._eval$1("List<1>?")._as(list);
      for (t1 = J.getInterceptor$asx(list), t2 = this._elementEquality, hash = 0, i = 0; i < t1.get$length(list); ++i) {
        hash = hash + t2.hash$1(t1.$index(list, i)) & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A._UnorderedEquality.prototype = {
    equals$2(elements1, elements2) {
      var counts, $length, e, count,
        t1 = A._instanceType(this),
        t2 = t1._eval$1("_UnorderedEquality.T?");
      t2._as(elements1);
      t2._as(elements2);
      if (elements1 === elements2)
        return true;
      t2 = this._elementEquality;
      counts = A.HashMap_HashMap(t1._eval$1("bool(_UnorderedEquality.E,_UnorderedEquality.E)")._as(t2.get$equals()), t1._eval$1("int(_UnorderedEquality.E)")._as(t2.get$hash()), t2.get$isValidKey(), t1._eval$1("_UnorderedEquality.E"), type$.int);
      for (t1 = J.get$iterator$ax(elements1), $length = 0; t1.moveNext$0();) {
        e = t1.get$current();
        count = counts.$index(0, e);
        counts.$indexSet(0, e, (count == null ? 0 : count) + 1);
        ++$length;
      }
      for (t1 = J.get$iterator$ax(elements2); t1.moveNext$0();) {
        e = t1.get$current();
        count = counts.$index(0, e);
        if (count == null || count === 0)
          return false;
        counts.$indexSet(0, e, count - 1);
        --$length;
      }
      return $length === 0;
    },
    hash$1(elements) {
      var t1, t2, hash;
      A._instanceType(this)._eval$1("_UnorderedEquality.T?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();)
        hash = hash + t2.hash$1(t1.get$current()) & 2147483647;
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.SetEquality.prototype = {};
  A._MapEntry.prototype = {
    get$hashCode(_) {
      var t1 = this.equality;
      return 3 * t1._keyEquality.hash$1(this.key) + 7 * t1._valueEquality.hash$1(this.value) & 2147483647;
    },
    $eq(_, other) {
      var t1;
      if (other == null)
        return false;
      if (other instanceof A._MapEntry) {
        t1 = this.equality;
        t1 = t1._keyEquality.equals$2(this.key, other.key) && t1._valueEquality.equals$2(this.value, other.value);
      } else
        t1 = false;
      return t1;
    }
  };
  A.MapEquality.prototype = {
    equals$2(map1, map2) {
      var equalElementCounts, key, entry, count,
        t1 = this.$ti._eval$1("Map<1,2>?");
      t1._as(map1);
      t1._as(map2);
      if (map1 === map2)
        return true;
      if (map1.get$length(map1) !== map2.get$length(map2))
        return false;
      equalElementCounts = A.HashMap_HashMap(null, null, null, type$._MapEntry, type$.int);
      for (t1 = map1.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
        key = t1.get$current();
        entry = new A._MapEntry(this, key, map1.$index(0, key));
        count = equalElementCounts.$index(0, entry);
        equalElementCounts.$indexSet(0, entry, (count == null ? 0 : count) + 1);
      }
      for (t1 = map2.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
        key = t1.get$current();
        entry = new A._MapEntry(this, key, map2.$index(0, key));
        count = equalElementCounts.$index(0, entry);
        if (count == null || count === 0)
          return false;
        equalElementCounts.$indexSet(0, entry, count - 1);
      }
      return true;
    },
    hash$1(map) {
      var t2, t3, t4, hash, key, keyHash, t5,
        t1 = this.$ti;
      t1._eval$1("Map<1,2>?")._as(map);
      for (t2 = map.get$keys(), t2 = t2.get$iterator(t2), t3 = this._keyEquality, t4 = this._valueEquality, t1 = t1._rest[1], hash = 0; t2.moveNext$0();) {
        key = t2.get$current();
        keyHash = t3.hash$1(key);
        t5 = map.$index(0, key);
        hash = hash + 3 * keyHash + 7 * t4.hash$1(t5 == null ? t1._as(t5) : t5) & 2147483647;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.DeepCollectionEquality.prototype = {
    equals$2(e1, e2) {
      var _this = this,
        t1 = type$.Set_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.SetEquality(_this, type$.SetEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Map_dynamic_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).equals$2(e1, e2);
      t1 = type$.List_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.ListEquality(_this, type$.ListEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Iterable_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.IterableEquality(_this, type$.IterableEquality_dynamic).equals$2(e1, e2);
      return J.$eq$(e1, e2);
    },
    hash$1(o) {
      var _this = this;
      if (type$.Set_dynamic._is(o))
        return new A.SetEquality(_this, type$.SetEquality_dynamic).hash$1(o);
      if (type$.Map_dynamic_dynamic._is(o))
        return new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).hash$1(o);
      if (type$.List_dynamic._is(o))
        return new A.ListEquality(_this, type$.ListEquality_dynamic).hash$1(o);
      if (type$.Iterable_dynamic._is(o))
        return new A.IterableEquality(_this, type$.IterableEquality_dynamic).hash$1(o);
      return J.get$hashCode$(o);
    },
    isValidKey$1(o) {
      return true;
    },
    $isEquality: 1
  };
  A.QueueList.prototype = {
    add$1(_, element) {
      this._queue_list$_add$1(A._instanceType(this)._eval$1("QueueList.E")._as(element));
    },
    cast$1$0(_, $T) {
      return new A._CastQueueList(this, J.cast$1$0$ax(this._queue_list$_table, $T), -1, -1, A._instanceType(this)._eval$1("@<QueueList.E>")._bind$1($T)._eval$1("_CastQueueList<1,2>"));
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    get$length(_) {
      return (this.get$_queue_list$_tail() - this.get$_queue_list$_head() & J.get$length$asx(this._queue_list$_table) - 1) >>> 0;
    },
    set$length(_, value) {
      var delta, newTail, t1, t2, _this = this;
      if (value < 0)
        throw A.wrapException(A.RangeError$("Length " + value + " may not be negative."));
      if (value > _this.get$length(0) && !A._instanceType(_this)._eval$1("QueueList.E")._is(null))
        throw A.wrapException(A.UnsupportedError$("The length can only be increased when the element type is nullable, but the current element type is `" + A.createRuntimeType(A._instanceType(_this)._eval$1("QueueList.E")).toString$0(0) + "`."));
      delta = value - _this.get$length(0);
      if (delta >= 0) {
        if (J.get$length$asx(_this._queue_list$_table) <= value)
          _this._preGrow$1(value);
        _this.set$_queue_list$_tail((_this.get$_queue_list$_tail() + delta & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0);
        return;
      }
      newTail = _this.get$_queue_list$_tail() + delta;
      t1 = _this._queue_list$_table;
      if (newTail >= 0)
        J.fillRange$3$ax(t1, newTail, _this.get$_queue_list$_tail(), null);
      else {
        newTail += J.get$length$asx(t1);
        J.fillRange$3$ax(_this._queue_list$_table, 0, _this.get$_queue_list$_tail(), null);
        t1 = _this._queue_list$_table;
        t2 = J.getInterceptor$asx(t1);
        t2.fillRange$3(t1, newTail, t2.get$length(t1), null);
      }
      _this.set$_queue_list$_tail(newTail);
    },
    $index(_, index) {
      var t1, _this = this;
      if (index < 0 || index >= _this.get$length(0))
        throw A.wrapException(A.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(0) + ")."));
      t1 = J.$index$asx(_this._queue_list$_table, (_this.get$_queue_list$_head() + index & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0);
      return t1 == null ? A._instanceType(_this)._eval$1("QueueList.E")._as(t1) : t1;
    },
    $indexSet(_, index, value) {
      var _this = this;
      A._instanceType(_this)._eval$1("QueueList.E")._as(value);
      if (index < 0 || index >= _this.get$length(0))
        throw A.wrapException(A.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(0) + ")."));
      J.$indexSet$ax(_this._queue_list$_table, (_this.get$_queue_list$_head() + index & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0, value);
    },
    _queue_list$_add$1(element) {
      var newTable, split, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("QueueList.E")._as(element);
      J.$indexSet$ax(_this._queue_list$_table, _this.get$_queue_list$_tail(), element);
      _this.set$_queue_list$_tail((_this.get$_queue_list$_tail() + 1 & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0);
      if (_this.get$_queue_list$_head() === _this.get$_queue_list$_tail()) {
        newTable = A.List_List$filled(J.get$length$asx(_this._queue_list$_table) * 2, null, false, t1._eval$1("QueueList.E?"));
        split = J.get$length$asx(_this._queue_list$_table) - _this.get$_queue_list$_head();
        B.JSArray_methods.setRange$4(newTable, 0, split, _this._queue_list$_table, _this.get$_queue_list$_head());
        B.JSArray_methods.setRange$4(newTable, split, split + _this.get$_queue_list$_head(), _this._queue_list$_table, 0);
        _this.set$_queue_list$_head(0);
        _this.set$_queue_list$_tail(J.get$length$asx(_this._queue_list$_table));
        _this._queue_list$_table = newTable;
      }
    },
    _writeToList$1(target) {
      var $length, firstPartSize, _this = this;
      A._instanceType(_this)._eval$1("List<QueueList.E?>")._as(target);
      if (_this.get$_queue_list$_head() <= _this.get$_queue_list$_tail()) {
        $length = _this.get$_queue_list$_tail() - _this.get$_queue_list$_head();
        B.JSArray_methods.setRange$4(target, 0, $length, _this._queue_list$_table, _this.get$_queue_list$_head());
        return $length;
      } else {
        firstPartSize = J.get$length$asx(_this._queue_list$_table) - _this.get$_queue_list$_head();
        B.JSArray_methods.setRange$4(target, 0, firstPartSize, _this._queue_list$_table, _this.get$_queue_list$_head());
        B.JSArray_methods.setRange$4(target, firstPartSize, firstPartSize + _this.get$_queue_list$_tail(), _this._queue_list$_table, 0);
        return _this.get$_queue_list$_tail() + firstPartSize;
      }
    },
    _preGrow$1(newElementCount) {
      var _this = this,
        newTable = A.List_List$filled(A.QueueList__nextPowerOf2(newElementCount + B.JSInt_methods._shrOtherPositive$1(newElementCount, 1)), null, false, A._instanceType(_this)._eval$1("QueueList.E?"));
      _this.set$_queue_list$_tail(_this._writeToList$1(newTable));
      _this._queue_list$_table = newTable;
      _this.set$_queue_list$_head(0);
    },
    set$_queue_list$_head(_head) {
      this._queue_list$_head = A._asInt(_head);
    },
    set$_queue_list$_tail(_tail) {
      this._queue_list$_tail = A._asInt(_tail);
    },
    $isEfficientLengthIterable: 1,
    $isQueue: 1,
    $isIterable: 1,
    $isList: 1,
    get$_queue_list$_head() {
      return this._queue_list$_head;
    },
    get$_queue_list$_tail() {
      return this._queue_list$_tail;
    }
  };
  A._CastQueueList.prototype = {
    get$_queue_list$_head() {
      return this._queue_list$_delegate.get$_queue_list$_head();
    },
    set$_queue_list$_head(value) {
      this._queue_list$_delegate.set$_queue_list$_head(value);
    },
    get$_queue_list$_tail() {
      return this._queue_list$_delegate.get$_queue_list$_tail();
    },
    set$_queue_list$_tail(value) {
      this._queue_list$_delegate.set$_queue_list$_tail(value);
    }
  };
  A._QueueList_Object_ListMixin.prototype = {};
  A.BuildStatus.prototype = {};
  A.BuildResult.prototype = {};
  A._$BuildStatusSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return type$.BuildStatus._as(object).name;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._$valueOf(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return B.List_Type_BuildStatus_8KJ;
    },
    get$wireName() {
      return "BuildStatus";
    }
  };
  A._$BuildResultSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["status", serializers.serialize$2$specifiedType(type$.BuildResult._as(object).status, B.FullType_k5M)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, value, $$v, _$result,
        result = new A.BuildResultBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuildStatus; iterator.moveNext$0();) {
        t2 = iterator.get$current();
        t2.toString;
        A._asString(t2);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t2) {
          case "status":
            t2 = serializers.deserialize$2$specifiedType(value, B.FullType_k5M);
            t2.toString;
            t1._as(t2);
            $$v = result._build_result$_$v;
            if ($$v != null) {
              result._status = $$v.status;
              result._build_result$_$v = null;
            }
            result._status = t2;
            break;
        }
      }
      _$result = result._build_result$_$v;
      return result._build_result$_$v = _$result == null ? new A._$BuildResult(A.BuiltValueNullFieldError_checkNotNull(result.get$_build_result$_$this()._status, "BuildResult", "status", t1)) : _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_pLn;
    },
    get$wireName() {
      return "BuildResult";
    }
  };
  A._$BuildResult.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BuildResult && this.status === other.status;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, A.Primitives_objectHashCode(this.status)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BuildResult"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "status", this.status);
      return t2.toString$0(t1);
    }
  };
  A.BuildResultBuilder.prototype = {
    get$_build_result$_$this() {
      var _this = this,
        $$v = _this._build_result$_$v;
      if ($$v != null) {
        _this._status = $$v.status;
        _this._build_result$_$v = null;
      }
      return _this;
    }
  };
  A.ConnectRequest.prototype = {};
  A._$ConnectRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ConnectRequest._as(object);
      return ["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_PT1), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_PT1), "entrypointPath", serializers.serialize$2$specifiedType(object.entrypointPath, B.FullType_PT1)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.ConnectRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "appId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._connect_request$_appId = t1;
            break;
          case "instanceId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._instanceId = t1;
            break;
          case "entrypointPath":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._entrypointPath = t1;
            break;
        }
      }
      return result._connect_request$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_xmd;
    },
    get$wireName() {
      return "ConnectRequest";
    }
  };
  A._$ConnectRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ConnectRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.entrypointPath === other.entrypointPath;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.appId)), B.JSString_methods.get$hashCode(this.instanceId)), B.JSString_methods.get$hashCode(this.entrypointPath)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ConnectRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", this.appId);
      t2.add$2(t1, "instanceId", this.instanceId);
      t2.add$2(t1, "entrypointPath", this.entrypointPath);
      return t2.toString$0(t1);
    }
  };
  A.ConnectRequestBuilder.prototype = {
    get$_connect_request$_$this() {
      var _this = this,
        $$v = _this._connect_request$_$v;
      if ($$v != null) {
        _this._connect_request$_appId = $$v.appId;
        _this._instanceId = $$v.instanceId;
        _this._entrypointPath = $$v.entrypointPath;
        _this._connect_request$_$v = null;
      }
      return _this;
    },
    _connect_request$_build$0() {
      var t1, _this = this,
        _s14_ = "ConnectRequest",
        _$result = _this._connect_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        _$result = new A._$ConnectRequest(A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._connect_request$_appId, _s14_, "appId", t1), A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._instanceId, _s14_, "instanceId", t1), A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._entrypointPath, _s14_, "entrypointPath", t1));
      }
      return _this._connect_request$_$v = _$result;
    }
  };
  A.DebugEvent.prototype = {};
  A.BatchedDebugEvents.prototype = {};
  A._$DebugEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.DebugEvent._as(object);
      return ["kind", serializers.serialize$2$specifiedType(object.kind, B.FullType_PT1), "eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_PT1), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_rTD)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DebugEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "kind":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_debug_event$_$this()._debug_event$_kind = t1;
            break;
          case "eventData":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_debug_event$_$this()._eventData = t1;
            break;
          case "timestamp":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_rTD);
            t1.toString;
            A._asInt(t1);
            result.get$_debug_event$_$this()._timestamp = t1;
            break;
        }
      }
      return result._debug_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_fK8;
    },
    get$wireName() {
      return "DebugEvent";
    }
  };
  A._$BatchedDebugEventsSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["events", serializers.serialize$2$specifiedType(type$.BatchedDebugEvents._as(object).events, B.FullType_3Xm)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, t5, value, $$v, t6, t7, t8, t9,
        result = new A.BatchedDebugEventsBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuiltList_nullable_Object, t2 = type$.DebugEvent, t3 = type$.List_DebugEvent, t4 = type$.ListBuilder_DebugEvent; iterator.moveNext$0();) {
        t5 = iterator.get$current();
        t5.toString;
        A._asString(t5);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t5) {
          case "events":
            $$v = result._debug_event$_$v;
            if ($$v != null) {
              t5 = $$v.events;
              t6 = t5.$ti;
              t7 = new A.ListBuilder(t6._eval$1("ListBuilder<1>"));
              t8 = t6._eval$1("_BuiltList<1>");
              t9 = t6._eval$1("List<1>");
              if (t8._is(t5)) {
                t8._as(t5);
                t7.__ListBuilder__list_A = t9._as(t5._list);
                t7._listOwner = t5;
              } else
                t7.__ListBuilder__list_A = t9._as(A.List_List$from(t5, true, t6._precomputed1));
              result._events = t7;
              result._debug_event$_$v = null;
            }
            t5 = result._events;
            if (t5 == null) {
              t5 = new A.ListBuilder(t4);
              t5.__ListBuilder__list_A = t3._as(A.List_List$from(B.List_empty0, true, t2));
              result.set$_events(t5);
            }
            t6 = serializers.deserialize$2$specifiedType(value, B.FullType_3Xm);
            t6.toString;
            t1._as(t6);
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1>");
            t9 = t7._eval$1("List<1>");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.__ListBuilder__list_A = t9._as(t6._list);
              t5._listOwner = t6;
            } else {
              t5.__ListBuilder__list_A = t9._as(A.List_List$from(t6, true, t7._precomputed1));
              t5._listOwner = null;
            }
            break;
        }
      }
      return result._debug_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_WAE;
    },
    get$wireName() {
      return "BatchedDebugEvents";
    }
  };
  A._$DebugEvent.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DebugEvent && _this.kind === other.kind && _this.eventData === other.eventData && _this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.kind)), B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DebugEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "kind", this.kind);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.DebugEventBuilder.prototype = {
    get$_debug_event$_$this() {
      var _this = this,
        $$v = _this._debug_event$_$v;
      if ($$v != null) {
        _this._debug_event$_kind = $$v.kind;
        _this._eventData = $$v.eventData;
        _this._timestamp = $$v.timestamp;
        _this._debug_event$_$v = null;
      }
      return _this;
    },
    _debug_event$_build$0() {
      var t1, _this = this,
        _s10_ = "DebugEvent",
        _$result = _this._debug_event$_$v;
      if (_$result == null) {
        t1 = type$.String;
        _$result = new A._$DebugEvent(A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._debug_event$_kind, _s10_, "kind", t1), A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._eventData, _s10_, "eventData", t1), A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._timestamp, _s10_, "timestamp", type$.int));
      }
      return _this._debug_event$_$v = _$result;
    }
  };
  A._$BatchedDebugEvents.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BatchedDebugEvents && this.events.$eq(0, other.events);
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, this.events.get$hashCode(0)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedDebugEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  A.BatchedDebugEventsBuilder.prototype = {
    get$events() {
      var t1 = this.get$_debug_event$_$this(),
        t2 = t1._events;
      if (t2 == null) {
        t2 = A.ListBuilder_ListBuilder(B.List_empty0, type$.DebugEvent);
        t1.set$_events(t2);
        t1 = t2;
      } else
        t1 = t2;
      return t1;
    },
    get$_debug_event$_$this() {
      var t1, _this = this,
        $$v = _this._debug_event$_$v;
      if ($$v != null) {
        t1 = $$v.events;
        _this._events = A.ListBuilder_ListBuilder(t1, t1.$ti._precomputed1);
        _this._debug_event$_$v = null;
      }
      return _this;
    },
    _debug_event$_build$0() {
      var _$failedField, e, _$result0, exception, t1, _this = this, _$result = null;
      try {
        _$result0 = _this._debug_event$_$v;
        _$result = _$result0 == null ? new A._$BatchedDebugEvents(_this.get$events().build$0()) : _$result0;
      } catch (exception) {
        _$failedField = A._Cell$named("_$failedField");
        try {
          _$failedField.__late_helper$_value = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = A.unwrapException(exception);
          t1 = A.BuiltValueNestedFieldError$("BatchedDebugEvents", _$failedField.readLocal$0(), J.toString$0$(e));
          throw A.wrapException(t1);
        }
        throw exception;
      }
      _this._debug_event$_$v = type$.BatchedDebugEvents._as(_$result);
      return _$result;
    },
    set$_events(_events) {
      this._events = type$.nullable_ListBuilder_DebugEvent._as(_events);
    }
  };
  A.DebugInfo.prototype = {};
  A._$DebugInfoSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DebugInfo._as(object);
      result = [];
      value = object.appEntrypointPath;
      if (value != null) {
        result.push("appEntrypointPath");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.appId;
      if (value != null) {
        result.push("appId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.appInstanceId;
      if (value != null) {
        result.push("appInstanceId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.appOrigin;
      if (value != null) {
        result.push("appOrigin");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.appUrl;
      if (value != null) {
        result.push("appUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.authUrl;
      if (value != null) {
        result.push("authUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.dwdsVersion;
      if (value != null) {
        result.push("dwdsVersion");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.extensionUrl;
      if (value != null) {
        result.push("extensionUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.isInternalBuild;
      if (value != null) {
        result.push("isInternalBuild");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_R6B));
      }
      value = object.isFlutterApp;
      if (value != null) {
        result.push("isFlutterApp");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_R6B));
      }
      value = object.workspaceName;
      if (value != null) {
        result.push("workspaceName");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.tabUrl;
      if (value != null) {
        result.push("tabUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.tabId;
      if (value != null) {
        result.push("tabId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_rTD));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DebugInfoBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "appEntrypointPath":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._appEntrypointPath = t1;
            break;
          case "appId":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._appId = t1;
            break;
          case "appInstanceId":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._appInstanceId = t1;
            break;
          case "appOrigin":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._appOrigin = t1;
            break;
          case "appUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._appUrl = t1;
            break;
          case "authUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._authUrl = t1;
            break;
          case "dwdsVersion":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._dwdsVersion = t1;
            break;
          case "extensionUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._extensionUrl = t1;
            break;
          case "isInternalBuild":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_R6B));
            result.get$_$this()._isInternalBuild = t1;
            break;
          case "isFlutterApp":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_R6B));
            result.get$_$this()._isFlutterApp = t1;
            break;
          case "workspaceName":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._workspaceName = t1;
            break;
          case "tabUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_$this()._tabUrl = t1;
            break;
          case "tabId":
            t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_rTD));
            result.get$_$this()._tabId = t1;
            break;
        }
      }
      return result._build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_55I;
    },
    get$wireName() {
      return "DebugInfo";
    }
  };
  A._$DebugInfo.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DebugInfo && _this.appEntrypointPath == other.appEntrypointPath && _this.appId == other.appId && _this.appInstanceId == other.appInstanceId && _this.appOrigin == other.appOrigin && _this.appUrl == other.appUrl && _this.authUrl == other.authUrl && _this.dwdsVersion == other.dwdsVersion && _this.extensionUrl == other.extensionUrl && _this.isInternalBuild == other.isInternalBuild && _this.isFlutterApp == other.isFlutterApp && _this.workspaceName == other.workspaceName && _this.tabUrl == other.tabUrl && _this.tabId == other.tabId;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, J.get$hashCode$(_this.appEntrypointPath)), J.get$hashCode$(_this.appId)), J.get$hashCode$(_this.appInstanceId)), J.get$hashCode$(_this.appOrigin)), J.get$hashCode$(_this.appUrl)), J.get$hashCode$(_this.authUrl)), J.get$hashCode$(_this.dwdsVersion)), J.get$hashCode$(_this.extensionUrl)), J.get$hashCode$(_this.isInternalBuild)), J.get$hashCode$(_this.isFlutterApp)), J.get$hashCode$(_this.workspaceName)), J.get$hashCode$(_this.tabUrl)), J.get$hashCode$(_this.tabId)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("DebugInfo"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appEntrypointPath", _this.appEntrypointPath);
      t2.add$2(t1, "appId", _this.appId);
      t2.add$2(t1, "appInstanceId", _this.appInstanceId);
      t2.add$2(t1, "appOrigin", _this.appOrigin);
      t2.add$2(t1, "appUrl", _this.appUrl);
      t2.add$2(t1, "authUrl", _this.authUrl);
      t2.add$2(t1, "dwdsVersion", _this.dwdsVersion);
      t2.add$2(t1, "extensionUrl", _this.extensionUrl);
      t2.add$2(t1, "isInternalBuild", _this.isInternalBuild);
      t2.add$2(t1, "isFlutterApp", _this.isFlutterApp);
      t2.add$2(t1, "workspaceName", _this.workspaceName);
      t2.add$2(t1, "tabUrl", _this.tabUrl);
      t2.add$2(t1, "tabId", _this.tabId);
      return t2.toString$0(t1);
    }
  };
  A.DebugInfoBuilder.prototype = {
    get$_$this() {
      var _this = this,
        $$v = _this._$v;
      if ($$v != null) {
        _this._appEntrypointPath = $$v.appEntrypointPath;
        _this._appId = $$v.appId;
        _this._appInstanceId = $$v.appInstanceId;
        _this._appOrigin = $$v.appOrigin;
        _this._appUrl = $$v.appUrl;
        _this._authUrl = $$v.authUrl;
        _this._dwdsVersion = $$v.dwdsVersion;
        _this._extensionUrl = $$v.extensionUrl;
        _this._isInternalBuild = $$v.isInternalBuild;
        _this._isFlutterApp = $$v.isFlutterApp;
        _this._workspaceName = $$v.workspaceName;
        _this._tabUrl = $$v.tabUrl;
        _this._tabId = $$v.tabId;
        _this._$v = null;
      }
      return _this;
    },
    _build$0() {
      var _this = this,
        _$result = _this._$v;
      return _this._$v = _$result == null ? new A._$DebugInfo(_this.get$_$this()._appEntrypointPath, _this.get$_$this()._appId, _this.get$_$this()._appInstanceId, _this.get$_$this()._appOrigin, _this.get$_$this()._appUrl, _this.get$_$this()._authUrl, _this.get$_$this()._dwdsVersion, _this.get$_$this()._extensionUrl, _this.get$_$this()._isInternalBuild, _this.get$_$this()._isFlutterApp, _this.get$_$this()._workspaceName, _this.get$_$this()._tabUrl, _this.get$_$this()._tabId) : _$result;
    }
  };
  A.DevToolsRequest.prototype = {};
  A.DevToolsResponse.prototype = {};
  A._$DevToolsRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DevToolsRequest._as(object);
      result = ["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_PT1), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_PT1)];
      value = object.contextId;
      if (value != null) {
        result.push("contextId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_rTD));
      }
      value = object.tabUrl;
      if (value != null) {
        result.push("tabUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.uriOnly;
      if (value != null) {
        result.push("uriOnly");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_R6B));
      }
      value = object.client;
      if (value != null) {
        result.push("client");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DevToolsRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "appId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_devtools_request$_$this()._devtools_request$_appId = t1;
            break;
          case "instanceId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
            break;
          case "contextId":
            t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_rTD));
            result.get$_devtools_request$_$this()._contextId = t1;
            break;
          case "tabUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_devtools_request$_$this()._devtools_request$_tabUrl = t1;
            break;
          case "uriOnly":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_R6B));
            result.get$_devtools_request$_$this()._uriOnly = t1;
            break;
          case "client":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_devtools_request$_$this()._devtools_request$_client = t1;
            break;
        }
      }
      return result._devtools_request$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_G46;
    },
    get$wireName() {
      return "DevToolsRequest";
    }
  };
  A._$DevToolsResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DevToolsResponse._as(object);
      result = ["success", serializers.serialize$2$specifiedType(object.success, B.FullType_R6B), "promptExtension", serializers.serialize$2$specifiedType(object.promptExtension, B.FullType_R6B)];
      value = object.error;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result,
        _s16_ = "DevToolsResponse",
        result = new A.DevToolsResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B);
            t1.toString;
            A._asBool(t1);
            result.get$_devtools_request$_$this()._success = t1;
            break;
          case "promptExtension":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B);
            t1.toString;
            A._asBool(t1);
            result.get$_devtools_request$_$this()._promptExtension = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_devtools_request$_$this()._error = t1;
            break;
        }
      }
      _$result = result._devtools_request$_$v;
      if (_$result == null) {
        t1 = type$.bool;
        _$result = new A._$DevToolsResponse(A.BuiltValueNullFieldError_checkNotNull(result.get$_devtools_request$_$this()._success, _s16_, "success", t1), A.BuiltValueNullFieldError_checkNotNull(result.get$_devtools_request$_$this()._promptExtension, _s16_, "promptExtension", t1), result.get$_devtools_request$_$this()._error);
      }
      return result._devtools_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_TEH;
    },
    get$wireName() {
      return "DevToolsResponse";
    }
  };
  A._$DevToolsRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DevToolsRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.contextId == other.contextId && _this.tabUrl == other.tabUrl && _this.uriOnly == other.uriOnly && _this.client == other.client;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(_this.appId)), B.JSString_methods.get$hashCode(_this.instanceId)), J.get$hashCode$(_this.contextId)), J.get$hashCode$(_this.tabUrl)), J.get$hashCode$(_this.uriOnly)), J.get$hashCode$(_this.client)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", _this.appId);
      t2.add$2(t1, "instanceId", _this.instanceId);
      t2.add$2(t1, "contextId", _this.contextId);
      t2.add$2(t1, "tabUrl", _this.tabUrl);
      t2.add$2(t1, "uriOnly", _this.uriOnly);
      t2.add$2(t1, "client", _this.client);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsRequestBuilder.prototype = {
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._devtools_request$_appId = $$v.appId;
        _this._devtools_request$_instanceId = $$v.instanceId;
        _this._contextId = $$v.contextId;
        _this._devtools_request$_tabUrl = $$v.tabUrl;
        _this._uriOnly = $$v.uriOnly;
        _this._devtools_request$_client = $$v.client;
        _this._devtools_request$_$v = null;
      }
      return _this;
    },
    _devtools_request$_build$0() {
      var t1, _this = this,
        _s15_ = "DevToolsRequest",
        _$result = _this._devtools_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        _$result = new A._$DevToolsRequest(A.BuiltValueNullFieldError_checkNotNull(_this.get$_devtools_request$_$this()._devtools_request$_appId, _s15_, "appId", t1), A.BuiltValueNullFieldError_checkNotNull(_this.get$_devtools_request$_$this()._devtools_request$_instanceId, _s15_, "instanceId", t1), _this.get$_devtools_request$_$this()._contextId, _this.get$_devtools_request$_$this()._devtools_request$_tabUrl, _this.get$_devtools_request$_$this()._uriOnly, _this.get$_devtools_request$_$this()._devtools_request$_client);
      }
      return _this._devtools_request$_$v = _$result;
    }
  };
  A._$DevToolsResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DevToolsResponse && _this.success === other.success && _this.promptExtension === other.promptExtension && _this.error == other.error;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSBool_methods.get$hashCode(this.success)), B.JSBool_methods.get$hashCode(this.promptExtension)), J.get$hashCode$(this.error)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "success", this.success);
      t2.add$2(t1, "promptExtension", this.promptExtension);
      t2.add$2(t1, "error", this.error);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsResponseBuilder.prototype = {
    set$success(success) {
      this.get$_devtools_request$_$this()._success = success;
    },
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._success = $$v.success;
        _this._promptExtension = $$v.promptExtension;
        _this._error = $$v.error;
        _this._devtools_request$_$v = null;
      }
      return _this;
    }
  };
  A.ErrorResponse.prototype = {};
  A._$ErrorResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ErrorResponse._as(object);
      return ["error", serializers.serialize$2$specifiedType(object.error, B.FullType_PT1), "stackTrace", serializers.serialize$2$specifiedType(object.stackTrace, B.FullType_PT1)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result,
        _s13_ = "ErrorResponse",
        result = new A.ErrorResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "error":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_error = t1;
            break;
          case "stackTrace":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_stackTrace = t1;
            break;
        }
      }
      _$result = result._error_response$_$v;
      if (_$result == null) {
        t1 = type$.String;
        _$result = new A._$ErrorResponse(A.BuiltValueNullFieldError_checkNotNull(result.get$_error_response$_$this()._error_response$_error, _s13_, "error", t1), A.BuiltValueNullFieldError_checkNotNull(result.get$_error_response$_$this()._error_response$_stackTrace, _s13_, "stackTrace", t1));
      }
      return result._error_response$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_5LV;
    },
    get$wireName() {
      return "ErrorResponse";
    }
  };
  A._$ErrorResponse.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$ErrorResponse && this.error === other.error && this.stackTrace === other.stackTrace;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.error)), B.JSString_methods.get$hashCode(this.stackTrace)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ErrorResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "error", this.error);
      t2.add$2(t1, "stackTrace", this.stackTrace);
      return t2.toString$0(t1);
    }
  };
  A.ErrorResponseBuilder.prototype = {
    get$_error_response$_$this() {
      var _this = this,
        $$v = _this._error_response$_$v;
      if ($$v != null) {
        _this._error_response$_error = $$v.error;
        _this._error_response$_stackTrace = $$v.stackTrace;
        _this._error_response$_$v = null;
      }
      return _this;
    }
  };
  A.ExtensionRequest.prototype = {};
  A.ExtensionResponse.prototype = {};
  A.ExtensionEvent.prototype = {};
  A.BatchedEvents.prototype = {};
  A._$ExtensionRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.ExtensionRequest._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_rTD), "command", serializers.serialize$2$specifiedType(object.command, B.FullType_PT1)];
      value = object.commandParams;
      if (value != null) {
        result.push("commandParams");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result,
        _s16_ = "ExtensionRequest",
        result = new A.ExtensionRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_rTD);
            t1.toString;
            A._asInt(t1);
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "command":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_extension_request$_$this()._command = t1;
            break;
          case "commandParams":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_extension_request$_$this()._commandParams = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      return result._extension_request$_$v = _$result == null ? new A._$ExtensionRequest(A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._id, _s16_, "id", type$.int), A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._command, _s16_, "command", type$.String), result.get$_extension_request$_$this()._commandParams) : _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_2dD;
    },
    get$wireName() {
      return "ExtensionRequest";
    }
  };
  A._$ExtensionResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.ExtensionResponse._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_rTD), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_R6B), "result", serializers.serialize$2$specifiedType(object.result, B.FullType_PT1)];
      value = object.error;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result,
        _s17_ = "ExtensionResponse",
        result = new A.ExtensionResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_rTD);
            t1.toString;
            A._asInt(t1);
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B);
            t1.toString;
            A._asBool(t1);
            result.get$_extension_request$_$this()._extension_request$_success = t1;
            break;
          case "result":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_extension_request$_$this()._extension_request$_result = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_extension_request$_$this()._extension_request$_error = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      return result._extension_request$_$v = _$result == null ? new A._$ExtensionResponse(A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._id, _s17_, "id", type$.int), A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_success, _s17_, "success", type$.bool), A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_result, _s17_, "result", type$.String), result.get$_extension_request$_$this()._extension_request$_error) : _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_RWp;
    },
    get$wireName() {
      return "ExtensionResponse";
    }
  };
  A._$ExtensionEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ExtensionEvent._as(object);
      return ["params", serializers.serialize$2$specifiedType(object.params, B.FullType_PT1), "method", serializers.serialize$2$specifiedType(object.method, B.FullType_PT1)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result,
        _s14_ = "ExtensionEvent",
        result = new A.ExtensionEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "params":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._params = t1;
            break;
          case "method":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._extension_request$_method = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        _$result = new A._$ExtensionEvent(A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._params, _s14_, "params", t1), A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_method, _s14_, "method", t1));
      }
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_yvR;
    },
    get$wireName() {
      return "ExtensionEvent";
    }
  };
  A._$BatchedEventsSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["events", serializers.serialize$2$specifiedType(type$.BatchedEvents._as(object).events, B.FullType_ahP)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, t5, value, $$v, t6, t7, t8, t9,
        result = new A.BatchedEventsBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuiltList_nullable_Object, t2 = type$.ExtensionEvent, t3 = type$.List_ExtensionEvent, t4 = type$.ListBuilder_ExtensionEvent; iterator.moveNext$0();) {
        t5 = iterator.get$current();
        t5.toString;
        A._asString(t5);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t5) {
          case "events":
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              t5 = $$v.events;
              t6 = t5.$ti;
              t7 = new A.ListBuilder(t6._eval$1("ListBuilder<1>"));
              t8 = t6._eval$1("_BuiltList<1>");
              t9 = t6._eval$1("List<1>");
              if (t8._is(t5)) {
                t8._as(t5);
                t7.__ListBuilder__list_A = t9._as(t5._list);
                t7._listOwner = t5;
              } else
                t7.__ListBuilder__list_A = t9._as(A.List_List$from(t5, true, t6._precomputed1));
              result._extension_request$_events = t7;
              result._extension_request$_$v = null;
            }
            t5 = result._extension_request$_events;
            if (t5 == null) {
              t5 = new A.ListBuilder(t4);
              t5.__ListBuilder__list_A = t3._as(A.List_List$from(B.List_empty0, true, t2));
              result.set$_extension_request$_events(t5);
            }
            t6 = serializers.deserialize$2$specifiedType(value, B.FullType_ahP);
            t6.toString;
            t1._as(t6);
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1>");
            t9 = t7._eval$1("List<1>");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.__ListBuilder__list_A = t9._as(t6._list);
              t5._listOwner = t6;
            } else {
              t5.__ListBuilder__list_A = t9._as(A.List_List$from(t6, true, t7._precomputed1));
              t5._listOwner = null;
            }
            break;
        }
      }
      return result._extension_request$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_oDF;
    },
    get$wireName() {
      return "BatchedEvents";
    }
  };
  A._$ExtensionRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ExtensionRequest && _this.id === other.id && _this.command === other.command && _this.commandParams == other.commandParams;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(this.id)), B.JSString_methods.get$hashCode(this.command)), J.get$hashCode$(this.commandParams)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      t2.add$2(t1, "command", this.command);
      t2.add$2(t1, "commandParams", this.commandParams);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionRequestBuilder.prototype = {
    set$id(id) {
      A._asIntQ(id);
      this.get$_extension_request$_$this()._id = id;
    },
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._command = $$v.command;
        _this._commandParams = $$v.commandParams;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ExtensionResponse && _this.id === other.id && _this.success === other.success && _this.result === other.result && _this.error == other.error;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(_this.id)), B.JSBool_methods.get$hashCode(_this.success)), B.JSString_methods.get$hashCode(_this.result)), J.get$hashCode$(_this.error)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", _this.id);
      t2.add$2(t1, "success", _this.success);
      t2.add$2(t1, "result", _this.result);
      t2.add$2(t1, "error", _this.error);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionResponseBuilder.prototype = {
    set$id(id) {
      A._asIntQ(id);
      this.get$_extension_request$_$this()._id = id;
    },
    set$success(success) {
      this.get$_extension_request$_$this()._extension_request$_success = success;
    },
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._extension_request$_success = $$v.success;
        _this._extension_request$_result = $$v.result;
        _this._extension_request$_error = $$v.error;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$ExtensionEvent && this.params === other.params && this.method === other.method;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.params)), B.JSString_methods.get$hashCode(this.method)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "params", this.params);
      t2.add$2(t1, "method", this.method);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionEventBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._params = $$v.params;
        _this._extension_request$_method = $$v.method;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$BatchedEvents.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BatchedEvents && this.events.$eq(0, other.events);
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, this.events.get$hashCode(0)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  A.BatchedEventsBuilder.prototype = {
    get$events() {
      var t1, _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        t1 = $$v.events;
        _this._extension_request$_events = A.ListBuilder_ListBuilder(t1, t1.$ti._precomputed1);
        _this._extension_request$_$v = null;
      }
      t1 = _this._extension_request$_events;
      if (t1 == null) {
        t1 = A.ListBuilder_ListBuilder(B.List_empty0, type$.ExtensionEvent);
        _this.set$_extension_request$_events(t1);
      }
      return t1;
    },
    _extension_request$_build$0() {
      var _$failedField, e, _$result0, exception, t1, _this = this, _$result = null;
      try {
        _$result0 = _this._extension_request$_$v;
        _$result = _$result0 == null ? new A._$BatchedEvents(_this.get$events().build$0()) : _$result0;
      } catch (exception) {
        _$failedField = A._Cell$named("_$failedField");
        try {
          _$failedField.__late_helper$_value = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = A.unwrapException(exception);
          t1 = A.BuiltValueNestedFieldError$("BatchedEvents", _$failedField.readLocal$0(), J.toString$0$(e));
          throw A.wrapException(t1);
        }
        throw exception;
      }
      _this._extension_request$_$v = type$.BatchedEvents._as(_$result);
      return _$result;
    },
    set$_extension_request$_events(_events) {
      this._extension_request$_events = type$.nullable_ListBuilder_ExtensionEvent._as(_events);
    }
  };
  A.HotReloadRequest.prototype = {};
  A._$HotReloadRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["id", serializers.serialize$2$specifiedType(type$.HotReloadRequest._as(object).id, B.FullType_PT1)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result,
        result = new A.HotReloadRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            $$v = result._hot_reload_request$_$v;
            if ($$v != null) {
              result._hot_reload_request$_id = $$v.id;
              result._hot_reload_request$_$v = null;
            }
            result._hot_reload_request$_id = t1;
            break;
        }
      }
      _$result = result._hot_reload_request$_$v;
      return result._hot_reload_request$_$v = _$result == null ? new A._$HotReloadRequest(A.BuiltValueNullFieldError_checkNotNull(result.get$_hot_reload_request$_$this()._hot_reload_request$_id, "HotReloadRequest", "id", type$.String)) : _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_dz9;
    },
    get$wireName() {
      return "HotReloadRequest";
    }
  };
  A._$HotReloadRequest.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$HotReloadRequest && this.id === other.id;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, B.JSString_methods.get$hashCode(this.id)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("HotReloadRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      return t2.toString$0(t1);
    }
  };
  A.HotReloadRequestBuilder.prototype = {
    set$id(id) {
      this.get$_hot_reload_request$_$this()._hot_reload_request$_id = id;
    },
    get$_hot_reload_request$_$this() {
      var _this = this,
        $$v = _this._hot_reload_request$_$v;
      if ($$v != null) {
        _this._hot_reload_request$_id = $$v.id;
        _this._hot_reload_request$_$v = null;
      }
      return _this;
    }
  };
  A.HotReloadResponse.prototype = {};
  A._$HotReloadResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.HotReloadResponse._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_PT1), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_R6B)];
      value = object.errorMessage;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.HotReloadResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_hot_reload_response$_$this()._hot_reload_response$_id = t1;
            break;
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B);
            t1.toString;
            A._asBool(t1);
            result.get$_hot_reload_response$_$this()._hot_reload_response$_success = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_hot_reload_response$_$this()._errorMessage = t1;
            break;
        }
      }
      return result._hot_reload_response$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_DqJ;
    },
    get$wireName() {
      return "HotReloadResponse";
    }
  };
  A._$HotReloadResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$HotReloadResponse && _this.id === other.id && _this.success === other.success && _this.errorMessage == other.errorMessage;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.id)), B.JSBool_methods.get$hashCode(this.success)), J.get$hashCode$(this.errorMessage)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("HotReloadResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      t2.add$2(t1, "success", this.success);
      t2.add$2(t1, "errorMessage", this.errorMessage);
      return t2.toString$0(t1);
    }
  };
  A.HotReloadResponseBuilder.prototype = {
    set$id(id) {
      this.get$_hot_reload_response$_$this()._hot_reload_response$_id = id;
    },
    set$success(success) {
      this.get$_hot_reload_response$_$this()._hot_reload_response$_success = success;
    },
    set$errorMessage(errorMessage) {
      this.get$_hot_reload_response$_$this()._errorMessage = errorMessage;
    },
    get$_hot_reload_response$_$this() {
      var _this = this,
        $$v = _this._hot_reload_response$_$v;
      if ($$v != null) {
        _this._hot_reload_response$_id = $$v.id;
        _this._hot_reload_response$_success = $$v.success;
        _this._errorMessage = $$v.errorMessage;
        _this._hot_reload_response$_$v = null;
      }
      return _this;
    },
    _hot_reload_response$_build$0() {
      var _this = this,
        _s17_ = "HotReloadResponse",
        _$result = _this._hot_reload_response$_$v;
      return _this._hot_reload_response$_$v = _$result == null ? new A._$HotReloadResponse(A.BuiltValueNullFieldError_checkNotNull(_this.get$_hot_reload_response$_$this()._hot_reload_response$_id, _s17_, "id", type$.String), A.BuiltValueNullFieldError_checkNotNull(_this.get$_hot_reload_response$_$this()._hot_reload_response$_success, _s17_, "success", type$.bool), _this.get$_hot_reload_response$_$this()._errorMessage) : _$result;
    }
  };
  A.HotRestartRequest.prototype = {};
  A._$HotRestartRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["id", serializers.serialize$2$specifiedType(type$.HotRestartRequest._as(object).id, B.FullType_PT1)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result,
        result = new A.HotRestartRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            $$v = result._hot_restart_request$_$v;
            if ($$v != null) {
              result._hot_restart_request$_id = $$v.id;
              result._hot_restart_request$_$v = null;
            }
            result._hot_restart_request$_id = t1;
            break;
        }
      }
      _$result = result._hot_restart_request$_$v;
      return result._hot_restart_request$_$v = _$result == null ? new A._$HotRestartRequest(A.BuiltValueNullFieldError_checkNotNull(result.get$_hot_restart_request$_$this()._hot_restart_request$_id, "HotRestartRequest", "id", type$.String)) : _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_9I1;
    },
    get$wireName() {
      return "HotRestartRequest";
    }
  };
  A._$HotRestartRequest.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$HotRestartRequest && this.id === other.id;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, B.JSString_methods.get$hashCode(this.id)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("HotRestartRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      return t2.toString$0(t1);
    }
  };
  A.HotRestartRequestBuilder.prototype = {
    set$id(id) {
      this.get$_hot_restart_request$_$this()._hot_restart_request$_id = id;
    },
    get$_hot_restart_request$_$this() {
      var _this = this,
        $$v = _this._hot_restart_request$_$v;
      if ($$v != null) {
        _this._hot_restart_request$_id = $$v.id;
        _this._hot_restart_request$_$v = null;
      }
      return _this;
    }
  };
  A.HotRestartResponse.prototype = {};
  A._$HotRestartResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.HotRestartResponse._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_PT1), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_R6B)];
      value = object.errorMessage;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.HotRestartResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_hot_restart_response$_$this()._hot_restart_response$_id = t1;
            break;
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B);
            t1.toString;
            A._asBool(t1);
            result.get$_hot_restart_response$_$this()._hot_restart_response$_success = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_hot_restart_response$_$this()._hot_restart_response$_errorMessage = t1;
            break;
        }
      }
      return result._hot_restart_response$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_YhA;
    },
    get$wireName() {
      return "HotRestartResponse";
    }
  };
  A._$HotRestartResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$HotRestartResponse && _this.id === other.id && _this.success === other.success && _this.errorMessage == other.errorMessage;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.id)), B.JSBool_methods.get$hashCode(this.success)), J.get$hashCode$(this.errorMessage)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("HotRestartResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      t2.add$2(t1, "success", this.success);
      t2.add$2(t1, "errorMessage", this.errorMessage);
      return t2.toString$0(t1);
    }
  };
  A.HotRestartResponseBuilder.prototype = {
    set$id(id) {
      this.get$_hot_restart_response$_$this()._hot_restart_response$_id = id;
    },
    set$success(success) {
      this.get$_hot_restart_response$_$this()._hot_restart_response$_success = success;
    },
    set$errorMessage(errorMessage) {
      this.get$_hot_restart_response$_$this()._hot_restart_response$_errorMessage = errorMessage;
    },
    get$_hot_restart_response$_$this() {
      var _this = this,
        $$v = _this._hot_restart_response$_$v;
      if ($$v != null) {
        _this._hot_restart_response$_id = $$v.id;
        _this._hot_restart_response$_success = $$v.success;
        _this._hot_restart_response$_errorMessage = $$v.errorMessage;
        _this._hot_restart_response$_$v = null;
      }
      return _this;
    },
    _hot_restart_response$_build$0() {
      var _this = this,
        _s18_ = "HotRestartResponse",
        _$result = _this._hot_restart_response$_$v;
      return _this._hot_restart_response$_$v = _$result == null ? new A._$HotRestartResponse(A.BuiltValueNullFieldError_checkNotNull(_this.get$_hot_restart_response$_$this()._hot_restart_response$_id, _s18_, "id", type$.String), A.BuiltValueNullFieldError_checkNotNull(_this.get$_hot_restart_response$_$this()._hot_restart_response$_success, _s18_, "success", type$.bool), _this.get$_hot_restart_response$_$this()._hot_restart_response$_errorMessage) : _$result;
    }
  };
  A.IsolateExit.prototype = {};
  A.IsolateStart.prototype = {};
  A._$IsolateExitSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.IsolateExit._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.Iterable_nullable_Object._as(serialized);
      return new A.IsolateExitBuilder()._isolate_events$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_MJN;
    },
    get$wireName() {
      return "IsolateExit";
    }
  };
  A._$IsolateStartSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.IsolateStart._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.Iterable_nullable_Object._as(serialized);
      return new A.IsolateStartBuilder()._isolate_events$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_KpG;
    },
    get$wireName() {
      return "IsolateStart";
    }
  };
  A._$IsolateExit.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$IsolateExit;
    },
    get$hashCode(_) {
      return 814065794;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateExit"));
    }
  };
  A.IsolateExitBuilder.prototype = {
    _isolate_events$_build$0() {
      var _$result = this._isolate_events$_$v;
      return this._isolate_events$_$v = _$result == null ? new A._$IsolateExit() : _$result;
    }
  };
  A._$IsolateStart.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$IsolateStart;
    },
    get$hashCode(_) {
      return 97463111;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateStart"));
    }
  };
  A.IsolateStartBuilder.prototype = {
    _isolate_events$_build$0() {
      var _$result = this._isolate_events$_$v;
      return this._isolate_events$_$v = _$result == null ? new A._$IsolateStart() : _$result;
    }
  };
  A.RegisterEvent.prototype = {};
  A._$RegisterEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.RegisterEvent._as(object);
      return ["eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_PT1), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_rTD)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v,
        result = new A.RegisterEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "eventData":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_eventData = t1;
            break;
          case "timestamp":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_rTD);
            t1.toString;
            A._asInt(t1);
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_timestamp = t1;
            break;
        }
      }
      return result._register_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_EMv;
    },
    get$wireName() {
      return "RegisterEvent";
    }
  };
  A._$RegisterEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$RegisterEvent && this.eventData === other.eventData && this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("RegisterEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.RegisterEventBuilder.prototype = {
    get$_register_event$_$this() {
      var _this = this,
        $$v = _this._register_event$_$v;
      if ($$v != null) {
        _this._register_event$_eventData = $$v.eventData;
        _this._register_event$_timestamp = $$v.timestamp;
        _this._register_event$_$v = null;
      }
      return _this;
    },
    _register_event$_build$0() {
      var _this = this,
        _s13_ = "RegisterEvent",
        _$result = _this._register_event$_$v;
      return _this._register_event$_$v = _$result == null ? new A._$RegisterEvent(A.BuiltValueNullFieldError_checkNotNull(_this.get$_register_event$_$this()._register_event$_eventData, _s13_, "eventData", type$.String), A.BuiltValueNullFieldError_checkNotNull(_this.get$_register_event$_$this()._register_event$_timestamp, _s13_, "timestamp", type$.int)) : _$result;
    }
  };
  A.RunRequest.prototype = {};
  A._$RunRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.RunRequest._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.Iterable_nullable_Object._as(serialized);
      return new A._$RunRequest();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_RlA;
    },
    get$wireName() {
      return "RunRequest";
    }
  };
  A._$RunRequest.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$RunRequest;
    },
    get$hashCode(_) {
      return 248087772;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("RunRequest"));
    }
  };
  A._$serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty0, type$.DebugEvent);
    },
    $signature: 40
  };
  A._$serializers_closure0.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty0, type$.ExtensionEvent);
    },
    $signature: 41
  };
  A.ServiceExtensionRequest.prototype = {};
  A._$ServiceExtensionRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ServiceExtensionRequest._as(object);
      return ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_PT1), "method", serializers.serialize$2$specifiedType(object.method, B.FullType_PT1), "argsJson", serializers.serialize$2$specifiedType(object.argsJson, B.FullType_PT1)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result,
        _s23_ = "ServiceExtensionRequest",
        result = new A.ServiceExtensionRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_service_extension_request$_$this()._service_extension_request$_id = t1;
            break;
          case "method":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_service_extension_request$_$this()._service_extension_request$_method = t1;
            break;
          case "argsJson":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_service_extension_request$_$this()._argsJson = t1;
            break;
        }
      }
      _$result = result._service_extension_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        _$result = new A._$ServiceExtensionRequest(A.BuiltValueNullFieldError_checkNotNull(result.get$_service_extension_request$_$this()._service_extension_request$_id, _s23_, "id", t1), A.BuiltValueNullFieldError_checkNotNull(result.get$_service_extension_request$_$this()._service_extension_request$_method, _s23_, "method", t1), A.BuiltValueNullFieldError_checkNotNull(result.get$_service_extension_request$_$this()._argsJson, _s23_, "argsJson", t1));
      }
      return result._service_extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_4i4;
    },
    get$wireName() {
      return "ServiceExtensionRequest";
    }
  };
  A._$ServiceExtensionRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ServiceExtensionRequest && _this.id === other.id && _this.method === other.method && _this.argsJson === other.argsJson;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.id)), B.JSString_methods.get$hashCode(this.method)), B.JSString_methods.get$hashCode(this.argsJson)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ServiceExtensionRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      t2.add$2(t1, "method", this.method);
      t2.add$2(t1, "argsJson", this.argsJson);
      return t2.toString$0(t1);
    }
  };
  A.ServiceExtensionRequestBuilder.prototype = {
    set$id(id) {
      this.get$_service_extension_request$_$this()._service_extension_request$_id = id;
    },
    get$_service_extension_request$_$this() {
      var _this = this,
        $$v = _this._service_extension_request$_$v;
      if ($$v != null) {
        _this._service_extension_request$_id = $$v.id;
        _this._service_extension_request$_method = $$v.method;
        _this._argsJson = $$v.argsJson;
        _this._service_extension_request$_$v = null;
      }
      return _this;
    }
  };
  A.ServiceExtensionResponse.prototype = {};
  A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure.prototype = {
    call$1(b) {
      var t1, _this = this;
      b.get$_service_extension_response$_$this()._service_extension_response$_id = _this.id;
      b.get$_service_extension_response$_$this()._service_extension_response$_success = _this.success;
      t1 = _this.result;
      t1 = t1 != null ? B.C_JsonCodec.encode$1(t1) : null;
      b.get$_service_extension_response$_$this()._resultJson = t1;
      b.get$_service_extension_response$_$this()._errorCode = _this.errorCode;
      b.get$_service_extension_response$_$this()._service_extension_response$_errorMessage = _this.errorMessage;
      return b;
    },
    $signature: 42
  };
  A._$ServiceExtensionResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.ServiceExtensionResponse._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_PT1), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_R6B)];
      value = object.resultJson;
      if (value != null) {
        result.push("resultJson");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      value = object.errorCode;
      if (value != null) {
        result.push("errorCode");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_rTD));
      }
      value = object.errorMessage;
      if (value != null) {
        result.push("errorMessage");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.ServiceExtensionResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      while (iterator.moveNext$0()) {
        t1 = iterator.get$current();
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current();
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1);
            t1.toString;
            A._asString(t1);
            result.get$_service_extension_response$_$this()._service_extension_response$_id = t1;
            break;
          case "resultJson":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_service_extension_response$_$this()._resultJson = t1;
            break;
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B);
            t1.toString;
            A._asBool(t1);
            result.get$_service_extension_response$_$this()._service_extension_response$_success = t1;
            break;
          case "errorCode":
            t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_rTD));
            result.get$_service_extension_response$_$this()._errorCode = t1;
            break;
          case "errorMessage":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1));
            result.get$_service_extension_response$_$this()._service_extension_response$_errorMessage = t1;
            break;
        }
      }
      return result._service_extension_response$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_5rA;
    },
    get$wireName() {
      return "ServiceExtensionResponse";
    }
  };
  A._$ServiceExtensionResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ServiceExtensionResponse && _this.id === other.id && _this.resultJson == other.resultJson && _this.success === other.success && _this.errorCode == other.errorCode && _this.errorMessage == other.errorMessage;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(_this.id)), J.get$hashCode$(_this.resultJson)), B.JSBool_methods.get$hashCode(_this.success)), J.get$hashCode$(_this.errorCode)), J.get$hashCode$(_this.errorMessage)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("ServiceExtensionResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", _this.id);
      t2.add$2(t1, "resultJson", _this.resultJson);
      t2.add$2(t1, "success", _this.success);
      t2.add$2(t1, "errorCode", _this.errorCode);
      t2.add$2(t1, "errorMessage", _this.errorMessage);
      return t2.toString$0(t1);
    }
  };
  A.ServiceExtensionResponseBuilder.prototype = {
    set$id(id) {
      this.get$_service_extension_response$_$this()._service_extension_response$_id = id;
    },
    set$success(success) {
      this.get$_service_extension_response$_$this()._service_extension_response$_success = success;
    },
    set$errorMessage(errorMessage) {
      this.get$_service_extension_response$_$this()._service_extension_response$_errorMessage = errorMessage;
    },
    get$_service_extension_response$_$this() {
      var _this = this,
        $$v = _this._service_extension_response$_$v;
      if ($$v != null) {
        _this._service_extension_response$_id = $$v.id;
        _this._resultJson = $$v.resultJson;
        _this._service_extension_response$_success = $$v.success;
        _this._errorCode = $$v.errorCode;
        _this._service_extension_response$_errorMessage = $$v.errorMessage;
        _this._service_extension_response$_$v = null;
      }
      return _this;
    },
    _service_extension_response$_build$0() {
      var _this = this,
        _s24_ = "ServiceExtensionResponse",
        _$result = _this._service_extension_response$_$v;
      return _this._service_extension_response$_$v = _$result == null ? new A._$ServiceExtensionResponse(A.BuiltValueNullFieldError_checkNotNull(_this.get$_service_extension_response$_$this()._service_extension_response$_id, _s24_, "id", type$.String), _this.get$_service_extension_response$_$this()._resultJson, A.BuiltValueNullFieldError_checkNotNull(_this.get$_service_extension_response$_$this()._service_extension_response$_success, _s24_, "success", type$.bool), _this.get$_service_extension_response$_$this()._errorCode, _this.get$_service_extension_response$_$this()._service_extension_response$_errorMessage) : _$result;
    }
  };
  A.BatchedStreamController.prototype = {
    _batchAndSendEvents$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, t2, t3, t4, t5, t6, t7, t8, now, lastEvent, duration, t1, buffer, lastSendTime, $async$temp1, $async$temp2;
      var $async$_batchAndSendEvents$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              duration = A.Duration$(0, $async$self._checkDelayMilliseconds);
              t1 = $async$self.$ti;
              buffer = A._setArrayType([], t1._eval$1("JSArray<1>"));
              lastSendTime = Date.now();
              t2 = $async$self._batchDelayMilliseconds, t3 = $async$self._outputController, t4 = A._instanceType(t3), t1 = t1._precomputed1, t5 = t4._eval$1("_DelayedData<1>");
            case 2:
              // for condition
              $async$goto = 4;
              return A._asyncAwait($async$self._hasEventOrTimeOut$1(duration), $async$_batchAndSendEvents$0);
            case 4:
              // returning from await.
              if (!$async$result) {
                // goto after for
                $async$goto = 3;
                break;
              }
              $async$goto = 7;
              return A._asyncAwait($async$self._hasEventDuring$1(duration), $async$_batchAndSendEvents$0);
            case 7:
              // returning from await.
              $async$goto = $async$result ? 5 : 6;
              break;
            case 5:
              // then
              t6 = $async$self.__BatchedStreamController__inputQueue_A;
              t6 === $ && A.throwLateFieldNI("_inputQueue");
              t7 = t6.$ti;
              t8 = new A._Future($.Zone__current, t7._eval$1("_Future<1>"));
              t6._addRequest$1(new A._NextRequest(new A._AsyncCompleter(t8, t7._eval$1("_AsyncCompleter<1>")), t7._eval$1("_NextRequest<1>")));
              $async$temp1 = B.JSArray_methods;
              $async$temp2 = buffer;
              $async$goto = 8;
              return A._asyncAwait(t8, $async$_batchAndSendEvents$0);
            case 8:
              // returning from await.
              $async$temp1.add$1($async$temp2, $async$result);
            case 6:
              // join
              now = Date.now();
              if (now > lastSendTime + t2) {
                if (buffer.length !== 0) {
                  t6 = A.List_List$_of(buffer, t1);
                  t4._precomputed1._as(t6);
                  t7 = t3._state;
                  if (t7 >= 4)
                    A.throwExpression(t3._badEventState$0());
                  if ((t7 & 1) !== 0)
                    t3._sendData$1(t6);
                  else if ((t7 & 3) === 0) {
                    t7 = t3._ensurePendingEvents$0();
                    t6 = new A._DelayedData(t6, t5);
                    lastEvent = t7.lastPendingEvent;
                    if (lastEvent == null)
                      t7.firstPendingEvent = t7.lastPendingEvent = t6;
                    else {
                      lastEvent.set$next(t6);
                      t7.lastPendingEvent = t6;
                    }
                  }
                  B.JSArray_methods.clear$0(buffer);
                }
                lastSendTime = now;
              }
              // goto for condition
              $async$goto = 2;
              break;
            case 3:
              // after for
              if (buffer.length !== 0) {
                t1 = A.List_List$_of(buffer, t1);
                t3.add$1(0, t4._precomputed1._as(t1));
              }
              $async$self._completer.complete$1(true);
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_batchAndSendEvents$0, $async$completer);
    },
    _hasEventOrTimeOut$1(duration) {
      var t1 = this.__BatchedStreamController__inputQueue_A;
      t1 === $ && A.throwLateFieldNI("_inputQueue");
      return t1.get$hasNext().timeout$2$onTimeout(duration, new A.BatchedStreamController__hasEventOrTimeOut_closure());
    },
    _hasEventDuring$1(duration) {
      var t1 = this.__BatchedStreamController__inputQueue_A;
      t1 === $ && A.throwLateFieldNI("_inputQueue");
      return t1.get$hasNext().timeout$2$onTimeout(duration, new A.BatchedStreamController__hasEventDuring_closure());
    }
  };
  A.BatchedStreamController__hasEventOrTimeOut_closure.prototype = {
    call$0() {
      return true;
    },
    $signature: 29
  };
  A.BatchedStreamController__hasEventDuring_closure.prototype = {
    call$0() {
      return false;
    },
    $signature: 29
  };
  A.SocketClient.prototype = {};
  A.SseSocketClient.prototype = {
    get$sink() {
      var t1 = this._sockets$_client._outgoingController;
      return new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>"));
    },
    get$stream() {
      var t1 = this._sockets$_client._incomingController;
      return new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>"));
    }
  };
  A.WebSocketClient.prototype = {
    get$sink() {
      var t2,
        t1 = this._channel,
        value = t1.__AdapterWebSocketChannel_sink_FI;
      if (value === $) {
        t2 = t1._adapter_web_socket_channel$_controller.__StreamChannelController__foreign_F;
        t2 === $ && A.throwLateFieldNI("_foreign");
        t2 = t2.__GuaranteeChannel__sink_F;
        t2 === $ && A.throwLateFieldNI("_sink");
        value = t1.__AdapterWebSocketChannel_sink_FI = new A._WebSocketSink(t1, t2);
      }
      return value;
    },
    get$stream() {
      var t2,
        t1 = this._channel._adapter_web_socket_channel$_controller.__StreamChannelController__foreign_F;
      t1 === $ && A.throwLateFieldNI("_foreign");
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t2 = A._instanceType(t1)._eval$1("_ControllerStream<1>");
      return new A._MapStream(t2._eval$1("String(Stream.T)")._as(new A.WebSocketClient_stream_closure()), new A._ControllerStream(t1, t2), t2._eval$1("_MapStream<Stream.T,String>"));
    }
  };
  A.WebSocketClient_stream_closure.prototype = {
    call$1(o) {
      return J.toString$0$(o);
    },
    $signature: 44
  };
  A.safeUnawaited_closure.prototype = {
    call$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      return $.$get$_logger().log$4(B.Level_WARNING_900, "Error in unawaited Future:", error, stackTrace);
    },
    $signature: 22
  };
  A.Int32.prototype = {
    _toInt$1(val) {
      if (val instanceof A.Int32)
        return val._i;
      else if (A._isInt(val))
        return val;
      throw A.wrapException(A.ArgumentError$value(val, "other", "Not an int, Int32 or Int64"));
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (other instanceof A.Int32)
        return this._i === other._i;
      else if (other instanceof A.Int64)
        return A.Int64_Int64(this._i).$eq(0, other);
      else if (A._isInt(other))
        return this._i === other;
      return false;
    },
    compareTo$1(_, other) {
      if (other instanceof A.Int64)
        return A.Int64_Int64(this._i)._compareTo$1(other);
      return B.JSInt_methods.compareTo$1(this._i, this._toInt$1(other));
    },
    get$hashCode(_) {
      return this._i;
    },
    toString$0(_) {
      return B.JSInt_methods.toString$0(this._i);
    },
    $isComparable: 1
  };
  A.Int64.prototype = {
    $eq(_, other) {
      var o, _this = this;
      if (other == null)
        return false;
      if (other instanceof A.Int64)
        o = other;
      else if (A._isInt(other)) {
        if (_this._h === 0 && _this._m === 0)
          return _this._l === other;
        if ((other & 4194303) === other)
          return false;
        o = A.Int64_Int64(other);
      } else
        o = other instanceof A.Int32 ? A.Int64_Int64(other._i) : null;
      if (o != null)
        return _this._l === o._l && _this._m === o._m && _this._h === o._h;
      return false;
    },
    compareTo$1(_, other) {
      return this._compareTo$1(other);
    },
    _compareTo$1(other) {
      var o = A.Int64__promote(other),
        t1 = this._h,
        signa = t1 >>> 19,
        t2 = o._h;
      if (signa !== t2 >>> 19)
        return signa === 0 ? 1 : -1;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._m;
      t2 = o._m;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._l;
      t2 = o._l;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      return 0;
    },
    get$hashCode(_) {
      var t1 = this._m;
      return (((t1 & 1023) << 22 | this._l) ^ (this._h << 12 | t1 >>> 10 & 4095)) >>> 0;
    },
    toString$0(_) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(10, d0, d1, d2, sign);
    },
    _toRadixString$1(radix) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign);
    },
    $isComparable: 1
  };
  A._StackState.prototype = {};
  A.RequestAbortedException.prototype = {};
  A.BaseClient.prototype = {
    _sendUnstreamed$3(method, url, headers) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Response),
        $async$returnValue, $async$self = this, request, $async$temp1;
      var $async$_sendUnstreamed$3 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              request = A.Request$(method, url);
              $async$temp1 = A;
              $async$goto = 3;
              return A._asyncAwait($async$self.send$1(request), $async$_sendUnstreamed$3);
            case 3:
              // returning from await.
              $async$returnValue = $async$temp1.Response_fromStream($async$result);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_sendUnstreamed$3, $async$completer);
    }
  };
  A.BaseRequest.prototype = {
    finalize$0() {
      if (this._finalized)
        throw A.wrapException(A.StateError$("Can't finalize a finalized Request."));
      this._finalized = true;
      return B.ByteStream__EmptyStream;
    },
    toString$0(_) {
      return this.method + " " + this.url.toString$0(0);
    }
  };
  A.BaseRequest_closure.prototype = {
    call$2(key1, key2) {
      return A._asString(key1).toLowerCase() === A._asString(key2).toLowerCase();
    },
    $signature: 45
  };
  A.BaseRequest_closure0.prototype = {
    call$1(key) {
      return B.JSString_methods.get$hashCode(A._asString(key).toLowerCase());
    },
    $signature: 46
  };
  A.BaseResponse.prototype = {
    BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(statusCode, contentLength, headers, isRedirect, persistentConnection, reasonPhrase, request) {
      var t1 = this.statusCode;
      if (t1 < 100)
        throw A.wrapException(A.ArgumentError$("Invalid status code " + t1 + ".", null));
      else {
        t1 = this.contentLength;
        if (t1 != null && t1 < 0)
          throw A.wrapException(A.ArgumentError$("Invalid content length " + A.S(t1) + ".", null));
      }
    }
  };
  A.BrowserClient.prototype = {
    send$1(request) {
      return this.send$body$BrowserClient(request);
    },
    send$body$BrowserClient(request) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.StreamedResponse),
        $async$returnValue, $async$handler = 2, $async$errorStack = [], $async$next = [], $async$self = this, bodyBytes, _0_0, _0_2, _0_2_isSet, abortTrigger, t1, _1_0, contentLength, header, response, contentLengthHeader, contentLength0, headers, e, st, t4, t5, _this, t6, t7, t8, t9, result, exception, t2, abortController, t3, $async$exception;
      var $async$send$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t2 = init.G;
              abortController = A._asJSObject(new t2.AbortController());
              t3 = $async$self._openRequestAbortControllers;
              B.JSArray_methods.add$1(t3, abortController);
              request.super$BaseRequest$finalize();
              t4 = type$._AsyncStreamController_List_int;
              t5 = new A._AsyncStreamController(null, null, null, null, t4);
              t5._add$1(request._bodyBytes);
              t5._closeUnchecked$0();
              $async$goto = 3;
              return A._asyncAwait(new A.ByteStream(new A._ControllerStream(t5, t4._eval$1("_ControllerStream<1>"))).toBytes$0(), $async$send$1);
            case 3:
              // returning from await.
              bodyBytes = $async$result;
              $async$handler = 5;
              _0_0 = request;
              _0_2 = null;
              _0_2_isSet = false;
              abortTrigger = null;
              t4 = request.url;
              _this = t4.toString$0(0);
              t5 = !J.get$isEmpty$asx(bodyBytes) ? bodyBytes : null;
              t6 = $async$self.withCredentials ? "include" : "same-origin";
              t7 = type$.String;
              t1 = A.LinkedHashMap_LinkedHashMap$_empty(t7, type$.Object);
              _1_0 = request._bodyBytes.length;
              contentLength = null;
              if (_1_0 != null) {
                contentLength = _1_0;
                J.$indexSet$ax(t1, "content-length", contentLength);
              }
              for (t8 = request.headers, t8 = new A.LinkedHashMapEntriesIterable(t8, A._instanceType(t8)._eval$1("LinkedHashMapEntriesIterable<1,2>")).get$iterator(0); t8.moveNext$0();) {
                t9 = t8.__js_helper$_current;
                t9.toString;
                header = t9;
                J.$indexSet$ax(t1, header.key, header.value);
              }
              t1 = A.jsify(t1);
              t1.toString;
              A._asJSObject(t1);
              t8 = A._asJSObject(abortController.signal);
              $async$goto = 8;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(t2.fetch(_this, {method: request.method, headers: t1, body: t5, credentials: t6, redirect: "follow", signal: t8})), type$.JSObject), $async$send$1);
            case 8:
              // returning from await.
              response = $async$result;
              contentLengthHeader = A._asStringQ(A._asJSObject(response.headers).get("content-length"));
              contentLength0 = contentLengthHeader != null ? A.Primitives_parseInt(contentLengthHeader, null) : null;
              if (contentLength0 == null && contentLengthHeader != null) {
                t1 = A.ClientException$("Invalid content-length header [" + contentLengthHeader + "].", t4);
                throw A.wrapException(t1);
              }
              headers = A.LinkedHashMap_LinkedHashMap$_empty(t7, t7);
              t1 = A._asJSObject(response.headers);
              t2 = new A.BrowserClient_send_closure(headers);
              if (typeof t2 == "function")
                A.throwExpression(A.ArgumentError$("Attempting to rewrap a JS function.", null));
              result = function(_call, f) {
                return function(arg1, arg2, arg3) {
                  return _call(f, arg1, arg2, arg3, arguments.length);
                };
              }(A._callDartFunctionFast3, t2);
              result[$.$get$DART_CLOSURE_PROPERTY_NAME()] = t2;
              t1.forEach(result);
              t1 = A._readBody(request, response);
              t2 = A._asInt(response.status);
              t4 = headers;
              t5 = contentLength0;
              A.Uri_parse(A._asString(response.url));
              t6 = A._asString(response.statusText);
              t1 = new A.StreamedResponseV2(A.toByteStream(t1), request, t2, t6, t5, t4, false, true);
              t1.BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(t2, t5, t4, false, true, t6, request);
              $async$returnValue = t1;
              $async$next = [1];
              // goto finally
              $async$goto = 6;
              break;
              $async$next.push(7);
              // goto finally
              $async$goto = 6;
              break;
            case 5:
              // catch
              $async$handler = 4;
              $async$exception = $async$errorStack.pop();
              e = A.unwrapException($async$exception);
              st = A.getTraceFromException($async$exception);
              A._rethrowAsClientException(e, st, request);
              $async$next.push(7);
              // goto finally
              $async$goto = 6;
              break;
            case 4:
              // uncaught
              $async$next = [2];
            case 6:
              // finally
              $async$handler = 2;
              B.JSArray_methods.remove$1(t3, abortController);
              // goto the next finally handler
              $async$goto = $async$next.pop();
              break;
            case 7:
              // after finally
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$send$1, $async$completer);
    }
  };
  A.BrowserClient_send_closure.prototype = {
    call$3(value, header, _) {
      A._asString(value);
      this.headers.$indexSet(0, A._asString(header).toLowerCase(), value);
    },
    call$2(value, header) {
      return this.call$3(value, header, null);
    },
    "call*": "call$3",
    $requiredArgCount: 2,
    $defaultValues() {
      return [null];
    },
    $signature: 47
  };
  A._readBody_closure.prototype = {
    call$1(_) {
      return null;
    },
    $signature: 6
  };
  A._readBody_closure0.prototype = {
    call$1(_) {
      A._asObject(_);
      return this._box_0.isError;
    },
    $signature: 48
  };
  A.ByteStream.prototype = {
    toBytes$0() {
      var t1 = new A._Future($.Zone__current, type$._Future_Uint8List),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_Uint8List),
        sink = new A._ByteCallbackSink(new A.ByteStream_toBytes_closure(completer), new Uint8Array(1024));
      this.listen$4$cancelOnError$onDone$onError(type$.void_Function_List_int._as(sink.get$add(sink)), true, sink.get$close(), completer.get$completeError());
      return t1;
    }
  };
  A.ByteStream_toBytes_closure.prototype = {
    call$1(bytes) {
      return this.completer.complete$1(new Uint8Array(A._ensureNativeList(type$.List_int._as(bytes))));
    },
    $signature: 49
  };
  A.ClientException.prototype = {
    toString$0(_) {
      var t1 = this.uri.toString$0(0);
      return "ClientException: " + this.message + ", uri=" + t1;
    },
    $isException: 1
  };
  A.Request.prototype = {};
  A.Response.prototype = {};
  A.StreamedResponse.prototype = {};
  A.StreamedResponseV2.prototype = {};
  A.CaseInsensitiveMap.prototype = {};
  A.MediaType.prototype = {
    toString$0(_) {
      var buffer = new A.StringBuffer(""),
        t1 = this.type;
      buffer._contents = t1;
      t1 += "/";
      buffer._contents = t1;
      buffer._contents = t1 + this.subtype;
      t1 = this.parameters;
      t1._collection$_map.forEach$1(0, t1.$ti._eval$1("~(1,2)")._as(new A.MediaType_toString_closure(buffer)));
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    }
  };
  A.MediaType_MediaType$parse_closure.prototype = {
    call$0() {
      var t3, t4, t5, t6, parameters, t7, success, t8, value,
        t1 = this.mediaType,
        scanner = new A.StringScanner(null, t1),
        t2 = $.$get$whitespace();
      scanner.scan$1(t2);
      t3 = $.$get$token();
      scanner.expect$1(t3);
      t4 = scanner.get$lastMatch().$index(0, 0);
      t4.toString;
      scanner.expect$1("/");
      scanner.expect$1(t3);
      t5 = scanner.get$lastMatch().$index(0, 0);
      t5.toString;
      scanner.scan$1(t2);
      t6 = type$.String;
      parameters = A.LinkedHashMap_LinkedHashMap$_empty(t6, t6);
      for (;;) {
        t6 = scanner._lastMatch = B.JSString_methods.matchAsPrefix$2(";", t1, scanner._string_scanner$_position);
        t7 = scanner._lastMatchPosition = scanner._string_scanner$_position;
        success = t6 != null;
        t6 = success ? scanner._lastMatchPosition = scanner._string_scanner$_position = t6.get$end() : t7;
        if (!success)
          break;
        t6 = scanner._lastMatch = t2.matchAsPrefix$2(0, t1, t6);
        scanner._lastMatchPosition = scanner._string_scanner$_position;
        if (t6 != null)
          scanner._lastMatchPosition = scanner._string_scanner$_position = t6.get$end();
        scanner.expect$1(t3);
        if (scanner._string_scanner$_position !== scanner._lastMatchPosition)
          scanner._lastMatch = null;
        t6 = scanner._lastMatch.$index(0, 0);
        t6.toString;
        scanner.expect$1("=");
        t7 = scanner._lastMatch = t3.matchAsPrefix$2(0, t1, scanner._string_scanner$_position);
        t8 = scanner._lastMatchPosition = scanner._string_scanner$_position;
        success = t7 != null;
        if (success) {
          t7 = scanner._lastMatchPosition = scanner._string_scanner$_position = t7.get$end();
          t8 = t7;
        } else
          t7 = t8;
        if (success) {
          if (t7 !== t8)
            scanner._lastMatch = null;
          t7 = scanner._lastMatch.$index(0, 0);
          t7.toString;
          value = t7;
        } else
          value = A.expectQuotedString(scanner);
        t7 = scanner._lastMatch = t2.matchAsPrefix$2(0, t1, scanner._string_scanner$_position);
        scanner._lastMatchPosition = scanner._string_scanner$_position;
        if (t7 != null)
          scanner._lastMatchPosition = scanner._string_scanner$_position = t7.get$end();
        parameters.$indexSet(0, t6, value);
      }
      scanner.expectDone$0();
      return A.MediaType$(t4, t5, parameters);
    },
    $signature: 50
  };
  A.MediaType_toString_closure.prototype = {
    call$2(attribute, value) {
      var t1, t2, t3;
      A._asString(attribute);
      A._asString(value);
      t1 = this.buffer;
      t1._contents += "; " + attribute + "=";
      t2 = $.$get$nonToken();
      t2 = t2._nativeRegExp.test(value);
      t3 = t1._contents;
      if (t2) {
        t1._contents = t3 + '"';
        t2 = A.stringReplaceAllFuncUnchecked(value, $.$get$_escapedChar(), type$.nullable_String_Function_Match._as(type$.String_Function_Match._as(new A.MediaType_toString__closure())), null);
        t1._contents = (t1._contents += t2) + '"';
      } else
        t1._contents = t3 + value;
    },
    $signature: 51
  };
  A.MediaType_toString__closure.prototype = {
    call$1(match) {
      return "\\" + A.S(match.$index(0, 0));
    },
    $signature: 28
  };
  A.expectQuotedString_closure.prototype = {
    call$1(match) {
      var t1 = match.$index(0, 1);
      t1.toString;
      return t1;
    },
    $signature: 28
  };
  A.Level.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Level && this.value === other.value;
    },
    compareTo$1(_, other) {
      return this.value - type$.Level._as(other).value;
    },
    get$hashCode(_) {
      return this.value;
    },
    toString$0(_) {
      return this.name;
    },
    $isComparable: 1
  };
  A.LogRecord.prototype = {
    toString$0(_) {
      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
    }
  };
  A.Logger.prototype = {
    get$fullName() {
      var t1 = this.parent,
        t2 = t1 == null ? null : t1.name.length !== 0,
        t3 = this.name;
      return t2 === true ? t1.get$fullName() + "." + t3 : t3;
    },
    get$level() {
      var t1, effectiveLevel;
      if (this.parent == null) {
        t1 = this._level;
        t1.toString;
        effectiveLevel = t1;
      } else {
        t1 = $.$get$Logger_root()._level;
        t1.toString;
        effectiveLevel = t1;
      }
      return effectiveLevel;
    },
    log$4(logLevel, message, error, stackTrace) {
      var record, _this = this,
        t1 = logLevel.value;
      if (t1 >= _this.get$level().value) {
        if ((stackTrace == null || stackTrace === B._StringStackTrace_OdL) && t1 >= 2000) {
          A.StackTrace_current();
          if (error == null)
            logLevel.toString$0(0);
        }
        t1 = _this.get$fullName();
        Date.now();
        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
        record = new A.LogRecord(logLevel, message, t1);
        if (_this.parent == null)
          _this._publish$1(record);
        else
          $.$get$Logger_root()._publish$1(record);
      }
    },
    _publish$1(record) {
      return null;
    }
  };
  A.Logger_Logger_closure.prototype = {
    call$0() {
      var dot, $parent, t1,
        thisName = this.name;
      if (B.JSString_methods.startsWith$1(thisName, "."))
        A.throwExpression(A.ArgumentError$("name shouldn't start with a '.'", null));
      if (B.JSString_methods.endsWith$1(thisName, "."))
        A.throwExpression(A.ArgumentError$("name shouldn't end with a '.'", null));
      dot = B.JSString_methods.lastIndexOf$1(thisName, ".");
      if (dot === -1)
        $parent = thisName !== "" ? A.Logger_Logger("") : null;
      else {
        $parent = A.Logger_Logger(B.JSString_methods.substring$2(thisName, 0, dot));
        thisName = B.JSString_methods.substring$1(thisName, dot + 1);
      }
      t1 = new A.Logger(thisName, $parent, A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger));
      if ($parent == null)
        t1._level = B.Level_INFO_800;
      else
        $parent._children.$indexSet(0, thisName, t1);
      return t1;
    },
    $signature: 53
  };
  A.Context.prototype = {
    absolute$15(part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15) {
      var t1;
      A._validateArgList("absolute", A._setArrayType([part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15], type$.JSArray_nullable_String));
      t1 = this.style;
      t1 = t1.rootLength$1(part1) > 0 && !t1.isRootRelative$1(part1);
      if (t1)
        return part1;
      t1 = this._context$_current;
      return this.join$16(0, t1 == null ? A.current() : t1, part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15);
    },
    absolute$1(part1) {
      var _null = null;
      return this.absolute$15(part1, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null);
    },
    join$16(_, part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15, part16) {
      var parts = A._setArrayType([part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15, part16], type$.JSArray_nullable_String);
      A._validateArgList("join", parts);
      return this.joinAll$1(new A.WhereTypeIterable(parts, type$.WhereTypeIterable_String));
    },
    joinAll$1(parts) {
      var t1, t2, t3, needsSeparator, isAbsoluteAndNotRootRelative, t4, t5, parsed, path, t6;
      type$.Iterable_String._as(parts);
      for (t1 = parts.$ti, t2 = t1._eval$1("bool(Iterable.E)")._as(new A.Context_joinAll_closure()), t3 = parts.get$iterator(0), t1 = new A.WhereIterator(t3, t2, t1._eval$1("WhereIterator<Iterable.E>")), t2 = this.style, needsSeparator = false, isAbsoluteAndNotRootRelative = false, t4 = ""; t1.moveNext$0();) {
        t5 = t3.get$current();
        if (t2.isRootRelative$1(t5) && isAbsoluteAndNotRootRelative) {
          parsed = A.ParsedPath_ParsedPath$parse(t5, t2);
          path = t4.charCodeAt(0) == 0 ? t4 : t4;
          t4 = B.JSString_methods.substring$2(path, 0, t2.rootLength$2$withDrive(path, true));
          parsed.root = t4;
          if (t2.needsSeparator$1(t4))
            B.JSArray_methods.$indexSet(parsed.separators, 0, t2.get$separator());
          t4 = parsed.toString$0(0);
        } else if (t2.rootLength$1(t5) > 0) {
          isAbsoluteAndNotRootRelative = !t2.isRootRelative$1(t5);
          t4 = t5;
        } else {
          t6 = t5.length;
          if (t6 !== 0) {
            if (0 >= t6)
              return A.ioore(t5, 0);
            t6 = t2.containsSeparator$1(t5[0]);
          } else
            t6 = false;
          if (!t6)
            if (needsSeparator)
              t4 += t2.get$separator();
          t4 += t5;
        }
        needsSeparator = t2.needsSeparator$1(t5);
      }
      return t4.charCodeAt(0) == 0 ? t4 : t4;
    },
    split$1(_, path) {
      var parsed = A.ParsedPath_ParsedPath$parse(path, this.style),
        t1 = parsed.parts,
        t2 = A._arrayInstanceType(t1),
        t3 = t2._eval$1("WhereIterable<1>");
      t1 = A.List_List$_of(new A.WhereIterable(t1, t2._eval$1("bool(1)")._as(new A.Context_split_closure()), t3), t3._eval$1("Iterable.E"));
      parsed.set$parts(t1);
      t1 = parsed.root;
      if (t1 != null)
        B.JSArray_methods.insert$2(parsed.parts, 0, t1);
      return parsed.parts;
    },
    normalize$1(path) {
      var parsed;
      if (!this._needsNormalization$1(path))
        return path;
      parsed = A.ParsedPath_ParsedPath$parse(path, this.style);
      parsed.normalize$0();
      return parsed.toString$0(0);
    },
    _needsNormalization$1(path) {
      var t2, i, start, previous, previousPrevious, codeUnit, t3,
        t1 = this.style,
        root = t1.rootLength$1(path);
      if (root !== 0) {
        if (t1 === $.$get$Style_windows())
          for (t2 = path.length, i = 0; i < root; ++i) {
            if (!(i < t2))
              return A.ioore(path, i);
            if (path.charCodeAt(i) === 47)
              return true;
          }
        start = root;
        previous = 47;
      } else {
        start = 0;
        previous = null;
      }
      for (t2 = path.length, i = start, previousPrevious = null; i < t2; ++i, previousPrevious = previous, previous = codeUnit) {
        if (!(i >= 0))
          return A.ioore(path, i);
        codeUnit = path.charCodeAt(i);
        if (t1.isSeparator$1(codeUnit)) {
          if (t1 === $.$get$Style_windows() && codeUnit === 47)
            return true;
          if (previous != null && t1.isSeparator$1(previous))
            return true;
          if (previous === 46)
            t3 = previousPrevious == null || previousPrevious === 46 || t1.isSeparator$1(previousPrevious);
          else
            t3 = false;
          if (t3)
            return true;
        }
      }
      if (previous == null)
        return true;
      if (t1.isSeparator$1(previous))
        return true;
      if (previous === 46)
        t1 = previousPrevious == null || t1.isSeparator$1(previousPrevious) || previousPrevious === 46;
      else
        t1 = false;
      if (t1)
        return true;
      return false;
    },
    relative$1(path) {
      var from, fromParsed, pathParsed, t3, t4, t5, t6, _this = this,
        _s26_ = 'Unable to find a path to "',
        t1 = _this.style,
        t2 = t1.rootLength$1(path);
      if (t2 <= 0)
        return _this.normalize$1(path);
      t2 = _this._context$_current;
      from = t2 == null ? A.current() : t2;
      if (t1.rootLength$1(from) <= 0 && t1.rootLength$1(path) > 0)
        return _this.normalize$1(path);
      if (t1.rootLength$1(path) <= 0 || t1.isRootRelative$1(path))
        path = _this.absolute$1(path);
      if (t1.rootLength$1(path) <= 0 && t1.rootLength$1(from) > 0)
        throw A.wrapException(A.PathException$(_s26_ + path + '" from "' + from + '".'));
      fromParsed = A.ParsedPath_ParsedPath$parse(from, t1);
      fromParsed.normalize$0();
      pathParsed = A.ParsedPath_ParsedPath$parse(path, t1);
      pathParsed.normalize$0();
      t2 = fromParsed.parts;
      t3 = t2.length;
      if (t3 !== 0) {
        if (0 >= t3)
          return A.ioore(t2, 0);
        t2 = t2[0] === ".";
      } else
        t2 = false;
      if (t2)
        return pathParsed.toString$0(0);
      t2 = fromParsed.root;
      t3 = pathParsed.root;
      if (t2 != t3)
        t2 = t2 == null || t3 == null || !t1.pathsEqual$2(t2, t3);
      else
        t2 = false;
      if (t2)
        return pathParsed.toString$0(0);
      for (;;) {
        t2 = fromParsed.parts;
        t3 = t2.length;
        t4 = false;
        if (t3 !== 0) {
          t5 = pathParsed.parts;
          t6 = t5.length;
          if (t6 !== 0) {
            if (0 >= t3)
              return A.ioore(t2, 0);
            t2 = t2[0];
            if (0 >= t6)
              return A.ioore(t5, 0);
            t5 = t1.pathsEqual$2(t2, t5[0]);
            t2 = t5;
          } else
            t2 = t4;
        } else
          t2 = t4;
        if (!t2)
          break;
        B.JSArray_methods.removeAt$1(fromParsed.parts, 0);
        B.JSArray_methods.removeAt$1(fromParsed.separators, 1);
        B.JSArray_methods.removeAt$1(pathParsed.parts, 0);
        B.JSArray_methods.removeAt$1(pathParsed.separators, 1);
      }
      t2 = fromParsed.parts;
      t3 = t2.length;
      if (t3 !== 0) {
        if (0 >= t3)
          return A.ioore(t2, 0);
        t2 = t2[0] === "..";
      } else
        t2 = false;
      if (t2)
        throw A.wrapException(A.PathException$(_s26_ + path + '" from "' + from + '".'));
      t2 = type$.String;
      B.JSArray_methods.insertAll$2(pathParsed.parts, 0, A.List_List$filled(t3, "..", false, t2));
      B.JSArray_methods.$indexSet(pathParsed.separators, 0, "");
      B.JSArray_methods.insertAll$2(pathParsed.separators, 1, A.List_List$filled(fromParsed.parts.length, t1.get$separator(), false, t2));
      t1 = pathParsed.parts;
      t2 = t1.length;
      if (t2 === 0)
        return ".";
      if (t2 > 1 && B.JSArray_methods.get$last(t1) === ".") {
        B.JSArray_methods.removeLast$0(pathParsed.parts);
        t1 = pathParsed.separators;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        B.JSArray_methods.add$1(t1, "");
      }
      pathParsed.root = "";
      pathParsed.removeTrailingSeparators$0();
      return pathParsed.toString$0(0);
    },
    prettyUri$1(uri) {
      var path, rel, _this = this,
        typedUri = A._parseUri(uri);
      if (typedUri.get$scheme() === "file" && _this.style === $.$get$Style_url())
        return typedUri.toString$0(0);
      else if (typedUri.get$scheme() !== "file" && typedUri.get$scheme() !== "" && _this.style !== $.$get$Style_url())
        return typedUri.toString$0(0);
      path = _this.normalize$1(_this.style.pathFromUri$1(A._parseUri(typedUri)));
      rel = _this.relative$1(path);
      return _this.split$1(0, rel).length > _this.split$1(0, path).length ? path : rel;
    }
  };
  A.Context_joinAll_closure.prototype = {
    call$1(part) {
      return A._asString(part) !== "";
    },
    $signature: 27
  };
  A.Context_split_closure.prototype = {
    call$1(part) {
      return A._asString(part).length !== 0;
    },
    $signature: 27
  };
  A._validateArgList_closure.prototype = {
    call$1(arg) {
      A._asStringQ(arg);
      return arg == null ? "null" : '"' + arg + '"';
    },
    $signature: 92
  };
  A.InternalStyle.prototype = {
    getRoot$1(path) {
      var t1,
        $length = this.rootLength$1(path);
      if ($length > 0)
        return B.JSString_methods.substring$2(path, 0, $length);
      if (this.isRootRelative$1(path)) {
        if (0 >= path.length)
          return A.ioore(path, 0);
        t1 = path[0];
      } else
        t1 = null;
      return t1;
    },
    pathsEqual$2(path1, path2) {
      return path1 === path2;
    }
  };
  A.ParsedPath.prototype = {
    removeTrailingSeparators$0() {
      var t1, t2, _this = this;
      for (;;) {
        t1 = _this.parts;
        if (!(t1.length !== 0 && B.JSArray_methods.get$last(t1) === ""))
          break;
        B.JSArray_methods.removeLast$0(_this.parts);
        t1 = _this.separators;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
      }
      t1 = _this.separators;
      t2 = t1.length;
      if (t2 !== 0)
        B.JSArray_methods.$indexSet(t1, t2 - 1, "");
    },
    normalize$0() {
      var t1, t2, leadingDoubles, _i, part, t3, _this = this,
        newParts = A._setArrayType([], type$.JSArray_String);
      for (t1 = _this.parts, t2 = t1.length, leadingDoubles = 0, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        part = t1[_i];
        if (!(part === "." || part === ""))
          if (part === "..") {
            t3 = newParts.length;
            if (t3 !== 0) {
              if (0 >= t3)
                return A.ioore(newParts, -1);
              newParts.pop();
            } else
              ++leadingDoubles;
          } else
            B.JSArray_methods.add$1(newParts, part);
      }
      if (_this.root == null)
        B.JSArray_methods.insertAll$2(newParts, 0, A.List_List$filled(leadingDoubles, "..", false, type$.String));
      if (newParts.length === 0 && _this.root == null)
        B.JSArray_methods.add$1(newParts, ".");
      _this.parts = newParts;
      t1 = _this.style;
      _this.separators = A.List_List$filled(newParts.length + 1, t1.get$separator(), true, type$.String);
      t2 = _this.root;
      if (t2 == null || newParts.length === 0 || !t1.needsSeparator$1(t2))
        B.JSArray_methods.$indexSet(_this.separators, 0, "");
      t2 = _this.root;
      if (t2 != null && t1 === $.$get$Style_windows())
        _this.root = A.stringReplaceAllUnchecked(t2, "/", "\\");
      _this.removeTrailingSeparators$0();
    },
    toString$0(_) {
      var t2, t3, t4, t5, i,
        t1 = this.root;
      t1 = t1 != null ? t1 : "";
      for (t2 = this.parts, t3 = t2.length, t4 = this.separators, t5 = t4.length, i = 0; i < t3; ++i) {
        if (!(i < t5))
          return A.ioore(t4, i);
        t1 = t1 + t4[i] + t2[i];
      }
      t1 += B.JSArray_methods.get$last(t4);
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    set$parts(parts) {
      this.parts = type$.List_String._as(parts);
    }
  };
  A.PathException.prototype = {
    toString$0(_) {
      return "PathException: " + this.message;
    },
    $isException: 1
  };
  A.Style.prototype = {
    toString$0(_) {
      return this.get$name();
    }
  };
  A.PosixStyle.prototype = {
    containsSeparator$1(path) {
      return B.JSString_methods.contains$1(path, "/");
    },
    isSeparator$1(codeUnit) {
      return codeUnit === 47;
    },
    needsSeparator$1(path) {
      var t2,
        t1 = path.length;
      if (t1 !== 0) {
        t2 = t1 - 1;
        if (!(t2 >= 0))
          return A.ioore(path, t2);
        t2 = path.charCodeAt(t2) !== 47;
        t1 = t2;
      } else
        t1 = false;
      return t1;
    },
    rootLength$2$withDrive(path, withDrive) {
      var t1 = path.length;
      if (t1 !== 0) {
        if (0 >= t1)
          return A.ioore(path, 0);
        t1 = path.charCodeAt(0) === 47;
      } else
        t1 = false;
      if (t1)
        return 1;
      return 0;
    },
    rootLength$1(path) {
      return this.rootLength$2$withDrive(path, false);
    },
    isRootRelative$1(path) {
      return false;
    },
    pathFromUri$1(uri) {
      var t1;
      if (uri.get$scheme() === "" || uri.get$scheme() === "file") {
        t1 = uri.get$path();
        return A._Uri__uriDecode(t1, 0, t1.length, B.C_Utf8Codec, false);
      }
      throw A.wrapException(A.ArgumentError$("Uri " + uri.toString$0(0) + " must have scheme 'file:'.", null));
    },
    get$name() {
      return "posix";
    },
    get$separator() {
      return "/";
    }
  };
  A.UrlStyle.prototype = {
    containsSeparator$1(path) {
      return B.JSString_methods.contains$1(path, "/");
    },
    isSeparator$1(codeUnit) {
      return codeUnit === 47;
    },
    needsSeparator$1(path) {
      var t2,
        t1 = path.length;
      if (t1 === 0)
        return false;
      t2 = t1 - 1;
      if (!(t2 >= 0))
        return A.ioore(path, t2);
      if (path.charCodeAt(t2) !== 47)
        return true;
      return B.JSString_methods.endsWith$1(path, "://") && this.rootLength$1(path) === t1;
    },
    rootLength$2$withDrive(path, withDrive) {
      var i, codeUnit, index,
        t1 = path.length;
      if (t1 === 0)
        return 0;
      if (0 >= t1)
        return A.ioore(path, 0);
      if (path.charCodeAt(0) === 47)
        return 1;
      for (i = 0; i < t1; ++i) {
        codeUnit = path.charCodeAt(i);
        if (codeUnit === 47)
          return 0;
        if (codeUnit === 58) {
          if (i === 0)
            return 0;
          index = B.JSString_methods.indexOf$2(path, "/", B.JSString_methods.startsWith$2(path, "//", i + 1) ? i + 3 : i);
          if (index <= 0)
            return t1;
          if (!withDrive || t1 < index + 3)
            return index;
          if (!B.JSString_methods.startsWith$1(path, "file://"))
            return index;
          t1 = A.driveLetterEnd(path, index + 1);
          return t1 == null ? index : t1;
        }
      }
      return 0;
    },
    rootLength$1(path) {
      return this.rootLength$2$withDrive(path, false);
    },
    isRootRelative$1(path) {
      var t1 = path.length;
      if (t1 !== 0) {
        if (0 >= t1)
          return A.ioore(path, 0);
        t1 = path.charCodeAt(0) === 47;
      } else
        t1 = false;
      return t1;
    },
    pathFromUri$1(uri) {
      return uri.toString$0(0);
    },
    get$name() {
      return "url";
    },
    get$separator() {
      return "/";
    }
  };
  A.WindowsStyle.prototype = {
    containsSeparator$1(path) {
      return B.JSString_methods.contains$1(path, "/");
    },
    isSeparator$1(codeUnit) {
      return codeUnit === 47 || codeUnit === 92;
    },
    needsSeparator$1(path) {
      var t2,
        t1 = path.length;
      if (t1 === 0)
        return false;
      t2 = t1 - 1;
      if (!(t2 >= 0))
        return A.ioore(path, t2);
      t2 = path.charCodeAt(t2);
      return !(t2 === 47 || t2 === 92);
    },
    rootLength$2$withDrive(path, withDrive) {
      var t2, index,
        t1 = path.length;
      if (t1 === 0)
        return 0;
      if (0 >= t1)
        return A.ioore(path, 0);
      if (path.charCodeAt(0) === 47)
        return 1;
      if (path.charCodeAt(0) === 92) {
        if (t1 >= 2) {
          if (1 >= t1)
            return A.ioore(path, 1);
          t2 = path.charCodeAt(1) !== 92;
        } else
          t2 = true;
        if (t2)
          return 1;
        index = B.JSString_methods.indexOf$2(path, "\\", 2);
        if (index > 0) {
          index = B.JSString_methods.indexOf$2(path, "\\", index + 1);
          if (index > 0)
            return index;
        }
        return t1;
      }
      if (t1 < 3)
        return 0;
      if (!A.isAlphabetic(path.charCodeAt(0)))
        return 0;
      if (path.charCodeAt(1) !== 58)
        return 0;
      t1 = path.charCodeAt(2);
      if (!(t1 === 47 || t1 === 92))
        return 0;
      return 3;
    },
    rootLength$1(path) {
      return this.rootLength$2$withDrive(path, false);
    },
    isRootRelative$1(path) {
      return this.rootLength$1(path) === 1;
    },
    pathFromUri$1(uri) {
      var path, t1;
      if (uri.get$scheme() !== "" && uri.get$scheme() !== "file")
        throw A.wrapException(A.ArgumentError$("Uri " + uri.toString$0(0) + " must have scheme 'file:'.", null));
      path = uri.get$path();
      if (uri.get$host() === "") {
        if (path.length >= 3 && B.JSString_methods.startsWith$1(path, "/") && A.driveLetterEnd(path, 1) != null)
          path = B.JSString_methods.replaceFirst$2(path, "/", "");
      } else
        path = "\\\\" + uri.get$host() + path;
      t1 = A.stringReplaceAllUnchecked(path, "/", "\\");
      return A._Uri__uriDecode(t1, 0, t1.length, B.C_Utf8Codec, false);
    },
    codeUnitsEqual$2(codeUnit1, codeUnit2) {
      var upperCase1;
      if (codeUnit1 === codeUnit2)
        return true;
      if (codeUnit1 === 47)
        return codeUnit2 === 92;
      if (codeUnit1 === 92)
        return codeUnit2 === 47;
      if ((codeUnit1 ^ codeUnit2) !== 32)
        return false;
      upperCase1 = codeUnit1 | 32;
      return upperCase1 >= 97 && upperCase1 <= 122;
    },
    pathsEqual$2(path1, path2) {
      var t1, t2, i;
      if (path1 === path2)
        return true;
      t1 = path1.length;
      t2 = path2.length;
      if (t1 !== t2)
        return false;
      for (i = 0; i < t1; ++i) {
        if (!(i < t2))
          return A.ioore(path2, i);
        if (!this.codeUnitsEqual$2(path1.charCodeAt(i), path2.charCodeAt(i)))
          return false;
      }
      return true;
    },
    get$name() {
      return "windows";
    },
    get$separator() {
      return "\\";
    }
  };
  A.Pool.prototype = {
    request$0() {
      var t1, t2, _this = this;
      if ((_this._closeMemo._async_memoizer$_completer.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("request() may not be called on a closed Pool."));
      t1 = _this._allocatedResources;
      if (t1 < _this._maxAllocatedResources) {
        _this._allocatedResources = t1 + 1;
        return A.Future_Future$value(new A.PoolResource(_this), type$.PoolResource);
      } else {
        t1 = _this._onReleaseCallbacks;
        if (!t1.get$isEmpty(0))
          return _this._runOnRelease$1(t1.removeFirst$0());
        else {
          t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
          t2 = _this._requestedResources;
          t2._collection$_add$1(t2.$ti._precomputed1._as(new A._AsyncCompleter(t1, type$._AsyncCompleter_PoolResource)));
          _this._resetTimer$0();
          return t1;
        }
      }
    },
    withResource$1$1(callback, $T) {
      return this.withResource$body$Pool($T._eval$1("0/()")._as(callback), $T, $T);
    },
    withResource$body$Pool(callback, $T, $async$type) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter($async$type),
        $async$returnValue, $async$handler = 2, $async$errorStack = [], $async$next = [], $async$self = this, resource, t1, t2;
      var $async$withResource$1$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              if (($async$self._closeMemo._async_memoizer$_completer.future._state & 30) !== 0)
                throw A.wrapException(A.StateError$("withResource() may not be called on a closed Pool."));
              $async$goto = 3;
              return A._asyncAwait($async$self.request$0(), $async$withResource$1$1);
            case 3:
              // returning from await.
              resource = $async$result;
              $async$handler = 4;
              t1 = callback.call$0();
              $async$goto = 7;
              return A._asyncAwait($T._eval$1("Future<0>")._is(t1) ? t1 : A._Future$value($T._as(t1), $T), $async$withResource$1$1);
            case 7:
              // returning from await.
              t1 = $async$result;
              $async$returnValue = t1;
              $async$next = [1];
              // goto finally
              $async$goto = 5;
              break;
              $async$next.push(6);
              // goto finally
              $async$goto = 5;
              break;
            case 4:
              // uncaught
              $async$next = [2];
            case 5:
              // finally
              $async$handler = 2;
              t1 = resource;
              if (t1._released)
                A.throwExpression(A.StateError$("A PoolResource may only be released once."));
              t1._released = true;
              t1 = t1._pool;
              t1._resetTimer$0();
              t2 = t1._requestedResources;
              if (!t2.get$isEmpty(0))
                t2.removeFirst$0().complete$1(new A.PoolResource(t1));
              else {
                t2 = --t1._allocatedResources;
                if ((t1._closeMemo._async_memoizer$_completer.future._state & 30) !== 0 && t2 === 0)
                  null.close$0();
              }
              // goto the next finally handler
              $async$goto = $async$next.pop();
              break;
            case 6:
              // after finally
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$withResource$1$1, $async$completer);
    },
    _runOnRelease$1(onRelease) {
      var t1, t2;
      A.Future_Future$sync(type$.void_Function._as(onRelease), type$.void).then$1$1(new A.Pool__runOnRelease_closure(this), type$.Null).catchError$1(new A.Pool__runOnRelease_closure0(this));
      t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
      t2 = this._onReleaseCompleters;
      t2._collection$_add$1(t2.$ti._precomputed1._as(new A._SyncCompleter(t1, type$._SyncCompleter_PoolResource)));
      return t1;
    },
    _resetTimer$0() {
      var t2,
        t1 = this._timer;
      if (t1 == null)
        return;
      t2 = this._requestedResources;
      if (t2._head === t2._tail)
        t1._restartable_timer$_timer.cancel$0();
      else {
        t1._restartable_timer$_timer.cancel$0();
        t1._restartable_timer$_timer = A.Timer_Timer(t1._restartable_timer$_duration, t1._restartable_timer$_callback);
      }
    }
  };
  A.Pool__runOnRelease_closure.prototype = {
    call$1(value) {
      var t1 = this.$this;
      t1._onReleaseCompleters.removeFirst$0().complete$1(new A.PoolResource(t1));
    },
    $signature: 56
  };
  A.Pool__runOnRelease_closure0.prototype = {
    call$2(error, stackTrace) {
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      this.$this._onReleaseCompleters.removeFirst$0().completeError$2(error, stackTrace);
    },
    $signature: 4
  };
  A.PoolResource.prototype = {};
  A.SourceFile.prototype = {
    get$length(_) {
      return this._decodedChars.length;
    },
    get$lines() {
      return this._lineStarts.length;
    },
    SourceFile$decoded$2$url(decodedChars, url) {
      var t1, t2, t3, i, c, j, t4;
      for (t1 = this._decodedChars, t2 = t1.length, t3 = this._lineStarts, i = 0; i < t2; ++i) {
        c = t1[i];
        if (c === 13) {
          j = i + 1;
          if (j < t2) {
            if (!(j < t2))
              return A.ioore(t1, j);
            t4 = t1[j] !== 10;
          } else
            t4 = true;
          if (t4)
            c = 10;
        }
        if (c === 10)
          B.JSArray_methods.add$1(t3, i + 1);
      }
    },
    getLine$1(offset) {
      var t1, _this = this;
      if (offset < 0)
        throw A.wrapException(A.RangeError$("Offset may not be negative, was " + offset + "."));
      else if (offset > _this._decodedChars.length)
        throw A.wrapException(A.RangeError$("Offset " + offset + string$.x20must_ + _this.get$length(0) + "."));
      t1 = _this._lineStarts;
      if (offset < B.JSArray_methods.get$first(t1))
        return -1;
      if (offset >= B.JSArray_methods.get$last(t1))
        return t1.length - 1;
      if (_this._isNearCachedLine$1(offset)) {
        t1 = _this._cachedLine;
        t1.toString;
        return t1;
      }
      return _this._cachedLine = _this._binarySearch$1(offset) - 1;
    },
    _isNearCachedLine$1(offset) {
      var t2, t3, t4,
        t1 = this._cachedLine;
      if (t1 == null)
        return false;
      t2 = this._lineStarts;
      t3 = t2.length;
      if (t1 >>> 0 !== t1 || t1 >= t3)
        return A.ioore(t2, t1);
      if (offset < t2[t1])
        return false;
      if (!(t1 >= t3 - 1)) {
        t4 = t1 + 1;
        if (!(t4 < t3))
          return A.ioore(t2, t4);
        t4 = offset < t2[t4];
      } else
        t4 = true;
      if (t4)
        return true;
      if (!(t1 >= t3 - 2)) {
        t4 = t1 + 2;
        if (!(t4 < t3))
          return A.ioore(t2, t4);
        t4 = offset < t2[t4];
        t2 = t4;
      } else
        t2 = true;
      if (t2) {
        this._cachedLine = t1 + 1;
        return true;
      }
      return false;
    },
    _binarySearch$1(offset) {
      var min, half,
        t1 = this._lineStarts,
        t2 = t1.length,
        max = t2 - 1;
      for (min = 0; min < max;) {
        half = min + B.JSInt_methods._tdivFast$1(max - min, 2);
        if (!(half >= 0 && half < t2))
          return A.ioore(t1, half);
        if (t1[half] > offset)
          max = half;
        else
          min = half + 1;
      }
      return max;
    },
    getColumn$1(offset) {
      var line, t1, lineStart, _this = this;
      if (offset < 0)
        throw A.wrapException(A.RangeError$("Offset may not be negative, was " + offset + "."));
      else if (offset > _this._decodedChars.length)
        throw A.wrapException(A.RangeError$("Offset " + offset + " must be not be greater than the number of characters in the file, " + _this.get$length(0) + "."));
      line = _this.getLine$1(offset);
      t1 = _this._lineStarts;
      if (!(line >= 0 && line < t1.length))
        return A.ioore(t1, line);
      lineStart = t1[line];
      if (lineStart > offset)
        throw A.wrapException(A.RangeError$("Line " + line + " comes after offset " + offset + "."));
      return offset - lineStart;
    },
    getOffset$1(line) {
      var t1, t2, result, t3;
      if (line < 0)
        throw A.wrapException(A.RangeError$("Line may not be negative, was " + line + "."));
      else {
        t1 = this._lineStarts;
        t2 = t1.length;
        if (line >= t2)
          throw A.wrapException(A.RangeError$("Line " + line + " must be less than the number of lines in the file, " + this.get$lines() + "."));
      }
      result = t1[line];
      if (result <= this._decodedChars.length) {
        t3 = line + 1;
        t1 = t3 < t2 && result >= t1[t3];
      } else
        t1 = true;
      if (t1)
        throw A.wrapException(A.RangeError$("Line " + line + " doesn't have 0 columns."));
      return result;
    }
  };
  A.FileLocation.prototype = {
    get$sourceUrl() {
      return this.file.url;
    },
    get$line() {
      return this.file.getLine$1(this.offset);
    },
    get$column() {
      return this.file.getColumn$1(this.offset);
    },
    get$offset() {
      return this.offset;
    }
  };
  A._FileSpan.prototype = {
    get$sourceUrl() {
      return this.file.url;
    },
    get$length(_) {
      return this._file$_end - this._file$_start;
    },
    get$start() {
      return A.FileLocation$_(this.file, this._file$_start);
    },
    get$end() {
      return A.FileLocation$_(this.file, this._file$_end);
    },
    get$text() {
      return A.String_String$fromCharCodes(B.NativeUint32List_methods.sublist$2(this.file._decodedChars, this._file$_start, this._file$_end), 0, null);
    },
    get$context() {
      var _this = this,
        t1 = _this.file,
        endOffset = _this._file$_end,
        endLine = t1.getLine$1(endOffset);
      if (t1.getColumn$1(endOffset) === 0 && endLine !== 0) {
        if (endOffset - _this._file$_start === 0)
          return endLine === t1._lineStarts.length - 1 ? "" : A.String_String$fromCharCodes(B.NativeUint32List_methods.sublist$2(t1._decodedChars, t1.getOffset$1(endLine), t1.getOffset$1(endLine + 1)), 0, null);
      } else
        endOffset = endLine === t1._lineStarts.length - 1 ? t1._decodedChars.length : t1.getOffset$1(endLine + 1);
      return A.String_String$fromCharCodes(B.NativeUint32List_methods.sublist$2(t1._decodedChars, t1.getOffset$1(t1.getLine$1(_this._file$_start)), endOffset), 0, null);
    },
    compareTo$1(_, other) {
      var result;
      type$.SourceSpan._as(other);
      if (!(other instanceof A._FileSpan))
        return this.super$SourceSpanMixin$compareTo(0, other);
      result = B.JSInt_methods.compareTo$1(this._file$_start, other._file$_start);
      return result === 0 ? B.JSInt_methods.compareTo$1(this._file$_end, other._file$_end) : result;
    },
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (!(other instanceof A._FileSpan))
        return _this.super$SourceSpanMixin$$eq(0, other);
      return _this._file$_start === other._file$_start && _this._file$_end === other._file$_end && J.$eq$(_this.file.url, other.file.url);
    },
    get$hashCode(_) {
      return A.Object_hash(this._file$_start, this._file$_end, this.file.url, B.C_SentinelValue);
    },
    $isSourceSpanWithContext: 1
  };
  A.Highlighter.prototype = {
    highlight$0() {
      var t2, highlightsByColumn, t3, t4, i, line, lastLine, t5, t6, t7, t8, t9, t10, t11, index, primaryIdx, primary, _i, _this = this, _null = null,
        t1 = _this._lines;
      _this._writeFileStart$1(B.JSArray_methods.get$first(t1).url);
      t2 = _this._maxMultilineSpans;
      highlightsByColumn = A.List_List$filled(t2, _null, false, type$.nullable__Highlight);
      for (t3 = _this._buffer, t2 = t2 !== 0, t4 = _this._primaryColor, i = 0; i < t1.length; ++i) {
        line = t1[i];
        if (i > 0) {
          lastLine = t1[i - 1];
          t5 = line.url;
          if (!J.$eq$(lastLine.url, t5)) {
            _this._writeSidebar$1$end("\u2575");
            t3._contents += "\n";
            _this._writeFileStart$1(t5);
          } else if (lastLine.number + 1 !== line.number) {
            _this._writeSidebar$1$text("...");
            t3._contents += "\n";
          }
        }
        for (t5 = line.highlights, t6 = A._arrayInstanceType(t5)._eval$1("ReversedListIterable<1>"), t7 = new A.ReversedListIterable(t5, t6), t7 = new A.ListIterator(t7, t7.get$length(0), t6._eval$1("ListIterator<ListIterable.E>")), t6 = t6._eval$1("ListIterable.E"), t8 = line.number, t9 = line.text; t7.moveNext$0();) {
          t10 = t7.__internal$_current;
          if (t10 == null)
            t10 = t6._as(t10);
          t11 = t10.span;
          if (t11.get$start().get$line() !== t11.get$end().get$line() && t11.get$start().get$line() === t8 && _this._isOnlyWhitespace$1(B.JSString_methods.substring$2(t9, 0, t11.get$start().get$column()))) {
            index = B.JSArray_methods.indexOf$1(highlightsByColumn, _null);
            if (index < 0)
              A.throwExpression(A.ArgumentError$(A.S(highlightsByColumn) + " contains no null elements.", _null));
            B.JSArray_methods.$indexSet(highlightsByColumn, index, t10);
          }
        }
        _this._writeSidebar$1$line(t8);
        t3._contents += " ";
        _this._writeMultilineHighlights$2(line, highlightsByColumn);
        if (t2)
          t3._contents += " ";
        primaryIdx = B.JSArray_methods.indexWhere$1(t5, new A.Highlighter_highlight_closure());
        if (primaryIdx === -1)
          primary = _null;
        else {
          if (!(primaryIdx >= 0 && primaryIdx < t5.length))
            return A.ioore(t5, primaryIdx);
          primary = t5[primaryIdx];
        }
        t6 = primary != null;
        if (t6) {
          t7 = primary.span;
          t10 = t7.get$start().get$line() === t8 ? t7.get$start().get$column() : 0;
          _this._writeHighlightedText$4$color(t9, t10, t7.get$end().get$line() === t8 ? t7.get$end().get$column() : t9.length, t4);
        } else
          _this._writeText$1(t9);
        t3._contents += "\n";
        if (t6)
          _this._writeIndicator$3(line, primary, highlightsByColumn);
        for (t5 = t5.length, _i = 0; _i < t5; ++_i)
          continue;
      }
      _this._writeSidebar$1$end("\u2575");
      t1 = t3._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _writeFileStart$1(url) {
      var t1, t2, _this = this;
      if (!_this._multipleFiles || !type$.Uri._is(url))
        _this._writeSidebar$1$end("\u2577");
      else {
        _this._writeSidebar$1$end("\u250c");
        _this._colorize$1$2$color(new A.Highlighter__writeFileStart_closure(_this), "\x1b[34m", type$.void);
        t1 = _this._buffer;
        t2 = " " + $.$get$context().prettyUri$1(url);
        t1._contents += t2;
      }
      _this._buffer._contents += "\n";
    },
    _writeMultilineHighlights$3$current(line, highlightsByColumn, current) {
      var t1, currentColor, t2, t3, t4, t5, t6, foundCurrent, _i, highlight, t7, startLine, endLine, _this = this, _box_0 = {};
      type$.List_nullable__Highlight._as(highlightsByColumn);
      _box_0.openedOnThisLine = false;
      _box_0.openedOnThisLineColor = null;
      t1 = current == null;
      if (t1)
        currentColor = null;
      else
        currentColor = _this._primaryColor;
      for (t2 = highlightsByColumn.length, t3 = type$.Null, t4 = _this._primaryColor, t1 = !t1, t5 = _this._buffer, t6 = type$.void, foundCurrent = false, _i = 0; _i < t2; ++_i) {
        highlight = highlightsByColumn[_i];
        t7 = highlight == null;
        startLine = t7 ? null : highlight.span.get$start().get$line();
        endLine = t7 ? null : highlight.span.get$end().get$line();
        if (t1 && highlight === current) {
          _this._colorize$1$2$color(new A.Highlighter__writeMultilineHighlights_closure(_this, startLine, line), currentColor, t3);
          foundCurrent = true;
        } else if (foundCurrent)
          _this._colorize$1$2$color(new A.Highlighter__writeMultilineHighlights_closure0(_this, highlight), currentColor, t3);
        else if (t7)
          if (_box_0.openedOnThisLine)
            _this._colorize$1$2$color(new A.Highlighter__writeMultilineHighlights_closure1(_this), _box_0.openedOnThisLineColor, t6);
          else
            t5._contents += " ";
        else
          _this._colorize$1$2$color(new A.Highlighter__writeMultilineHighlights_closure2(_box_0, _this, current, startLine, line, highlight, endLine), t4, t3);
      }
    },
    _writeMultilineHighlights$2(line, highlightsByColumn) {
      return this._writeMultilineHighlights$3$current(line, highlightsByColumn, null);
    },
    _writeHighlightedText$4$color(text, startColumn, endColumn, color) {
      var _this = this;
      _this._writeText$1(B.JSString_methods.substring$2(text, 0, startColumn));
      _this._colorize$1$2$color(new A.Highlighter__writeHighlightedText_closure(_this, text, startColumn, endColumn), color, type$.void);
      _this._writeText$1(B.JSString_methods.substring$2(text, endColumn, text.length));
    },
    _writeIndicator$3(line, highlight, highlightsByColumn) {
      var color, t1, t2, _this = this;
      type$.List_nullable__Highlight._as(highlightsByColumn);
      color = _this._primaryColor;
      t1 = highlight.span;
      if (t1.get$start().get$line() === t1.get$end().get$line()) {
        _this._writeSidebar$0();
        t1 = _this._buffer;
        t1._contents += " ";
        _this._writeMultilineHighlights$3$current(line, highlightsByColumn, highlight);
        if (highlightsByColumn.length !== 0)
          t1._contents += " ";
        _this._writeLabel$3(highlight, highlightsByColumn, _this._colorize$1$2$color(new A.Highlighter__writeIndicator_closure(_this, line, highlight), color, type$.int));
      } else {
        t2 = line.number;
        if (t1.get$start().get$line() === t2) {
          if (B.JSArray_methods.contains$1(highlightsByColumn, highlight))
            return;
          A.replaceFirstNull(highlightsByColumn, highlight, type$._Highlight);
          _this._writeSidebar$0();
          t1 = _this._buffer;
          t1._contents += " ";
          _this._writeMultilineHighlights$3$current(line, highlightsByColumn, highlight);
          _this._colorize$1$2$color(new A.Highlighter__writeIndicator_closure0(_this, line, highlight), color, type$.void);
          t1._contents += "\n";
        } else if (t1.get$end().get$line() === t2) {
          t1 = t1.get$end().get$column();
          if (t1 === line.text.length) {
            A.replaceWithNull(highlightsByColumn, highlight, type$._Highlight);
            return;
          }
          _this._writeSidebar$0();
          _this._buffer._contents += " ";
          _this._writeMultilineHighlights$3$current(line, highlightsByColumn, highlight);
          _this._writeLabel$3(highlight, highlightsByColumn, _this._colorize$1$2$color(new A.Highlighter__writeIndicator_closure1(_this, false, line, highlight), color, type$.int));
          A.replaceWithNull(highlightsByColumn, highlight, type$._Highlight);
        }
      }
    },
    _writeArrow$3$beginning(line, column, beginning) {
      var t1 = beginning ? 0 : 1,
        t2 = this._buffer;
      t1 = B.JSString_methods.$mul("\u2500", 1 + column + this._countTabs$1(B.JSString_methods.substring$2(line.text, 0, column + t1)) * 3);
      t2._contents = (t2._contents += t1) + "^";
    },
    _writeArrow$2(line, column) {
      return this._writeArrow$3$beginning(line, column, true);
    },
    _writeLabel$3(highlight, highlightsByColumn, underlineLength) {
      type$.List_nullable__Highlight._as(highlightsByColumn);
      this._buffer._contents += "\n";
      return;
    },
    _writeText$1(text) {
      var t1, t2, t3, t4;
      for (t1 = new A.CodeUnits(text), t2 = type$.CodeUnits, t1 = new A.ListIterator(t1, t1.get$length(0), t2._eval$1("ListIterator<ListBase.E>")), t3 = this._buffer, t2 = t2._eval$1("ListBase.E"); t1.moveNext$0();) {
        t4 = t1.__internal$_current;
        if (t4 == null)
          t4 = t2._as(t4);
        if (t4 === 9)
          t3._contents += B.JSString_methods.$mul(" ", 4);
        else {
          t4 = A.Primitives_stringFromCharCode(t4);
          t3._contents += t4;
        }
      }
    },
    _writeSidebar$3$end$line$text(end, line, text) {
      var t1 = {};
      t1.text = text;
      if (line != null)
        t1.text = B.JSInt_methods.toString$0(line + 1);
      this._colorize$1$2$color(new A.Highlighter__writeSidebar_closure(t1, this, end), "\x1b[34m", type$.Null);
    },
    _writeSidebar$1$end(end) {
      return this._writeSidebar$3$end$line$text(end, null, null);
    },
    _writeSidebar$1$text(text) {
      return this._writeSidebar$3$end$line$text(null, null, text);
    },
    _writeSidebar$1$line(line) {
      return this._writeSidebar$3$end$line$text(null, line, null);
    },
    _writeSidebar$0() {
      return this._writeSidebar$3$end$line$text(null, null, null);
    },
    _countTabs$1(text) {
      var t1, t2, count, t3;
      for (t1 = new A.CodeUnits(text), t2 = type$.CodeUnits, t1 = new A.ListIterator(t1, t1.get$length(0), t2._eval$1("ListIterator<ListBase.E>")), t2 = t2._eval$1("ListBase.E"), count = 0; t1.moveNext$0();) {
        t3 = t1.__internal$_current;
        if ((t3 == null ? t2._as(t3) : t3) === 9)
          ++count;
      }
      return count;
    },
    _isOnlyWhitespace$1(text) {
      var t1, t2, t3;
      for (t1 = new A.CodeUnits(text), t2 = type$.CodeUnits, t1 = new A.ListIterator(t1, t1.get$length(0), t2._eval$1("ListIterator<ListBase.E>")), t2 = t2._eval$1("ListBase.E"); t1.moveNext$0();) {
        t3 = t1.__internal$_current;
        if (t3 == null)
          t3 = t2._as(t3);
        if (t3 !== 32 && t3 !== 9)
          return false;
      }
      return true;
    },
    _colorize$1$2$color(callback, color, $T) {
      var t1, result;
      $T._eval$1("0()")._as(callback);
      t1 = this._primaryColor != null;
      if (t1 && color != null)
        this._buffer._contents += color;
      result = callback.call$0();
      if (t1 && color != null)
        this._buffer._contents += "\x1b[0m";
      return result;
    }
  };
  A.Highlighter_closure.prototype = {
    call$0() {
      return this.color;
    },
    $signature: 57
  };
  A.Highlighter$__closure.prototype = {
    call$1(line) {
      var t1 = type$._Line._as(line).highlights,
        t2 = A._arrayInstanceType(t1);
      return new A.WhereIterable(t1, t2._eval$1("bool(1)")._as(new A.Highlighter$___closure()), t2._eval$1("WhereIterable<1>")).get$length(0);
    },
    $signature: 32
  };
  A.Highlighter$___closure.prototype = {
    call$1(highlight) {
      var t1 = type$._Highlight._as(highlight).span;
      return t1.get$start().get$line() !== t1.get$end().get$line();
    },
    $signature: 12
  };
  A.Highlighter$__closure0.prototype = {
    call$1(line) {
      return type$._Line._as(line).url;
    },
    $signature: 60
  };
  A.Highlighter__collateLines_closure.prototype = {
    call$1(highlight) {
      var t1 = type$._Highlight._as(highlight).span.get$sourceUrl();
      return t1 == null ? new A.Object() : t1;
    },
    $signature: 61
  };
  A.Highlighter__collateLines_closure0.prototype = {
    call$2(highlight1, highlight2) {
      var t1 = type$._Highlight;
      return t1._as(highlight1).span.compareTo$1(0, t1._as(highlight2).span);
    },
    $signature: 62
  };
  A.Highlighter__collateLines_closure1.prototype = {
    call$1(entry) {
      var url, highlightsForFile, lines, t1, t2, t3, t4, context, t5, linesBeforeSpan, lineNumber, _i, line, activeHighlights, flags, highlightIndex, oldHighlightLength, t6, t7;
      type$.MapEntry_of_Object_and_List__Highlight._as(entry);
      url = entry.key;
      highlightsForFile = entry.value;
      lines = A._setArrayType([], type$.JSArray__Line);
      for (t1 = J.getInterceptor$ax(highlightsForFile), t2 = t1.get$iterator(highlightsForFile), t3 = type$.JSArray__Highlight; t2.moveNext$0();) {
        t4 = t2.get$current().span;
        context = t4.get$context();
        t5 = A.findLineStart(context, t4.get$text(), t4.get$start().get$column());
        t5.toString;
        linesBeforeSpan = B.JSString_methods.allMatches$1("\n", B.JSString_methods.substring$2(context, 0, t5)).get$length(0);
        lineNumber = t4.get$start().get$line() - linesBeforeSpan;
        for (t4 = context.split("\n"), t5 = t4.length, _i = 0; _i < t5; ++_i) {
          line = t4[_i];
          if (lines.length === 0 || lineNumber > B.JSArray_methods.get$last(lines).number)
            B.JSArray_methods.add$1(lines, new A._Line(line, lineNumber, url, A._setArrayType([], t3)));
          ++lineNumber;
        }
      }
      activeHighlights = A._setArrayType([], t3);
      for (t2 = lines.length, t3 = type$.bool_Function__Highlight, flags = activeHighlights.$flags | 0, highlightIndex = 0, _i = 0; _i < lines.length; lines.length === t2 || (0, A.throwConcurrentModificationError)(lines), ++_i) {
        line = lines[_i];
        t4 = t3._as(new A.Highlighter__collateLines__closure(line));
        flags & 1 && A.throwUnsupportedOperation(activeHighlights, 16);
        B.JSArray_methods._removeWhere$2(activeHighlights, t4, true);
        oldHighlightLength = activeHighlights.length;
        for (t4 = t1.skip$1(highlightsForFile, highlightIndex), t5 = t4.$ti, t4 = new A.ListIterator(t4, t4.get$length(0), t5._eval$1("ListIterator<ListIterable.E>")), t6 = line.number, t5 = t5._eval$1("ListIterable.E"); t4.moveNext$0();) {
          t7 = t4.__internal$_current;
          if (t7 == null)
            t7 = t5._as(t7);
          if (t7.span.get$start().get$line() > t6)
            break;
          B.JSArray_methods.add$1(activeHighlights, t7);
        }
        highlightIndex += activeHighlights.length - oldHighlightLength;
        B.JSArray_methods.addAll$1(line.highlights, activeHighlights);
      }
      return lines;
    },
    $signature: 63
  };
  A.Highlighter__collateLines__closure.prototype = {
    call$1(highlight) {
      return type$._Highlight._as(highlight).span.get$end().get$line() < this.line.number;
    },
    $signature: 12
  };
  A.Highlighter_highlight_closure.prototype = {
    call$1(highlight) {
      type$._Highlight._as(highlight);
      return true;
    },
    $signature: 12
  };
  A.Highlighter__writeFileStart_closure.prototype = {
    call$0() {
      this.$this._buffer._contents += B.JSString_methods.$mul("\u2500", 2) + ">";
      return null;
    },
    $signature: 0
  };
  A.Highlighter__writeMultilineHighlights_closure.prototype = {
    call$0() {
      var t1 = this.$this._buffer,
        t2 = this.startLine === this.line.number ? "\u250c" : "\u2514";
      t1._contents += t2;
    },
    $signature: 1
  };
  A.Highlighter__writeMultilineHighlights_closure0.prototype = {
    call$0() {
      var t1 = this.$this._buffer,
        t2 = this.highlight == null ? "\u2500" : "\u253c";
      t1._contents += t2;
    },
    $signature: 1
  };
  A.Highlighter__writeMultilineHighlights_closure1.prototype = {
    call$0() {
      this.$this._buffer._contents += "\u2500";
      return null;
    },
    $signature: 0
  };
  A.Highlighter__writeMultilineHighlights_closure2.prototype = {
    call$0() {
      var t2, t3, _this = this,
        t1 = _this._box_0,
        vertical = t1.openedOnThisLine ? "\u253c" : "\u2502";
      if (_this.current != null)
        _this.$this._buffer._contents += vertical;
      else {
        t2 = _this.line;
        t3 = t2.number;
        if (_this.startLine === t3) {
          t2 = _this.$this;
          t2._colorize$1$2$color(new A.Highlighter__writeMultilineHighlights__closure(t1, t2), t1.openedOnThisLineColor, type$.Null);
          t1.openedOnThisLine = true;
          if (t1.openedOnThisLineColor == null)
            t1.openedOnThisLineColor = t2._primaryColor;
        } else {
          t2 = _this.endLine === t3 && _this.highlight.span.get$end().get$column() === t2.text.length;
          t3 = _this.$this;
          if (t2)
            t3._buffer._contents += "\u2514";
          else
            t3._colorize$1$2$color(new A.Highlighter__writeMultilineHighlights__closure0(t3, vertical), t1.openedOnThisLineColor, type$.Null);
        }
      }
    },
    $signature: 1
  };
  A.Highlighter__writeMultilineHighlights__closure.prototype = {
    call$0() {
      var t1 = this.$this._buffer,
        t2 = this._box_0.openedOnThisLine ? "\u252c" : "\u250c";
      t1._contents += t2;
    },
    $signature: 1
  };
  A.Highlighter__writeMultilineHighlights__closure0.prototype = {
    call$0() {
      this.$this._buffer._contents += this.vertical;
    },
    $signature: 1
  };
  A.Highlighter__writeHighlightedText_closure.prototype = {
    call$0() {
      var _this = this;
      return _this.$this._writeText$1(B.JSString_methods.substring$2(_this.text, _this.startColumn, _this.endColumn));
    },
    $signature: 0
  };
  A.Highlighter__writeIndicator_closure.prototype = {
    call$0() {
      var tabsBefore, tabsInside,
        t1 = this.$this,
        t2 = t1._buffer,
        t3 = t2._contents,
        t4 = this.highlight.span,
        startColumn = t4.get$start().get$column(),
        endColumn = t4.get$end().get$column();
      t4 = this.line.text;
      tabsBefore = t1._countTabs$1(B.JSString_methods.substring$2(t4, 0, startColumn));
      tabsInside = t1._countTabs$1(B.JSString_methods.substring$2(t4, startColumn, endColumn));
      startColumn += tabsBefore * 3;
      t4 = (t2._contents += B.JSString_methods.$mul(" ", startColumn)) + B.JSString_methods.$mul("^", Math.max(endColumn + (tabsBefore + tabsInside) * 3 - startColumn, 1));
      t2._contents = t4;
      return t4.length - t3.length;
    },
    $signature: 20
  };
  A.Highlighter__writeIndicator_closure0.prototype = {
    call$0() {
      return this.$this._writeArrow$2(this.line, this.highlight.span.get$start().get$column());
    },
    $signature: 0
  };
  A.Highlighter__writeIndicator_closure1.prototype = {
    call$0() {
      var _this = this,
        t1 = _this.$this,
        t2 = t1._buffer,
        t3 = t2._contents;
      if (_this.coversWholeLine)
        t2._contents = t3 + B.JSString_methods.$mul("\u2500", 3);
      else
        t1._writeArrow$3$beginning(_this.line, Math.max(_this.highlight.span.get$end().get$column() - 1, 0), false);
      return t2._contents.length - t3.length;
    },
    $signature: 20
  };
  A.Highlighter__writeSidebar_closure.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1._buffer,
        t3 = this._box_0.text;
      if (t3 == null)
        t3 = "";
      t1 = B.JSString_methods.padRight$1(t3, t1._paddingBeforeSidebar);
      t1 = t2._contents += t1;
      t3 = this.end;
      t2._contents = t1 + (t3 == null ? "\u2502" : t3);
    },
    $signature: 1
  };
  A._Highlight.prototype = {
    toString$0(_) {
      var t1 = this.span;
      t1 = "primary " + ("" + t1.get$start().get$line() + ":" + t1.get$start().get$column() + "-" + t1.get$end().get$line() + ":" + t1.get$end().get$column());
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    }
  };
  A._Highlight_closure.prototype = {
    call$0() {
      var t1, t2, t3, t4,
        newSpan = this.span;
      if (!(type$.SourceSpanWithContext._is(newSpan) && A.findLineStart(newSpan.get$context(), newSpan.get$text(), newSpan.get$start().get$column()) != null)) {
        t1 = A.SourceLocation$(newSpan.get$start().get$offset(), 0, 0, newSpan.get$sourceUrl());
        t2 = newSpan.get$end().get$offset();
        t3 = newSpan.get$sourceUrl();
        t4 = A.countCodeUnits(newSpan.get$text(), 10);
        newSpan = A.SourceSpanWithContext$(t1, A.SourceLocation$(t2, A._Highlight__lastLineLength(newSpan.get$text()), t4, t3), newSpan.get$text(), newSpan.get$text());
      }
      return A._Highlight__normalizeEndOfLine(A._Highlight__normalizeTrailingNewline(A._Highlight__normalizeNewlines(newSpan)));
    },
    $signature: 65
  };
  A._Line.prototype = {
    toString$0(_) {
      return "" + this.number + ': "' + this.text + '" (' + B.JSArray_methods.join$1(this.highlights, ", ") + ")";
    }
  };
  A.SourceLocation.prototype = {
    distance$1(other) {
      var t1 = this.sourceUrl;
      if (!J.$eq$(t1, other.get$sourceUrl()))
        throw A.wrapException(A.ArgumentError$('Source URLs "' + A.S(t1) + '" and "' + A.S(other.get$sourceUrl()) + "\" don't match.", null));
      return Math.abs(this.offset - other.get$offset());
    },
    compareTo$1(_, other) {
      var t1;
      type$.SourceLocation._as(other);
      t1 = this.sourceUrl;
      if (!J.$eq$(t1, other.get$sourceUrl()))
        throw A.wrapException(A.ArgumentError$('Source URLs "' + A.S(t1) + '" and "' + A.S(other.get$sourceUrl()) + "\" don't match.", null));
      return this.offset - other.get$offset();
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return type$.SourceLocation._is(other) && J.$eq$(this.sourceUrl, other.get$sourceUrl()) && this.offset === other.get$offset();
    },
    get$hashCode(_) {
      var t1 = this.sourceUrl;
      t1 = t1 == null ? null : t1.get$hashCode(t1);
      if (t1 == null)
        t1 = 0;
      return t1 + this.offset;
    },
    toString$0(_) {
      var _this = this,
        t1 = A.getRuntimeTypeOfDartObject(_this).toString$0(0),
        source = _this.sourceUrl;
      return "<" + t1 + ": " + _this.offset + " " + (A.S(source == null ? "unknown source" : source) + ":" + (_this.line + 1) + ":" + (_this.column + 1)) + ">";
    },
    $isComparable: 1,
    get$sourceUrl() {
      return this.sourceUrl;
    },
    get$offset() {
      return this.offset;
    },
    get$line() {
      return this.line;
    },
    get$column() {
      return this.column;
    }
  };
  A.SourceLocationMixin.prototype = {
    distance$1(other) {
      if (!J.$eq$(this.file.url, other.get$sourceUrl()))
        throw A.wrapException(A.ArgumentError$('Source URLs "' + A.S(this.get$sourceUrl()) + '" and "' + A.S(other.get$sourceUrl()) + "\" don't match.", null));
      return Math.abs(this.offset - other.get$offset());
    },
    compareTo$1(_, other) {
      type$.SourceLocation._as(other);
      if (!J.$eq$(this.file.url, other.get$sourceUrl()))
        throw A.wrapException(A.ArgumentError$('Source URLs "' + A.S(this.get$sourceUrl()) + '" and "' + A.S(other.get$sourceUrl()) + "\" don't match.", null));
      return this.offset - other.get$offset();
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return type$.SourceLocation._is(other) && J.$eq$(this.file.url, other.get$sourceUrl()) && this.offset === other.get$offset();
    },
    get$hashCode(_) {
      var t1 = this.file.url;
      t1 = t1 == null ? null : t1.get$hashCode(t1);
      if (t1 == null)
        t1 = 0;
      return t1 + this.offset;
    },
    toString$0(_) {
      var t1 = A.getRuntimeTypeOfDartObject(this).toString$0(0),
        t2 = this.offset,
        t3 = this.file,
        source = t3.url;
      return "<" + t1 + ": " + t2 + " " + (A.S(source == null ? "unknown source" : source) + ":" + (t3.getLine$1(t2) + 1) + ":" + (t3.getColumn$1(t2) + 1)) + ">";
    },
    $isComparable: 1,
    $isSourceLocation: 1
  };
  A.SourceSpanBase.prototype = {
    SourceSpanBase$3(start, end, text) {
      var t3,
        t1 = this.end,
        t2 = this.start;
      if (!J.$eq$(t1.get$sourceUrl(), t2.get$sourceUrl()))
        throw A.wrapException(A.ArgumentError$('Source URLs "' + A.S(t2.get$sourceUrl()) + '" and  "' + A.S(t1.get$sourceUrl()) + "\" don't match.", null));
      else if (t1.get$offset() < t2.get$offset())
        throw A.wrapException(A.ArgumentError$("End " + t1.toString$0(0) + " must come after start " + t2.toString$0(0) + ".", null));
      else {
        t3 = this.text;
        if (t3.length !== t2.distance$1(t1))
          throw A.wrapException(A.ArgumentError$('Text "' + t3 + '" must be ' + t2.distance$1(t1) + " characters long.", null));
      }
    },
    get$start() {
      return this.start;
    },
    get$end() {
      return this.end;
    },
    get$text() {
      return this.text;
    }
  };
  A.SourceSpanException.prototype = {
    get$message() {
      return this._span_exception$_message;
    },
    toString$0(_) {
      var t3, t4, highlight,
        t1 = this._span,
        t2 = "line " + (t1.get$start().get$line() + 1) + ", column " + (t1.get$start().get$column() + 1);
      if (t1.get$sourceUrl() != null) {
        t3 = t1.get$sourceUrl();
        t4 = $.$get$context();
        t3.toString;
        t3 = t2 + (" of " + t4.prettyUri$1(t3));
        t2 = t3;
      }
      t2 += ": " + this._span_exception$_message;
      highlight = t1.highlight$1$color(null);
      t1 = highlight.length !== 0 ? t2 + "\n" + highlight : t2;
      return "Error on " + (t1.charCodeAt(0) == 0 ? t1 : t1);
    },
    $isException: 1
  };
  A.SourceSpanFormatException.prototype = {
    get$offset() {
      var t1 = this._span;
      t1 = A.FileLocation$_(t1.file, t1._file$_start);
      return t1.offset;
    },
    $isFormatException: 1,
    get$source() {
      return this.source;
    }
  };
  A.SourceSpanMixin.prototype = {
    get$sourceUrl() {
      return this.get$start().get$sourceUrl();
    },
    get$length(_) {
      return this.get$end().get$offset() - this.get$start().get$offset();
    },
    compareTo$1(_, other) {
      var result;
      type$.SourceSpan._as(other);
      result = this.get$start().compareTo$1(0, other.get$start());
      return result === 0 ? this.get$end().compareTo$1(0, other.get$end()) : result;
    },
    highlight$1$color(color) {
      var _this = this;
      if (!type$.SourceSpanWithContext._is(_this) && _this.get$length(_this) === 0)
        return "";
      return A.Highlighter$(_this, color).highlight$0();
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.SourceSpanMixin && this.get$start().$eq(0, other.get$start()) && this.get$end().$eq(0, other.get$end());
    },
    get$hashCode(_) {
      return A.Object_hash(this.get$start(), this.get$end(), B.C_SentinelValue, B.C_SentinelValue);
    },
    toString$0(_) {
      var _this = this;
      return "<" + A.getRuntimeTypeOfDartObject(_this).toString$0(0) + ": from " + _this.get$start().toString$0(0) + " to " + _this.get$end().toString$0(0) + ' "' + _this.get$text() + '">';
    },
    $isComparable: 1,
    $isSourceSpan: 1
  };
  A.SourceSpanWithContext.prototype = {
    get$context() {
      return this._context;
    }
  };
  A.SseClient.prototype = {
    SseClient$2$debugKey(serverUrl, debugKey) {
      var t2, _this = this,
        t1 = serverUrl + "?sseClientId=" + _this._clientId;
      _this.__SseClient__serverUrl_A = t1;
      t1 = A._asJSObject(new init.G.EventSource(t1, {withCredentials: true}));
      _this.__SseClient__eventSource_A = t1;
      new A._EventStream(t1, "open", false, type$._EventStream_JSObject).get$first(0).whenComplete$1(new A.SseClient_closure(_this));
      _this.__SseClient__eventSource_A.addEventListener("message", A._functionToJS1(_this.get$_onIncomingMessage()));
      _this.__SseClient__eventSource_A.addEventListener("control", A._functionToJS1(_this.get$_onIncomingControlMessage()));
      t1 = type$.nullable_void_Function_JSObject;
      t2 = type$.JSObject;
      A._EventStreamSubscription$(_this.__SseClient__eventSource_A, "open", t1._as(new A.SseClient_closure0(_this)), false, t2);
      A._EventStreamSubscription$(_this.__SseClient__eventSource_A, "error", t1._as(new A.SseClient_closure1(_this)), false, t2);
    },
    close$0() {
      var _this = this,
        t1 = _this.__SseClient__eventSource_A;
      t1 === $ && A.throwLateFieldNI("_eventSource");
      t1.close();
      if ((_this._onConnected.future._state & 30) === 0) {
        t1 = _this._outgoingController;
        new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$cancelOnError(null, true).asFuture$1$1(null, type$.void);
      }
      _this._incomingController.close$0();
      _this._outgoingController.close$0();
    },
    _closeWithError$1(error) {
      var t1;
      this._incomingController.addError$1(error);
      this.close$0();
      t1 = this._onConnected;
      if ((t1.future._state & 30) === 0)
        t1.completeError$1(error);
    },
    _onIncomingControlMessage$1(message) {
      var data = A._asJSObject(message).data;
      if (J.$eq$(A.dartify(data), "close"))
        this.close$0();
      else
        throw A.wrapException(A.UnsupportedError$("[" + this._clientId + '] Illegal Control Message "' + A.S(data) + '"'));
    },
    _onIncomingMessage$1(message) {
      this._incomingController.add$1(0, A._asString(B.C_JsonCodec.decode$2$reviver(A._asString(A._asJSObject(message).data), null)));
    },
    _onOutgoingDone$0() {
      this.close$0();
    },
    _onOutgoingMessage$1(message) {
      return this._onOutgoingMessage$body$SseClient(A._asStringQ(message));
    },
    _onOutgoingMessage$body$SseClient(message) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, t1;
      var $async$_onOutgoingMessage$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = {};
              t1.encodedMessage = null;
              $async$goto = 2;
              return A._asyncAwait($.$get$_requestPool().withResource$1$1(new A.SseClient__onOutgoingMessage_closure(t1, $async$self, message), type$.Null), $async$_onOutgoingMessage$1);
            case 2:
              // returning from await.
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
    }
  };
  A.SseClient_closure.prototype = {
    call$0() {
      var t2,
        t1 = this.$this;
      t1._onConnected.complete$0();
      t2 = t1._outgoingController;
      new A._ControllerStream(t2, A._instanceType(t2)._eval$1("_ControllerStream<1>")).listen$2$onDone(t1.get$_onOutgoingMessage(), t1.get$_onOutgoingDone());
    },
    $signature: 1
  };
  A.SseClient_closure0.prototype = {
    call$1(_) {
      var t1 = this.$this._errorTimer;
      if (t1 != null)
        t1.cancel$0();
    },
    $signature: 2
  };
  A.SseClient_closure1.prototype = {
    call$1(error) {
      var t1 = this.$this,
        t2 = t1._errorTimer;
      t2 = t2 == null ? null : t2.get$isActive();
      if (t2 !== true)
        t1._errorTimer = A.Timer_Timer(B.Duration_5000000, new A.SseClient__closure(t1, error));
    },
    $signature: 2
  };
  A.SseClient__closure.prototype = {
    call$0() {
      this.$this._closeWithError$1(this.error);
    },
    $signature: 0
  };
  A.SseClient__onOutgoingMessage_closure.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        $async$handler = 1, $async$errorStack = [], $async$self = this, e, e0, url, error, augmentedError, exception, t1, t2, $async$exception;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              try {
                $async$self._box_0.encodedMessage = B.C_JsonCodec.encode$2$toEncodable($async$self.message, null);
              } catch (exception) {
                t1 = A.unwrapException(exception);
                if (t1 instanceof A.JsonUnsupportedObjectError) {
                  e = t1;
                  t1 = $async$self.$this;
                  t1._logger.log$4(B.Level_WARNING_900, "[" + t1._clientId + "] Unable to encode outgoing message: " + A.S(e), null, null);
                } else if (t1 instanceof A.ArgumentError) {
                  e0 = t1;
                  t1 = $async$self.$this;
                  t1._logger.log$4(B.Level_WARNING_900, "[" + t1._clientId + "] Invalid argument: " + A.S(e0), null, null);
                } else
                  throw exception;
              }
              $async$handler = 3;
              t1 = $async$self.$this;
              t2 = t1.__SseClient__serverUrl_A;
              t2 === $ && A.throwLateFieldNI("_serverUrl");
              url = t2 + "&messageId=" + ++t1._lastMessageId;
              t1 = $async$self._box_0.encodedMessage;
              if (t1 == null)
                t1 = null;
              t1 = {method: "POST", body: t1, credentials: "include"};
              $async$goto = 6;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(init.G.window).fetch(url, t1)), type$.JSObject), $async$call$0);
            case 6:
              // returning from await.
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$errorStack.pop();
              error = A.unwrapException($async$exception);
              t1 = $async$self.$this;
              augmentedError = "[" + t1._clientId + "] SSE client failed to send " + A.S($async$self.message) + ":\n " + A.S(error);
              t1._logger.log$4(B.Level_SEVERE_1000, augmentedError, null, null);
              t1._closeWithError$1(augmentedError);
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return A._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 68
  };
  A.GuaranteeChannel.prototype = {
    GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, _box_0, $T) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_GuaranteeSink<1>")._as(new A._GuaranteeSink(innerSink, _this, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_void), type$._AsyncCompleter_void), allowSinkErrors, $T._eval$1("_GuaranteeSink<0>")));
      _this.__GuaranteeChannel__sink_F !== $ && A.throwLateFieldAI("_sink");
      _this.__GuaranteeChannel__sink_F = t2;
      t1 = t1._eval$1("StreamController<1>")._as(A.StreamController_StreamController(null, new A.GuaranteeChannel_closure(_box_0, _this, $T), null, true, $T));
      _this.__GuaranteeChannel__streamController_F !== $ && A.throwLateFieldAI("_streamController");
      _this.__GuaranteeChannel__streamController_F = t1;
    },
    _onSinkDisconnected$0() {
      var subscription, t1;
      this._disconnected = true;
      subscription = this._guarantee_channel$_subscription;
      if (subscription != null)
        subscription.cancel$0();
      t1 = this.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t1.close$0();
    }
  };
  A.GuaranteeChannel_closure.prototype = {
    call$0() {
      var t2, t3,
        t1 = this.$this;
      if (t1._disconnected)
        return;
      t2 = this._box_0.innerStream;
      t3 = t1.__GuaranteeChannel__streamController_F;
      t3 === $ && A.throwLateFieldNI("_streamController");
      t1._guarantee_channel$_subscription = t2.listen$3$onDone$onError(this.T._eval$1("~(0)")._as(t3.get$add(t3)), new A.GuaranteeChannel__closure(t1), t3.get$addError());
    },
    $signature: 0
  };
  A.GuaranteeChannel__closure.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1.__GuaranteeChannel__sink_F;
      t2 === $ && A.throwLateFieldNI("_sink");
      t2._onStreamDisconnected$0();
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t1.close$0();
    },
    $signature: 0
  };
  A._GuaranteeSink.prototype = {
    add$1(_, data) {
      var t1, _this = this;
      _this.$ti._precomputed1._as(data);
      if (_this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (_this._disconnected)
        return;
      t1 = _this._inner;
      t1._async$_target.add$1(0, t1.$ti._precomputed1._as(data));
    },
    addError$2(error, stackTrace) {
      if (this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (this._disconnected)
        return;
      this._guarantee_channel$_addError$2(error, stackTrace);
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    _guarantee_channel$_addError$2(error, stackTrace) {
      var _this = this;
      if (_this._allowErrors) {
        _this._inner._async$_target.addError$2(error, stackTrace);
        return;
      }
      _this._doneCompleter.completeError$2(error, stackTrace);
      _this._onStreamDisconnected$0();
      _this._guarantee_channel$_channel._onSinkDisconnected$0();
      _this._inner._async$_target.close$0().catchError$1(new A._GuaranteeSink__addError_closure());
    },
    close$0() {
      var _this = this;
      if (_this._closed)
        return _this._doneCompleter.future;
      _this._closed = true;
      if (!_this._disconnected) {
        _this._guarantee_channel$_channel._onSinkDisconnected$0();
        _this._doneCompleter.complete$1(_this._inner._async$_target.close$0());
      }
      return _this._doneCompleter.future;
    },
    _onStreamDisconnected$0() {
      this._disconnected = true;
      var t1 = this._doneCompleter;
      if ((t1.future._state & 30) === 0)
        t1.complete$0();
      return;
    },
    $isStreamSink: 1
  };
  A._GuaranteeSink__addError_closure.prototype = {
    call$1(_) {
    },
    $signature: 6
  };
  A.StreamChannelController.prototype = {};
  A.StreamChannelMixin.prototype = {$isStreamChannel: 1};
  A.StringScannerException.prototype = {
    get$source() {
      return A._asString(this.source);
    }
  };
  A.StringScanner.prototype = {
    get$lastMatch() {
      var _this = this;
      if (_this._string_scanner$_position !== _this._lastMatchPosition)
        _this._lastMatch = null;
      return _this._lastMatch;
    },
    scan$1(pattern) {
      var success, _this = this,
        t1 = _this._lastMatch = J.matchAsPrefix$2$s(pattern, _this.string, _this._string_scanner$_position);
      _this._lastMatchPosition = _this._string_scanner$_position;
      success = t1 != null;
      if (success)
        _this._lastMatchPosition = _this._string_scanner$_position = t1.get$end();
      return success;
    },
    expect$2$name(pattern, $name) {
      var t1;
      if (this.scan$1(pattern))
        return;
      if ($name == null)
        if (pattern instanceof A.JSSyntaxRegExp)
          $name = "/" + pattern.pattern + "/";
        else {
          t1 = J.toString$0$(pattern);
          t1 = A.stringReplaceAllUnchecked(t1, "\\", "\\\\");
          $name = '"' + A.stringReplaceAllUnchecked(t1, '"', '\\"') + '"';
        }
      this._fail$1($name);
    },
    expect$1(pattern) {
      return this.expect$2$name(pattern, null);
    },
    expectDone$0() {
      if (this._string_scanner$_position === this.string.length)
        return;
      this._fail$1("no more input");
    },
    error$3$length$position(message, $length, position) {
      var t2, t3, t4, t5, sourceFile, end,
        t1 = this.string;
      if (position < 0)
        A.throwExpression(A.RangeError$("position must be greater than or equal to 0."));
      else if (position > t1.length)
        A.throwExpression(A.RangeError$("position must be less than or equal to the string length."));
      t2 = position + $length > t1.length;
      if (t2)
        A.throwExpression(A.RangeError$("position plus length must not go beyond the end of the string."));
      t2 = this.sourceUrl;
      t3 = new A.CodeUnits(t1);
      t4 = A._setArrayType([0], type$.JSArray_int);
      t5 = new Uint32Array(A._ensureNativeList(t3.toList$0(t3)));
      sourceFile = new A.SourceFile(t2, t4, t5);
      sourceFile.SourceFile$decoded$2$url(t3, t2);
      end = position + $length;
      if (end > t5.length)
        A.throwExpression(A.RangeError$("End " + end + string$.x20must_ + sourceFile.get$length(0) + "."));
      else if (position < 0)
        A.throwExpression(A.RangeError$("Start may not be negative, was " + position + "."));
      throw A.wrapException(new A.StringScannerException(t1, message, new A._FileSpan(sourceFile, position, end)));
    },
    _fail$1($name) {
      this.error$3$length$position("expected " + $name + ".", 0, this._string_scanner$_position);
    }
  };
  A.RNG.prototype = {
    generate$0() {
      var uint8list = this._generateInternal$0();
      if (uint8list.length !== 16)
        throw A.wrapException(A.Exception_Exception("The length of the Uint8list returned by the custom RNG must be 16."));
      else
        return uint8list;
    }
  };
  A.CryptoRNG.prototype = {
    _generateInternal$0() {
      var i, k, t1, t2,
        b = new Uint8Array(16);
      for (i = 0; i < 16; i += 4) {
        k = $.$get$CryptoRNG__secureRandom().nextInt$1(B.JSNumber_methods.toInt$0(Math.pow(2, 32)));
        if (!(i < 16))
          return A.ioore(b, i);
        b[i] = k;
        t1 = i + 1;
        t2 = B.JSInt_methods._shrOtherPositive$1(k, 8);
        if (!(t1 < 16))
          return A.ioore(b, t1);
        b[t1] = t2;
        t2 = i + 2;
        t1 = B.JSInt_methods._shrOtherPositive$1(k, 16);
        if (!(t2 < 16))
          return A.ioore(b, t2);
        b[t2] = t1;
        t1 = i + 3;
        t2 = B.JSInt_methods._shrOtherPositive$1(k, 24);
        if (!(t1 < 16))
          return A.ioore(b, t1);
        b[t1] = t2;
      }
      return b;
    }
  };
  A.UuidV1.prototype = {
    _init$0() {
      var seedBytes, t1, t2, t3, t4, t5, t6;
      if ($.V1State_initialized)
        return;
      seedBytes = $.$get$V1State_random().generate$0();
      t1 = seedBytes.length;
      if (0 >= t1)
        return A.ioore(seedBytes, 0);
      t2 = seedBytes[0];
      if (1 >= t1)
        return A.ioore(seedBytes, 1);
      t3 = seedBytes[1];
      if (2 >= t1)
        return A.ioore(seedBytes, 2);
      t4 = seedBytes[2];
      if (3 >= t1)
        return A.ioore(seedBytes, 3);
      t5 = seedBytes[3];
      if (4 >= t1)
        return A.ioore(seedBytes, 4);
      t6 = seedBytes[4];
      if (5 >= t1)
        return A.ioore(seedBytes, 5);
      $.V1State_nodeId = A._setArrayType([t2 | 1, t3, t4, t5, t6, seedBytes[5]], type$.JSArray_int);
      if (6 >= t1)
        return A.ioore(seedBytes, 6);
      t6 = seedBytes[6];
      if (7 >= t1)
        return A.ioore(seedBytes, 7);
      $.V1State_clockSeq = (t6 << 8 | seedBytes[7]) & 262143;
      $.V1State_initialized = true;
    },
    generate$1$options(options) {
      var buf, clockSeq, mSecs, t1, nSecs, t2, tl, tmh, node, n, t3;
      this._init$0();
      buf = new Uint8Array(16);
      clockSeq = $.V1State_clockSeq;
      mSecs = Date.now();
      t1 = $.V1State_nSecs;
      nSecs = t1 + 1;
      t2 = $.V1State_mSecs;
      t1 = mSecs - t2 + (nSecs - t1) / 10000 < 0;
      if (t1)
        clockSeq = clockSeq + 1 & 16383;
      t1 = t1 || mSecs > t2;
      if (t1)
        nSecs = 0;
      if (nSecs >= 10000)
        throw A.wrapException(A.Exception_Exception("uuid.v1(): Can't create more than 10M uuids/sec"));
      $.V1State_mSecs = mSecs;
      $.V1State_nSecs = nSecs;
      $.V1State_clockSeq = clockSeq;
      mSecs += 122192928e5;
      tl = ((mSecs & 268435455) * 10000 + nSecs) % 4294967296;
      buf[0] = tl >>> 24 & 255;
      buf[1] = tl >>> 16 & 255;
      buf[2] = tl >>> 8 & 255;
      buf[3] = tl & 255;
      tmh = B.JSNumber_methods.floor$0(mSecs / 4294967296 * 10000) & 268435455;
      buf[4] = tmh >>> 8 & 255;
      buf[5] = tmh & 255;
      buf[6] = tmh >>> 24 & 255;
      buf[7] = tmh >>> 16 & 255;
      buf[8] = clockSeq >>> 8 & 63;
      buf[9] = clockSeq & 255;
      buf[6] = buf[6] & 15 | 16;
      buf[8] = buf[8] | 128;
      node = $.V1State_nodeId;
      for (t1 = node.length, n = 0; n < 6; ++n) {
        t2 = 10 + n;
        if (!(n < t1))
          return A.ioore(node, n);
        t3 = node[n];
        if (!(t2 < 16))
          return A.ioore(buf, t2);
        buf[t2] = t3;
      }
      return A.UuidParsing_unparse(buf);
    }
  };
  A.EventStreamProvider.prototype = {};
  A._EventStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return A._EventStreamSubscription$(this._target, this._eventType, onData, false, t1._precomputed1);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._EventStreamSubscription.prototype = {
    cancel$0() {
      var _this = this,
        emptyFuture = A.Future_Future$value(null, type$.void);
      if (_this._target == null)
        return emptyFuture;
      _this._unlisten$0();
      _this._onData = _this._target = null;
      return emptyFuture;
    },
    onData$1(handleData) {
      var t1, _this = this;
      _this.$ti._eval$1("~(1)?")._as(handleData);
      if (_this._target == null)
        throw A.wrapException(A.StateError$("Subscription has been canceled."));
      _this._unlisten$0();
      t1 = A._wrapZone(new A._EventStreamSubscription_onData_closure(handleData), type$.JSObject);
      t1 = t1 == null ? null : A._functionToJS1(t1);
      _this._onData = t1;
      _this._tryResume$0();
    },
    pause$0() {
      if (this._target == null)
        return;
      ++this._pauseCount;
      this._unlisten$0();
    },
    resume$0() {
      var _this = this;
      if (_this._target == null || _this._pauseCount <= 0)
        return;
      --_this._pauseCount;
      _this._tryResume$0();
    },
    _tryResume$0() {
      var _this = this,
        t1 = _this._onData;
      if (t1 != null && _this._pauseCount <= 0)
        _this._target.addEventListener(_this._eventType, t1, false);
    },
    _unlisten$0() {
      var t1 = this._onData;
      if (t1 != null)
        this._target.removeEventListener(this._eventType, t1, false);
    },
    $isStreamSubscription: 1
  };
  A._EventStreamSubscription_closure.prototype = {
    call$1(e) {
      return this.onData.call$1(A._asJSObject(e));
    },
    $signature: 2
  };
  A._EventStreamSubscription_onData_closure.prototype = {
    call$1(e) {
      return this.handleData.call$1(A._asJSObject(e));
    },
    $signature: 2
  };
  A.BrowserWebSocket.prototype = {
    _browser_web_socket$_closed$2(code, reason) {
      var t1 = this._browser_web_socket$_events;
      if ((t1._state & 4) !== 0)
        return;
      t1.add$1(0, new A.CloseReceived(code, reason));
      t1.close$0();
    },
    sendBytes$1(b) {
      var t1;
      if ((this._browser_web_socket$_events._state & 4) !== 0)
        throw A.wrapException(A.WebSocketConnectionClosed$());
      t1 = A.jsify(b);
      t1.toString;
      this._webSocket.send(t1);
    },
    close$2(code, reason) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, t1;
      var $async$close$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._browser_web_socket$_events;
              if ((t1._state & 4) !== 0)
                throw A.wrapException(A.WebSocketConnectionClosed$());
              t1.close$0();
              $async$self._webSocket.close();
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$close$2, $async$completer);
    },
    $isWebSocket: 1
  };
  A.BrowserWebSocket_connect_closure.prototype = {
    call$1(_) {
      A._asJSObject(_);
      this.webSocketConnected.complete$1(this.browserSocket);
    },
    $signature: 14
  };
  A.BrowserWebSocket_connect_closure0.prototype = {
    call$1(e) {
      var t1;
      A._asJSObject(e);
      t1 = this.webSocketConnected;
      if ((t1.future._state & 30) === 0)
        t1.completeError$1(new A.WebSocketException("Failed to connect WebSocket"));
      else
        this.browserSocket._browser_web_socket$_closed$2(1006, "error");
    },
    $signature: 14
  };
  A.BrowserWebSocket_connect_closure1.prototype = {
    call$1(e) {
      var t2, data,
        t1 = this.browserSocket._browser_web_socket$_events;
      if ((t1._state & 4) !== 0)
        return;
      t2 = e.data;
      t2.toString;
      data = A._Cell$named("data");
      if (typeof t2 === "string")
        data.__late_helper$_value = new A.TextDataReceived(A._asString(t2));
      else if (typeof t2 === "object" && A.JSAnyUtilityExtension_instanceOfString(A._asJSObject(t2), "ArrayBuffer"))
        data.__late_helper$_value = new A.BinaryDataReceived(A.NativeUint8List_NativeUint8List$view(type$.NativeArrayBuffer._as(t2), 0, null));
      else
        throw A.wrapException(A.StateError$("unexpected message type: " + J.get$runtimeType$(t2).toString$0(0)));
      t1.add$1(0, data._readLocal$0());
    },
    $signature: 2
  };
  A.BrowserWebSocket_connect_closure2.prototype = {
    call$1($event) {
      var t1;
      A._asJSObject($event);
      t1 = this.webSocketConnected;
      if ((t1.future._state & 30) === 0)
        t1.complete$1(this.browserSocket);
      this.browserSocket._browser_web_socket$_closed$2(A._asInt($event.code), A._asString($event.reason));
    },
    $signature: 14
  };
  A.WebSocketEvent.prototype = {};
  A.TextDataReceived.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.TextDataReceived && other.text === this.text;
    },
    get$hashCode(_) {
      return B.JSString_methods.get$hashCode(this.text);
    }
  };
  A.BinaryDataReceived.prototype = {
    $eq(_, other) {
      var t1, t2, t3, t4, i;
      if (other == null)
        return false;
      if (other instanceof A.BinaryDataReceived && other.data.length === this.data.length) {
        for (t1 = this.data, t2 = t1.length, t3 = other.data, t4 = t3.length, i = 0; i < t2; ++i) {
          if (!(i < t4))
            return A.ioore(t3, i);
          if (t3[i] !== t1[i])
            return false;
        }
        return true;
      }
      return false;
    },
    get$hashCode(_) {
      return A.Primitives_objectHashCode(this.data);
    },
    toString$0(_) {
      return "BinaryDataReceived(" + A.S(this.data) + ")";
    }
  };
  A.CloseReceived.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.CloseReceived && other.code === this.code && other.reason === this.reason;
    },
    get$hashCode(_) {
      return A.Primitives_objectHashCode([this.code, this.reason]);
    },
    toString$0(_) {
      return "CloseReceived(" + this.code + ", " + this.reason + ")";
    }
  };
  A.WebSocketException.prototype = {
    toString$0(_) {
      var t1 = this.message;
      if (t1.length === 0)
        return "WebSocketException";
      else
        return "WebSocketException: " + t1;
    },
    $isException: 1
  };
  A.WebSocketConnectionClosed.prototype = {
    toString$0(_) {
      var t1 = this.message;
      if (t1.length === 0)
        return "WebSocketConnectionClosed";
      else
        return "WebSocketConnectionClosed: " + t1;
    }
  };
  A.AdapterWebSocketChannel.prototype = {
    AdapterWebSocketChannel$1(webSocket) {
      webSocket.then$1$2$onError(new A.AdapterWebSocketChannel_closure(this), new A.AdapterWebSocketChannel_closure0(this), type$.Null);
    },
    $isWebSocketChannel: 1
  };
  A.AdapterWebSocketChannel_closure.prototype = {
    call$1(webSocket) {
      var t1, t2;
      type$.WebSocket._as(webSocket);
      t1 = webSocket._browser_web_socket$_events;
      t2 = this.$this;
      new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$1(new A.AdapterWebSocketChannel__closure(t2));
      t1 = t2._adapter_web_socket_channel$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$onDone(new A.AdapterWebSocketChannel__closure0(webSocket), new A.AdapterWebSocketChannel__closure1(t2, webSocket));
      A._asString(webSocket._webSocket.protocol);
      t2._readyCompleter.complete$0();
    },
    $signature: 70
  };
  A.AdapterWebSocketChannel__closure.prototype = {
    call$1($event) {
      var t1, text, data, _s6_ = "_local", _s5_ = "_sink";
      type$.WebSocketEvent._as($event);
      $label0$0: {
        t1 = $event instanceof A.TextDataReceived;
        text = t1 ? $event.text : null;
        if (t1) {
          t1 = this.$this._adapter_web_socket_channel$_controller.__StreamChannelController__local_F;
          t1 === $ && A.throwLateFieldNI(_s6_);
          t1 = t1.__GuaranteeChannel__sink_F;
          t1 === $ && A.throwLateFieldNI(_s5_);
          t1.add$1(0, text);
          break $label0$0;
        }
        t1 = $event instanceof A.BinaryDataReceived;
        data = t1 ? $event.data : null;
        if (t1) {
          t1 = this.$this._adapter_web_socket_channel$_controller.__StreamChannelController__local_F;
          t1 === $ && A.throwLateFieldNI(_s6_);
          t1 = t1.__GuaranteeChannel__sink_F;
          t1 === $ && A.throwLateFieldNI(_s5_);
          t1.add$1(0, data);
          break $label0$0;
        }
        if ($event instanceof A.CloseReceived) {
          t1 = this.$this._adapter_web_socket_channel$_controller.__StreamChannelController__local_F;
          t1 === $ && A.throwLateFieldNI(_s6_);
          t1 = t1.__GuaranteeChannel__sink_F;
          t1 === $ && A.throwLateFieldNI(_s5_);
          t1.close$0();
        }
      }
    },
    $signature: 71
  };
  A.AdapterWebSocketChannel__closure0.prototype = {
    call$1(obj) {
      var _1_0, s, b, b0, t1, t2, exception;
      try {
        $label1$1: {
          _1_0 = obj;
          s = null;
          t1 = typeof _1_0 == "string";
          if (t1)
            s = _1_0;
          if (t1) {
            t1 = this.webSocket;
            t2 = A._asString(s);
            if ((t1._browser_web_socket$_events._state & 4) !== 0)
              A.throwExpression(A.WebSocketConnectionClosed$());
            t2 = A.jsify(t2);
            t2.toString;
            t1._webSocket.send(t2);
            break $label1$1;
          }
          b = null;
          t1 = type$.Uint8List._is(_1_0);
          if (t1)
            b = _1_0;
          if (t1) {
            this.webSocket.sendBytes$1(b);
            break $label1$1;
          }
          b0 = null;
          t1 = type$.List_int._is(_1_0);
          if (t1)
            b0 = _1_0;
          if (t1) {
            this.webSocket.sendBytes$1(new Uint8Array(A._ensureNativeList(b0)));
            break $label1$1;
          }
          t1 = A.UnsupportedError$("Cannot send " + J.get$runtimeType$(obj).toString$0(0));
          throw A.wrapException(t1);
        }
      } catch (exception) {
        if (!(A.unwrapException(exception) instanceof A.WebSocketConnectionClosed))
          throw exception;
      }
    },
    $signature: 8
  };
  A.AdapterWebSocketChannel__closure1.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$handler = 1, $async$errorStack = [], $async$self = this, t1, exception, $async$exception;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$handler = 3;
              t1 = $async$self.$this;
              $async$goto = 6;
              return A._asyncAwait($async$self.webSocket.close$2(t1._localCloseCode, t1._localCloseReason), $async$call$0);
            case 6:
              // returning from await.
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$errorStack.pop();
              if (!(A.unwrapException($async$exception) instanceof A.WebSocketConnectionClosed))
                throw $async$exception;
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return A._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 19
  };
  A.AdapterWebSocketChannel_closure0.prototype = {
    call$1(e) {
      var error, t1, t2;
      A._asObject(e);
      error = e instanceof A.TimeoutException ? e : new A.WebSocketChannelException(J.toString$0$(e));
      t1 = this.$this;
      t1._readyCompleter.completeError$1(error);
      t1 = t1._adapter_web_socket_channel$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t2 = t1.__GuaranteeChannel__sink_F;
      t2 === $ && A.throwLateFieldNI("_sink");
      t2.addError$1(error);
      t1 = t1.__GuaranteeChannel__sink_F;
      t1 === $ && A.throwLateFieldNI("_sink");
      t1.close$0();
    },
    $signature: 72
  };
  A._WebSocketSink.prototype = {$isWebSocketSink: 1};
  A.WebSocketChannelException.prototype = {
    toString$0(_) {
      return "WebSocketChannelException: " + this.message;
    },
    $isException: 1
  };
  A.main_closure.prototype = {
    call$0() {
      return this.$call$body$main_closure();
    },
    $call$body$main_closure() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        uri, fixedPath, fixedUri, client, _0_0, t2, manager, t3, t4, t5, debugEventController, t6, _box_0, t1;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              _box_0 = {};
              t1 = init.G;
              if (A._asStringQ(t1.$dartAppInstanceId) == null)
                t1.$dartAppInstanceId = new A.UuidV1(null).generate$1$options(null);
              uri = A.Uri_parse(A._asString(t1.$dwdsDevHandlerPath));
              if (A._asString(A._asJSObject(A._asJSObject(t1.window).location).protocol) === "https:" && uri.get$scheme() === "http" && uri.get$host() !== "localhost")
                uri = uri.replace$1$scheme("https");
              else if (A._asString(A._asJSObject(A._asJSObject(t1.window).location).protocol) === "wss:" && uri.get$scheme() === "ws" && uri.get$host() !== "localhost")
                uri = uri.replace$1$scheme("wss");
              fixedPath = uri.toString$0(0);
              fixedUri = A.Uri_parse(fixedPath);
              client = fixedUri.isScheme$1("ws") || fixedUri.isScheme$1("wss") ? new A.WebSocketClient(A.AdapterWebSocketChannel$(A.BrowserWebSocket_connect(fixedUri, null))) : new A.SseSocketClient(A.SseClient$(fixedPath, "InjectedClient"));
              _0_0 = A._asString(t1.$dartModuleStrategy);
              $async$goto = "require-js" === _0_0 ? 3 : 4;
              break;
            case 3:
              // then
              $async$goto = 5;
              return A._asyncAwait(A.RequireRestarter_create(), $async$call$0);
            case 5:
              // returning from await.
              t2 = $async$result;
              // goto break $label0$0
              $async$goto = 2;
              break;
            case 4:
              // join
              if ("ddc-library-bundle" === _0_0) {
                t2 = new A.DdcLibraryBundleRestarter();
                // goto break $label0$0
                $async$goto = 2;
                break;
              }
              if ("ddc" === _0_0 || "legacy" === _0_0) {
                t2 = new A.DdcRestarter();
                // goto break $label0$0
                $async$goto = 2;
                break;
              }
              t2 = A.throwExpression(A.StateError$("Unknown module strategy: " + A.S(A.getProperty(A.staticInteropGlobalContext(), "$dartModuleStrategy", type$.String))));
            case 2:
              // break $label0$0
              manager = new A.ReloadingManager(client, t2);
              t1.$dartHotReloadStartDwds = A._functionToJS0(new A.main__closure(manager));
              t1.$dartHotReloadEndDwds = A._functionToJS0(new A.main__closure0(manager));
              _box_0.readyToRunMainCompleter = null;
              t1.$dartHotRestartDwds = A._functionToJS2(new A.main__closure1(_box_0, manager));
              t1.$dartReadyToRunMain = A._functionToJS0(new A.main__closure2(_box_0));
              t2 = $.Zone__current;
              t3 = Math.max(100, 1);
              t4 = A.StreamController_StreamController(null, null, null, false, type$.DebugEvent);
              t5 = A.StreamController_StreamController(null, null, null, false, type$.List_DebugEvent);
              debugEventController = new A.BatchedStreamController(t3, 1000, t4, t5, new A._AsyncCompleter(new A._Future(t2, type$._Future_bool), type$._AsyncCompleter_bool), type$.BatchedStreamController_DebugEvent);
              t2 = A.List_List$filled(A.QueueList__computeInitialCapacity(null), null, false, type$.nullable_Result_DebugEvent);
              t3 = A.ListQueue$(type$._EventRequest_dynamic);
              t6 = type$.StreamQueue_DebugEvent;
              debugEventController.__BatchedStreamController__inputQueue_A = t6._as(new A.StreamQueue(new A._ControllerStream(t4, A._instanceType(t4)._eval$1("_ControllerStream<1>")), new A.QueueList(t2, 0, 0, type$.QueueList_Result_DebugEvent), t3, t6));
              A.safeUnawaited(debugEventController._batchAndSendEvents$0());
              new A._ControllerStream(t5, A._instanceType(t5)._eval$1("_ControllerStream<1>")).listen$1(new A.main__closure3(client));
              t1.$emitDebugEvent = A._functionToJS2(new A.main__closure4(debugEventController));
              t1.$emitRegisterEvent = A._functionToJS1(new A.main__closure5(client));
              t1.$launchDevTools = A._functionToJS0(new A.main__closure6(client));
              client.get$stream().listen$2$onError(new A.main__closure7(manager, client), new A.main__closure8());
              if (A._asBool(t1.$dwdsEnableDevToolsLaunch))
                A._EventStreamSubscription$(A._asJSObject(t1.window), "keydown", type$.nullable_void_Function_JSObject._as(new A.main__closure9()), false, type$.JSObject);
              if (A._asString(t1.$dartModuleStrategy) !== "ddc-library-bundle")
                if (A._isChromium())
                  A._sendConnectRequest(client.get$sink());
                else
                  A.runMain();
              else
                A._sendConnectRequest(client.get$sink());
              A._launchCommunicationWithDebugExtension();
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 19
  };
  A.main__closure.prototype = {
    call$0() {
      var path = A._asStringQ(init.G.$reloadedSourcesPath);
      path.toString;
      return A.FutureOfJSAnyToJSPromise_get_toJS(this.manager._restarter.hotReloadStart$1(path), type$.JSArray_nullable_Object);
    },
    $signature: 9
  };
  A.main__closure0.prototype = {
    call$0() {
      return A.FutureOfVoidToJSPromise_get_toJS(this.manager.hotReloadEnd$0());
    },
    $signature: 9
  };
  A.main__closure1.prototype = {
    call$2(runId, pauseIsolatesOnStart) {
      var t1, t2, t3, t4;
      A._asString(runId);
      A._asBoolQ(pauseIsolatesOnStart);
      t1 = this.manager;
      t2 = init.G;
      t3 = type$.nullable_JSArray_nullable_Object;
      if (pauseIsolatesOnStart === true) {
        t4 = new A._Future($.Zone__current, type$._Future_dynamic);
        this._box_0.readyToRunMainCompleter = new A._AsyncCompleter(t4, type$._AsyncCompleter_dynamic);
        return A.FutureOfJSAnyToJSPromise_get_toJS(t1.hotRestart$3$readyToRunMain$reloadedSourcesPath$runId(t4, A._asStringQ(t2.$reloadedSourcesPath), runId), t3);
      } else
        return A.FutureOfJSAnyToJSPromise_get_toJS(t1.hotRestart$2$reloadedSourcesPath$runId(A._asStringQ(t2.$reloadedSourcesPath), runId), t3);
    },
    call$1(runId) {
      return this.call$2(runId, null);
    },
    "call*": "call$2",
    $requiredArgCount: 1,
    $defaultValues() {
      return [null];
    },
    $signature: 74
  };
  A.main__closure2.prototype = {
    call$0() {
      var t1 = this._box_0,
        t2 = t1.readyToRunMainCompleter;
      if (t2 == null)
        return;
      if ((t2.future._state & 30) !== 0)
        return;
      t2.complete$0();
      t1.readyToRunMainCompleter = null;
    },
    $signature: 1
  };
  A.main__closure3.prototype = {
    call$1(events) {
      var t1, t2, t3;
      type$.List_DebugEvent._as(events);
      if (A._asBool(init.G.$dartEmitDebugEvents)) {
        t1 = this.client.get$sink();
        t2 = $.$get$serializers();
        t3 = new A.BatchedDebugEventsBuilder();
        type$.nullable_void_Function_BatchedDebugEventsBuilder._as(new A.main___closure2(events)).call$1(t3);
        A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._debug_event$_build$0()), null), type$.dynamic);
      }
    },
    $signature: 75
  };
  A.main___closure2.prototype = {
    call$1(b) {
      var t1 = A.ListBuilder_ListBuilder(this.events, type$.DebugEvent);
      type$.nullable_ListBuilder_DebugEvent._as(t1);
      b.get$_debug_event$_$this().set$_events(t1);
      return t1;
    },
    $signature: 76
  };
  A.main__closure4.prototype = {
    call$2(kind, eventData) {
      var t1, t2;
      A._asString(kind);
      A._asString(eventData);
      if (A._asBool(init.G.$dartEmitDebugEvents)) {
        t1 = this.debugEventController._inputController;
        t2 = new A.DebugEventBuilder();
        type$.nullable_void_Function_DebugEventBuilder._as(new A.main___closure1(kind, eventData)).call$1(t2);
        A._trySendEvent(new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>")), t2._debug_event$_build$0(), type$.DebugEvent);
      }
    },
    $signature: 77
  };
  A.main___closure1.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_debug_event$_$this()._timestamp = t1;
      b.get$_debug_event$_$this()._debug_event$_kind = this.kind;
      b.get$_debug_event$_$this()._eventData = this.eventData;
      return b;
    },
    $signature: 78
  };
  A.main__closure5.prototype = {
    call$1(eventData) {
      var t1, t2, t3;
      A._asString(eventData);
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.RegisterEventBuilder();
      type$.nullable_void_Function_RegisterEventBuilder._as(new A.main___closure0(eventData)).call$1(t3);
      A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._register_event$_build$0()), null), type$.dynamic);
    },
    $signature: 79
  };
  A.main___closure0.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_register_event$_$this()._register_event$_timestamp = t1;
      b.get$_register_event$_$this()._register_event$_eventData = this.eventData;
      return b;
    },
    $signature: 80
  };
  A.main__closure6.prototype = {
    call$0() {
      var t1, t2, t3;
      if (!A._isChromium()) {
        A._asJSObject(init.G.window).alert("Dart DevTools is only supported on Chromium based browsers.");
        return;
      }
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.DevToolsRequestBuilder();
      type$.nullable_void_Function_DevToolsRequestBuilder._as(new A.main___closure()).call$1(t3);
      A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._devtools_request$_build$0()), null), type$.dynamic);
    },
    $signature: 1
  };
  A.main___closure.prototype = {
    call$1(b) {
      var t1 = init.G,
        t2 = A._asString(t1.$dartAppId);
      b.get$_devtools_request$_$this()._devtools_request$_appId = t2;
      t1 = A._asStringQ(t1.$dartAppInstanceId);
      b.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
      return b;
    },
    $signature: 81
  };
  A.main__closure7.prototype = {
    call$1(serialized) {
      return this.$call$body$main__closure(A._asString(serialized));
    },
    $call$body$main__closure(serialized) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, t1, t2, path, $alert, $event;
      var $async$call$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $event = $.$get$serializers().deserialize$1(B.C_JsonCodec.decode$2$reviver(serialized, null));
              $async$goto = $event instanceof A._$BuildResult ? 2 : 4;
              break;
            case 2:
              // then
              t1 = init.G;
              $async$goto = A._asString(t1.$dartReloadConfiguration) === "ReloadConfiguration.liveReload" ? 5 : 7;
              break;
            case 5:
              // then
              A._asJSObject(A._asJSObject(t1.window).location).reload();
              // goto join
              $async$goto = 6;
              break;
            case 7:
              // else
              $async$goto = A._asString(t1.$dartReloadConfiguration) === "ReloadConfiguration.hotRestart" ? 8 : 10;
              break;
            case 8:
              // then
              $async$goto = 11;
              return A._asyncAwait($async$self.manager.hotRestart$1$reloadedSourcesPath(A._asStringQ(t1.$reloadedSourcesPath)), $async$call$1);
            case 11:
              // returning from await.
              // goto join
              $async$goto = 9;
              break;
            case 10:
              // else
              $async$goto = A._asString(t1.$dartReloadConfiguration) === "ReloadConfiguration.hotReload" ? 12 : 13;
              break;
            case 12:
              // then
              t2 = $async$self.manager;
              path = A._asStringQ(t1.$reloadedSourcesPath);
              path.toString;
              $async$goto = 14;
              return A._asyncAwait(t2._restarter.hotReloadStart$1(path), $async$call$1);
            case 14:
              // returning from await.
              $async$goto = 15;
              return A._asyncAwait(t2.hotReloadEnd$0(), $async$call$1);
            case 15:
              // returning from await.
            case 13:
              // join
            case 9:
              // join
            case 6:
              // join
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              $async$goto = $event instanceof A._$DevToolsResponse ? 16 : 18;
              break;
            case 16:
              // then
              if (!$event.success) {
                $alert = "DevTools failed to open with:\n" + A.S($event.error);
                t1 = $event.promptExtension && A._asBool(A._asJSObject(init.G.window).confirm($alert));
                t2 = init.G;
                if (t1)
                  A._asJSObjectQ(A._asJSObject(t2.window).open("https://dart.dev/to/web-debug-extension", "_blank"));
                else
                  A._asJSObject(t2.window).alert($alert);
              }
              // goto join
              $async$goto = 17;
              break;
            case 18:
              // else
              $async$goto = $event instanceof A._$RunRequest ? 19 : 21;
              break;
            case 19:
              // then
              A.runMain();
              // goto join
              $async$goto = 20;
              break;
            case 21:
              // else
              $async$goto = $event instanceof A._$ErrorResponse ? 22 : 24;
              break;
            case 22:
              // then
              A._asJSObject(init.G.window).reportError("Error from backend:\n\nError: " + $event.error + "\n\nStack Trace:\n" + $event.stackTrace);
              // goto join
              $async$goto = 23;
              break;
            case 24:
              // else
              $async$goto = $event instanceof A._$HotReloadRequest ? 25 : 27;
              break;
            case 25:
              // then
              $async$goto = 28;
              return A._asyncAwait(A.handleWebSocketHotReloadRequest($event, $async$self.manager, $async$self.client.get$sink()), $async$call$1);
            case 28:
              // returning from await.
              // goto join
              $async$goto = 26;
              break;
            case 27:
              // else
              $async$goto = $event instanceof A._$HotRestartRequest ? 29 : 31;
              break;
            case 29:
              // then
              $async$goto = 32;
              return A._asyncAwait(A.handleWebSocketHotRestartRequest($event, $async$self.manager, $async$self.client.get$sink()), $async$call$1);
            case 32:
              // returning from await.
              // goto join
              $async$goto = 30;
              break;
            case 31:
              // else
              $async$goto = $event instanceof A._$ServiceExtensionRequest ? 33 : 34;
              break;
            case 33:
              // then
              $async$goto = 35;
              return A._asyncAwait(A.handleServiceExtensionRequest($event, $async$self.client.get$sink(), $async$self.manager), $async$call$1);
            case 35:
              // returning from await.
            case 34:
              // join
            case 30:
              // join
            case 26:
              // join
            case 23:
              // join
            case 20:
              // join
            case 17:
              // join
            case 3:
              // join
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$1, $async$completer);
    },
    $signature: 82
  };
  A.main__closure8.prototype = {
    call$1(error) {
    },
    $signature: 6
  };
  A.main__closure9.prototype = {
    call$1(e) {
      var t1 = A.JSAnyUtilityExtension_instanceOfString(e, "KeyboardEvent");
      if (t1)
        if (B.JSArray_methods.contains$1(B.List_fAJ, A._asString(e.key)) && A._asBool(e.altKey) && !A._asBool(e.ctrlKey) && !A._asBool(e.metaKey)) {
          e.preventDefault();
          type$.JavaScriptFunction._as(init.G.$launchDevTools).call();
        }
    },
    $signature: 2
  };
  A.main_closure0.prototype = {
    call$2(error, stackTrace) {
      A._asObject(error);
      type$.StackTrace._as(stackTrace);
      A.print("Unhandled error detected in the injected client.js script.\n\nYou can disable this script in webdev by passing --no-injected-client if it\nis preventing your app from loading, but note that this will also prevent\nall debugging and hot reload/restart functionality from working.\n\nThe original error is below, please file an issue at\nhttps://github.com/dart-lang/webdev/issues/new and attach this output:\n\n" + A.S(error) + "\n" + stackTrace.toString$0(0) + "\n");
    },
    $signature: 10
  };
  A._sendConnectRequest_closure.prototype = {
    call$1(b) {
      var t1 = init.G,
        t2 = A._asString(t1.$dartAppId);
      b.get$_connect_request$_$this()._connect_request$_appId = t2;
      t2 = A._asStringQ(t1.$dartAppInstanceId);
      b.get$_connect_request$_$this()._instanceId = t2;
      t1 = A._asString(t1.$dartEntrypointPath);
      b.get$_connect_request$_$this()._entrypointPath = t1;
      return b;
    },
    $signature: 83
  };
  A._launchCommunicationWithDebugExtension_closure.prototype = {
    call$1(b) {
      var t3,
        t1 = init.G,
        t2 = A._asString(t1.$dartEntrypointPath);
      b.get$_$this()._appEntrypointPath = t2;
      t2 = type$.JavaScriptObject;
      t3 = A._asStringQ(t2._as(t1.window).$dartAppId);
      b.get$_$this()._appId = t3;
      t3 = A._asStringQ(t1.$dartAppInstanceId);
      b.get$_$this()._appInstanceId = t3;
      t3 = A._asString(A._asJSObject(A._asJSObject(t1.window).location).origin);
      b.get$_$this()._appOrigin = t3;
      t3 = A._asString(A._asJSObject(A._asJSObject(t1.window).location).href);
      b.get$_$this()._appUrl = t3;
      t3 = A._authUrl();
      b.get$_$this()._authUrl = t3;
      t3 = A._asStringQ(t2._as(t1.window).$dartExtensionUri);
      b.get$_$this()._extensionUrl = t3;
      t3 = A._asBoolQ(t2._as(t1.window).$isInternalBuild);
      b.get$_$this()._isInternalBuild = t3;
      t2 = A._asBoolQ(t2._as(t1.window).$isFlutterApp);
      b.get$_$this()._isFlutterApp = t2;
      t1 = A._asStringQ(t1.$dartWorkspaceName);
      b.get$_$this()._workspaceName = t1;
      return b;
    },
    $signature: 110
  };
  A._handleAuthRequest_closure.prototype = {
    call$1(isAuthenticated) {
      return A._dispatchEvent("dart-auth-response", "" + A._asBool(isAuthenticated));
    },
    $signature: 85
  };
  A._sendResponse_closure.prototype = {
    call$1(b) {
      var t1;
      b.set$id(this.requestId);
      b.set$success(this.success);
      t1 = this.errorMessage;
      if (t1 != null)
        b.set$errorMessage(t1);
    },
    $signature: 7
  };
  A.DdcLibraryBundleRestarter.prototype = {
    _runMainWhenReady$2(readyToRunMain, runMain) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void);
      var $async$_runMainWhenReady$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = readyToRunMain != null ? 2 : 3;
              break;
            case 2:
              // then
              $async$goto = 4;
              return A._asyncAwait(readyToRunMain, $async$_runMainWhenReady$2);
            case 4:
              // returning from await.
            case 3:
              // join
              runMain.call();
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_runMainWhenReady$2, $async$completer);
    },
    _getSrcModuleLibraries$1(reloadedSourcesPath) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.List_Map_dynamic_dynamic),
        $async$returnValue, t1, xhr, $async$temp1, $async$temp2, $async$temp3;
      var $async$_getSrcModuleLibraries$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = new A._Future($.Zone__current, type$._Future_String);
              xhr = A._asJSObject(new init.G.XMLHttpRequest());
              xhr.withCredentials = true;
              xhr.onreadystatechange = A._functionToJS0(new A.DdcLibraryBundleRestarter__getSrcModuleLibraries_closure(xhr, new A._AsyncCompleter(t1, type$._AsyncCompleter_String)));
              xhr.open("GET", reloadedSourcesPath, true);
              xhr.send();
              $async$temp1 = J;
              $async$temp2 = type$.List_dynamic;
              $async$temp3 = B.C_JsonCodec;
              $async$goto = 3;
              return A._asyncAwait(t1, $async$_getSrcModuleLibraries$1);
            case 3:
              // returning from await.
              $async$returnValue = $async$temp1.cast$1$0$ax($async$temp2._as($async$temp3.decode$1($async$result)), type$.Map_dynamic_dynamic);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_getSrcModuleLibraries$1, $async$completer);
    },
    restart$3$readyToRunMain$reloadedSourcesPath$runId(readyToRunMain, reloadedSourcesPath, runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Record_2_bool_and_nullable_JSArray_nullable_Object),
        $async$returnValue, $async$self = this, mainHandler, srcModuleLibraries, t1;
      var $async$restart$3$readyToRunMain$reloadedSourcesPath$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = init.G;
              $async$goto = 3;
              return A._asyncAwait(A._Debugger_maybeInvokeFlutterDisassemble(A._asJSObject(A._asJSObject(t1.dartDevEmbedder).debugger)), $async$restart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 3:
              // returning from await.
              mainHandler = A._functionToJS1(new A.DdcLibraryBundleRestarter_restart_closure($async$self, readyToRunMain));
              A._asJSObject(A._asJSObject(t1.dartDevEmbedder).config).capturedMainHandler = mainHandler;
              reloadedSourcesPath.toString;
              $async$goto = 4;
              return A._asyncAwait($async$self._getSrcModuleLibraries$1(reloadedSourcesPath), $async$restart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 4:
              // returning from await.
              srcModuleLibraries = $async$result;
              $async$goto = 5;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(t1.dartDevEmbedder).hotRestart()), type$.nullable_Object), $async$restart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 5:
              // returning from await.
              $async$returnValue = new A._Record_2(true, type$.JSArray_nullable_Object._as(A.jsify(srcModuleLibraries)));
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$3$readyToRunMain$reloadedSourcesPath$runId, $async$completer);
    },
    hotReloadStart$1(reloadedSourcesPath) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.JSArray_nullable_Object),
        $async$returnValue, $async$self = this, t3, t4, t5, t6, srcModuleLibraryCast, src, libraries, t7, t1, t2, filesToLoad, librariesToReload, srcModuleLibraries;
      var $async$hotReloadStart$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = init.G;
              t2 = type$.JSArray_nullable_Object;
              filesToLoad = t2._as(new t1.Array());
              librariesToReload = t2._as(new t1.Array());
              $async$goto = 3;
              return A._asyncAwait($async$self._getSrcModuleLibraries$1(reloadedSourcesPath), $async$hotReloadStart$1);
            case 3:
              // returning from await.
              srcModuleLibraries = $async$result;
              for (t3 = J.get$iterator$ax(srcModuleLibraries), t4 = type$.String, t5 = type$.Object, t6 = type$.List_dynamic; t3.moveNext$0();) {
                srcModuleLibraryCast = t3.get$current().cast$2$0(0, t4, t5);
                src = A._asString(srcModuleLibraryCast.$index(0, "src"));
                libraries = J.cast$1$0$ax(t6._as(srcModuleLibraryCast.$index(0, "libraries")), t4);
                filesToLoad.push(src);
                for (t7 = libraries.get$iterator(libraries); t7.moveNext$0();)
                  librariesToReload.push(t7.get$current());
              }
              A._asJSObject(A._asJSObject(t1.dartDevEmbedder).config).capturedHotReloadEndHandler = A._functionToJS1(new A.DdcLibraryBundleRestarter_hotReloadStart_closure($async$self));
              $async$goto = 4;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(t1.dartDevEmbedder).hotReload(filesToLoad, librariesToReload)), type$.nullable_Object), $async$hotReloadStart$1);
            case 4:
              // returning from await.
              $async$returnValue = t2._as(A.jsify(srcModuleLibraries));
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$hotReloadStart$1, $async$completer);
    },
    hotReloadEnd$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this;
      var $async$hotReloadEnd$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$self._capturedHotReloadEndCallback.call();
              A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).config).capturedHotReloadEndHandler = null;
              $async$self._capturedHotReloadEndCallback = null;
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$hotReloadEnd$0, $async$completer);
    },
    handleServiceExtension$2(method, args) {
      return this.handleServiceExtension$body$DdcLibraryBundleRestarter(method, type$.Map_String_dynamic._as(args));
    },
    handleServiceExtension$body$DdcLibraryBundleRestarter(method, args) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_Map_String_dynamic),
        $async$returnValue, t1, t2, params, $async$temp1, $async$temp2;
      var $async$handleServiceExtension$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = method === "ext.flutter.reassemble" ? 3 : 5;
              break;
            case 3:
              // then
              $async$goto = 6;
              return A._asyncAwait(A._Debugger_maybeInvokeFlutterReassemble(A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).debugger)), $async$handleServiceExtension$2);
            case 6:
              // returning from await.
              $async$returnValue = A.LinkedHashMap_LinkedHashMap$_literal(["status", "reassemble invoked"], type$.String, type$.dynamic);
              // goto return
              $async$goto = 1;
              break;
              // goto join
              $async$goto = 4;
              break;
            case 5:
              // else
              $async$goto = method === "getExtensionRpcs" ? 7 : 9;
              break;
            case 7:
              // then
              t1 = type$.JSArray_nullable_Object._as(A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).debugger).extensionNames);
              t1 = type$.List_String._is(t1) ? t1 : new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,String>"));
              t2 = type$.String;
              $async$returnValue = A.LinkedHashMap_LinkedHashMap$_literal(["rpcs", J.cast$1$0$ax(t1, t2)], t2, type$.dynamic);
              // goto return
              $async$goto = 1;
              break;
              // goto join
              $async$goto = 8;
              break;
            case 9:
              // else
              params = args.get$isNotEmpty(args) ? B.C_JsonCodec.encode$2$toEncodable(args, null) : "{}";
              $async$temp1 = type$.Map_String_dynamic;
              $async$temp2 = B.C_JsonCodec;
              $async$goto = 10;
              return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).debugger).invokeExtension(method, params)), type$.String), $async$handleServiceExtension$2);
            case 10:
              // returning from await.
              $async$returnValue = $async$temp1._as($async$temp2.decode$2$reviver($async$result, null));
              // goto return
              $async$goto = 1;
              break;
            case 8:
              // join
            case 4:
              // join
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$handleServiceExtension$2, $async$completer);
    },
    $isRestarter: 1
  };
  A.DdcLibraryBundleRestarter__getSrcModuleLibraries_closure.prototype = {
    call$0() {
      var t1 = this.xhr;
      if (A._asInt(t1.readyState) === 4 && A._asInt(t1.status) === 200 || A._asInt(t1.status) === 304)
        this.completer.complete$1(A._asString(t1.responseText));
    },
    $signature: 1
  };
  A.DdcLibraryBundleRestarter_restart_closure.prototype = {
    call$1(runMain) {
      type$.JavaScriptFunction._as(runMain);
      A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).config).capturedMainHandler = null;
      A.safeUnawaited(this.$this._runMainWhenReady$2(this.readyToRunMain, runMain));
    },
    $signature: 23
  };
  A.DdcLibraryBundleRestarter_hotReloadStart_closure.prototype = {
    call$1(hotReloadEndCallback) {
      this.$this._capturedHotReloadEndCallback = type$.JavaScriptFunction._as(hotReloadEndCallback);
    },
    $signature: 23
  };
  A.DdcRestarter.prototype = {
    restart$3$readyToRunMain$reloadedSourcesPath$runId(readyToRunMain, reloadedSourcesPath, runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Record_2_bool_and_nullable_JSArray_nullable_Object),
        $async$returnValue, t1, t2, t3, $async$temp1;
      var $async$restart$3$readyToRunMain$reloadedSourcesPath$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = init.G;
              t2 = A._asJSObject(t1.dart_library);
              t3 = readyToRunMain == null ? null : A.FutureOfVoidToJSPromise_get_toJS(readyToRunMain);
              t2.reload(runId, t3);
              t3 = new A._Future($.Zone__current, type$._Future_bool);
              $async$temp1 = A;
              $async$goto = 3;
              return A._asyncAwait(t3.then$1$1(new A.DdcRestarter_restart_closure(A._EventStreamSubscription$(A._asJSObject(t1.window), "message", type$.nullable_void_Function_JSObject._as(new A.DdcRestarter_restart_closure0(new A._AsyncCompleter(t3, type$._AsyncCompleter_bool))), false, type$.JSObject)), type$.bool), $async$restart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 3:
              // returning from await.
              $async$returnValue = new $async$temp1._Record_2($async$result, null);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$3$readyToRunMain$reloadedSourcesPath$runId, $async$completer);
    },
    hotReloadEnd$0() {
      return A.throwExpression(A.UnimplementedError$(string$.Hot_reD));
    },
    hotReloadStart$1(reloadedSourcesPath) {
      return A.throwExpression(A.UnimplementedError$(string$.Hot_reD));
    },
    $isRestarter: 1
  };
  A.DdcRestarter_restart_closure0.prototype = {
    call$1($event) {
      var t1 = $event.data,
        message = t1 == null ? null : A.dartify(t1);
      if (type$.Map_dynamic_dynamic._is(message) && J.$eq$(message.$index(0, "type"), "DDC_STATE_CHANGE") && J.$eq$(message.$index(0, "state"), "restart_end"))
        this.reloadCompleter.complete$1(true);
    },
    $signature: 2
  };
  A.DdcRestarter_restart_closure.prototype = {
    call$1(value) {
      A._asBool(value);
      this.sub.cancel$0();
      return value;
    },
    $signature: 87
  };
  A.ReloadingManager.prototype = {
    hotRestart$3$readyToRunMain$reloadedSourcesPath$runId(readyToRunMain, reloadedSourcesPath, runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_JSArray_nullable_Object),
        $async$returnValue, $async$self = this, result, t1, t2;
      var $async$hotRestart$3$readyToRunMain$reloadedSourcesPath$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._client.get$sink();
              t2 = $.$get$serializers();
              t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateExitBuilder()._isolate_events$_build$0()), null));
              $async$goto = 3;
              return A._asyncAwait($async$self._restarter.restart$3$readyToRunMain$reloadedSourcesPath$runId(readyToRunMain, reloadedSourcesPath, runId), $async$hotRestart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 3:
              // returning from await.
              result = $async$result;
              $async$self._afterRestart$1(result._0);
              $async$returnValue = result._1;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$hotRestart$3$readyToRunMain$reloadedSourcesPath$runId, $async$completer);
    },
    hotRestart$1$reloadedSourcesPath(reloadedSourcesPath) {
      return this.hotRestart$3$readyToRunMain$reloadedSourcesPath$runId(null, reloadedSourcesPath, null);
    },
    hotRestart$2$reloadedSourcesPath$runId(reloadedSourcesPath, runId) {
      return this.hotRestart$3$readyToRunMain$reloadedSourcesPath$runId(null, reloadedSourcesPath, runId);
    },
    hotReloadEnd$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this;
      var $async$hotReloadEnd$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = 2;
              return A._asyncAwait($async$self._restarter.hotReloadEnd$0(), $async$hotReloadEnd$0);
            case 2:
              // returning from await.
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$hotReloadEnd$0, $async$completer);
    },
    handleServiceExtension$2(method, args) {
      return this.handleServiceExtension$body$ReloadingManager(method, type$.Map_String_dynamic._as(args));
    },
    handleServiceExtension$body$ReloadingManager(method, args) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_Map_String_dynamic),
        $async$returnValue, $async$self = this, restarter;
      var $async$handleServiceExtension$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              restarter = $async$self._restarter;
              $async$goto = restarter instanceof A.DdcLibraryBundleRestarter ? 3 : 4;
              break;
            case 3:
              // then
              $async$goto = 5;
              return A._asyncAwait(restarter.handleServiceExtension$2(method, args), $async$handleServiceExtension$2);
            case 5:
              // returning from await.
              $async$returnValue = $async$result;
              // goto return
              $async$goto = 1;
              break;
            case 4:
              // join
              $async$returnValue = null;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$handleServiceExtension$2, $async$completer);
    },
    _afterRestart$1(succeeded) {
      var t1, t2;
      if (!succeeded)
        return;
      t1 = this._client.get$sink();
      t2 = $.$get$serializers();
      t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateStartBuilder()._isolate_events$_build$0()), null));
    }
  };
  A.HotReloadFailedException.prototype = {
    toString$0(_) {
      return "HotReloadFailedException: '" + this._s + "'";
    },
    $isException: 1
  };
  A.RequireRestarter.prototype = {
    restart$3$readyToRunMain$reloadedSourcesPath$runId(readyToRunMain, reloadedSourcesPath, runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Record_2_bool_and_nullable_JSArray_nullable_Object),
        $async$returnValue, $async$self = this, newDigests, modulesToLoad, t3, t4, t5, t6, line, toZone, t7, result, t1, t2;
      var $async$restart$3$readyToRunMain$reloadedSourcesPath$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = init.G;
              t2 = type$.JavaScriptObject;
              $async$goto = 3;
              return A._asyncAwait(A.SdkDeveloperExtension_maybeInvokeFlutterDisassemble(t2._as(t2._as(t1.$loadModuleConfig("dart_sdk")).developer)), $async$restart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 3:
              // returning from await.
              $async$goto = 4;
              return A._asyncAwait($async$self._getDigests$0(), $async$restart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 4:
              // returning from await.
              newDigests = $async$result;
              modulesToLoad = A._setArrayType([], type$.JSArray_String);
              for (t3 = newDigests.get$keys(), t3 = t3.get$iterator(t3), t4 = $.RequireRestarter____lastKnownDigests._name; t3.moveNext$0();) {
                t5 = t3.get$current();
                t6 = $.RequireRestarter____lastKnownDigests.__late_helper$_value;
                if (t6 === $.RequireRestarter____lastKnownDigests)
                  A.throwExpression(A.LateError$fieldNI(t4));
                if (!t6.containsKey$1(t5)) {
                  line = "Error during script reloading, refreshing the page. \nUnable to find an existing digest for module: " + t5 + ".";
                  toZone = $.printToZone;
                  if (toZone == null)
                    A.printString(line);
                  else
                    toZone.call$1(line);
                  A._asJSObject(A._asJSObject(t1.window).location).reload();
                } else {
                  t6 = $.RequireRestarter____lastKnownDigests.__late_helper$_value;
                  if (t6 === $.RequireRestarter____lastKnownDigests)
                    A.throwExpression(A.LateError$fieldNI(t4));
                  if (t6.$index(0, t5) != newDigests.$index(0, t5)) {
                    t6 = $.RequireRestarter____lastKnownDigests.__late_helper$_value;
                    if (t6 === $.RequireRestarter____lastKnownDigests)
                      A.throwExpression(A.LateError$fieldNI(t4));
                    t7 = newDigests.$index(0, t5);
                    t7.toString;
                    t6.$indexSet(0, t5, t7);
                    B.JSArray_methods.add$1(modulesToLoad, t5);
                  }
                }
              }
              $async$goto = modulesToLoad.length !== 0 ? 5 : 7;
              break;
            case 5:
              // then
              $async$self._updateGraph$0();
              $async$goto = 8;
              return A._asyncAwait($async$self._reload$1(modulesToLoad), $async$restart$3$readyToRunMain$reloadedSourcesPath$runId);
            case 8:
              // returning from await.
              result = $async$result;
              // goto join
              $async$goto = 6;
              break;
            case 7:
              // else
              result = true;
            case 6:
              // join
              t2._as(t2._as(t1.$loadModuleConfig("dart_sdk")).dart).hotRestart();
              A.safeUnawaited($async$self._require_restarter$_runMainWhenReady$1(readyToRunMain));
              $async$returnValue = new A._Record_2(result, null);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$3$readyToRunMain$reloadedSourcesPath$runId, $async$completer);
    },
    hotReloadEnd$0() {
      return A.throwExpression(A.UnimplementedError$(string$.Hot_reA));
    },
    hotReloadStart$1(reloadedSourcesPath) {
      return A.throwExpression(A.UnimplementedError$(string$.Hot_reA));
    },
    _require_restarter$_runMainWhenReady$1(readyToRunMain) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void);
      var $async$_require_restarter$_runMainWhenReady$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = readyToRunMain != null ? 2 : 3;
              break;
            case 2:
              // then
              $async$goto = 4;
              return A._asyncAwait(readyToRunMain, $async$_require_restarter$_runMainWhenReady$1);
            case 4:
              // returning from await.
            case 3:
              // join
              A.runMain();
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_require_restarter$_runMainWhenReady$1, $async$completer);
    },
    _getDigests$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Map_String_String),
        $async$returnValue, response, t1;
      var $async$_getDigests$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = 3;
              return A._asyncAwait(new A.BrowserClient(A._setArrayType([], type$.JSArray_JSObject))._sendUnstreamed$3("GET", A.Uri_parse(A._asString(type$.JavaScriptObject._as(init.G.$requireLoader).digestsPath)), null), $async$_getDigests$0);
            case 3:
              // returning from await.
              response = $async$result;
              t1 = type$.String;
              $async$returnValue = type$.Map_dynamic_dynamic._as(B.C_JsonCodec.decode$2$reviver(A.encodingForContentTypeHeader(A._contentTypeForHeaders(response.headers)).decode$1(response.bodyBytes), null)).cast$2$0(0, t1, t1);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_getDigests$0, $async$completer);
    },
    _initialize$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, $async$temp1;
      var $async$_initialize$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$temp1 = $.RequireRestarter____lastKnownDigests;
              $async$goto = 2;
              return A._asyncAwait($async$self._getDigests$0(), $async$_initialize$0);
            case 2:
              // returning from await.
              $async$temp1.__late_helper$_value = $async$result;
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_initialize$0, $async$completer);
    },
    _moduleParents$1(module) {
      var t1;
      A._asString(module);
      t1 = type$.JavaScriptObject;
      t1 = type$.nullable_JSArray_nullable_Object._as(t1._as(t1._as(init.G.$requireLoader).moduleParentsGraph).get(module));
      if (t1 == null)
        t1 = null;
      else {
        t1 = A.JSArrayExtension_toDartIterable(t1, type$.String);
        t1 = A.List_List$_of(t1, t1.$ti._eval$1("ListIterable.E"));
      }
      return t1 == null ? A._setArrayType([], type$.JSArray_String) : t1;
    },
    _moduleTopologicalCompare$2(module1, module2) {
      var t1, order1, order2, t2, topological;
      A._asString(module1);
      A._asString(module2);
      t1 = this._moduleOrdering;
      order1 = t1.$index(0, module1);
      order2 = t1.$index(0, module2);
      t2 = order1 == null;
      if (t2 || order2 == null)
        throw A.wrapException(A.HotReloadFailedException$("Unable to fetch ordering info for module: " + (t2 ? module1 : module2)));
      t2 = t1.$index(0, module2);
      t2.toString;
      t1 = t1.$index(0, module1);
      t1.toString;
      topological = B.JSInt_methods.compareTo$1(t2, t1);
      return topological === 0 ? B.JSString_methods.compareTo$1(module1, module2) : topological;
    },
    _reload$1(modules) {
      return this._reload$body$RequireRestarter(type$.List_String._as(modules));
    },
    _reload$body$RequireRestarter(modules) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, $async$handler = 2, $async$errorStack = [], $async$self = this, reloadedModules, moduleId, parentIds, e, _box_0, t4, t5, t6, t7, t8, t9, t10, _this, parentIds0, result, exception, t1, t2, dart, t3, $async$exception;
      var $async$_reload$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$errorStack.push($async$result);
          $async$goto = $async$handler;
        }
        for (;;)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = init.G;
              t2 = type$.JavaScriptObject;
              dart = t2._as(t2._as(t1.$loadModuleConfig("dart_sdk")).dart);
              t3 = $async$self._running.future;
              $async$goto = (t3._state & 30) === 0 ? 3 : 4;
              break;
            case 3:
              // then
              $async$goto = 5;
              return A._asyncAwait(t3, $async$_reload$1);
            case 5:
              // returning from await.
              $async$returnValue = $async$result;
              // goto return
              $async$goto = 1;
              break;
            case 4:
              // join
              $async$self._running = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_bool), type$._AsyncCompleter_bool);
              reloadedModules = 0;
              $async$handler = 7;
              _box_0 = {};
              t3 = $async$self.__RequireRestarter__dirtyModules_A;
              t3 === $ && A.throwLateFieldNI("_dirtyModules");
              t3.addAll$1(0, modules);
              _box_0.previousModuleId = null;
              t3 = $async$self.get$_moduleTopologicalCompare(), t4 = type$.String, t5 = type$.nullable_JSArray_nullable_Object, t6 = type$.JSArray_String, t7 = A._callDartFunctionFast0;
            case 10:
              // for condition
              if (!(t8 = $async$self.__RequireRestarter__dirtyModules_A, t9 = t8._root, t10 = t9 == null, !t10)) {
                // goto after for
                $async$goto = 11;
                break;
              }
              if (t10)
                A.throwExpression(A.IterableElementError_noElement());
              t9 = t8._splayMin$1(t9);
              t8._root = t9;
              moduleId = t9.key;
              $async$self.__RequireRestarter__dirtyModules_A.remove$1(0, moduleId);
              _this = A._asString(moduleId);
              t9 = t5._as(t2._as(t2._as(t1.$requireLoader).moduleParentsGraph).get(_this));
              if (t9 == null)
                parentIds0 = null;
              else {
                t8 = A.JSArrayExtension_toDartIterable(t9, t4);
                t8 = A.List_List$_of(t8, t8.$ti._eval$1("ListIterable.E"));
                parentIds0 = t8;
              }
              parentIds = parentIds0 == null ? A._setArrayType([], t6) : parentIds0;
              $async$goto = J.get$length$asx(parentIds) === 0 ? 12 : 14;
              break;
            case 12:
              // then
              t8 = new A.RequireRestarter__reload_closure(_box_0, dart);
              if (typeof t8 == "function")
                A.throwExpression(A.ArgumentError$("Attempting to rewrap a JS function.", null));
              result = function(_call, f) {
                return function() {
                  return _call(f);
                };
              }(t7, t8);
              result[$.$get$DART_CLOSURE_PROPERTY_NAME()] = t8;
              t1.$dartRunMain = result;
              // goto join
              $async$goto = 13;
              break;
            case 14:
              // else
              t8 = reloadedModules;
              if (typeof t8 !== "number") {
                $async$returnValue = t8.$add();
                // goto return
                $async$goto = 1;
                break;
              }
              reloadedModules = t8 + 1;
              $async$goto = 15;
              return A._asyncAwait($async$self._reloadModule$1(moduleId), $async$_reload$1);
            case 15:
              // returning from await.
              J.sort$1$ax(parentIds, t3);
              $async$self.__RequireRestarter__dirtyModules_A.addAll$1(0, parentIds);
              _box_0.previousModuleId = moduleId;
            case 13:
              // join
              // goto for condition
              $async$goto = 10;
              break;
            case 11:
              // after for
              A.print(A.S(reloadedModules) + " module(s) were hot-reloaded.");
              $async$self._running.complete$1(true);
              $async$handler = 2;
              // goto after finally
              $async$goto = 9;
              break;
            case 7:
              // catch
              $async$handler = 6;
              $async$exception = $async$errorStack.pop();
              t2 = A.unwrapException($async$exception);
              if (t2 instanceof A.HotReloadFailedException) {
                e = t2;
                A.print("Error during script reloading. Firing full page reload. " + A.S(e));
                A._asJSObject(A._asJSObject(t1.window).location).reload();
                $async$self._running.complete$1(false);
              } else
                throw $async$exception;
              // goto after finally
              $async$goto = 9;
              break;
            case 6:
              // uncaught
              // goto rethrow
              $async$goto = 2;
              break;
            case 9:
              // after finally
              $async$returnValue = $async$self._running.future;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$errorStack.at(-1), $async$completer);
          }
      });
      return A._asyncStartSync($async$_reload$1, $async$completer);
    },
    _reloadModule$1(moduleId) {
      var t1 = new A._Future($.Zone__current, type$._Future_dynamic),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_dynamic),
        stackTrace = A.StackTrace_current();
      type$.JavaScriptObject._as(init.G.$requireLoader).forceLoadModule(moduleId, A._functionToJS0(new A.RequireRestarter__reloadModule_closure(completer)), A._functionToJS1(new A.RequireRestarter__reloadModule_closure0(completer, stackTrace)));
      return t1;
    },
    _updateGraph$0() {
      var t3, stronglyConnectedComponents, i, _i,
        t1 = init.G,
        t2 = type$.JavaScriptObject;
      t2 = t2._as(t2._as(t1.$requireLoader).moduleParentsGraph);
      t3 = type$.String;
      stronglyConnectedComponents = A.stronglyConnectedComponents(A.JSArrayExtension_toDartIterable(type$.JSArray_nullable_Object._as(t1.Array.from(A._asJSObject(t2.keys()))), t3), this.get$_moduleParents(), t3);
      t3 = this._moduleOrdering;
      if (t3._collection$_length > 0) {
        t3._strings = t3._nums = t3._collection$_rest = t3._keys = null;
        t3._collection$_length = 0;
      }
      for (i = 0; i < stronglyConnectedComponents.length; ++i)
        for (t1 = stronglyConnectedComponents[i], t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i)
          t3.$indexSet(0, t1[_i], i);
    },
    $isRestarter: 1
  };
  A.RequireRestarter__reload_closure.prototype = {
    call$0() {
      var t1 = A._asJSObject(this.dart.getModuleLibraries(this._box_0.previousModuleId));
      t1 = A.JSArrayExtension_toDartIterable(type$.JSArray_nullable_Object._as(init.G.Object.values(t1)), type$.nullable_Object).get$first(0);
      t1.toString;
      type$.JavaScriptObject._as(t1).main();
    },
    $signature: 1
  };
  A.RequireRestarter__reloadModule_closure.prototype = {
    call$0() {
      this.completer.complete$0();
    },
    $signature: 1
  };
  A.RequireRestarter__reloadModule_closure0.prototype = {
    call$1(e) {
      this.completer.completeError$2(new A.HotReloadFailedException(A._asString(type$.JavaScriptObject._as(e).message)), this.stackTrace);
    },
    $signature: 90
  };
  A._createScript_closure.prototype = {
    call$0() {
      var nonce = A._findNonce();
      if (nonce == null)
        return new A._createScript__closure();
      return new A._createScript__closure0(nonce);
    },
    $signature: 91
  };
  A._createScript__closure.prototype = {
    call$0() {
      return A._asJSObject(A._asJSObject(init.G.document).createElement("script"));
    },
    $signature: 9
  };
  A._createScript__closure0.prototype = {
    call$0() {
      var scriptElement = A._asJSObject(A._asJSObject(init.G.document).createElement("script"));
      scriptElement.setAttribute("nonce", this.nonce);
      return scriptElement;
    },
    $signature: 9
  };
  A.runMain_closure.prototype = {
    call$0() {
      return this.scriptElement.remove();
    },
    $signature: 0
  };
  A.JSArrayExtension_toDartIterable_closure.prototype = {
    call$1(e) {
      return this.T._as(A.dartify(e));
    },
    $signature() {
      return this.T._eval$1("0(Object?)");
    }
  };
  (function aliases() {
    var _ = J.LegacyJavaScriptObject.prototype;
    _.super$LegacyJavaScriptObject$toString = _.toString$0;
    _ = A.JsLinkedHashMap.prototype;
    _.super$JsLinkedHashMap$internalContainsKey = _.internalContainsKey$1;
    _.super$JsLinkedHashMap$internalGet = _.internalGet$1;
    _.super$JsLinkedHashMap$internalSet = _.internalSet$2;
    _.super$JsLinkedHashMap$internalRemove = _.internalRemove$1;
    _ = A._BufferingStreamSubscription.prototype;
    _.super$_BufferingStreamSubscription$_add = _._add$1;
    _.super$_BufferingStreamSubscription$_addError = _._addError$2;
    _ = A._HashMap.prototype;
    _.super$_HashMap$_containsKey = _._containsKey$1;
    _.super$_HashMap$_get = _._get$1;
    _.super$_HashMap$_set = _._set$2;
    _ = A.ListBase.prototype;
    _.super$ListBase$setRange = _.setRange$4;
    _ = A.BaseRequest.prototype;
    _.super$BaseRequest$finalize = _.finalize$0;
    _ = A.SourceSpanMixin.prototype;
    _.super$SourceSpanMixin$compareTo = _.compareTo$1;
    _.super$SourceSpanMixin$$eq = _.$eq;
  })();
  (function installTearOffs() {
    var _static_2 = hunkHelpers._static_2,
      _static_1 = hunkHelpers._static_1,
      _static_0 = hunkHelpers._static_0,
      _static = hunkHelpers.installStaticTearOff,
      _instance = hunkHelpers.installInstanceTearOff,
      _instance_2_u = hunkHelpers._instance_2u,
      _instance_1_i = hunkHelpers._instance_1i,
      _instance_1_u = hunkHelpers._instance_1u,
      _instance_0_u = hunkHelpers._instance_0u;
    _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 31);
    _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 13);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 13);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 13);
    _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
    _static_1(A, "async___nullDataHandler$closure", "_nullDataHandler", 7);
    _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 10);
    _static_0(A, "async___nullDoneHandler$closure", "_nullDoneHandler", 0);
    _static(A, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 94, 0);
    _static(A, "async___rootRun$closure", 4, null, ["call$1$4", "call$4"], ["_rootRun", function($self, $parent, zone, f) {
      return A._rootRun($self, $parent, zone, f, type$.dynamic);
    }], 95, 1);
    _static(A, "async___rootRunUnary$closure", 5, null, ["call$2$5", "call$5"], ["_rootRunUnary", function($self, $parent, zone, f, arg) {
      var t1 = type$.dynamic;
      return A._rootRunUnary($self, $parent, zone, f, arg, t1, t1);
    }], 96, 1);
    _static(A, "async___rootRunBinary$closure", 6, null, ["call$3$6", "call$6"], ["_rootRunBinary", function($self, $parent, zone, f, arg1, arg2) {
      var t1 = type$.dynamic;
      return A._rootRunBinary($self, $parent, zone, f, arg1, arg2, t1, t1, t1);
    }], 97, 1);
    _static(A, "async___rootRegisterCallback$closure", 4, null, ["call$1$4", "call$4"], ["_rootRegisterCallback", function($self, $parent, zone, f) {
      return A._rootRegisterCallback($self, $parent, zone, f, type$.dynamic);
    }], 98, 0);
    _static(A, "async___rootRegisterUnaryCallback$closure", 4, null, ["call$2$4", "call$4"], ["_rootRegisterUnaryCallback", function($self, $parent, zone, f) {
      var t1 = type$.dynamic;
      return A._rootRegisterUnaryCallback($self, $parent, zone, f, t1, t1);
    }], 99, 0);
    _static(A, "async___rootRegisterBinaryCallback$closure", 4, null, ["call$3$4", "call$4"], ["_rootRegisterBinaryCallback", function($self, $parent, zone, f) {
      var t1 = type$.dynamic;
      return A._rootRegisterBinaryCallback($self, $parent, zone, f, t1, t1, t1);
    }], 100, 0);
    _static(A, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 101, 0);
    _static(A, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 102, 0);
    _static(A, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 103, 0);
    _static(A, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 104, 0);
    _static(A, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 105, 0);
    _static_1(A, "async___printToZone$closure", "_printToZone", 106);
    _static(A, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 107, 0);
    _instance(A._Completer.prototype, "get$completeError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 21, 0, 0);
    _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 10);
    var _;
    _instance_1_i(_ = A._StreamController.prototype, "get$add", "add$1", 8);
    _instance(_, "get$addError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["addError$2", "addError$1"], 21, 0, 0);
    _instance_1_u(_, "get$_add", "_add$1", 8);
    _instance_2_u(_, "get$_addError", "_addError$2", 10);
    _instance_0_u(_, "get$_close", "_close$0", 0);
    _instance_0_u(_ = A._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = A._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(A._DoneStreamSubscription.prototype, "get$_onMicrotask", "_onMicrotask$0", 0);
    _instance_0_u(_ = A._ForwardingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_1_u(_, "get$_handleData", "_handleData$1", 8);
    _instance_2_u(_, "get$_handleError", "_handleError$2", 22);
    _instance_0_u(_, "get$_handleDone", "_handleDone$0", 0);
    _static_2(A, "collection___defaultEquals$closure", "_defaultEquals0", 18);
    _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 17);
    _static_2(A, "collection_ListBase__compareAny$closure", "ListBase__compareAny", 31);
    _static_1(A, "convert___defaultToEncodable$closure", "_defaultToEncodable", 5);
    _instance_1_i(_ = A._ByteCallbackSink.prototype, "get$add", "add$1", 8);
    _instance_0_u(_, "get$close", "close$0", 0);
    _static_1(A, "core__identityHashCode$closure", "identityHashCode", 17);
    _static_2(A, "core__identical$closure", "identical", 18);
    _static_1(A, "core_Uri_decodeComponent$closure", "Uri_decodeComponent", 16);
    _static(A, "math__max$closure", 2, null, ["call$1$2", "call$2"], ["max", function(a, b) {
      return A.max(a, b, type$.num);
    }], 108, 1);
    _instance_2_u(_ = A.DeepCollectionEquality.prototype, "get$equals", "equals$2", 18);
    _instance_1_u(_, "get$hash", "hash$1", 17);
    _instance_1_u(_, "get$isValidKey", "isValidKey$1", 15);
    _static(A, "hot_reload_response_HotReloadResponse___new_tearOff$closure", 0, null, ["call$1", "call$0"], ["HotReloadResponse___new_tearOff", function() {
      return A.HotReloadResponse___new_tearOff(null);
    }], 109, 0);
    _static(A, "hot_restart_response_HotRestartResponse___new_tearOff$closure", 0, null, ["call$1", "call$0"], ["HotRestartResponse___new_tearOff", function() {
      return A.HotRestartResponse___new_tearOff(null);
    }], 73, 0);
    _static_1(A, "case_insensitive_map_CaseInsensitiveMap__canonicalizer$closure", "CaseInsensitiveMap__canonicalizer", 16);
    _instance_1_u(_ = A.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 2);
    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 2);
    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 67);
    _static_1(A, "client___handleAuthRequest$closure", "_handleAuthRequest", 2);
    _instance_1_u(_ = A.RequireRestarter.prototype, "get$_moduleParents", "_moduleParents$1", 88);
    _instance_2_u(_, "get$_moduleTopologicalCompare", "_moduleTopologicalCompare$2", 89);
  })();
  (function inheritance() {
    var _mixin = hunkHelpers.mixin,
      _inherit = hunkHelpers.inherit,
      _inheritMany = hunkHelpers.inheritMany;
    _inherit(A.Object, null);
    _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, A.SafeToStringHook, J.ArrayIterator, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.ListBase, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.ExpandIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.WhereTypeIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A._Record, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.LinkedHashMapValueIterator, A.LinkedHashMapEntryIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A._UnmodifiableNativeByteBufferView, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A._AsyncStarStreamController, A._IterationMarker, A.AsyncError, A.TimeoutException, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A.Stream, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._AddStreamState, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._DoneStreamSubscription, A._StreamIterator, A._ZoneFunction, A._ZoneSpecification, A._ZoneDelegate, A._Zone, A._HashMapKeyIterator, A.SetBase, A._HashSetIterator, A._LinkedHashSetCell, A._LinkedHashSetIterator, A._UnmodifiableMapMixin, A.MapView, A._ListQueueIterator, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A.Converter, A._Base64Encoder, A._Base64Decoder, A.ByteConversionSink, A._JsonStringifier, A._Utf8Encoder, A._Utf8Decoder, A._BigIntImpl, A.DateTime, A.Duration, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.MapEntry, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.NullRejectionException, A._JSRandom, A._JSSecureRandom, A.AsyncMemoizer, A.DelegatingStreamSink, A.ErrorResult, A.ValueResult, A.StreamQueue, A._NextRequest, A._HasNextRequest, A.BuiltList, A.ListBuilder, A.BuiltListMultimap, A.ListMultimapBuilder, A.BuiltMap, A.MapBuilder, A.BuiltSet, A.SetBuilder, A.BuiltSetMultimap, A.SetMultimapBuilder, A.EnumClass, A.IndentingBuiltValueToStringHelper, A.JsonObject, A.FullType, A.BigIntSerializer, A.BoolSerializer, A.BuiltJsonSerializers, A.BuiltJsonSerializersBuilder, A.BuiltListMultimapSerializer, A.BuiltListSerializer, A.BuiltMapSerializer, A.BuiltSetMultimapSerializer, A.BuiltSetSerializer, A.DateTimeSerializer, A.DoubleSerializer, A.DurationSerializer, A.Int32Serializer, A.Int64Serializer, A.IntSerializer, A.JsonObjectSerializer, A.ListSerializer, A.MapSerializer, A.NullSerializer, A.NumSerializer, A.RegExpSerializer, A.SetSerializer, A.StringSerializer, A.Uint8ListSerializer, A.UriSerializer, A.CanonicalizedMap, A.DefaultEquality, A.IterableEquality, A.ListEquality, A._UnorderedEquality, A._MapEntry, A.MapEquality, A.DeepCollectionEquality, A._QueueList_Object_ListMixin, A.BuildResult, A._$BuildStatusSerializer, A._$BuildResultSerializer, A.BuildResultBuilder, A.ConnectRequest, A._$ConnectRequestSerializer, A.ConnectRequestBuilder, A.DebugEvent, A.BatchedDebugEvents, A._$DebugEventSerializer, A._$BatchedDebugEventsSerializer, A.DebugEventBuilder, A.BatchedDebugEventsBuilder, A.DebugInfo, A._$DebugInfoSerializer, A.DebugInfoBuilder, A.DevToolsRequest, A.DevToolsResponse, A._$DevToolsRequestSerializer, A._$DevToolsResponseSerializer, A.DevToolsRequestBuilder, A.DevToolsResponseBuilder, A.ErrorResponse, A._$ErrorResponseSerializer, A.ErrorResponseBuilder, A.ExtensionRequest, A.ExtensionResponse, A.ExtensionEvent, A.BatchedEvents, A._$ExtensionRequestSerializer, A._$ExtensionResponseSerializer, A._$ExtensionEventSerializer, A._$BatchedEventsSerializer, A.ExtensionRequestBuilder, A.ExtensionResponseBuilder, A.ExtensionEventBuilder, A.BatchedEventsBuilder, A.HotReloadRequest, A._$HotReloadRequestSerializer, A.HotReloadRequestBuilder, A.HotReloadResponse, A._$HotReloadResponseSerializer, A.HotReloadResponseBuilder, A.HotRestartRequest, A._$HotRestartRequestSerializer, A.HotRestartRequestBuilder, A.HotRestartResponse, A._$HotRestartResponseSerializer, A.HotRestartResponseBuilder, A.IsolateExit, A.IsolateStart, A._$IsolateExitSerializer, A._$IsolateStartSerializer, A.IsolateExitBuilder, A.IsolateStartBuilder, A.RegisterEvent, A._$RegisterEventSerializer, A.RegisterEventBuilder, A.RunRequest, A._$RunRequestSerializer, A.ServiceExtensionRequest, A._$ServiceExtensionRequestSerializer, A.ServiceExtensionRequestBuilder, A.ServiceExtensionResponse, A._$ServiceExtensionResponseSerializer, A.ServiceExtensionResponseBuilder, A.BatchedStreamController, A.SocketClient, A.Int32, A.Int64, A._StackState, A.ClientException, A.BaseClient, A.BaseRequest, A.BaseResponse, A.MediaType, A.Level, A.LogRecord, A.Logger, A.Context, A.Style, A.ParsedPath, A.PathException, A.Pool, A.PoolResource, A.SourceFile, A.SourceLocationMixin, A.SourceSpanMixin, A.Highlighter, A._Highlight, A._Line, A.SourceLocation, A.SourceSpanException, A.StreamChannelMixin, A._GuaranteeSink, A.StreamChannelController, A.StringScanner, A.RNG, A.UuidV1, A.EventStreamProvider, A._EventStreamSubscription, A.BrowserWebSocket, A.WebSocketEvent, A.WebSocketException, A.WebSocketChannelException, A.DdcLibraryBundleRestarter, A.DdcRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]);
    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JavaScriptBigInt, J.JavaScriptSymbol, J.JSNumber, J.JSString]);
    _inheritMany(J.JavaScriptObject, [J.LegacyJavaScriptObject, J.JSArray, A.NativeByteBuffer, A.NativeTypedData]);
    _inheritMany(J.LegacyJavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction]);
    _inherit(J.JSArraySafeToStringHook, A.SafeToStringHook);
    _inherit(J.JSUnmodifiableArray, J.JSArray);
    _inheritMany(J.JSNumber, [J.JSInt, J.JSNumNotInt]);
    _inheritMany(A.Iterable, [A._CastIterableBase, A.EfficientLengthIterable, A.MappedIterable, A.WhereIterable, A.ExpandIterable, A.TakeIterable, A.SkipIterable, A.WhereTypeIterable, A._KeysOrValues, A._AllMatchesIterable, A._StringAllMatchesIterable]);
    _inheritMany(A._CastIterableBase, [A.CastIterable, A.__CastListBase__CastIterableBase_ListMixin]);
    _inherit(A._EfficientLengthCastIterable, A.CastIterable);
    _inherit(A._CastListBase, A.__CastListBase__CastIterableBase_ListMixin);
    _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.Instantiation, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._asyncStarHelper_closure0, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._CustomHashMap_closure, A._LinkedCustomHashMap_closure, A._BigIntImpl_hashCode_finish, A._Uri__makePath_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure, A.FutureOfVoidToJSPromise_get_toJS__closure, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.StreamQueue__ensureListening_closure, A.BuiltListMultimap_BuiltListMultimap_closure, A.BuiltListMultimap_hashCode_closure, A.ListMultimapBuilder_replace_closure, A.BuiltMap_BuiltMap_closure, A.BuiltMap_hashCode_closure, A.BuiltSet_hashCode_closure, A.BuiltSetMultimap_hashCode_closure, A.SetMultimapBuilder_replace_closure, A.newBuiltValueToStringHelper_closure, A.BuiltListMultimapSerializer_serialize_closure, A.BuiltListMultimapSerializer_deserialize_closure, A.BuiltListSerializer_serialize_closure, A.BuiltListSerializer_deserialize_closure, A.BuiltSetMultimapSerializer_serialize_closure, A.BuiltSetMultimapSerializer_deserialize_closure, A.BuiltSetSerializer_serialize_closure, A.BuiltSetSerializer_deserialize_closure, A.ListSerializer_serialize_closure, A.SetSerializer_serialize_closure, A.CanonicalizedMap_keys_closure, A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure, A.WebSocketClient_stream_closure, A.BaseRequest_closure0, A.BrowserClient_send_closure, A._readBody_closure, A._readBody_closure0, A.ByteStream_toBytes_closure, A.MediaType_toString__closure, A.expectQuotedString_closure, A.Context_joinAll_closure, A.Context_split_closure, A._validateArgList_closure, A.Pool__runOnRelease_closure, A.Highlighter$__closure, A.Highlighter$___closure, A.Highlighter$__closure0, A.Highlighter__collateLines_closure, A.Highlighter__collateLines_closure1, A.Highlighter__collateLines__closure, A.Highlighter_highlight_closure, A.SseClient_closure0, A.SseClient_closure1, A._GuaranteeSink__addError_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.BrowserWebSocket_connect_closure, A.BrowserWebSocket_connect_closure0, A.BrowserWebSocket_connect_closure1, A.BrowserWebSocket_connect_closure2, A.AdapterWebSocketChannel_closure, A.AdapterWebSocketChannel__closure, A.AdapterWebSocketChannel__closure0, A.AdapterWebSocketChannel_closure0, A.main__closure1, A.main__closure3, A.main___closure2, A.main___closure1, A.main__closure5, A.main___closure0, A.main___closure, A.main__closure7, A.main__closure8, A.main__closure9, A._sendConnectRequest_closure, A._launchCommunicationWithDebugExtension_closure, A._handleAuthRequest_closure, A._sendResponse_closure, A.DdcLibraryBundleRestarter_restart_closure, A.DdcLibraryBundleRestarter_hotReloadStart_closure, A.DdcRestarter_restart_closure0, A.DdcRestarter_restart_closure, A.RequireRestarter__reloadModule_closure0, A.JSArrayExtension_toDartIterable_closure]);
    _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure0, A._Future_timeout_closure1, A._AddStreamState_makeErrorHandler_closure, A._BufferingStreamSubscription_asFuture_closure0, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._BigIntImpl_hashCode_combine, A.Uri_parseIPv6Address_error, A.FutureOfJSAnyToJSPromise_get_toJS_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure0, A.FutureOfVoidToJSPromise_get_toJS_closure, A.FutureOfVoidToJSPromise_get_toJS__closure0, A.StreamQueue__ensureListening_closure1, A.hashObjects_closure, A.MapBuilder_replace_closure, A.CanonicalizedMap_addAll_closure, A.CanonicalizedMap_forEach_closure, A.CanonicalizedMap_map_closure, A.safeUnawaited_closure, A.BaseRequest_closure, A.MediaType_toString_closure, A.Pool__runOnRelease_closure0, A.Highlighter__collateLines_closure0, A.main__closure4, A.main_closure0]);
    _inherit(A.CastList, A._CastListBase);
    _inheritMany(A.MapBase, [A.CastMap, A.JsLinkedHashMap, A._HashMap, A._JsonMap]);
    _inheritMany(A.Error, [A.LateError, A.TypeError, A.JsNoSuchMethodError, A.UnknownJsTypeError, A.RuntimeError, A._Error, A.JsonUnsupportedObjectError, A.AssertionError, A.ArgumentError, A.UnsupportedError, A.UnimplementedError, A.StateError, A.ConcurrentModificationError, A.BuiltValueNullFieldError, A.BuiltValueNestedFieldError, A.DeserializationError]);
    _inherit(A.UnmodifiableListBase, A.ListBase);
    _inheritMany(A.UnmodifiableListBase, [A.CodeUnits, A.UnmodifiableListView]);
    _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl$periodic_closure, A._asyncStarHelper_closure, A._AsyncStarStreamController__resumeBody, A._AsyncStarStreamController__resumeBody_closure, A._AsyncStarStreamController_closure0, A._AsyncStarStreamController_closure1, A._AsyncStarStreamController_closure, A._AsyncStarStreamController__closure, A.Future_Future$microtask_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainCoreFuture_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteErrorObject_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._AddStreamState_cancel_closure, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A._Utf8Decoder__decoder_closure, A._Utf8Decoder__decoderNonfatal_closure, A.StreamQueue__ensureListening_closure0, A.Serializers_Serializers_closure, A.Serializers_Serializers_closure0, A.Serializers_Serializers_closure1, A.Serializers_Serializers_closure2, A.Serializers_Serializers_closure3, A._$serializers_closure, A._$serializers_closure0, A.BatchedStreamController__hasEventOrTimeOut_closure, A.BatchedStreamController__hasEventDuring_closure, A.MediaType_MediaType$parse_closure, A.Logger_Logger_closure, A.Highlighter_closure, A.Highlighter__writeFileStart_closure, A.Highlighter__writeMultilineHighlights_closure, A.Highlighter__writeMultilineHighlights_closure0, A.Highlighter__writeMultilineHighlights_closure1, A.Highlighter__writeMultilineHighlights_closure2, A.Highlighter__writeMultilineHighlights__closure, A.Highlighter__writeMultilineHighlights__closure0, A.Highlighter__writeHighlightedText_closure, A.Highlighter__writeIndicator_closure, A.Highlighter__writeIndicator_closure0, A.Highlighter__writeIndicator_closure1, A.Highlighter__writeSidebar_closure, A._Highlight_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.GuaranteeChannel_closure, A.GuaranteeChannel__closure, A.AdapterWebSocketChannel__closure1, A.main_closure, A.main__closure, A.main__closure0, A.main__closure2, A.main__closure6, A.DdcLibraryBundleRestarter__getSrcModuleLibraries_closure, A.RequireRestarter__reload_closure, A.RequireRestarter__reloadModule_closure, A._createScript_closure, A._createScript__closure, A._createScript__closure0, A.runMain_closure]);
    _inheritMany(A.EfficientLengthIterable, [A.ListIterable, A.EmptyIterable, A.LinkedHashMapKeysIterable, A.LinkedHashMapValuesIterable, A.LinkedHashMapEntriesIterable, A._HashMapKeyIterable]);
    _inheritMany(A.ListIterable, [A.SubListIterable, A.MappedListIterable, A.ReversedListIterable, A.ListQueue, A._JsonMapKeyIterable]);
    _inherit(A.EfficientLengthMappedIterable, A.MappedIterable);
    _inherit(A.EfficientLengthTakeIterable, A.TakeIterable);
    _inherit(A.EfficientLengthSkipIterable, A.SkipIterable);
    _inherit(A._Record2, A._Record);
    _inherit(A._Record_2, A._Record2);
    _inherit(A.ConstantStringMap, A.ConstantMap);
    _inherit(A.Instantiation1, A.Instantiation);
    _inherit(A.NullError, A.TypeError);
    _inheritMany(A.TearOffClosure, [A.StaticClosure, A.BoundClosure]);
    _inheritMany(A.JsLinkedHashMap, [A.JsIdentityLinkedHashMap, A._LinkedCustomHashMap]);
    _inherit(A.NativeArrayBuffer, A.NativeByteBuffer);
    _inheritMany(A.NativeTypedData, [A.NativeByteData, A.NativeTypedArray]);
    _inheritMany(A.NativeTypedArray, [A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]);
    _inherit(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfDouble, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inherit(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfInt, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inheritMany(A.NativeTypedArrayOfDouble, [A.NativeFloat32List, A.NativeFloat64List]);
    _inheritMany(A.NativeTypedArrayOfInt, [A.NativeInt16List, A.NativeInt32List, A.NativeInt8List, A.NativeUint16List, A.NativeUint32List, A.NativeUint8ClampedList, A.NativeUint8List]);
    _inherit(A._TypeError, A._Error);
    _inheritMany(A._Completer, [A._AsyncCompleter, A._SyncCompleter]);
    _inheritMany(A.Stream, [A.StreamView, A._StreamImpl, A._EmptyStream, A._ForwardingStream, A._EventStream]);
    _inheritMany(A._StreamController, [A._AsyncStreamController, A._SyncStreamController]);
    _inherit(A._ControllerStream, A._StreamImpl);
    _inheritMany(A._BufferingStreamSubscription, [A._ControllerSubscription, A._ForwardingStreamSubscription]);
    _inherit(A._StreamControllerAddStreamState, A._AddStreamState);
    _inheritMany(A._DelayedEvent, [A._DelayedData, A._DelayedError]);
    _inherit(A._MapStream, A._ForwardingStream);
    _inheritMany(A._Zone, [A._CustomZone, A._RootZone]);
    _inheritMany(A._HashMap, [A._IdentityHashMap, A._CustomHashMap]);
    _inherit(A._SetBase, A.SetBase);
    _inheritMany(A._SetBase, [A._HashSet, A._LinkedHashSet]);
    _inherit(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A.MapView);
    _inherit(A.UnmodifiableMapView, A._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
    _inherit(A._SplayTreeSetNode, A._SplayTreeNode);
    _inherit(A._SplayTreeKeyIterator, A._SplayTreeIterator);
    _inherit(A._SplayTreeSet__SplayTree_Iterable, A._SplayTree);
    _inherit(A._SplayTreeSet__SplayTree_Iterable_SetMixin, A._SplayTreeSet__SplayTree_Iterable);
    _inherit(A.SplayTreeSet, A._SplayTreeSet__SplayTree_Iterable_SetMixin);
    _inheritMany(A.Codec, [A.Encoding, A.Base64Codec, A.JsonCodec]);
    _inheritMany(A.Encoding, [A.AsciiCodec, A.Latin1Codec, A.Utf8Codec]);
    _inheritMany(A.Converter, [A._UnicodeSubsetEncoder, A._UnicodeSubsetDecoder, A.Base64Encoder, A.Base64Decoder, A.JsonEncoder, A.JsonDecoder, A.Utf8Encoder, A.Utf8Decoder]);
    _inheritMany(A._UnicodeSubsetEncoder, [A.AsciiEncoder, A.Latin1Encoder]);
    _inheritMany(A._UnicodeSubsetDecoder, [A.AsciiDecoder, A.Latin1Decoder]);
    _inherit(A._ByteCallbackSink, A.ByteConversionSink);
    _inherit(A.JsonCyclicError, A.JsonUnsupportedObjectError);
    _inherit(A._JsonStringStringifier, A._JsonStringifier);
    _inheritMany(A.ArgumentError, [A.RangeError, A.IndexError]);
    _inherit(A._DataUri, A._Uri);
    _inherit(A._BuiltList, A.BuiltList);
    _inherit(A._BuiltListMultimap, A.BuiltListMultimap);
    _inherit(A._BuiltMap, A.BuiltMap);
    _inherit(A._BuiltSet, A.BuiltSet);
    _inherit(A._BuiltSetMultimap, A.BuiltSetMultimap);
    _inheritMany(A.JsonObject, [A.BoolJsonObject, A.ListJsonObject, A.MapJsonObject, A.NumJsonObject, A.StringJsonObject]);
    _inherit(A.SetEquality, A._UnorderedEquality);
    _inherit(A.QueueList, A._QueueList_Object_ListMixin);
    _inherit(A._CastQueueList, A.QueueList);
    _inherit(A.BuildStatus, A.EnumClass);
    _inherit(A._$BuildResult, A.BuildResult);
    _inherit(A._$ConnectRequest, A.ConnectRequest);
    _inherit(A._$DebugEvent, A.DebugEvent);
    _inherit(A._$BatchedDebugEvents, A.BatchedDebugEvents);
    _inherit(A._$DebugInfo, A.DebugInfo);
    _inherit(A._$DevToolsRequest, A.DevToolsRequest);
    _inherit(A._$DevToolsResponse, A.DevToolsResponse);
    _inherit(A._$ErrorResponse, A.ErrorResponse);
    _inherit(A._$ExtensionRequest, A.ExtensionRequest);
    _inherit(A._$ExtensionResponse, A.ExtensionResponse);
    _inherit(A._$ExtensionEvent, A.ExtensionEvent);
    _inherit(A._$BatchedEvents, A.BatchedEvents);
    _inherit(A._$HotReloadRequest, A.HotReloadRequest);
    _inherit(A._$HotReloadResponse, A.HotReloadResponse);
    _inherit(A._$HotRestartRequest, A.HotRestartRequest);
    _inherit(A._$HotRestartResponse, A.HotRestartResponse);
    _inherit(A._$IsolateExit, A.IsolateExit);
    _inherit(A._$IsolateStart, A.IsolateStart);
    _inherit(A._$RegisterEvent, A.RegisterEvent);
    _inherit(A._$RunRequest, A.RunRequest);
    _inherit(A._$ServiceExtensionRequest, A.ServiceExtensionRequest);
    _inherit(A._$ServiceExtensionResponse, A.ServiceExtensionResponse);
    _inheritMany(A.SocketClient, [A.SseSocketClient, A.WebSocketClient]);
    _inherit(A.RequestAbortedException, A.ClientException);
    _inherit(A.BrowserClient, A.BaseClient);
    _inherit(A.ByteStream, A.StreamView);
    _inherit(A.Request, A.BaseRequest);
    _inheritMany(A.BaseResponse, [A.Response, A.StreamedResponse]);
    _inherit(A.StreamedResponseV2, A.StreamedResponse);
    _inherit(A.CaseInsensitiveMap, A.CanonicalizedMap);
    _inherit(A.InternalStyle, A.Style);
    _inheritMany(A.InternalStyle, [A.PosixStyle, A.UrlStyle, A.WindowsStyle]);
    _inherit(A.FileLocation, A.SourceLocationMixin);
    _inheritMany(A.SourceSpanMixin, [A._FileSpan, A.SourceSpanBase]);
    _inherit(A.SourceSpanFormatException, A.SourceSpanException);
    _inherit(A.SourceSpanWithContext, A.SourceSpanBase);
    _inheritMany(A.StreamChannelMixin, [A.SseClient, A.GuaranteeChannel, A.AdapterWebSocketChannel]);
    _inherit(A.StringScannerException, A.SourceSpanFormatException);
    _inherit(A.CryptoRNG, A.RNG);
    _inheritMany(A.WebSocketEvent, [A.TextDataReceived, A.BinaryDataReceived, A.CloseReceived]);
    _inherit(A.WebSocketConnectionClosed, A.WebSocketException);
    _inherit(A._WebSocketSink, A.DelegatingStreamSink);
    _mixin(A.UnmodifiableListBase, A.UnmodifiableListMixin);
    _mixin(A.__CastListBase__CastIterableBase_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._AsyncStreamController, A._AsyncStreamControllerDispatch);
    _mixin(A._SyncStreamController, A._SyncStreamControllerDispatch);
    _mixin(A._SplayTreeSet__SplayTree_Iterable, A.Iterable);
    _mixin(A._SplayTreeSet__SplayTree_Iterable_SetMixin, A.SetBase);
    _mixin(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A._UnmodifiableMapMixin);
    _mixin(A._QueueList_Object_ListMixin, A.ListBase);
  })();
  var init = {
    G: typeof self != "undefined" ? self : globalThis,
    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
    mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List", Object: "Object", Map: "Map", JSObject: "JSObject"},
    mangledNames: {},
    types: ["~()", "Null()", "~(JSObject)", "Object?(@)", "Null(Object,StackTrace)", "@(@)", "Null(@)", "~(@)", "~(Object?)", "JSObject()", "~(Object,StackTrace)", "Object?(Object?)", "bool(_Highlight)", "~(~())", "Null(JSObject)", "bool(Object?)", "String(String)", "int(Object?)", "bool(Object?,Object?)", "Future<~>()", "int()", "~(Object[StackTrace?])", "~(@,StackTrace)", "Null(JavaScriptFunction)", "~(@,@)", "~(Object?,Object?)", "@()", "bool(String)", "String(Match)", "bool()", "Null(JavaScriptFunction,JavaScriptFunction)", "int(@,@)", "int(_Line)", "ListMultimapBuilder<Object,Object>()", "MapBuilder<Object,Object>()", "SetBuilder<Object>()", "SetMultimapBuilder<Object,Object>()", "int(int,@)", "Object?(~)", "JSObject(Object,StackTrace)", "ListBuilder<DebugEvent>()", "ListBuilder<ExtensionEvent>()", "~(ServiceExtensionResponseBuilder)", "0&(String,int?)", "String(@)", "bool(String,String)", "int(String)", "Null(String,String[Object?])", "bool(Object)", "~(List<int>)", "MediaType()", "~(String,String)", "int(int)", "Logger()", "int(int,int)", "~(Zone,ZoneDelegate,Zone,Object,StackTrace)", "Null(~)", "String?()", "ListBuilder<Object>()", "_Future<@>?()", "Object(_Line)", "Object(_Highlight)", "int(_Highlight,_Highlight)", "List<_Line>(MapEntry<Object,List<_Highlight>>)", "~(int,@)", "SourceSpanWithContext()", "Null(@,StackTrace)", "~(String?)", "Future<Null>()", "Null(~())", "Null(WebSocket)", "~(WebSocketEvent)", "Null(Object)", "HotRestartResponse([~(HotRestartResponseBuilder)])", "JSObject(String[bool?])", "~(List<DebugEvent>)", "ListBuilder<DebugEvent>(BatchedDebugEventsBuilder)", "Null(String,String)", "DebugEventBuilder(DebugEventBuilder)", "Null(String)", "RegisterEventBuilder(RegisterEventBuilder)", "DevToolsRequestBuilder(DevToolsRequestBuilder)", "Future<~>(String)", "ConnectRequestBuilder(ConnectRequestBuilder)", "IndentingBuiltValueToStringHelper(String)", "~(bool)", "@(String)", "bool(bool)", "List<String>(String)", "int(String,String)", "Null(JavaScriptObject)", "JSObject()()", "String(String?)", "@(@,String)", "~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)", "0^(Zone?,ZoneDelegate?,Zone,0^())<Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)<Object?,Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>", "0^()(Zone,ZoneDelegate,Zone,0^())<Object?>", "0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>", "0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>", "AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)", "~(Zone?,ZoneDelegate?,Zone,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))", "~(Zone,ZoneDelegate,Zone,String)", "~(String)", "Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map<Object?,Object?>?)", "0^(0^,0^)<num>", "HotReloadResponse([~(HotReloadResponseBuilder)])", "DebugInfoBuilder(DebugInfoBuilder)"],
    interceptorsByTag: null,
    leafTags: null,
    arrayRti: Symbol("$ti"),
    rttc: {
      "2;": (t1, t2) => o => o instanceof A._Record_2 && t1._is(o._0) && t2._is(o._1)
    }
  };
  A._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"LegacyJavaScriptObject","PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","NativeSharedArrayBuffer":"NativeByteBuffer","JavaScriptObject":{"JSObject":[]},"JSArray":{"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"JSIndexable":["1"],"Iterable.E":"1"},"JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"LegacyJavaScriptObject":{"JavaScriptObject":[],"JSObject":[]},"JSArraySafeToStringHook":{"SafeToStringHook":[]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"JSIndexable":["1"],"Iterable.E":"1"},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[],"JSIndexable":["@"],"TrustedGetRuntimeType":[]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","Iterable.E":"2"},"CastMap":{"MapBase":["3","4"],"Map":["3","4"],"MapBase.K":"3","MapBase.V":"4"},"LateError":{"Error":[]},"CodeUnits":{"ListBase":["int"],"UnmodifiableListMixin":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListBase.E":"int","Iterable.E":"int","UnmodifiableListMixin.E":"int"},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListIterable.E":"2","Iterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"ExpandIterable":{"Iterable":["2"],"Iterable.E":"2"},"ExpandIterator":{"Iterator":["2"]},"TakeIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthTakeIterable":{"TakeIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"TakeIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"WhereTypeIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereTypeIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_Record_2":{"_Record2":[],"_Record":[]},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_KeysOrValues":{"Iterable":["1"],"Iterable.E":"1"},"_KeysOrValuesOrElementsIterator":{"Iterator":["1"]},"Instantiation":{"Closure":[],"Function":[]},"Instantiation1":{"Closure":[],"Function":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"NullThrownFromJavaScriptException":{"Exception":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Closure":[],"Function":[]},"Closure2Args":{"Closure":[],"Function":[]},"TearOffClosure":{"Closure":[],"Function":[]},"StaticClosure":{"Closure":[],"Function":[]},"BoundClosure":{"Closure":[],"Function":[]},"RuntimeError":{"Error":[]},"JsLinkedHashMap":{"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"LinkedHashMapKeysIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"LinkedHashMapValuesIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapValueIterator":{"Iterator":["1"]},"LinkedHashMapEntriesIterable":{"EfficientLengthIterable":["MapEntry<1,2>"],"Iterable":["MapEntry<1,2>"],"Iterable.E":"MapEntry<1,2>"},"LinkedHashMapEntryIterator":{"Iterator":["MapEntry<1,2>"]},"JsIdentityLinkedHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_Record2":{"_Record":[]},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"JavaScriptObject":[],"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeArrayBuffer":{"NativeByteBuffer":[],"JavaScriptObject":[],"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeTypedData":{"JavaScriptObject":[],"JSObject":[]},"_UnmodifiableNativeByteBufferView":{"ByteBuffer":[]},"NativeByteData":{"JavaScriptObject":[],"ByteData":[],"JSObject":[],"TrustedGetRuntimeType":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"JavaScriptObject":[],"JSObject":[],"JSIndexable":["1"]},"NativeTypedArrayOfDouble":{"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"Float32List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double","FixedLengthListMixin.E":"double"},"NativeFloat64List":{"Float64List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double","FixedLengthListMixin.E":"double"},"NativeInt16List":{"NativeTypedArrayOfInt":[],"Int16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeInt32List":{"NativeTypedArrayOfInt":[],"Int32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeInt8List":{"NativeTypedArrayOfInt":[],"Int8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint16List":{"NativeTypedArrayOfInt":[],"Uint16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint32List":{"NativeTypedArrayOfInt":[],"Uint32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8ClampedList":{"NativeTypedArrayOfInt":[],"Uint8ClampedList":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8List":{"NativeTypedArrayOfInt":[],"Uint8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"_Type":{"Type":[]},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"AsyncError":{"Error":[]},"_Future":{"Future":["1"]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"StreamView":{"Stream":["1"]},"_StreamController":{"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamSinkWrapper":{"StreamSink":["1"]},"_StreamControllerAddStreamState":{"_AddStreamState":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_DoneStreamSubscription":{"StreamSubscription":["1"]},"_EmptyStream":{"Stream":["1"],"Stream.T":"1"},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_EventSink":["2"],"_EventDispatch":["2"],"_BufferingStreamSubscription.T":"2"},"_MapStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"_ZoneSpecification":{"ZoneSpecification":[]},"_ZoneDelegate":{"ZoneDelegate":[]},"_Zone":{"Zone":[]},"_CustomZone":{"_Zone":[],"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_SplayTreeSetNode":{"_SplayTreeNode":["1","_SplayTreeSetNode<1>"],"_SplayTreeNode.K":"1","_SplayTreeNode.1":"_SplayTreeSetNode<1>"},"_HashMap":{"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_IdentityHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_CustomHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_LinkedCustomHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashSetIterator":{"Iterator":["1"]},"_LinkedHashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_LinkedHashSetIterator":{"Iterator":["1"]},"UnmodifiableListView":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1","UnmodifiableListMixin.E":"1"},"ListBase":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ListQueue":{"Queue":["1"],"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SetBase":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SplayTreeIterator":{"Iterator":["3"]},"_SplayTreeKeyIterator":{"_SplayTreeIterator":["1","2","1"],"Iterator":["1"],"_SplayTreeIterator.K":"1","_SplayTreeIterator.T":"1","_SplayTreeIterator.1":"2"},"SplayTreeSet":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"_SplayTree":["1","_SplayTreeSetNode<1>"],"Iterable":["1"],"Iterable.E":"1","_SplayTree.1":"_SplayTreeSetNode<1>","_SplayTree.K":"1"},"Encoding":{"Codec":["String","List<int>"]},"_JsonMap":{"MapBase":["String","@"],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"AsciiCodec":{"Encoding":[],"Codec":["String","List<int>"],"Codec.S":"String"},"_UnicodeSubsetEncoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"AsciiEncoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"_UnicodeSubsetDecoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"AsciiDecoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"Base64Codec":{"Codec":["List<int>","String"],"Codec.S":"List<int>"},"Base64Encoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"Base64Decoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"Converter":{"StreamTransformer":["1","2"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"],"StreamTransformer":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"],"StreamTransformer":["String","Object?"]},"Latin1Codec":{"Encoding":[],"Codec":["String","List<int>"],"Codec.S":"String"},"Latin1Encoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"Latin1Decoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"Utf8Codec":{"Encoding":[],"Codec":["String","List<int>"],"Codec.S":"String"},"Utf8Encoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"Utf8Decoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExp":{"Pattern":[]},"RegExpMatch":{"Match":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"_Exception":{"Exception":[]},"FormatException":{"Exception":[]},"IntegerDivisionByZeroException":{"Exception":[],"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"NullRejectionException":{"Exception":[]},"DelegatingStreamSink":{"StreamSink":["1"]},"ErrorResult":{"Result":["0&"]},"ValueResult":{"Result":["1"]},"_NextRequest":{"_EventRequest":["1"]},"_HasNextRequest":{"_EventRequest":["1"]},"BuiltList":{"Iterable":["1"]},"_BuiltList":{"BuiltList":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltListMultimap":{"BuiltListMultimap":["1","2"]},"_BuiltMap":{"BuiltMap":["1","2"]},"BuiltSet":{"Iterable":["1"]},"_BuiltSet":{"BuiltSet":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltSetMultimap":{"BuiltSetMultimap":["1","2"]},"BuiltValueNullFieldError":{"Error":[]},"BuiltValueNestedFieldError":{"Error":[]},"BoolJsonObject":{"JsonObject":[]},"ListJsonObject":{"JsonObject":[]},"MapJsonObject":{"JsonObject":[]},"NumJsonObject":{"JsonObject":[]},"StringJsonObject":{"JsonObject":[]},"DeserializationError":{"Error":[]},"BigIntSerializer":{"PrimitiveSerializer":["BigInt"],"Serializer":["BigInt"]},"BoolSerializer":{"PrimitiveSerializer":["bool"],"Serializer":["bool"]},"BuiltJsonSerializers":{"Serializers":[]},"BuiltListMultimapSerializer":{"StructuredSerializer":["BuiltListMultimap<@,@>"],"Serializer":["BuiltListMultimap<@,@>"]},"BuiltListSerializer":{"StructuredSerializer":["BuiltList<@>"],"Serializer":["BuiltList<@>"]},"BuiltMapSerializer":{"StructuredSerializer":["BuiltMap<@,@>"],"Serializer":["BuiltMap<@,@>"]},"BuiltSetMultimapSerializer":{"StructuredSerializer":["BuiltSetMultimap<@,@>"],"Serializer":["BuiltSetMultimap<@,@>"]},"BuiltSetSerializer":{"StructuredSerializer":["BuiltSet<@>"],"Serializer":["BuiltSet<@>"]},"DateTimeSerializer":{"PrimitiveSerializer":["DateTime"],"Serializer":["DateTime"]},"DoubleSerializer":{"PrimitiveSerializer":["double"],"Serializer":["double"]},"DurationSerializer":{"PrimitiveSerializer":["Duration"],"Serializer":["Duration"]},"Int32Serializer":{"PrimitiveSerializer":["Int32"],"Serializer":["Int32"]},"Int64Serializer":{"PrimitiveSerializer":["Int64"],"Serializer":["Int64"]},"IntSerializer":{"PrimitiveSerializer":["int"],"Serializer":["int"]},"JsonObjectSerializer":{"PrimitiveSerializer":["JsonObject"],"Serializer":["JsonObject"]},"ListSerializer":{"StructuredSerializer":["List<@>"],"Serializer":["List<@>"]},"MapSerializer":{"StructuredSerializer":["Map<@,@>"],"Serializer":["Map<@,@>"]},"NullSerializer":{"PrimitiveSerializer":["Null"],"Serializer":["Null"]},"NumSerializer":{"PrimitiveSerializer":["num"],"Serializer":["num"]},"RegExpSerializer":{"PrimitiveSerializer":["RegExp"],"Serializer":["RegExp"]},"SetSerializer":{"StructuredSerializer":["Set<@>"],"Serializer":["Set<@>"]},"StringSerializer":{"PrimitiveSerializer":["String"],"Serializer":["String"]},"Uint8ListSerializer":{"PrimitiveSerializer":["Uint8List"],"Serializer":["Uint8List"]},"UriSerializer":{"PrimitiveSerializer":["Uri"],"Serializer":["Uri"]},"CanonicalizedMap":{"Map":["2","3"]},"DefaultEquality":{"Equality":["1"]},"IterableEquality":{"Equality":["Iterable<1>"]},"ListEquality":{"Equality":["List<1>"]},"_UnorderedEquality":{"Equality":["2"]},"SetEquality":{"_UnorderedEquality":["1","Set<1>"],"Equality":["Set<1>"],"_UnorderedEquality.E":"1","_UnorderedEquality.T":"Set<1>"},"MapEquality":{"Equality":["Map<1,2>"]},"DeepCollectionEquality":{"Equality":["@"]},"QueueList":{"ListBase":["1"],"List":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","QueueList.E":"1","Iterable.E":"1"},"_CastQueueList":{"QueueList":["2"],"ListBase":["2"],"List":["2"],"Queue":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","QueueList.E":"2","Iterable.E":"2"},"_$BuildStatusSerializer":{"PrimitiveSerializer":["BuildStatus"],"Serializer":["BuildStatus"]},"_$BuildResultSerializer":{"StructuredSerializer":["BuildResult"],"Serializer":["BuildResult"]},"_$BuildResult":{"BuildResult":[]},"_$ConnectRequestSerializer":{"StructuredSerializer":["ConnectRequest"],"Serializer":["ConnectRequest"]},"_$ConnectRequest":{"ConnectRequest":[]},"_$DebugEventSerializer":{"StructuredSerializer":["DebugEvent"],"Serializer":["DebugEvent"]},"_$BatchedDebugEventsSerializer":{"StructuredSerializer":["BatchedDebugEvents"],"Serializer":["BatchedDebugEvents"]},"_$DebugEvent":{"DebugEvent":[]},"_$BatchedDebugEvents":{"BatchedDebugEvents":[]},"_$DebugInfoSerializer":{"StructuredSerializer":["DebugInfo"],"Serializer":["DebugInfo"]},"_$DebugInfo":{"DebugInfo":[]},"_$DevToolsRequestSerializer":{"StructuredSerializer":["DevToolsRequest"],"Serializer":["DevToolsRequest"]},"_$DevToolsResponseSerializer":{"StructuredSerializer":["DevToolsResponse"],"Serializer":["DevToolsResponse"]},"_$DevToolsRequest":{"DevToolsRequest":[]},"_$DevToolsResponse":{"DevToolsResponse":[]},"_$ErrorResponseSerializer":{"StructuredSerializer":["ErrorResponse"],"Serializer":["ErrorResponse"]},"_$ErrorResponse":{"ErrorResponse":[]},"_$ExtensionRequestSerializer":{"StructuredSerializer":["ExtensionRequest"],"Serializer":["ExtensionRequest"]},"_$ExtensionResponseSerializer":{"StructuredSerializer":["ExtensionResponse"],"Serializer":["ExtensionResponse"]},"_$ExtensionEventSerializer":{"StructuredSerializer":["ExtensionEvent"],"Serializer":["ExtensionEvent"]},"_$BatchedEventsSerializer":{"StructuredSerializer":["BatchedEvents"],"Serializer":["BatchedEvents"]},"_$ExtensionRequest":{"ExtensionRequest":[]},"_$ExtensionResponse":{"ExtensionResponse":[]},"_$ExtensionEvent":{"ExtensionEvent":[]},"_$BatchedEvents":{"BatchedEvents":[]},"_$HotReloadRequestSerializer":{"StructuredSerializer":["HotReloadRequest"],"Serializer":["HotReloadRequest"]},"_$HotReloadRequest":{"HotReloadRequest":[]},"_$HotReloadResponseSerializer":{"StructuredSerializer":["HotReloadResponse"],"Serializer":["HotReloadResponse"]},"_$HotReloadResponse":{"HotReloadResponse":[]},"_$HotRestartRequestSerializer":{"StructuredSerializer":["HotRestartRequest"],"Serializer":["HotRestartRequest"]},"_$HotRestartRequest":{"HotRestartRequest":[]},"_$HotRestartResponseSerializer":{"StructuredSerializer":["HotRestartResponse"],"Serializer":["HotRestartResponse"]},"_$HotRestartResponse":{"HotRestartResponse":[]},"_$IsolateExitSerializer":{"StructuredSerializer":["IsolateExit"],"Serializer":["IsolateExit"]},"_$IsolateStartSerializer":{"StructuredSerializer":["IsolateStart"],"Serializer":["IsolateStart"]},"_$IsolateExit":{"IsolateExit":[]},"_$IsolateStart":{"IsolateStart":[]},"_$RegisterEventSerializer":{"StructuredSerializer":["RegisterEvent"],"Serializer":["RegisterEvent"]},"_$RegisterEvent":{"RegisterEvent":[]},"_$RunRequestSerializer":{"StructuredSerializer":["RunRequest"],"Serializer":["RunRequest"]},"_$RunRequest":{"RunRequest":[]},"_$ServiceExtensionRequestSerializer":{"StructuredSerializer":["ServiceExtensionRequest"],"Serializer":["ServiceExtensionRequest"]},"_$ServiceExtensionRequest":{"ServiceExtensionRequest":[]},"_$ServiceExtensionResponseSerializer":{"StructuredSerializer":["ServiceExtensionResponse"],"Serializer":["ServiceExtensionResponse"]},"_$ServiceExtensionResponse":{"ServiceExtensionResponse":[]},"SseSocketClient":{"SocketClient":[]},"WebSocketClient":{"SocketClient":[]},"Int32":{"Comparable":["Object"]},"Int64":{"Comparable":["Object"]},"RequestAbortedException":{"Exception":[]},"ByteStream":{"StreamView":["List<int>"],"Stream":["List<int>"],"Stream.T":"List<int>","StreamView.T":"List<int>"},"ClientException":{"Exception":[]},"Request":{"BaseRequest":[]},"StreamedResponseV2":{"StreamedResponse":[]},"CaseInsensitiveMap":{"CanonicalizedMap":["String","String","1"],"Map":["String","1"],"CanonicalizedMap.K":"String","CanonicalizedMap.V":"1","CanonicalizedMap.C":"String"},"Level":{"Comparable":["Level"]},"PathException":{"Exception":[]},"PosixStyle":{"InternalStyle":[]},"UrlStyle":{"InternalStyle":[]},"WindowsStyle":{"InternalStyle":[]},"FileLocation":{"SourceLocation":[],"Comparable":["SourceLocation"]},"_FileSpan":{"SourceSpanWithContext":[],"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceLocation":{"Comparable":["SourceLocation"]},"SourceLocationMixin":{"SourceLocation":[],"Comparable":["SourceLocation"]},"SourceSpan":{"Comparable":["SourceSpan"]},"SourceSpanBase":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanException":{"Exception":[]},"SourceSpanFormatException":{"FormatException":[],"Exception":[]},"SourceSpanMixin":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanWithContext":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SseClient":{"StreamChannel":["String?"]},"GuaranteeChannel":{"StreamChannel":["1"]},"_GuaranteeSink":{"StreamSink":["1"]},"StreamChannelMixin":{"StreamChannel":["1"]},"StringScannerException":{"FormatException":[],"Exception":[]},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"BrowserWebSocket":{"WebSocket":[]},"TextDataReceived":{"WebSocketEvent":[]},"BinaryDataReceived":{"WebSocketEvent":[]},"CloseReceived":{"WebSocketEvent":[]},"WebSocketException":{"Exception":[]},"WebSocketConnectionClosed":{"Exception":[]},"AdapterWebSocketChannel":{"WebSocketChannel":[],"StreamChannel":["@"]},"_WebSocketSink":{"WebSocketSink":[],"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"WebSocketChannelException":{"Exception":[]},"DdcLibraryBundleRestarter":{"Restarter":[]},"DdcRestarter":{"Restarter":[]},"RequireRestarter":{"Restarter":[]},"HotReloadFailedException":{"Exception":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]}}'));
  A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"_DelayedEvent":1,"_SplayTreeSet__SplayTree_Iterable":1,"_SplayTreeSet__SplayTree_Iterable_SetMixin":1,"_QueueList_Object_ListMixin":1,"StreamChannelMixin":1}'));
  var string$ = {
    x00_____: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u03f6\x00\u0404\u03f4 \u03f4\u03f6\u01f6\u01f6\u03f6\u03fc\u01f4\u03ff\u03ff\u0584\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u05d4\u01f4\x00\u01f4\x00\u0504\u05c4\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0400\x00\u0400\u0200\u03f7\u0200\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0200\u0200\u0200\u03f7\x00",
    x20must_: " must not be greater than the number of characters in the file, ",
    ABCDEF: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    Cannotff: "Cannot extract a file path from a URI with a fragment component",
    Cannotfq: "Cannot extract a file path from a URI with a query component",
    Cannotn: "Cannot extract a non-Windows file path from a file URI with an authority",
    Dart_e: "Dart exception thrown from converted Future. Use the properties 'error' to fetch the boxed error and 'stack' to recover the stack trace.",
    Error_: "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type",
    Hot_reA: "Hot reload is not supported for the AMD module format.",
    Hot_reD: "Hot reload is not supported for the DDC module format.",
    max_mu: "max must be in range 0 < max \u2264 2^32, was ",
    serial: "serializer must be StructuredSerializer or PrimitiveSerializer"
  };
  var type$ = (function rtii() {
    var findType = A.findType;
    return {
      AsyncError: findType("AsyncError"),
      Base64Codec: findType("Base64Codec"),
      BatchedDebugEvents: findType("BatchedDebugEvents"),
      BatchedEvents: findType("BatchedEvents"),
      BatchedStreamController_DebugEvent: findType("BatchedStreamController<DebugEvent>"),
      BigInt: findType("BigInt"),
      BrowserWebSocket: findType("BrowserWebSocket"),
      BuildResult: findType("BuildResult"),
      BuildStatus: findType("BuildStatus"),
      BuiltListMultimap_dynamic_dynamic: findType("BuiltListMultimap<@,@>"),
      BuiltList_dynamic: findType("BuiltList<@>"),
      BuiltList_nullable_Object: findType("BuiltList<Object?>"),
      BuiltMap_dynamic_dynamic: findType("BuiltMap<@,@>"),
      BuiltSetMultimap_dynamic_dynamic: findType("BuiltSetMultimap<@,@>"),
      BuiltSet_dynamic: findType("BuiltSet<@>"),
      ByteBuffer: findType("ByteBuffer"),
      ByteData: findType("ByteData"),
      CaseInsensitiveMap_String: findType("CaseInsensitiveMap<String>"),
      CodeUnits: findType("CodeUnits"),
      Comparable_dynamic: findType("Comparable<@>"),
      ConnectRequest: findType("ConnectRequest"),
      DateTime: findType("DateTime"),
      DebugEvent: findType("DebugEvent"),
      DebugInfo: findType("DebugInfo"),
      DevToolsRequest: findType("DevToolsRequest"),
      DevToolsResponse: findType("DevToolsResponse"),
      Duration: findType("Duration"),
      EfficientLengthIterable_dynamic: findType("EfficientLengthIterable<@>"),
      Error: findType("Error"),
      ErrorResponse: findType("ErrorResponse"),
      Exception: findType("Exception"),
      ExtensionEvent: findType("ExtensionEvent"),
      ExtensionRequest: findType("ExtensionRequest"),
      ExtensionResponse: findType("ExtensionResponse"),
      Float32List: findType("Float32List"),
      Float64List: findType("Float64List"),
      FormatException: findType("FormatException"),
      FullType: findType("FullType"),
      Function: findType("Function"),
      Future_void: findType("Future<~>"),
      HotReloadRequest: findType("HotReloadRequest"),
      HotReloadResponse: findType("HotReloadResponse"),
      HotRestartRequest: findType("HotRestartRequest"),
      HotRestartResponse: findType("HotRestartResponse"),
      Int16List: findType("Int16List"),
      Int32: findType("Int32"),
      Int32List: findType("Int32List"),
      Int64: findType("Int64"),
      Int8List: findType("Int8List"),
      IsolateExit: findType("IsolateExit"),
      IsolateStart: findType("IsolateStart"),
      IterableEquality_dynamic: findType("IterableEquality<@>"),
      Iterable_String: findType("Iterable<String>"),
      Iterable_dynamic: findType("Iterable<@>"),
      Iterable_int: findType("Iterable<int>"),
      Iterable_nullable_Object: findType("Iterable<Object?>"),
      JSArray_FullType: findType("JSArray<FullType>"),
      JSArray_JSObject: findType("JSArray<JSObject>"),
      JSArray_Object: findType("JSArray<Object>"),
      JSArray_String: findType("JSArray<String>"),
      JSArray_Type: findType("JSArray<Type>"),
      JSArray__Highlight: findType("JSArray<_Highlight>"),
      JSArray__Line: findType("JSArray<_Line>"),
      JSArray_dynamic: findType("JSArray<@>"),
      JSArray_int: findType("JSArray<int>"),
      JSArray_nullable_Object: findType("JSArray<Object?>"),
      JSArray_nullable_String: findType("JSArray<String?>"),
      JSIndexable_dynamic: findType("JSIndexable<@>"),
      JSNull: findType("JSNull"),
      JSObject: findType("JSObject"),
      JavaScriptFunction: findType("JavaScriptFunction"),
      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
      JavaScriptObject: findType("JavaScriptObject"),
      JsonObject: findType("JsonObject"),
      Level: findType("Level"),
      ListBuilder_DebugEvent: findType("ListBuilder<DebugEvent>"),
      ListBuilder_ExtensionEvent: findType("ListBuilder<ExtensionEvent>"),
      ListBuilder_dynamic: findType("ListBuilder<@>"),
      ListEquality_dynamic: findType("ListEquality<@>"),
      ListMultimapBuilder_dynamic_dynamic: findType("ListMultimapBuilder<@,@>"),
      List_DebugEvent: findType("List<DebugEvent>"),
      List_ExtensionEvent: findType("List<ExtensionEvent>"),
      List_Map_dynamic_dynamic: findType("List<Map<@,@>>"),
      List_String: findType("List<String>"),
      List_dynamic: findType("List<@>"),
      List_int: findType("List<int>"),
      List_nullable_Object: findType("List<Object?>"),
      List_nullable__Highlight: findType("List<_Highlight?>"),
      Logger: findType("Logger"),
      MapBuilder_dynamic_dynamic: findType("MapBuilder<@,@>"),
      MapEntry_String_String: findType("MapEntry<String,String>"),
      MapEntry_of_Object_and_List__Highlight: findType("MapEntry<Object,List<_Highlight>>"),
      MapEquality_dynamic_dynamic: findType("MapEquality<@,@>"),
      Map_String_String: findType("Map<String,String>"),
      Map_String_dynamic: findType("Map<String,@>"),
      Map_dynamic_dynamic: findType("Map<@,@>"),
      Map_of_String_and_nullable_Object: findType("Map<String,Object?>"),
      MappedListIterable_String_dynamic: findType("MappedListIterable<String,@>"),
      MediaType: findType("MediaType"),
      NativeArrayBuffer: findType("NativeArrayBuffer"),
      NativeTypedArrayOfInt: findType("NativeTypedArrayOfInt"),
      NativeUint8List: findType("NativeUint8List"),
      Null: findType("Null"),
      Object: findType("Object"),
      PoolResource: findType("PoolResource"),
      PrimitiveSerializer_dynamic: findType("PrimitiveSerializer<@>"),
      QueueList_Result_DebugEvent: findType("QueueList<Result<DebugEvent>>"),
      Record: findType("Record"),
      Record_0: findType("+()"),
      Record_2_bool_and_nullable_JSArray_nullable_Object: findType("+(bool,JSArray<Object?>?)"),
      RegExp: findType("RegExp"),
      RegExpMatch: findType("RegExpMatch"),
      RegisterEvent: findType("RegisterEvent"),
      RequireRestarter: findType("RequireRestarter"),
      Response: findType("Response"),
      ReversedListIterable_String: findType("ReversedListIterable<String>"),
      RunRequest: findType("RunRequest"),
      SerializerPlugin: findType("SerializerPlugin"),
      Serializer_dynamic: findType("Serializer<@>"),
      ServiceExtensionRequest: findType("ServiceExtensionRequest"),
      ServiceExtensionResponse: findType("ServiceExtensionResponse"),
      SetBuilder_dynamic: findType("SetBuilder<@>"),
      SetEquality_dynamic: findType("SetEquality<@>"),
      SetMultimapBuilder_dynamic_dynamic: findType("SetMultimapBuilder<@,@>"),
      Set_dynamic: findType("Set<@>"),
      SourceLocation: findType("SourceLocation"),
      SourceSpan: findType("SourceSpan"),
      SourceSpanWithContext: findType("SourceSpanWithContext"),
      SplayTreeSet_String: findType("SplayTreeSet<String>"),
      StackTrace: findType("StackTrace"),
      StreamChannelController_nullable_Object: findType("StreamChannelController<Object?>"),
      StreamQueue_DebugEvent: findType("StreamQueue<DebugEvent>"),
      Stream_dynamic: findType("Stream<@>"),
      StreamedResponse: findType("StreamedResponse"),
      String: findType("String"),
      String_Function_Match: findType("String(Match)"),
      StructuredSerializer_dynamic: findType("StructuredSerializer<@>"),
      Timer: findType("Timer"),
      TrustedGetRuntimeType: findType("TrustedGetRuntimeType"),
      Type: findType("Type"),
      TypeError: findType("TypeError"),
      Uint16List: findType("Uint16List"),
      Uint32List: findType("Uint32List"),
      Uint8ClampedList: findType("Uint8ClampedList"),
      Uint8List: findType("Uint8List"),
      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
      UnmodifiableListView_nullable_Object: findType("UnmodifiableListView<Object?>"),
      UnmodifiableMapView_String_String: findType("UnmodifiableMapView<String,String>"),
      UnmodifiableMapView_of_String_and_nullable_Object: findType("UnmodifiableMapView<String,Object?>"),
      Uri: findType("Uri"),
      WebSocket: findType("WebSocket"),
      WebSocketEvent: findType("WebSocketEvent"),
      WhereTypeIterable_String: findType("WhereTypeIterable<String>"),
      Zone: findType("Zone"),
      _AsyncCompleter_BrowserWebSocket: findType("_AsyncCompleter<BrowserWebSocket>"),
      _AsyncCompleter_PoolResource: findType("_AsyncCompleter<PoolResource>"),
      _AsyncCompleter_String: findType("_AsyncCompleter<String>"),
      _AsyncCompleter_Uint8List: findType("_AsyncCompleter<Uint8List>"),
      _AsyncCompleter_bool: findType("_AsyncCompleter<bool>"),
      _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"),
      _AsyncCompleter_void: findType("_AsyncCompleter<~>"),
      _AsyncStreamController_List_int: findType("_AsyncStreamController<List<int>>"),
      _BigIntImpl: findType("_BigIntImpl"),
      _BuiltMap_dynamic_dynamic: findType("_BuiltMap<@,@>"),
      _EventRequest_dynamic: findType("_EventRequest<@>"),
      _EventStream_JSObject: findType("_EventStream<JSObject>"),
      _Future_BrowserWebSocket: findType("_Future<BrowserWebSocket>"),
      _Future_PoolResource: findType("_Future<PoolResource>"),
      _Future_String: findType("_Future<String>"),
      _Future_Uint8List: findType("_Future<Uint8List>"),
      _Future_bool: findType("_Future<bool>"),
      _Future_dynamic: findType("_Future<@>"),
      _Future_int: findType("_Future<int>"),
      _Future_void: findType("_Future<~>"),
      _Highlight: findType("_Highlight"),
      _IdentityHashMap_of_nullable_Object_and_nullable_Object: findType("_IdentityHashMap<Object?,Object?>"),
      _Line: findType("_Line"),
      _MapEntry: findType("_MapEntry"),
      _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState<Object?>"),
      _SyncCompleter_PoolResource: findType("_SyncCompleter<PoolResource>"),
      _ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace: findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,Object,StackTrace)>"),
      bool: findType("bool"),
      bool_Function_Object: findType("bool(Object)"),
      bool_Function__Highlight: findType("bool(_Highlight)"),
      double: findType("double"),
      dynamic: findType("@"),
      dynamic_Function: findType("@()"),
      dynamic_Function_Object: findType("@(Object)"),
      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
      dynamic_Function_String: findType("@(String)"),
      int: findType("int"),
      nullable_Future_Null: findType("Future<Null>?"),
      nullable_JSArray_nullable_Object: findType("JSArray<Object?>?"),
      nullable_JSObject: findType("JSObject?"),
      nullable_ListBuilder_DebugEvent: findType("ListBuilder<DebugEvent>?"),
      nullable_ListBuilder_ExtensionEvent: findType("ListBuilder<ExtensionEvent>?"),
      nullable_List_dynamic: findType("List<@>?"),
      nullable_Map_String_dynamic: findType("Map<String,@>?"),
      nullable_Map_of_nullable_Object_and_nullable_Object: findType("Map<Object?,Object?>?"),
      nullable_Object: findType("Object?"),
      nullable_Result_DebugEvent: findType("Result<DebugEvent>?"),
      nullable_StackTrace: findType("StackTrace?"),
      nullable_String: findType("String?"),
      nullable_String_Function_Match: findType("String(Match)?"),
      nullable_Zone: findType("Zone?"),
      nullable_ZoneDelegate: findType("ZoneDelegate?"),
      nullable_ZoneSpecification: findType("ZoneSpecification?"),
      nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"),
      nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"),
      nullable__Highlight: findType("_Highlight?"),
      nullable__LinkedHashSetCell: findType("_LinkedHashSetCell?"),
      nullable_bool: findType("bool?"),
      nullable_bool_Function_Object: findType("bool(Object)?"),
      nullable_double: findType("double?"),
      nullable_int: findType("int?"),
      nullable_num: findType("num?"),
      nullable_void_Function: findType("~()?"),
      nullable_void_Function_BatchedDebugEventsBuilder: findType("~(BatchedDebugEventsBuilder)?"),
      nullable_void_Function_ConnectRequestBuilder: findType("~(ConnectRequestBuilder)?"),
      nullable_void_Function_DebugEventBuilder: findType("~(DebugEventBuilder)?"),
      nullable_void_Function_DebugInfoBuilder: findType("~(DebugInfoBuilder)?"),
      nullable_void_Function_DevToolsRequestBuilder: findType("~(DevToolsRequestBuilder)?"),
      nullable_void_Function_HotReloadResponseBuilder: findType("~(HotReloadResponseBuilder)?"),
      nullable_void_Function_HotRestartResponseBuilder: findType("~(HotRestartResponseBuilder)?"),
      nullable_void_Function_JSObject: findType("~(JSObject)?"),
      nullable_void_Function_RegisterEventBuilder: findType("~(RegisterEventBuilder)?"),
      nullable_void_Function_ServiceExtensionResponseBuilder: findType("~(ServiceExtensionResponseBuilder)?"),
      num: findType("num"),
      void: findType("~"),
      void_Function: findType("~()"),
      void_Function_HotReloadResponseBuilder: findType("~(HotReloadResponseBuilder)"),
      void_Function_HotRestartResponseBuilder: findType("~(HotRestartResponseBuilder)"),
      void_Function_List_int: findType("~(List<int>)"),
      void_Function_Object: findType("~(Object)"),
      void_Function_Object_StackTrace: findType("~(Object,StackTrace)"),
      void_Function_String_dynamic: findType("~(String,@)"),
      void_Function_Timer: findType("~(Timer)"),
      void_Function_int_dynamic: findType("~(int,@)")
    };
  })();
  (function constants() {
    var makeConstList = hunkHelpers.makeConstList;
    B.Interceptor_methods = J.Interceptor.prototype;
    B.JSArray_methods = J.JSArray.prototype;
    B.JSBool_methods = J.JSBool.prototype;
    B.JSInt_methods = J.JSInt.prototype;
    B.JSNumber_methods = J.JSNumber.prototype;
    B.JSString_methods = J.JSString.prototype;
    B.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
    B.JavaScriptObject_methods = J.JavaScriptObject.prototype;
    B.NativeByteData_methods = A.NativeByteData.prototype;
    B.NativeUint32List_methods = A.NativeUint32List.prototype;
    B.NativeUint8List_methods = A.NativeUint8List.prototype;
    B.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
    B.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
    B.AsciiDecoder_false_127 = new A.AsciiDecoder(false, 127);
    B.AsciiEncoder_127 = new A.AsciiEncoder(127);
    B.BuildStatus_failed = new A.BuildStatus("failed");
    B.BuildStatus_started = new A.BuildStatus("started");
    B.BuildStatus_succeeded = new A.BuildStatus("succeeded");
    B.C__EmptyStream = new A._EmptyStream(A.findType("_EmptyStream<List<int>>"));
    B.ByteStream__EmptyStream = new A.ByteStream(B.C__EmptyStream);
    B.CONSTANT = new A.Instantiation1(A.math__max$closure(), A.findType("Instantiation1<int>"));
    B.C_AsciiCodec = new A.AsciiCodec();
    B.C_Base64Encoder = new A.Base64Encoder();
    B.C_Base64Codec = new A.Base64Codec();
    B.C_Base64Decoder = new A.Base64Decoder();
    B.C_DefaultEquality = new A.DefaultEquality(A.findType("DefaultEquality<0&>"));
    B.C_DeepCollectionEquality = new A.DeepCollectionEquality();
    B.C_EmptyIterator = new A.EmptyIterator(A.findType("EmptyIterator<0&>"));
    B.C_IntegerDivisionByZeroException = new A.IntegerDivisionByZeroException();
    B.C_JS_CONST = function getTagFallback(o) {
  var s = Object.prototype.toString.call(o);
  return s.substring(8, s.length - 1);
};
    B.C_JS_CONST0 = function() {
  var toStringFunction = Object.prototype.toString;
  function getTag(o) {
    var s = toStringFunction.call(o);
    return s.substring(8, s.length - 1);
  }
  function getUnknownTag(object, tag) {
    if (/^HTML[A-Z].*Element$/.test(tag)) {
      var name = toStringFunction.call(object);
      if (name == "[object Object]") return null;
      return "HTMLElement";
    }
  }
  function getUnknownTagGenericBrowser(object, tag) {
    if (object instanceof HTMLElement) return "HTMLElement";
    return getUnknownTag(object, tag);
  }
  function prototypeForTag(tag) {
    if (typeof window == "undefined") return null;
    if (typeof window[tag] == "undefined") return null;
    var constructor = window[tag];
    if (typeof constructor != "function") return null;
    return constructor.prototype;
  }
  function discriminator(tag) { return null; }
  var isBrowser = typeof HTMLElement == "function";
  return {
    getTag: getTag,
    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
    prototypeForTag: prototypeForTag,
    discriminator: discriminator };
};
    B.C_JS_CONST6 = function(getTagFallback) {
  return function(hooks) {
    if (typeof navigator != "object") return hooks;
    var userAgent = navigator.userAgent;
    if (typeof userAgent != "string") return hooks;
    if (userAgent.indexOf("DumpRenderTree") >= 0) return hooks;
    if (userAgent.indexOf("Chrome") >= 0) {
      function confirm(p) {
        return typeof window == "object" && window[p] && window[p].name == p;
      }
      if (confirm("Window") && confirm("HTMLElement")) return hooks;
    }
    hooks.getTag = getTagFallback;
  };
};
    B.C_JS_CONST1 = function(hooks) {
  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
};
    B.C_JS_CONST5 = function(hooks) {
  if (typeof navigator != "object") return hooks;
  var userAgent = navigator.userAgent;
  if (typeof userAgent != "string") return hooks;
  if (userAgent.indexOf("Firefox") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "GeoGeolocation": "Geolocation",
    "Location": "!Location",
    "WorkerMessageEvent": "MessageEvent",
    "XMLDocument": "!Document"};
  function getTagFirefox(o) {
    var tag = getTag(o);
    return quickMap[tag] || tag;
  }
  hooks.getTag = getTagFirefox;
};
    B.C_JS_CONST4 = function(hooks) {
  if (typeof navigator != "object") return hooks;
  var userAgent = navigator.userAgent;
  if (typeof userAgent != "string") return hooks;
  if (userAgent.indexOf("Trident/") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "HTMLDDElement": "HTMLElement",
    "HTMLDTElement": "HTMLElement",
    "HTMLPhraseElement": "HTMLElement",
    "Position": "Geoposition"
  };
  function getTagIE(o) {
    var tag = getTag(o);
    var newTag = quickMap[tag];
    if (newTag) return newTag;
    if (tag == "Object") {
      if (window.DataView && (o instanceof window.DataView)) return "DataView";
    }
    return tag;
  }
  function prototypeForTagIE(tag) {
    var constructor = window[tag];
    if (constructor == null) return null;
    return constructor.prototype;
  }
  hooks.getTag = getTagIE;
  hooks.prototypeForTag = prototypeForTagIE;
};
    B.C_JS_CONST2 = function(hooks) {
  var getTag = hooks.getTag;
  var prototypeForTag = hooks.prototypeForTag;
  function getTagFixed(o) {
    var tag = getTag(o);
    if (tag == "Document") {
      if (!!o.xmlVersion) return "!Document";
      return "!HTMLDocument";
    }
    return tag;
  }
  function prototypeForTagFixed(tag) {
    if (tag == "Document") return null;
    return prototypeForTag(tag);
  }
  hooks.getTag = getTagFixed;
  hooks.prototypeForTag = prototypeForTagFixed;
};
    B.C_JS_CONST3 = function(hooks) { return hooks; }
;
    B.C_JsonCodec = new A.JsonCodec();
    B.C_Latin1Codec = new A.Latin1Codec();
    B.C_OutOfMemoryError = new A.OutOfMemoryError();
    B.C_SentinelValue = new A.SentinelValue();
    B.C_Utf8Codec = new A.Utf8Codec();
    B.C_Utf8Encoder = new A.Utf8Encoder();
    B.C__DelayedDone = new A._DelayedDone();
    B.C__JSRandom = new A._JSRandom();
    B.C__RootZone = new A._RootZone();
    B.Duration_0 = new A.Duration(0);
    B.Duration_5000000 = new A.Duration(5000000);
    B.Type_BuiltList_fj6 = A.typeLiteral("BuiltList<@>");
    B.Type_DebugEvent_gLJ = A.typeLiteral("DebugEvent");
    B.List_empty1 = makeConstList([], type$.JSArray_FullType);
    B.FullType_np4 = new A.FullType(B.Type_DebugEvent_gLJ, B.List_empty1, false);
    B.List_njn = makeConstList([B.FullType_np4], type$.JSArray_FullType);
    B.FullType_3Xm = new A.FullType(B.Type_BuiltList_fj6, B.List_njn, false);
    B.Type_String_AXU = A.typeLiteral("String");
    B.FullType_PT1 = new A.FullType(B.Type_String_AXU, B.List_empty1, false);
    B.Type_bool_wF1 = A.typeLiteral("bool");
    B.FullType_R6B = new A.FullType(B.Type_bool_wF1, B.List_empty1, false);
    B.Type_BuiltSetMultimap_yT7 = A.typeLiteral("BuiltSetMultimap<@,@>");
    B.Type_Object_A4p = A.typeLiteral("Object");
    B.FullType_kV7 = new A.FullType(B.Type_Object_A4p, B.List_empty1, false);
    B.List_03P = makeConstList([B.FullType_kV7, B.FullType_kV7], type$.JSArray_FullType);
    B.FullType_SWR = new A.FullType(B.Type_BuiltSetMultimap_yT7, B.List_03P, false);
    B.Type_BuiltListMultimap_HQW = A.typeLiteral("BuiltListMultimap<@,@>");
    B.FullType_WP0 = new A.FullType(B.Type_BuiltListMultimap_HQW, B.List_03P, false);
    B.Type_ExtensionEvent_T8C = A.typeLiteral("ExtensionEvent");
    B.FullType_I4i = new A.FullType(B.Type_ExtensionEvent_T8C, B.List_empty1, false);
    B.List_O9J = makeConstList([B.FullType_I4i], type$.JSArray_FullType);
    B.FullType_ahP = new A.FullType(B.Type_BuiltList_fj6, B.List_O9J, false);
    B.List_LtY = makeConstList([B.FullType_kV7], type$.JSArray_FullType);
    B.FullType_hm4 = new A.FullType(B.Type_BuiltList_fj6, B.List_LtY, false);
    B.Type_BuildStatus_8KJ = A.typeLiteral("BuildStatus");
    B.FullType_k5M = new A.FullType(B.Type_BuildStatus_8KJ, B.List_empty1, false);
    B.Type_BuiltMap_TeX = A.typeLiteral("BuiltMap<@,@>");
    B.FullType_mo5 = new A.FullType(B.Type_BuiltMap_TeX, B.List_03P, false);
    B.FullType_null_List_empty_false = new A.FullType(null, B.List_empty1, false);
    B.Type_int_T7V = A.typeLiteral("int");
    B.FullType_rTD = new A.FullType(B.Type_int_T7V, B.List_empty1, false);
    B.Type_BuiltSet_oHu = A.typeLiteral("BuiltSet<@>");
    B.FullType_tpw = new A.FullType(B.Type_BuiltSet_oHu, B.List_LtY, false);
    B.JsonDecoder_null = new A.JsonDecoder(null);
    B.JsonEncoder_null = new A.JsonEncoder(null);
    B.Latin1Decoder_false_255 = new A.Latin1Decoder(false, 255);
    B.Latin1Encoder_255 = new A.Latin1Encoder(255);
    B.Level_INFO_800 = new A.Level("INFO", 800);
    B.Level_SEVERE_1000 = new A.Level("SEVERE", 1000);
    B.Level_WARNING_900 = new A.Level("WARNING", 900);
    B.Type_ExtensionRequest_9GR = A.typeLiteral("ExtensionRequest");
    B.Type__$ExtensionRequest_o1C = A.typeLiteral("_$ExtensionRequest");
    B.List_2dD = makeConstList([B.Type_ExtensionRequest_9GR, B.Type__$ExtensionRequest_o1C], type$.JSArray_Type);
    B.Type_ServiceExtensionRequest_K8g = A.typeLiteral("ServiceExtensionRequest");
    B.Type__$ServiceExtensionRequest_n9i = A.typeLiteral("_$ServiceExtensionRequest");
    B.List_4i4 = makeConstList([B.Type_ServiceExtensionRequest_K8g, B.Type__$ServiceExtensionRequest_n9i], type$.JSArray_Type);
    B.Type_DebugInfo_ua9 = A.typeLiteral("DebugInfo");
    B.Type__$DebugInfo_ywz = A.typeLiteral("_$DebugInfo");
    B.List_55I = makeConstList([B.Type_DebugInfo_ua9, B.Type__$DebugInfo_ywz], type$.JSArray_Type);
    B.Type_ErrorResponse_WMn = A.typeLiteral("ErrorResponse");
    B.Type__$ErrorResponse_9Ps = A.typeLiteral("_$ErrorResponse");
    B.List_5LV = makeConstList([B.Type_ErrorResponse_WMn, B.Type__$ErrorResponse_9Ps], type$.JSArray_Type);
    B.Type_ServiceExtensionResponse_84R = A.typeLiteral("ServiceExtensionResponse");
    B.Type__$ServiceExtensionResponse_UiR = A.typeLiteral("_$ServiceExtensionResponse");
    B.List_5rA = makeConstList([B.Type_ServiceExtensionResponse_84R, B.Type__$ServiceExtensionResponse_UiR], type$.JSArray_Type);
    B.Type_HotRestartRequest_xnM = A.typeLiteral("HotRestartRequest");
    B.Type__$HotRestartRequest_rYI = A.typeLiteral("_$HotRestartRequest");
    B.List_9I1 = makeConstList([B.Type_HotRestartRequest_xnM, B.Type__$HotRestartRequest_rYI], type$.JSArray_Type);
    B.Type_HotReloadResponse_Gqc = A.typeLiteral("HotReloadResponse");
    B.Type__$HotReloadResponse_56g = A.typeLiteral("_$HotReloadResponse");
    B.List_DqJ = makeConstList([B.Type_HotReloadResponse_Gqc, B.Type__$HotReloadResponse_56g], type$.JSArray_Type);
    B.Type_RegisterEvent_0Yw = A.typeLiteral("RegisterEvent");
    B.Type__$RegisterEvent_Ks1 = A.typeLiteral("_$RegisterEvent");
    B.List_EMv = makeConstList([B.Type_RegisterEvent_0Yw, B.Type__$RegisterEvent_Ks1], type$.JSArray_Type);
    B.Type_DevToolsRequest_DxE = A.typeLiteral("DevToolsRequest");
    B.Type__$DevToolsRequest_Rak = A.typeLiteral("_$DevToolsRequest");
    B.List_G46 = makeConstList([B.Type_DevToolsRequest_DxE, B.Type__$DevToolsRequest_Rak], type$.JSArray_Type);
    B.Type_IsolateStart_nRT = A.typeLiteral("IsolateStart");
    B.Type__$IsolateStart_Pnq = A.typeLiteral("_$IsolateStart");
    B.List_KpG = makeConstList([B.Type_IsolateStart_nRT, B.Type__$IsolateStart_Pnq], type$.JSArray_Type);
    B.Type_IsolateExit_QVA = A.typeLiteral("IsolateExit");
    B.Type__$IsolateExit_4XE = A.typeLiteral("_$IsolateExit");
    B.List_MJN = makeConstList([B.Type_IsolateExit_QVA, B.Type__$IsolateExit_4XE], type$.JSArray_Type);
    B.Type_ExtensionResponse_0Oi = A.typeLiteral("ExtensionResponse");
    B.Type__$ExtensionResponse_46G = A.typeLiteral("_$ExtensionResponse");
    B.List_RWp = makeConstList([B.Type_ExtensionResponse_0Oi, B.Type__$ExtensionResponse_46G], type$.JSArray_Type);
    B.Type_RunRequest_Hfm = A.typeLiteral("RunRequest");
    B.Type__$RunRequest_3ad = A.typeLiteral("_$RunRequest");
    B.List_RlA = makeConstList([B.Type_RunRequest_Hfm, B.Type__$RunRequest_3ad], type$.JSArray_Type);
    B.Type_DevToolsResponse_gVs = A.typeLiteral("DevToolsResponse");
    B.Type__$DevToolsResponse_dcs = A.typeLiteral("_$DevToolsResponse");
    B.List_TEH = makeConstList([B.Type_DevToolsResponse_gVs, B.Type__$DevToolsResponse_dcs], type$.JSArray_Type);
    B.List_Type_BuildStatus_8KJ = makeConstList([B.Type_BuildStatus_8KJ], type$.JSArray_Type);
    B.Type_BatchedDebugEvents_v7B = A.typeLiteral("BatchedDebugEvents");
    B.Type__$BatchedDebugEvents_LFV = A.typeLiteral("_$BatchedDebugEvents");
    B.List_WAE = makeConstList([B.Type_BatchedDebugEvents_v7B, B.Type__$BatchedDebugEvents_LFV], type$.JSArray_Type);
    B.Type_HotRestartResponse_F1y = A.typeLiteral("HotRestartResponse");
    B.Type__$HotRestartResponse_9cS = A.typeLiteral("_$HotRestartResponse");
    B.List_YhA = makeConstList([B.Type_HotRestartResponse_F1y, B.Type__$HotRestartResponse_9cS], type$.JSArray_Type);
    B.List_ZNA = makeConstList([0, 0, 1048576, 531441, 1048576, 390625, 279936, 823543, 262144, 531441, 1000000, 161051, 248832, 371293, 537824, 759375, 1048576, 83521, 104976, 130321, 160000, 194481, 234256, 279841, 331776, 390625, 456976, 531441, 614656, 707281, 810000, 923521, 1048576, 35937, 39304, 42875, 46656], type$.JSArray_int);
    B.Type_HotReloadRequest_EsW = A.typeLiteral("HotReloadRequest");
    B.Type__$HotReloadRequest_ynq = A.typeLiteral("_$HotReloadRequest");
    B.List_dz9 = makeConstList([B.Type_HotReloadRequest_EsW, B.Type__$HotReloadRequest_ynq], type$.JSArray_Type);
    B.List_empty = makeConstList([], type$.JSArray_String);
    B.List_empty0 = makeConstList([], type$.JSArray_dynamic);
    B.List_fAJ = makeConstList(["d", "D", "\u2202", "\xce"], type$.JSArray_String);
    B.Type__$DebugEvent_YX4 = A.typeLiteral("_$DebugEvent");
    B.List_fK8 = makeConstList([B.Type_DebugEvent_gLJ, B.Type__$DebugEvent_YX4], type$.JSArray_Type);
    B.Type_BatchedEvents_ABc = A.typeLiteral("BatchedEvents");
    B.Type__$BatchedEvents_jAA = A.typeLiteral("_$BatchedEvents");
    B.List_oDF = makeConstList([B.Type_BatchedEvents_ABc, B.Type__$BatchedEvents_jAA], type$.JSArray_Type);
    B.Type_BuildResult_SAR = A.typeLiteral("BuildResult");
    B.Type__$BuildResult_Iwz = A.typeLiteral("_$BuildResult");
    B.List_pLn = makeConstList([B.Type_BuildResult_SAR, B.Type__$BuildResult_Iwz], type$.JSArray_Type);
    B.Type_ConnectRequest_8Nv = A.typeLiteral("ConnectRequest");
    B.Type__$ConnectRequest_3Qd = A.typeLiteral("_$ConnectRequest");
    B.List_xmd = makeConstList([B.Type_ConnectRequest_8Nv, B.Type__$ConnectRequest_3Qd], type$.JSArray_Type);
    B.Type__$ExtensionEvent_WzR = A.typeLiteral("_$ExtensionEvent");
    B.List_yvR = makeConstList([B.Type_ExtensionEvent_T8C, B.Type__$ExtensionEvent_WzR], type$.JSArray_Type);
    B.Object_empty = {};
    B.Map_empty0 = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap<String,String>"));
    B.Map_empty = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap<@,@>"));
    B.Type_BigInt_DZK = A.typeLiteral("BigInt");
    B.Type_BoolJsonObject_Zqn = A.typeLiteral("BoolJsonObject");
    B.Type_ByteBuffer_rqD = A.typeLiteral("ByteBuffer");
    B.Type_ByteData_9dB = A.typeLiteral("ByteData");
    B.Type_DateTime_akv = A.typeLiteral("DateTime");
    B.Type_Duration_VAs = A.typeLiteral("Duration");
    B.Type_Float32List_9Kz = A.typeLiteral("Float32List");
    B.Type_Float64List_9Kz = A.typeLiteral("Float64List");
    B.Type_Int16List_s5h = A.typeLiteral("Int16List");
    B.Type_Int32List_O8Z = A.typeLiteral("Int32List");
    B.Type_Int32_291 = A.typeLiteral("Int32");
    B.Type_Int64_LHp = A.typeLiteral("Int64");
    B.Type_Int8List_rFV = A.typeLiteral("Int8List");
    B.Type_JSObject_ttY = A.typeLiteral("JSObject");
    B.Type_JsonObject_5jQ = A.typeLiteral("JsonObject");
    B.Type_ListJsonObject_qcV = A.typeLiteral("ListJsonObject");
    B.Type_List_hc9 = A.typeLiteral("List<@>");
    B.Type_MapJsonObject_VMr = A.typeLiteral("MapJsonObject");
    B.Type_Map_9Aj = A.typeLiteral("Map<@,@>");
    B.Type_Null_0Rm = A.typeLiteral("Null");
    B.Type_NumJsonObject_hYY = A.typeLiteral("NumJsonObject");
    B.Type_RegExp_w5l = A.typeLiteral("RegExp");
    B.Type_Set_tZi = A.typeLiteral("Set<@>");
    B.Type_StringJsonObject_NL7 = A.typeLiteral("StringJsonObject");
    B.Type_Uint16List_kmP = A.typeLiteral("Uint16List");
    B.Type_Uint32List_kmP = A.typeLiteral("Uint32List");
    B.Type_Uint8ClampedList_04U = A.typeLiteral("Uint8ClampedList");
    B.Type_Uint8List_8Eb = A.typeLiteral("Uint8List");
    B.Type_Uri_l9i = A.typeLiteral("Uri");
    B.Type_double_JIQ = A.typeLiteral("double");
    B.Type_num_LZa = A.typeLiteral("num");
    B.Utf8Decoder_false = new A.Utf8Decoder(false);
    B._StringStackTrace_OdL = new A._StringStackTrace("");
    B._ZoneFunction_KjJ = new A._ZoneFunction(B.C__RootZone, A.async___rootHandleUncaughtError$closure(), type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace);
    B._ZoneFunction_PAY = new A._ZoneFunction(B.C__RootZone, A.async___rootCreatePeriodicTimer$closure(), A.findType("_ZoneFunction<Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))>"));
    B._ZoneFunction_Xkh = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterUnaryCallback$closure(), A.findType("_ZoneFunction<0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>>"));
    B._ZoneFunction__RootZone__rootCreateTimer = new A._ZoneFunction(B.C__RootZone, A.async___rootCreateTimer$closure(), A.findType("_ZoneFunction<Timer(Zone,ZoneDelegate,Zone,Duration,~())>"));
    B._ZoneFunction__RootZone__rootErrorCallback = new A._ZoneFunction(B.C__RootZone, A.async___rootErrorCallback$closure(), A.findType("_ZoneFunction<AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)>"));
    B._ZoneFunction__RootZone__rootFork = new A._ZoneFunction(B.C__RootZone, A.async___rootFork$closure(), A.findType("_ZoneFunction<Zone(Zone,ZoneDelegate,Zone,ZoneSpecification?,Map<Object?,Object?>?)>"));
    B._ZoneFunction__RootZone__rootPrint = new A._ZoneFunction(B.C__RootZone, A.async___rootPrint$closure(), A.findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,String)>"));
    B._ZoneFunction__RootZone__rootRegisterCallback = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterCallback$closure(), A.findType("_ZoneFunction<0^()(Zone,ZoneDelegate,Zone,0^())<Object?>>"));
    B._ZoneFunction__RootZone__rootRun = new A._ZoneFunction(B.C__RootZone, A.async___rootRun$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^())<Object?>>"));
    B._ZoneFunction__RootZone__rootRunBinary = new A._ZoneFunction(B.C__RootZone, A.async___rootRunBinary$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>>"));
    B._ZoneFunction__RootZone__rootRunUnary = new A._ZoneFunction(B.C__RootZone, A.async___rootRunUnary$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^(1^),1^)<Object?,Object?>>"));
    B._ZoneFunction__RootZone__rootScheduleMicrotask = new A._ZoneFunction(B.C__RootZone, A.async___rootScheduleMicrotask$closure(), A.findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,~())>"));
    B._ZoneFunction_e9o = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterBinaryCallback$closure(), A.findType("_ZoneFunction<0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>>"));
  })();
  (function staticFields() {
    $._JS_INTEROP_INTERCEPTOR_TAG = null;
    $.toStringVisiting = A._setArrayType([], type$.JSArray_Object);
    $.printToZone = null;
    $.Primitives__identityHashCodeProperty = null;
    $.BoundClosure__receiverFieldNameCache = null;
    $.BoundClosure__interceptorFieldNameCache = null;
    $.getTagFunction = null;
    $.alternateTagFunction = null;
    $.prototypeForTagFunction = null;
    $.dispatchRecordsForInstanceTags = null;
    $.interceptorsForUncacheableTags = null;
    $.initNativeDispatchFlag = null;
    $._Record__computedFieldKeys = A._setArrayType([], A.findType("JSArray<List<Object>?>"));
    $._nextCallback = null;
    $._lastCallback = null;
    $._lastPriorityCallback = null;
    $._isInCallbackLoop = false;
    $.Zone__current = B.C__RootZone;
    $._RootZone__rootDelegate = null;
    $._BigIntImpl__lastDividendDigits = null;
    $._BigIntImpl__lastDividendUsed = null;
    $._BigIntImpl__lastDivisorDigits = null;
    $._BigIntImpl__lastDivisorUsed = null;
    $._BigIntImpl____lastQuoRemDigits = A._Cell$named("_lastQuoRemDigits");
    $._BigIntImpl____lastQuoRemUsed = A._Cell$named("_lastQuoRemUsed");
    $._BigIntImpl____lastRemUsed = A._Cell$named("_lastRemUsed");
    $._BigIntImpl____lastRem_nsh = A._Cell$named("_lastRem_nsh");
    $.Uri__cachedBaseString = "";
    $.Uri__cachedBaseUri = null;
    $._indentingBuiltValueToStringHelperIndent = 0;
    $.LogRecord__nextNumber = 0;
    $.Logger__loggers = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger);
    $._currentUriBase = null;
    $._current = null;
    $.V1State_nodeId = A._setArrayType([], type$.JSArray_int);
    $.V1State_clockSeq = 0;
    $.V1State_mSecs = 0;
    $.V1State_nSecs = 0;
    $.V1State_initialized = false;
    $.RequireRestarter____lastKnownDigests = A._Cell$named("_lastKnownDigests");
  })();
  (function lazyInitializers() {
    var _lazyFinal = hunkHelpers.lazyFinal,
      _lazy = hunkHelpers.lazy;
    _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", () => A.getIsolateAffinityTag("_$dart_dartClosure"));
    _lazyFinal($, "nullFuture", "$get$nullFuture", () => B.C__RootZone.run$1$1(new A.nullFuture_closure(), type$.Future_void));
    _lazyFinal($, "_safeToStringHooks", "$get$_safeToStringHooks", () => A._setArrayType([new J.JSArraySafeToStringHook()], A.findType("JSArray<SafeToStringHook>")));
    _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        null.$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        (void 0).$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        null.$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        (void 0).$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", () => A._AsyncRun__initializeScheduleImmediate());
    _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", () => $.$get$nullFuture());
    _lazyFinal($, "_RootZone__rootMap", "$get$_RootZone__rootMap", () => {
      var t1 = type$.dynamic;
      return A.HashMap_HashMap(null, null, null, t1, t1);
    });
    _lazyFinal($, "_Utf8Decoder__reusableBuffer", "$get$_Utf8Decoder__reusableBuffer", () => A.NativeUint8List_NativeUint8List(4096));
    _lazyFinal($, "_Utf8Decoder__decoder", "$get$_Utf8Decoder__decoder", () => new A._Utf8Decoder__decoder_closure().call$0());
    _lazyFinal($, "_Utf8Decoder__decoderNonfatal", "$get$_Utf8Decoder__decoderNonfatal", () => new A._Utf8Decoder__decoderNonfatal_closure().call$0());
    _lazyFinal($, "_Base64Decoder__inverseAlphabet", "$get$_Base64Decoder__inverseAlphabet", () => A.NativeInt8List__create1(A._ensureNativeList(A._setArrayType([-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, -1, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -1, -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], type$.JSArray_int))));
    _lazy($, "_Base64Decoder__emptyBuffer", "$get$_Base64Decoder__emptyBuffer", () => A.NativeUint8List_NativeUint8List(0));
    _lazyFinal($, "Encoding__nameToEncoding", "$get$Encoding__nameToEncoding", () => A.LinkedHashMap_LinkedHashMap$_literal(["iso_8859-1:1987", B.C_Latin1Codec, "iso-ir-100", B.C_Latin1Codec, "iso_8859-1", B.C_Latin1Codec, "iso-8859-1", B.C_Latin1Codec, "latin1", B.C_Latin1Codec, "l1", B.C_Latin1Codec, "ibm819", B.C_Latin1Codec, "cp819", B.C_Latin1Codec, "csisolatin1", B.C_Latin1Codec, "iso-ir-6", B.C_AsciiCodec, "ansi_x3.4-1968", B.C_AsciiCodec, "ansi_x3.4-1986", B.C_AsciiCodec, "iso_646.irv:1991", B.C_AsciiCodec, "iso646-us", B.C_AsciiCodec, "us-ascii", B.C_AsciiCodec, "us", B.C_AsciiCodec, "ibm367", B.C_AsciiCodec, "cp367", B.C_AsciiCodec, "csascii", B.C_AsciiCodec, "ascii", B.C_AsciiCodec, "csutf8", B.C_Utf8Codec, "utf-8", B.C_Utf8Codec], type$.String, A.findType("Encoding")));
    _lazyFinal($, "_BigIntImpl_zero", "$get$_BigIntImpl_zero", () => A._BigIntImpl__BigIntImpl$_fromInt(0));
    _lazyFinal($, "_BigIntImpl_one", "$get$_BigIntImpl_one", () => A._BigIntImpl__BigIntImpl$_fromInt(1));
    _lazyFinal($, "_BigIntImpl__minusOne", "$get$_BigIntImpl__minusOne", () => $.$get$_BigIntImpl_one().$negate(0));
    _lazyFinal($, "_BigIntImpl__bigInt10000", "$get$_BigIntImpl__bigInt10000", () => A._BigIntImpl__BigIntImpl$_fromInt(10000));
    _lazy($, "_BigIntImpl__parseRE", "$get$_BigIntImpl__parseRE", () => A.RegExp_RegExp("^\\s*([+-]?)((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$", false, false));
    _lazyFinal($, "_Uri__needsNoEncoding", "$get$_Uri__needsNoEncoding", () => A.RegExp_RegExp("^[\\-\\.0-9A-Z_a-z~]*$", true, false));
    _lazyFinal($, "_hashSeed", "$get$_hashSeed", () => A.objectHashCode(B.Type_Object_A4p));
    _lazyFinal($, "_jsBoxedDartObjectProperty", "$get$_jsBoxedDartObjectProperty", () => Symbol("jsBoxedDartObjectProperty"));
    _lazyFinal($, "Random__secureRandom", "$get$Random__secureRandom", () => {
      var t1 = new A._JSSecureRandom(new DataView(new ArrayBuffer(A._checkLength(8))));
      t1._JSSecureRandom$0();
      return t1;
    });
    _lazyFinal($, "isSoundMode", "$get$isSoundMode", () => !type$.List_int._is(A._setArrayType([], A.findType("JSArray<int?>"))));
    _lazy($, "newBuiltValueToStringHelper", "$get$newBuiltValueToStringHelper", () => new A.newBuiltValueToStringHelper_closure());
    _lazyFinal($, "_runtimeType", "$get$_runtimeType", () => A.getRuntimeTypeOfDartObject(A.RegExp_RegExp("", true, false)));
    _lazy($, "_$buildStatusSerializer", "$get$_$buildStatusSerializer", () => new A._$BuildStatusSerializer());
    _lazy($, "_$buildResultSerializer", "$get$_$buildResultSerializer", () => new A._$BuildResultSerializer());
    _lazy($, "_$connectRequestSerializer", "$get$_$connectRequestSerializer", () => new A._$ConnectRequestSerializer());
    _lazy($, "_$debugEventSerializer", "$get$_$debugEventSerializer", () => new A._$DebugEventSerializer());
    _lazy($, "_$batchedDebugEventsSerializer", "$get$_$batchedDebugEventsSerializer", () => new A._$BatchedDebugEventsSerializer());
    _lazy($, "_$debugInfoSerializer", "$get$_$debugInfoSerializer", () => new A._$DebugInfoSerializer());
    _lazy($, "_$devToolsRequestSerializer", "$get$_$devToolsRequestSerializer", () => new A._$DevToolsRequestSerializer());
    _lazy($, "_$devToolsResponseSerializer", "$get$_$devToolsResponseSerializer", () => new A._$DevToolsResponseSerializer());
    _lazy($, "_$errorResponseSerializer", "$get$_$errorResponseSerializer", () => new A._$ErrorResponseSerializer());
    _lazy($, "_$extensionRequestSerializer", "$get$_$extensionRequestSerializer", () => new A._$ExtensionRequestSerializer());
    _lazy($, "_$extensionResponseSerializer", "$get$_$extensionResponseSerializer", () => new A._$ExtensionResponseSerializer());
    _lazy($, "_$extensionEventSerializer", "$get$_$extensionEventSerializer", () => new A._$ExtensionEventSerializer());
    _lazy($, "_$batchedEventsSerializer", "$get$_$batchedEventsSerializer", () => new A._$BatchedEventsSerializer());
    _lazy($, "_$hotReloadRequestSerializer", "$get$_$hotReloadRequestSerializer", () => new A._$HotReloadRequestSerializer());
    _lazy($, "_$hotReloadResponseSerializer", "$get$_$hotReloadResponseSerializer", () => new A._$HotReloadResponseSerializer());
    _lazy($, "_$hotRestartRequestSerializer", "$get$_$hotRestartRequestSerializer", () => new A._$HotRestartRequestSerializer());
    _lazy($, "_$hotRestartResponseSerializer", "$get$_$hotRestartResponseSerializer", () => new A._$HotRestartResponseSerializer());
    _lazy($, "_$isolateExitSerializer", "$get$_$isolateExitSerializer", () => new A._$IsolateExitSerializer());
    _lazy($, "_$isolateStartSerializer", "$get$_$isolateStartSerializer", () => new A._$IsolateStartSerializer());
    _lazy($, "_$registerEventSerializer", "$get$_$registerEventSerializer", () => new A._$RegisterEventSerializer());
    _lazy($, "_$runRequestSerializer", "$get$_$runRequestSerializer", () => new A._$RunRequestSerializer());
    _lazyFinal($, "serializers", "$get$serializers", () => $.$get$_$serializers());
    _lazy($, "_$serializers", "$get$_$serializers", () => {
      var t1 = A.Serializers_Serializers();
      t1 = A.BuiltJsonSerializersBuilder$_(t1._typeToSerializer.toBuilder$0(), t1._wireNameToSerializer.toBuilder$0(), t1._typeNameToSerializer.toBuilder$0(), t1.builderFactories.toBuilder$0(), t1.serializerPlugins.toBuilder$0());
      t1.add$1(0, $.$get$_$batchedDebugEventsSerializer());
      t1.add$1(0, $.$get$_$batchedEventsSerializer());
      t1.add$1(0, $.$get$_$buildResultSerializer());
      t1.add$1(0, $.$get$_$buildStatusSerializer());
      t1.add$1(0, $.$get$_$connectRequestSerializer());
      t1.add$1(0, $.$get$_$debugEventSerializer());
      t1.add$1(0, $.$get$_$debugInfoSerializer());
      t1.add$1(0, $.$get$_$devToolsRequestSerializer());
      t1.add$1(0, $.$get$_$devToolsResponseSerializer());
      t1.add$1(0, $.$get$_$errorResponseSerializer());
      t1.add$1(0, $.$get$_$extensionEventSerializer());
      t1.add$1(0, $.$get$_$extensionRequestSerializer());
      t1.add$1(0, $.$get$_$extensionResponseSerializer());
      t1.add$1(0, $.$get$_$hotReloadRequestSerializer());
      t1.add$1(0, $.$get$_$hotReloadResponseSerializer());
      t1.add$1(0, $.$get$_$hotRestartRequestSerializer());
      t1.add$1(0, $.$get$_$hotRestartResponseSerializer());
      t1.add$1(0, $.$get$_$isolateExitSerializer());
      t1.add$1(0, $.$get$_$isolateStartSerializer());
      t1.add$1(0, $.$get$_$registerEventSerializer());
      t1.add$1(0, $.$get$_$runRequestSerializer());
      t1.add$1(0, $.$get$_$serviceExtensionRequestSerializer());
      t1.add$1(0, $.$get$_$serviceExtensionResponseSerializer());
      t1.addBuilderFactory$2(B.FullType_3Xm, new A._$serializers_closure());
      t1.addBuilderFactory$2(B.FullType_ahP, new A._$serializers_closure0());
      return t1.build$0();
    });
    _lazy($, "_$serviceExtensionRequestSerializer", "$get$_$serviceExtensionRequestSerializer", () => new A._$ServiceExtensionRequestSerializer());
    _lazy($, "_$serviceExtensionResponseSerializer", "$get$_$serviceExtensionResponseSerializer", () => new A._$ServiceExtensionResponseSerializer());
    _lazyFinal($, "_logger", "$get$_logger", () => A.Logger_Logger("Utilities"));
    _lazyFinal($, "BaseRequest__tokenRE", "$get$BaseRequest__tokenRE", () => A.RegExp_RegExp("^[\\w!#%&'*+\\-.^`|~]+$", true, false));
    _lazyFinal($, "_escapedChar", "$get$_escapedChar", () => A.RegExp_RegExp('["\\x00-\\x1F\\x7F]', true, false));
    _lazyFinal($, "token", "$get$token", () => A.RegExp_RegExp('[^()<>@,;:"\\\\/[\\]?={} \\t\\x00-\\x1F\\x7F]+', true, false));
    _lazyFinal($, "_lws", "$get$_lws", () => A.RegExp_RegExp("(?:\\r\\n)?[ \\t]+", true, false));
    _lazyFinal($, "_quotedString", "$get$_quotedString", () => A.RegExp_RegExp('"(?:[^"\\x00-\\x1F\\x7F\\\\]|\\\\.)*"', true, false));
    _lazyFinal($, "_quotedPair", "$get$_quotedPair", () => A.RegExp_RegExp("\\\\(.)", true, false));
    _lazyFinal($, "nonToken", "$get$nonToken", () => A.RegExp_RegExp('[()<>@,;:"\\\\/\\[\\]?={} \\t\\x00-\\x1F\\x7F]', true, false));
    _lazyFinal($, "whitespace", "$get$whitespace", () => A.RegExp_RegExp("(?:" + $.$get$_lws().pattern + ")*", true, false));
    _lazyFinal($, "Logger_root", "$get$Logger_root", () => A.Logger_Logger(""));
    _lazyFinal($, "context", "$get$context", () => new A.Context($.$get$Style_platform(), null));
    _lazyFinal($, "Style_posix", "$get$Style_posix", () => new A.PosixStyle(A.RegExp_RegExp("/", true, false), A.RegExp_RegExp("[^/]$", true, false), A.RegExp_RegExp("^/", true, false)));
    _lazyFinal($, "Style_windows", "$get$Style_windows", () => new A.WindowsStyle(A.RegExp_RegExp("[/\\\\]", true, false), A.RegExp_RegExp("[^/\\\\]$", true, false), A.RegExp_RegExp("^(\\\\\\\\[^\\\\]+\\\\[^\\\\/]+|[a-zA-Z]:[/\\\\])", true, false), A.RegExp_RegExp("^[/\\\\](?![/\\\\])", true, false)));
    _lazyFinal($, "Style_url", "$get$Style_url", () => new A.UrlStyle(A.RegExp_RegExp("/", true, false), A.RegExp_RegExp("(^[a-zA-Z][-+.a-zA-Z\\d]*://|[^/])$", true, false), A.RegExp_RegExp("[a-zA-Z][-+.a-zA-Z\\d]*://[^/]*", true, false), A.RegExp_RegExp("^/", true, false)));
    _lazyFinal($, "Style_platform", "$get$Style_platform", () => A.Style__getPlatformStyle());
    _lazyFinal($, "_requestPool", "$get$_requestPool", () => {
      var t4,
        t1 = A.findType("Completer<PoolResource>"),
        t2 = A.ListQueue$(t1),
        t3 = A.ListQueue$(type$.void_Function);
      t1 = A.ListQueue$(t1);
      t4 = A.Completer_Completer(type$.void);
      return new A.Pool(t2, t3, t1, 1000, new A.AsyncMemoizer(t4, A.findType("AsyncMemoizer<~>")));
    });
    _lazy($, "V1State_random", "$get$V1State_random", () => new A.CryptoRNG());
    _lazy($, "V4State_random", "$get$V4State_random", () => new A.CryptoRNG());
    _lazyFinal($, "UuidParsing__byteToHex", "$get$UuidParsing__byteToHex", () => {
      var i,
        _list = J.JSArray_JSArray$allocateGrowable(256, type$.String);
      for (i = 0; i < 256; ++i)
        _list[i] = B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(i, 16), 2, "0");
      return _list;
    });
    _lazyFinal($, "CryptoRNG__secureRandom", "$get$CryptoRNG__secureRandom", () => $.$get$Random__secureRandom());
    _lazyFinal($, "_noncePattern", "$get$_noncePattern", () => A.RegExp_RegExp("^[\\w+/_-]+[=]{0,2}$", true, false));
    _lazyFinal($, "_createScript", "$get$_createScript", () => new A._createScript_closure().call$0());
  })();
  (function nativeSupport() {
    !function() {
      var intern = function(s) {
        var o = {};
        o[s] = 1;
        return Object.keys(hunkHelpers.convertToFastObject(o))[0];
      };
      init.getIsolateTag = function(name) {
        return intern("___dart_" + name + init.isolateTag);
      };
      var tableProperty = "___dart_isolate_tags_";
      var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
      var rootProperty = "_ZxYxX";
      for (var i = 0;; i++) {
        var property = intern(rootProperty + "_" + i + "_");
        if (!(property in usedProperties)) {
          usedProperties[property] = 1;
          init.isolateTag = property;
          break;
        }
      }
      init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
    }();
    hunkHelpers.setOrUpdateInterceptorsByTag({SharedArrayBuffer: A.NativeByteBuffer, ArrayBuffer: A.NativeArrayBuffer, ArrayBufferView: A.NativeTypedData, DataView: A.NativeByteData, Float32Array: A.NativeFloat32List, Float64Array: A.NativeFloat64List, Int16Array: A.NativeInt16List, Int32Array: A.NativeInt32List, Int8Array: A.NativeInt8List, Uint16Array: A.NativeUint16List, Uint32Array: A.NativeUint32List, Uint8ClampedArray: A.NativeUint8ClampedList, CanvasPixelArray: A.NativeUint8ClampedList, Uint8Array: A.NativeUint8List});
    hunkHelpers.setOrUpdateLeafTags({SharedArrayBuffer: true, ArrayBuffer: true, ArrayBufferView: false, DataView: true, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false});
    A.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfDouble.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfInt.$nativeSuperclassTag = "ArrayBufferView";
  })();
  Function.prototype.call$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$0 = function() {
    return this();
  };
  Function.prototype.call$1$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$6 = function(a, b, c, d, e, f) {
    return this(a, b, c, d, e, f);
  };
  Function.prototype.call$1$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$2$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$2$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$2$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$2$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$1$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$0 = function() {
    return this();
  };
  Function.prototype.call$1$0 = function() {
    return this();
  };
  convertAllToFastObject(holders);
  convertToFastObject($);
  (function(callback) {
    if (typeof document === "undefined") {
      callback(null);
      return;
    }
    if (typeof document.currentScript != "undefined") {
      callback(document.currentScript);
      return;
    }
    var scripts = document.scripts;
    function onLoad(event) {
      for (var i = 0; i < scripts.length; ++i) {
        scripts[i].removeEventListener("load", onLoad, false);
      }
      callback(event.target);
    }
    for (var i = 0; i < scripts.length; ++i) {
      scripts[i].addEventListener("load", onLoad, false);
    }
  })(function(currentScript) {
    init.currentScript = currentScript;
    var callMain = A.main;
    if (typeof dartMainRunner === "function") {
      dartMainRunner(callMain, []);
    } else {
      callMain([]);
    }
  });
})();
