// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.13.0-203.0.dev.
// 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):
//    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.
//
// 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 mixinProperties(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];
    }
  }
  var supportsDirectProtoAccess = function() {
    var cls = function() {
    };
    cls.prototype = {p: {}};
    var object = new cls();
    if (!(object.__proto__ && object.__proto__.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 setFunctionNamesIfNecessary(holders) {
    function t() {
    }
    ;
    if (typeof t.name == "string")
      return;
    for (var i = 0; i < holders.length; i++) {
      var holder = holders[i];
      var keys = Object.keys(holder);
      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        var f = holder[key];
        if (typeof f == "function")
          f.name = key;
      }
    }
  }
  function inherit(cls, sup) {
    cls.prototype.constructor = cls;
    cls.prototype["$is" + cls.name] = cls;
    if (sup != null) {
      if (supportsDirectProtoAccess) {
        cls.prototype.__proto__ = 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 mixin(cls, mixin) {
    mixinProperties(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function lazyOld(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      holder[getterName] = function() {
        H.throwCyclicInit(name);
      };
      var result;
      var sentinelInProgress = initializer;
      try {
        if (holder[name] === uninitializedSentinel) {
          result = holder[name] = sentinelInProgress;
          result = holder[name] = initializer();
        } else
          result = holder[name];
      } finally {
        if (result === sentinelInProgress)
          holder[name] = null;
        holder[getterName] = function() {
          return this[name];
        };
      }
      return result;
    };
  }
  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)
          H.throwLateInitializationError(name);
        holder[name] = value;
      }
      holder[getterName] = function() {
        return this[name];
      };
      return holder[name];
    };
  }
  function makeConstList(list) {
    list.immutable$list = Array;
    list.fixed$length = Array;
    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 tearOffGetter(funcs, applyTrampolineIndex, reflectionInfo, name, isIntercepted) {
    return isIntercepted ? new Function("funcs", "applyTrampolineIndex", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(receiver) {" + "if (c === null) c = " + "H.closureFromTearOff" + "(" + "this, funcs, applyTrampolineIndex, reflectionInfo, false, true, name);" + "return new c(this, funcs[0], receiver, name);" + "}")(funcs, applyTrampolineIndex, reflectionInfo, name, H, null) : new Function("funcs", "applyTrampolineIndex", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = " + "H.closureFromTearOff" + "(" + "this, funcs, applyTrampolineIndex, reflectionInfo, false, false, name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, applyTrampolineIndex, reflectionInfo, name, H, null);
  }
  function tearOff(funcs, applyTrampolineIndex, reflectionInfo, isStatic, name, isIntercepted) {
    var cache = null;
    return isStatic ? function() {
      if (cache === null)
        cache = H.closureFromTearOff(this, funcs, applyTrampolineIndex, reflectionInfo, true, false, name).prototype;
      return cache;
    } : tearOffGetter(funcs, applyTrampolineIndex, reflectionInfo, name, isIntercepted);
  }
  var typesOffset = 0;
  function installTearOff(container, getterName, isStatic, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    var funs = [];
    for (var i = 0; i < funsOrNames.length; i++) {
      var fun = funsOrNames[i];
      if (typeof fun == "string")
        fun = container[fun];
      fun.$callName = callNames[i];
      funs.push(fun);
    }
    var fun = funs[0];
    fun.$requiredArgCount = requiredParameterCount;
    fun.$defaultValues = optionalParameterDefaultValues;
    var reflectionInfo = funType;
    if (typeof reflectionInfo == "number")
      reflectionInfo += typesOffset;
    var name = funsOrNames[0];
    fun.$stubName = name;
    var getterFunction = tearOff(funs, applyIndex || 0, reflectionInfo, isStatic, name, isIntercepted);
    container[getterName] = getterFunction;
    if (isStatic)
      fun.$tearOff = getterFunction;
  }
  function installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    return installTearOff(container, getterName, true, false, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex);
  }
  function installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    return installTearOff(container, getterName, false, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex);
  }
  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);
        };
      },
      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: mixin, 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, lazyOld: lazyOld, updateHolder: updateHolder, convertToFastObject: convertToFastObject, setFunctionNamesIfNecessary: setFunctionNamesIfNecessary, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
  }();
  function initializeDeferredHunk(hunk) {
    typesOffset = init.types.length;
    hunk(hunkHelpers, init, holders, $);
  }
  function getGlobalFromName(name) {
    for (var i = 0; i < holders.length; i++) {
      if (holders[i] == C)
        continue;
      if (holders[i][name])
        return holders[i][name];
    }
  }
  var C = {},
  H = {JS_CONST: function JS_CONST() {
    },
    CastIterable_CastIterable: function(source, $S, $T) {
      if ($S._eval$1("EfficientLengthIterable<0>")._is(source))
        return new H._EfficientLengthCastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("_EfficientLengthCastIterable<1,2>"));
      return new H.CastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("CastIterable<1,2>"));
    },
    LateError$fieldADI: function(fieldName) {
      return new H.LateError("Field '" + fieldName + "' has been assigned during initialization.");
    },
    LateError$fieldNI: function(fieldName) {
      return new H.LateError("Field '" + fieldName + "' has not been initialized.");
    },
    LateError$fieldAI: function(fieldName) {
      return new H.LateError("Field '" + fieldName + "' has already been initialized.");
    },
    ReachabilityError$: function(_message) {
      return new H.ReachabilityError(_message);
    },
    hexDigitValue: function(char) {
      var letter,
        digit = char ^ 48;
      if (digit <= 9)
        return digit;
      letter = char | 32;
      if (97 <= letter && letter <= 102)
        return letter - 87;
      return -1;
    },
    checkNotNullable: function(value, $name, $T) {
      if (value == null)
        throw H.wrapException(new H.NotNullableError($name, $T._eval$1("NotNullableError<0>")));
      return value;
    },
    SubListIterable$: function(_iterable, _start, _endOrLength, $E) {
      P.RangeError_checkNotNegative(_start, "start");
      if (_endOrLength != null) {
        P.RangeError_checkNotNegative(_endOrLength, "end");
        if (_start > _endOrLength)
          H.throwExpression(P.RangeError$range(_start, 0, _endOrLength, "start", null));
      }
      return new H.SubListIterable(_iterable, _start, _endOrLength, $E._eval$1("SubListIterable<0>"));
    },
    MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new H.EfficientLengthMappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
      return new H.MappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    SkipIterable_SkipIterable: function(iterable, count, $E) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable)) {
        P.RangeError_checkNotNegative(count, "count");
        return new H.EfficientLengthSkipIterable(iterable, count, $E._eval$1("EfficientLengthSkipIterable<0>"));
      }
      P.RangeError_checkNotNegative(count, "count");
      return new H.SkipIterable(iterable, count, $E._eval$1("SkipIterable<0>"));
    },
    IterableElementError_noElement: function() {
      return new P.StateError("No element");
    },
    IterableElementError_tooMany: function() {
      return new P.StateError("Too many elements");
    },
    IterableElementError_tooFew: function() {
      return new P.StateError("Too few elements");
    },
    Sort_sort: function(a, compare, $E) {
      H.Sort__doSort(a, 0, J.get$length$asx(a) - 1, compare, $E);
    },
    Sort__doSort: function(a, left, right, compare, $E) {
      if (right - left <= 32)
        H.Sort__insertionSort(a, left, right, compare, $E);
      else
        H.Sort__dualPivotQuicksort(a, left, right, compare, $E);
    },
    Sort__insertionSort: function(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;
        while (true) {
          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: function(a, left, right, compare, $E) {
      var t0, less, great, k, ak, comp, great0, less0, pivots_are_equal, comp_pivot1, comp_pivot2,
        sixth = C.JSInt_methods._tdivFast$1(right - left + 1, 6),
        index1 = left + sixth,
        index5 = right - sixth,
        index3 = C.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;
      if (J.$eq$(compare.call$2(el2, el4), 0)) {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          comp = compare.call$2(ak, el2);
          if (comp === 0)
            continue;
          if (typeof comp !== "number")
            return comp.$lt();
          if (comp < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else
            for (; true;) {
              comp = compare.call$2(t1.$index(a, great), el2);
              if (typeof comp !== "number")
                return comp.$gt();
              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;
                }
              }
            }
        }
        pivots_are_equal = true;
      } else {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          comp_pivot1 = compare.call$2(ak, el2);
          if (typeof comp_pivot1 !== "number")
            return comp_pivot1.$lt();
          if (comp_pivot1 < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else {
            comp_pivot2 = compare.call$2(ak, el4);
            if (typeof comp_pivot2 !== "number")
              return comp_pivot2.$gt();
            if (comp_pivot2 > 0)
              for (; true;) {
                comp = compare.call$2(t1.$index(a, great), el4);
                if (typeof comp !== "number")
                  return comp.$gt();
                if (comp > 0) {
                  --great;
                  if (great < k)
                    break;
                  continue;
                } else {
                  comp = compare.call$2(t1.$index(a, great), el2);
                  if (typeof comp !== "number")
                    return comp.$lt();
                  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);
                    less = less0;
                  } else {
                    t1.$indexSet(a, k, t1.$index(a, great));
                    t1.$indexSet(a, great, ak);
                  }
                  great = great0;
                  break;
                }
              }
          }
        }
        pivots_are_equal = false;
      }
      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);
      H.Sort__doSort(a, left, less - 2, compare, $E);
      H.Sort__doSort(a, great + 2, right, compare, $E);
      if (pivots_are_equal)
        return;
      if (less < index1 && great > index5) {
        for (; J.$eq$(compare.call$2(t1.$index(a, less), el2), 0);)
          ++less;
        for (; 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 (; true;)
              if (compare.call$2(t1.$index(a, great), el4) === 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                comp = compare.call$2(t1.$index(a, great), el2);
                if (typeof comp !== "number")
                  return comp.$lt();
                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);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
        H.Sort__doSort(a, less, great, compare, $E);
      } else
        H.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;
    },
    ReachabilityError: function ReachabilityError(t0) {
      this._message = t0;
    },
    nullFuture_closure: function nullFuture_closure() {
    },
    NotNullableError: function NotNullableError(t0, t1) {
      this.__internal$_name = t0;
      this.$ti = t1;
    },
    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;
    },
    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;
    },
    FixedLengthListMixin: function FixedLengthListMixin() {
    },
    UnmodifiableListMixin: function UnmodifiableListMixin() {
    },
    UnmodifiableListBase: function UnmodifiableListBase() {
    },
    ReversedListIterable: function ReversedListIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    Symbol: function Symbol(t0) {
      this.__internal$_name = t0;
    },
    __CastListBase__CastIterableBase_ListMixin: function __CastListBase__CastIterableBase_ListMixin() {
    },
    ConstantMap__throwUnmodifiable: function() {
      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable Map"));
    },
    unminifyOrTag: function(rawClassName) {
      var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    isJsIndexable: function(object, record) {
      var result;
      if (record != null) {
        result = record.x;
        if (result != null)
          return result;
      }
      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
    },
    S: function(value) {
      var res;
      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";
      res = J.toString$0$(value);
      if (typeof res != "string")
        throw H.wrapException(H.argumentErrorValue(value));
      return res;
    },
    Primitives_objectHashCode: function(object) {
      var hash = object.$identityHash;
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object.$identityHash = hash;
      }
      return hash;
    },
    Primitives_parseInt: function(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 H.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 H.wrapException(P.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 ((C.JSString_methods._codeUnitAt$1(digitsPart, i) | 32) > maxCharCode)
            return _null;
      }
      return parseInt(source, radix);
    },
    Primitives_objectTypeName: function(object) {
      return H.Primitives__objectTypeNameNewRti(object);
    },
    Primitives__objectTypeNameNewRti: function(object) {
      var dispatchName, t1, $constructor, constructorName;
      if (object instanceof P.Object)
        return H._rtiToString(H.instanceType(object), null);
      if (J.getInterceptor$(object) === C.Interceptor_methods || type$.UnknownJavaScriptObject._is(object)) {
        dispatchName = C.C_JS_CONST(object);
        t1 = dispatchName !== "Object" && dispatchName !== "";
        if (t1)
          return dispatchName;
        $constructor = object.constructor;
        if (typeof $constructor == "function") {
          constructorName = $constructor.name;
          if (typeof constructorName == "string")
            t1 = constructorName !== "Object" && constructorName !== "";
          else
            t1 = false;
          if (t1)
            return constructorName;
        }
      }
      return H._rtiToString(H.instanceType(object), null);
    },
    Primitives__fromCharCodeApply: function(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: function(codePoints) {
      var t1, _i, i,
        a = H.setRuntimeTypeInfo([], type$.JSArray_int);
      for (t1 = codePoints.length, _i = 0; _i < codePoints.length; codePoints.length === t1 || (0, H.throwConcurrentModificationError)(codePoints), ++_i) {
        i = codePoints[_i];
        if (!H._isInt(i))
          throw H.wrapException(H.argumentErrorValue(i));
        if (i <= 65535)
          C.JSArray_methods.add$1(a, i);
        else if (i <= 1114111) {
          C.JSArray_methods.add$1(a, 55296 + (C.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
          C.JSArray_methods.add$1(a, 56320 + (i & 1023));
        } else
          throw H.wrapException(H.argumentErrorValue(i));
      }
      return H.Primitives__fromCharCodeApply(a);
    },
    Primitives_stringFromCharCodes: function(charCodes) {
      var t1, _i, i;
      for (t1 = charCodes.length, _i = 0; _i < t1; ++_i) {
        i = charCodes[_i];
        if (!H._isInt(i))
          throw H.wrapException(H.argumentErrorValue(i));
        if (i < 0)
          throw H.wrapException(H.argumentErrorValue(i));
        if (i > 65535)
          return H.Primitives_stringFromCodePoints(charCodes);
      }
      return H.Primitives__fromCharCodeApply(charCodes);
    },
    Primitives_stringFromNativeUint8List: function(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: function(charCode) {
      var bits;
      if (0 <= charCode) {
        if (charCode <= 65535)
          return String.fromCharCode(charCode);
        if (charCode <= 1114111) {
          bits = charCode - 65536;
          return String.fromCharCode((C.JSInt_methods._shrOtherPositive$1(bits, 10) | 55296) >>> 0, bits & 1023 | 56320);
        }
      }
      throw H.wrapException(P.RangeError$range(charCode, 0, 1114111, null, null));
    },
    Primitives_lazyAsJsDate: function(receiver) {
      if (receiver.date === void 0)
        receiver.date = new Date(receiver._value);
      return receiver.date;
    },
    Primitives_getYear: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCFullYear() + 0 : H.Primitives_lazyAsJsDate(receiver).getFullYear() + 0;
    },
    Primitives_getMonth: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMonth() + 1 : H.Primitives_lazyAsJsDate(receiver).getMonth() + 1;
    },
    Primitives_getDay: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCDate() + 0 : H.Primitives_lazyAsJsDate(receiver).getDate() + 0;
    },
    Primitives_getHours: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCHours() + 0 : H.Primitives_lazyAsJsDate(receiver).getHours() + 0;
    },
    Primitives_getMinutes: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMinutes() + 0 : H.Primitives_lazyAsJsDate(receiver).getMinutes() + 0;
    },
    Primitives_getSeconds: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCSeconds() + 0 : H.Primitives_lazyAsJsDate(receiver).getSeconds() + 0;
    },
    Primitives_getMilliseconds: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
    },
    Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
      var $arguments, namedArgumentList, t1 = {};
      t1.argumentCount = 0;
      $arguments = [];
      namedArgumentList = [];
      t1.argumentCount = positionalArguments.length;
      C.JSArray_methods.addAll$1($arguments, positionalArguments);
      t1.names = "";
      if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
        namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, namedArgumentList, $arguments));
      "" + t1.argumentCount;
      return J.noSuchMethod$1$($function, new H.JSInvocationMirror(C.Symbol_call, 0, $arguments, namedArgumentList, 0));
    },
    Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
      var t1, $arguments, argumentCount, jsStub;
      if (positionalArguments instanceof Array)
        t1 = namedArguments == null || namedArguments.get$isEmpty(namedArguments);
      else
        t1 = false;
      if (t1) {
        $arguments = positionalArguments;
        argumentCount = $arguments.length;
        if (argumentCount === 0) {
          if (!!$function.call$0)
            return $function.call$0();
        } else if (argumentCount === 1) {
          if (!!$function.call$1)
            return $function.call$1($arguments[0]);
        } else if (argumentCount === 2) {
          if (!!$function.call$2)
            return $function.call$2($arguments[0], $arguments[1]);
        } else if (argumentCount === 3) {
          if (!!$function.call$3)
            return $function.call$3($arguments[0], $arguments[1], $arguments[2]);
        } else if (argumentCount === 4) {
          if (!!$function.call$4)
            return $function.call$4($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
        } else if (argumentCount === 5)
          if (!!$function.call$5)
            return $function.call$5($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
        jsStub = $function["call" + "$" + argumentCount];
        if (jsStub != null)
          return jsStub.apply($function, $arguments);
      }
      return H.Primitives__genericApplyFunction2($function, positionalArguments, namedArguments);
    },
    Primitives__genericApplyFunction2: function($function, positionalArguments, namedArguments) {
      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, keys, _i, defaultValue, used, key;
      if (positionalArguments != null)
        $arguments = positionalArguments instanceof Array ? positionalArguments : P.List_List$from(positionalArguments, true, type$.dynamic);
      else
        $arguments = [];
      argumentCount = $arguments.length;
      requiredParameterCount = $function.$requiredArgCount;
      if (argumentCount < requiredParameterCount)
        return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      defaultValuesClosure = $function.$defaultValues;
      t1 = defaultValuesClosure == null;
      defaultValues = !t1 ? defaultValuesClosure() : null;
      interceptor = J.getInterceptor$($function);
      jsFunction = interceptor["call*"];
      if (typeof jsFunction == "string")
        jsFunction = interceptor[jsFunction];
      if (t1) {
        if (namedArguments != null && namedArguments.get$isNotEmpty(namedArguments))
          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if (argumentCount === requiredParameterCount)
          return jsFunction.apply($function, $arguments);
        return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      }
      if (defaultValues instanceof Array) {
        if (namedArguments != null && namedArguments.get$isNotEmpty(namedArguments))
          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if (argumentCount > requiredParameterCount + defaultValues.length)
          return H.Primitives_functionNoSuchMethod($function, $arguments, null);
        C.JSArray_methods.addAll$1($arguments, defaultValues.slice(argumentCount - requiredParameterCount));
        return jsFunction.apply($function, $arguments);
      } else {
        if (argumentCount > requiredParameterCount)
          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        keys = Object.keys(defaultValues);
        if (namedArguments == null)
          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
            defaultValue = defaultValues[H._asStringS(keys[_i])];
            if (C.C__Required === defaultValue)
              return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
            C.JSArray_methods.add$1($arguments, defaultValue);
          }
        else {
          for (t1 = keys.length, used = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
            key = H._asStringS(keys[_i]);
            if (namedArguments.containsKey$1(0, key)) {
              ++used;
              C.JSArray_methods.add$1($arguments, namedArguments.$index(0, key));
            } else {
              defaultValue = defaultValues[key];
              if (C.C__Required === defaultValue)
                return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
              C.JSArray_methods.add$1($arguments, defaultValue);
            }
          }
          if (used !== namedArguments.get$length(namedArguments))
            return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        }
        return jsFunction.apply($function, $arguments);
      }
    },
    iae: function(argument) {
      throw H.wrapException(H.argumentErrorValue(argument));
    },
    ioore: function(receiver, index) {
      if (receiver == null)
        J.get$length$asx(receiver);
      throw H.wrapException(H.diagnoseIndexError(receiver, index));
    },
    diagnoseIndexError: function(indexable, index) {
      var $length, t1, _s5_ = "index";
      if (!H._isInt(index))
        return new P.ArgumentError(true, index, _s5_, null);
      $length = H._asIntS(J.get$length$asx(indexable));
      if (!(index < 0)) {
        if (typeof $length !== "number")
          return H.iae($length);
        t1 = index >= $length;
      } else
        t1 = true;
      if (t1)
        return P.IndexError$(index, indexable, _s5_, null, $length);
      return P.RangeError$value(index, _s5_);
    },
    diagnoseRangeError: function(start, end, $length) {
      if (start > $length)
        return P.RangeError$range(start, 0, $length, "start", null);
      if (end != null)
        if (end < start || end > $length)
          return P.RangeError$range(end, start, $length, "end", null);
      return new P.ArgumentError(true, end, "end", null);
    },
    argumentErrorValue: function(object) {
      return new P.ArgumentError(true, object, null, null);
    },
    checkNum: function(value) {
      if (typeof value != "number")
        throw H.wrapException(H.argumentErrorValue(value));
      return value;
    },
    wrapException: function(ex) {
      var wrapper, t1;
      if (ex == null)
        ex = new P.NullThrownError();
      wrapper = new Error();
      wrapper.dartException = ex;
      t1 = H.toStringWrapper;
      if ("defineProperty" in Object) {
        Object.defineProperty(wrapper, "message", {get: t1});
        wrapper.name = "";
      } else
        wrapper.toString = t1;
      return wrapper;
    },
    toStringWrapper: function() {
      return J.toString$0$(this.dartException);
    },
    throwExpression: function(ex) {
      throw H.wrapException(ex);
    },
    throwConcurrentModificationError: function(collection) {
      throw H.wrapException(P.ConcurrentModificationError$(collection));
    },
    TypeErrorDecoder_extractPattern: function(message) {
      var match, $arguments, argumentsExpr, expr, method, receiver;
      message = H.quoteStringForRegExp(message.replace(String({}), "$receiver$"));
      match = message.match(/\\\$[a-zA-Z]+\\\$/g);
      if (match == null)
        match = H.setRuntimeTypeInfo([], 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 H.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: function(expression) {
      return function($expr$) {
        var $argumentsExpr$ = "$arguments$";
        try {
          $expr$.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
      return function($expr$) {
        try {
          $expr$.$method$;
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    JsNoSuchMethodError$: function(_message, match) {
      var t1 = match == null,
        t2 = t1 ? null : match.method;
      return new H.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
    },
    unwrapException: function(ex) {
      if (ex == null)
        return new H.NullThrownFromJavaScriptException(ex);
      if (ex instanceof H.ExceptionAndStackTrace)
        return H.saveStackTrace(ex, ex.dartException);
      if (typeof ex !== "object")
        return ex;
      if ("dartException" in ex)
        return H.saveStackTrace(ex, ex.dartException);
      return H._unwrapNonDartException(ex);
    },
    saveStackTrace: function(ex, error) {
      if (type$.Error._is(error))
        if (error.$thrownJsError == null)
          error.$thrownJsError = ex;
      return error;
    },
    _unwrapNonDartException: function(ex) {
      var message, number, ieErrorCode, t1, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, _null = null;
      if (!("message" in ex))
        return ex;
      message = ex.message;
      if ("number" in ex && typeof ex.number == "number") {
        number = ex.number;
        ieErrorCode = number & 65535;
        if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
          switch (ieErrorCode) {
            case 438:
              return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
            case 445:
            case 5007:
              t1 = H.S(message) + " (Error " + ieErrorCode + ")";
              return H.saveStackTrace(ex, new H.NullError(t1, _null));
          }
      }
      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 H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
        else {
          match = notClosure.matchTypeError$1(message);
          if (match != null) {
            match.method = "call";
            return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
          } else {
            match = nullCall.matchTypeError$1(message);
            if (match == null) {
              match = nullLiteralCall.matchTypeError$1(message);
              if (match == null) {
                match = undefCall.matchTypeError$1(message);
                if (match == null) {
                  match = undefLiteralCall.matchTypeError$1(message);
                  if (match == null) {
                    match = nullProperty.matchTypeError$1(message);
                    if (match == null) {
                      match = nullLiteralCall.matchTypeError$1(message);
                      if (match == null) {
                        match = undefProperty.matchTypeError$1(message);
                        if (match == null) {
                          match = undefLiteralProperty.matchTypeError$1(message);
                          t1 = match != null;
                        } else
                          t1 = true;
                      } else
                        t1 = true;
                    } else
                      t1 = true;
                  } else
                    t1 = true;
                } else
                  t1 = true;
              } else
                t1 = true;
            } else
              t1 = true;
            if (t1) {
              H._asStringS(message);
              return H.saveStackTrace(ex, new H.NullError(message, match == null ? _null : match.method));
            }
          }
        }
        return H.saveStackTrace(ex, new H.UnknownJsTypeError(typeof message == "string" ? message : ""));
      }
      if (ex instanceof RangeError) {
        if (typeof message == "string" && message.indexOf("call stack") !== -1)
          return new P.StackOverflowError();
        message = function(ex) {
          try {
            return String(ex);
          } catch (e) {
          }
          return null;
        }(ex);
        return H.saveStackTrace(ex, new P.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 P.StackOverflowError();
      return ex;
    },
    getTraceFromException: function(exception) {
      var trace;
      if (exception instanceof H.ExceptionAndStackTrace)
        return exception.stackTrace;
      if (exception == null)
        return new H._StackTrace(exception);
      trace = exception.$cachedTrace;
      if (trace != null)
        return trace;
      return exception.$cachedTrace = new H._StackTrace(exception);
    },
    objectHashCode: function(object) {
      if (object == null || typeof object != "object")
        return J.get$hashCode$(object);
      else
        return H.Primitives_objectHashCode(object);
    },
    fillLiteralMap: function(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: function(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
      type$.Function._as(closure);
      switch (H._asIntS(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 H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
    },
    convertDartClosureToJS: function(closure, arity) {
      var $function;
      if (closure == null)
        return null;
      $function = closure.$identity;
      if (!!$function)
        return $function;
      $function = function(closure, arity, invoke) {
        return function(a1, a2, a3, a4) {
          return invoke(closure, arity, a1, a2, a3, a4);
        };
      }(closure, arity, H.invokeClosure);
      closure.$identity = $function;
      return $function;
    },
    Closure_fromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, propertyName) {
      var $constructor, t1, trampoline, applyTrampoline, i, stub, stubCallName,
        $function = functions[0],
        callName = $function.$callName,
        $prototype = isStatic ? Object.create(new H.StaticClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, "").constructor.prototype);
      $prototype.$initialize = $prototype.constructor;
      if (isStatic)
        $constructor = function static_tear_off() {
          this.$initialize();
        };
      else {
        t1 = $.Closure_functionCounter;
        if (typeof t1 !== "number")
          return t1.$add();
        $.Closure_functionCounter = t1 + 1;
        t1 = new Function("a,b,c,d" + t1, "this.$initialize(a,b,c,d" + t1 + ")");
        $constructor = t1;
      }
      $prototype.constructor = $constructor;
      $constructor.prototype = $prototype;
      if (!isStatic) {
        trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
        trampoline.$reflectionInfo = reflectionInfo;
      } else {
        $prototype.$static_name = propertyName;
        trampoline = $function;
      }
      $prototype.$signature = H.Closure__computeSignatureFunctionNewRti(reflectionInfo, isStatic, isIntercepted);
      $prototype[callName] = trampoline;
      for (applyTrampoline = trampoline, i = 1; i < functions.length; ++i) {
        stub = functions[i];
        stubCallName = stub.$callName;
        if (stubCallName != null) {
          stub = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
          $prototype[stubCallName] = stub;
        }
        if (i === applyTrampolineIndex) {
          stub.$reflectionInfo = reflectionInfo;
          applyTrampoline = stub;
        }
      }
      $prototype["call*"] = applyTrampoline;
      $prototype.$requiredArgCount = $function.$requiredArgCount;
      $prototype.$defaultValues = $function.$defaultValues;
      return $constructor;
    },
    Closure__computeSignatureFunctionNewRti: function(functionType, isStatic, isIntercepted) {
      var typeEvalMethod;
      if (typeof functionType == "number")
        return function(getType, t) {
          return function() {
            return getType(t);
          };
        }(H.getTypeFromTypesTable, functionType);
      if (typeof functionType == "string") {
        if (isStatic)
          throw H.wrapException("Cannot compute signature for static tearoff.");
        typeEvalMethod = isIntercepted ? H.BoundClosure_evalRecipeIntercepted : H.BoundClosure_evalRecipe;
        return function(recipe, evalOnReceiver) {
          return function() {
            return evalOnReceiver(this, recipe);
          };
        }(functionType, typeEvalMethod);
      }
      throw H.wrapException("Error in functionType of tearoff");
    },
    Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
      var getSelf = H.BoundClosure_selfOf;
      switch (isSuperCall ? -1 : arity) {
        case 0:
          return function(n, S) {
            return function() {
              return S(this)[n]();
            };
          }(stubName, getSelf);
        case 1:
          return function(n, S) {
            return function(a) {
              return S(this)[n](a);
            };
          }(stubName, getSelf);
        case 2:
          return function(n, S) {
            return function(a, b) {
              return S(this)[n](a, b);
            };
          }(stubName, getSelf);
        case 3:
          return function(n, S) {
            return function(a, b, c) {
              return S(this)[n](a, b, c);
            };
          }(stubName, getSelf);
        case 4:
          return function(n, S) {
            return function(a, b, c, d) {
              return S(this)[n](a, b, c, d);
            };
          }(stubName, getSelf);
        case 5:
          return function(n, S) {
            return function(a, b, c, d, e) {
              return S(this)[n](a, b, c, d, e);
            };
          }(stubName, getSelf);
        default:
          return function(f, s) {
            return function() {
              return f.apply(s(this), arguments);
            };
          }($function, getSelf);
      }
    },
    Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
      var stubName, arity, lookedUpFunction, t1, t2, selfName, $arguments;
      if (isIntercepted)
        return H.Closure_forwardInterceptedCallTo(receiver, $function);
      stubName = $function.$stubName;
      arity = $function.length;
      lookedUpFunction = receiver[stubName];
      t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
      t2 = !t1 || arity >= 27;
      if (t2)
        return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
      if (arity === 0) {
        t1 = $.Closure_functionCounter;
        if (typeof t1 !== "number")
          return t1.$add();
        $.Closure_functionCounter = t1 + 1;
        selfName = "self" + t1;
        t1 = "return function(){var " + selfName + " = this.";
        t2 = $.BoundClosure_selfFieldNameCache;
        return new Function(t1 + (t2 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t2) + ";return " + selfName + "." + H.S(stubName) + "();}")();
      }
      $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
      t1 = $.Closure_functionCounter;
      if (typeof t1 !== "number")
        return t1.$add();
      $.Closure_functionCounter = t1 + 1;
      $arguments += t1;
      t1 = "return function(" + $arguments + "){return this.";
      t2 = $.BoundClosure_selfFieldNameCache;
      return new Function(t1 + (t2 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t2) + "." + H.S(stubName) + "(" + $arguments + ");}")();
    },
    Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
      var getSelf = H.BoundClosure_selfOf,
        getReceiver = H.BoundClosure_receiverOf;
      switch (isSuperCall ? -1 : arity) {
        case 0:
          throw H.wrapException(new H.RuntimeError("Intercepted function with no arguments."));
        case 1:
          return function(n, s, r) {
            return function() {
              return s(this)[n](r(this));
            };
          }($name, getSelf, getReceiver);
        case 2:
          return function(n, s, r) {
            return function(a) {
              return s(this)[n](r(this), a);
            };
          }($name, getSelf, getReceiver);
        case 3:
          return function(n, s, r) {
            return function(a, b) {
              return s(this)[n](r(this), a, b);
            };
          }($name, getSelf, getReceiver);
        case 4:
          return function(n, s, r) {
            return function(a, b, c) {
              return s(this)[n](r(this), a, b, c);
            };
          }($name, getSelf, getReceiver);
        case 5:
          return function(n, s, r) {
            return function(a, b, c, d) {
              return s(this)[n](r(this), a, b, c, d);
            };
          }($name, getSelf, getReceiver);
        case 6:
          return function(n, s, r) {
            return function(a, b, c, d, e) {
              return s(this)[n](r(this), a, b, c, d, e);
            };
          }($name, getSelf, getReceiver);
        default:
          return function(f, s, r, a) {
            return function() {
              a = [r(this)];
              Array.prototype.push.apply(a, arguments);
              return f.apply(s(this), a);
            };
          }($function, getSelf, getReceiver);
      }
    },
    Closure_forwardInterceptedCallTo: function(receiver, $function) {
      var receiverField, stubName, arity, lookedUpFunction, t1, t2, $arguments,
        selfField = $.BoundClosure_selfFieldNameCache;
      if (selfField == null)
        selfField = $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self");
      receiverField = $.BoundClosure_receiverFieldNameCache;
      if (receiverField == null)
        receiverField = $.BoundClosure_receiverFieldNameCache = H.BoundClosure_computeFieldNamed("receiver");
      stubName = $function.$stubName;
      arity = $function.length;
      lookedUpFunction = receiver[stubName];
      t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
      t2 = !t1 || arity >= 28;
      if (t2)
        return H.Closure_cspForwardInterceptedCall(arity, !t1, stubName, $function);
      if (arity === 1) {
        t1 = "return function(){return this." + selfField + "." + H.S(stubName) + "(this." + receiverField + ");";
        t2 = $.Closure_functionCounter;
        if (typeof t2 !== "number")
          return t2.$add();
        $.Closure_functionCounter = t2 + 1;
        return new Function(t1 + t2 + "}")();
      }
      $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
      t1 = "return function(" + $arguments + "){return this." + selfField + "." + H.S(stubName) + "(this." + receiverField + ", " + $arguments + ");";
      t2 = $.Closure_functionCounter;
      if (typeof t2 !== "number")
        return t2.$add();
      $.Closure_functionCounter = t2 + 1;
      return new Function(t1 + t2 + "}")();
    },
    closureFromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, $name) {
      return H.Closure_fromTearOff(receiver, functions, applyTrampolineIndex, reflectionInfo, !!isStatic, !!isIntercepted, $name);
    },
    BoundClosure_evalRecipe: function(closure, recipe) {
      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._self), recipe);
    },
    BoundClosure_evalRecipeIntercepted: function(closure, recipe) {
      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._receiver), recipe);
    },
    BoundClosure_selfOf: function(closure) {
      return closure._self;
    },
    BoundClosure_receiverOf: function(closure) {
      return closure._receiver;
    },
    BoundClosure_computeFieldNamed: function(fieldName) {
      var t1, i, $name,
        template = new H.BoundClosure("self", "target", "receiver", "name"),
        names = J.JSArray_markFixedList(Object.getOwnPropertyNames(template), type$.nullable_Object);
      for (t1 = names.length, i = 0; i < t1; ++i) {
        $name = names[i];
        if (template[$name] === fieldName)
          return $name;
      }
      throw H.wrapException(P.ArgumentError$("Field name " + fieldName + " not found."));
    },
    boolConversionCheck: function(value) {
      if (value == null)
        H.assertThrow("boolean expression must not be null");
      return value;
    },
    assertThrow: function(message) {
      throw H.wrapException(new H._AssertionError(message));
    },
    throwCyclicInit: function(staticName) {
      throw H.wrapException(new P.CyclicInitializationError(staticName));
    },
    getIsolateAffinityTag: function($name) {
      return init.getIsolateTag($name);
    },
    throwLateInitializationError: function($name) {
      return H.throwExpression(new H.LateError($name));
    },
    defineProperty: function(obj, property, value) {
      Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
    },
    lookupAndCacheInterceptor: function(obj) {
      var interceptor, interceptorClass, altTag, mark, t1,
        tag = H._asStringS($.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 = H._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 = H.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 = H.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      }
      if (mark === "+")
        return H.patchInteriorProto(obj, interceptor);
      if (mark === "*")
        throw H.wrapException(P.UnimplementedError$(tag));
      if (init.leafTags[tag] === true) {
        t1 = H.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      } else
        return H.patchInteriorProto(obj, interceptor);
    },
    patchInteriorProto: function(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: function(interceptor) {
      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
    },
    makeDefaultDispatchRecord: function(tag, interceptorClass, proto) {
      var interceptor = interceptorClass.prototype;
      if (init.leafTags[tag] === true)
        return H.makeLeafDispatchRecord(interceptor);
      else
        return J.makeDispatchRecord(interceptor, proto, null, null);
    },
    initNativeDispatch: function() {
      if (true === $.initNativeDispatchFlag)
        return;
      $.initNativeDispatchFlag = true;
      H.initNativeDispatchContinue();
    },
    initNativeDispatchContinue: function() {
      var map, tags, fun, i, tag, proto, record, interceptorClass;
      $.dispatchRecordsForInstanceTags = Object.create(null);
      $.interceptorsForUncacheableTags = Object.create(null);
      H.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 = H.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: function() {
      var transformers, i, transformer, getTag, getUnknownTag, prototypeForTag,
        hooks = C.C_JS_CONST0();
      hooks = H.applyHooksTransformer(C.C_JS_CONST1, H.applyHooksTransformer(C.C_JS_CONST2, H.applyHooksTransformer(C.C_JS_CONST3, H.applyHooksTransformer(C.C_JS_CONST3, H.applyHooksTransformer(C.C_JS_CONST4, H.applyHooksTransformer(C.C_JS_CONST5, H.applyHooksTransformer(C.C_JS_CONST6(C.C_JS_CONST), hooks)))))));
      if (typeof dartNativeDispatchHooksTransformer != "undefined") {
        transformers = dartNativeDispatchHooksTransformer;
        if (typeof transformers == "function")
          transformers = [transformers];
        if (transformers.constructor == Array)
          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 H.initHooks_closure(getTag);
      $.alternateTagFunction = new H.initHooks_closure0(getUnknownTag);
      $.prototypeForTagFunction = new H.initHooks_closure1(prototypeForTag);
    },
    applyHooksTransformer: function(transformer, hooks) {
      return transformer(hooks) || hooks;
    },
    JSSyntaxRegExp_makeNative: function(source, multiLine, caseSensitive, unicode, dotAll, global) {
      var m, i, u, s, g, regexp;
      if (typeof source != "string")
        H.throwExpression(H.argumentErrorValue(source));
      m = multiLine ? "m" : "";
      i = caseSensitive ? "" : "i";
      u = unicode ? "u" : "";
      s = dotAll ? "s" : "";
      g = global ? "g" : "";
      regexp = function(source, modifiers) {
        try {
          return new RegExp(source, modifiers);
        } catch (e) {
          return e;
        }
      }(source, m + i + u + s + g);
      if (regexp instanceof RegExp)
        return regexp;
      throw H.wrapException(P.FormatException$("Illegal RegExp pattern (" + String(regexp) + ")", source, null));
    },
    stringContainsUnchecked: function(receiver, other, startIndex) {
      var t1 = receiver.indexOf(other, startIndex);
      return t1 >= 0;
    },
    quoteStringForRegExp: function(string) {
      if (/[[\]{}()*+?.\\^$|]/.test(string))
        return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
      return string;
    },
    ConstantMapView: function ConstantMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = 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, t3) {
      var _ = this;
      _.__js_helper$_length = t0;
      _._jsObject = t1;
      _.__js_helper$_keys = t2;
      _.$ti = t3;
    },
    _ConstantMapKeyIterable: function _ConstantMapKeyIterable(t0, t1) {
      this._map = t0;
      this.$ti = t1;
    },
    JSInvocationMirror: function JSInvocationMirror(t0, t1, t2, t3, t4) {
      var _ = this;
      _._memberName = t0;
      _.__js_helper$_kind = t1;
      _._arguments = t2;
      _._namedArgumentNames = t3;
      _._typeArgumentCount = t4;
    },
    Primitives_functionNoSuchMethod_closure: function Primitives_functionNoSuchMethod_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.namedArgumentList = t1;
      this.$arguments = t2;
    },
    TypeErrorDecoder: function TypeErrorDecoder(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _._pattern = t0;
      _._arguments = t1;
      _._argumentsExpr = t2;
      _._expr = t3;
      _.__js_helper$_method = t4;
      _._receiver = t5;
    },
    NullError: function NullError(t0, t1) {
      this.__js_helper$_message = t0;
      this.__js_helper$_method = t1;
    },
    JsNoSuchMethodError: function JsNoSuchMethodError(t0, t1, t2) {
      this.__js_helper$_message = t0;
      this.__js_helper$_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() {
    },
    TearOffClosure: function TearOffClosure() {
    },
    StaticClosure: function StaticClosure() {
    },
    BoundClosure: function BoundClosure(t0, t1, t2, t3) {
      var _ = this;
      _._self = t0;
      _._target = t1;
      _._receiver = t2;
      _._name = t3;
    },
    RuntimeError: function RuntimeError(t0) {
      this.message = t0;
    },
    _AssertionError: function _AssertionError(t0) {
      this.message = t0;
    },
    _Required: function _Required() {
    },
    JsLinkedHashMap: function JsLinkedHashMap(t0) {
      var _ = this;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _._nums = _._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;
    },
    LinkedHashMapKeyIterable: function LinkedHashMapKeyIterable(t0, t1) {
      this._map = t0;
      this.$ti = t1;
    },
    LinkedHashMapKeyIterator: function LinkedHashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._map = t0;
      _._modifications = t1;
      _.__js_helper$_current = _._cell = null;
      _.$ti = t2;
    },
    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;
    },
    JSSyntaxRegExp: function JSSyntaxRegExp(t0, t1) {
      var _ = this;
      _.pattern = t0;
      _._nativeRegExp = t1;
      _._nativeAnchoredRegExp = _._nativeGlobalRegExp = null;
    },
    _MatchImplementation: function _MatchImplementation(t0) {
      this._match = t0;
    },
    _checkViewArguments: function(buffer, offsetInBytes, $length) {
      if (!H._isInt(offsetInBytes))
        throw H.wrapException(P.ArgumentError$("Invalid view offsetInBytes " + H.S(offsetInBytes)));
    },
    _ensureNativeList: function(list) {
      return list;
    },
    NativeInt8List__create1: function(arg) {
      return new Int8Array(arg);
    },
    NativeUint8List_NativeUint8List$view: function(buffer, offsetInBytes, $length) {
      H._checkViewArguments(buffer, offsetInBytes, $length);
      return $length == null ? new Uint8Array(buffer, offsetInBytes) : new Uint8Array(buffer, offsetInBytes, $length);
    },
    _checkValidIndex: function(index, list, $length) {
      if (index >>> 0 !== index || index >= $length)
        throw H.wrapException(H.diagnoseIndexError(list, index));
    },
    _checkValidRange: function(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 H.wrapException(H.diagnoseRangeError(start, end, $length));
      if (end == null)
        return $length;
      return end;
    },
    NativeByteBuffer: function NativeByteBuffer() {
    },
    NativeTypedData: function NativeTypedData() {
    },
    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__getQuestionFromStar: function(universe, rti) {
      var question = rti._precomputed1;
      return question == null ? rti._precomputed1 = H._Universe__lookupQuestionRti(universe, rti._primary, true) : question;
    },
    Rti__getFutureFromFutureOr: function(universe, rti) {
      var future = rti._precomputed1;
      return future == null ? rti._precomputed1 = H._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
    },
    Rti__isUnionOfFunctionType: function(rti) {
      var kind = rti._kind;
      if (kind === 6 || kind === 7 || kind === 8)
        return H.Rti__isUnionOfFunctionType(rti._primary);
      return kind === 11 || kind === 12;
    },
    Rti__getCanonicalRecipe: function(rti) {
      return rti._canonicalRecipe;
    },
    findType: function(recipe) {
      return H._Universe_eval(init.typeUniverse, recipe, false);
    },
    _substitute: function(universe, rti, typeArguments, depth) {
      var baseType, substitutedBaseType, interfaceTypeArguments, substitutedInterfaceTypeArguments, base, substitutedBase, $arguments, substitutedArguments, 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 = H._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return H._Universe__lookupStarRti(universe, substitutedBaseType, true);
        case 7:
          baseType = rti._primary;
          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return H._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
        case 8:
          baseType = rti._primary;
          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return H._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
        case 9:
          interfaceTypeArguments = rti._rest;
          substitutedInterfaceTypeArguments = H._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
            return rti;
          return H._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
        case 10:
          base = rti._primary;
          substitutedBase = H._substitute(universe, base, typeArguments, depth);
          $arguments = rti._rest;
          substitutedArguments = H._substituteArray(universe, $arguments, typeArguments, depth);
          if (substitutedBase === base && substitutedArguments === $arguments)
            return rti;
          return H._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
        case 11:
          returnType = rti._primary;
          substitutedReturnType = H._substitute(universe, returnType, typeArguments, depth);
          functionParameters = rti._rest;
          substitutedFunctionParameters = H._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
            return rti;
          return H._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
        case 12:
          bounds = rti._rest;
          depth += bounds.length;
          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, depth);
          base = rti._primary;
          substitutedBase = H._substitute(universe, base, typeArguments, depth);
          if (substitutedBounds === bounds && substitutedBase === base)
            return rti;
          return H._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 H.wrapException(P.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
      }
    },
    _substituteArray: function(universe, rtiArray, typeArguments, depth) {
      var changed, i, rti, substitutedRti,
        $length = rtiArray.length,
        result = [];
      for (changed = false, i = 0; i < $length; ++i) {
        rti = rtiArray[i];
        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.push(substitutedRti);
      }
      return changed ? result : rtiArray;
    },
    _substituteNamed: function(universe, namedArray, typeArguments, depth) {
      var changed, i, t1, t2, rti, substitutedRti,
        $length = namedArray.length,
        result = [];
      for (changed = false, i = 0; i < $length; i += 3) {
        t1 = namedArray[i];
        t2 = namedArray[i + 1];
        rti = namedArray[i + 2];
        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.push(t1);
        result.push(t2);
        result.push(substitutedRti);
      }
      return changed ? result : namedArray;
    },
    _substituteFunctionParameters: function(universe, functionParameters, typeArguments, depth) {
      var result,
        requiredPositional = functionParameters._requiredPositional,
        substitutedRequiredPositional = H._substituteArray(universe, requiredPositional, typeArguments, depth),
        optionalPositional = functionParameters._optionalPositional,
        substitutedOptionalPositional = H._substituteArray(universe, optionalPositional, typeArguments, depth),
        named = functionParameters._named,
        substitutedNamed = H._substituteNamed(universe, named, typeArguments, depth);
      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
        return functionParameters;
      result = new H._FunctionParameters();
      result._requiredPositional = substitutedRequiredPositional;
      result._optionalPositional = substitutedOptionalPositional;
      result._named = substitutedNamed;
      return result;
    },
    setRuntimeTypeInfo: function(target, rti) {
      target[init.arrayRti] = rti;
      return target;
    },
    closureFunctionType: function(closure) {
      var signature = closure.$signature;
      if (signature != null) {
        if (typeof signature == "number")
          return H.getTypeFromTypesTable(signature);
        return closure.$signature();
      }
      return null;
    },
    instanceOrFunctionType: function(object, testRti) {
      var rti;
      if (H.Rti__isUnionOfFunctionType(testRti))
        if (object instanceof H.Closure) {
          rti = H.closureFunctionType(object);
          if (rti != null)
            return rti;
        }
      return H.instanceType(object);
    },
    instanceType: function(object) {
      var rti;
      if (object instanceof P.Object) {
        rti = object.$ti;
        return rti != null ? rti : H._instanceTypeFromConstructor(object);
      }
      if (Array.isArray(object))
        return H._arrayInstanceType(object);
      return H._instanceTypeFromConstructor(J.getInterceptor$(object));
    },
    _arrayInstanceType: function(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: function(object) {
      var rti = object.$ti;
      return rti != null ? rti : H._instanceTypeFromConstructor(object);
    },
    _instanceTypeFromConstructor: function(instance) {
      var $constructor = instance.constructor,
        probe = $constructor.$ccache;
      if (probe != null)
        return probe;
      return H._instanceTypeFromConstructorMiss(instance, $constructor);
    },
    _instanceTypeFromConstructorMiss: function(instance, $constructor) {
      var effectiveConstructor = instance instanceof H.Closure ? instance.__proto__.__proto__.constructor : $constructor,
        rti = H._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
      $constructor.$ccache = rti;
      return rti;
    },
    getTypeFromTypesTable: function(index) {
      var table, type, rti;
      H._asIntS(index);
      table = init.types;
      type = table[index];
      if (typeof type == "string") {
        rti = H._Universe_eval(init.typeUniverse, type, false);
        table[index] = rti;
        return rti;
      }
      return type;
    },
    getRuntimeType: function(object) {
      var rti = object instanceof H.Closure ? H.closureFunctionType(object) : null;
      return H.createRuntimeType(rti == null ? H.instanceType(object) : rti);
    },
    createRuntimeType: function(rti) {
      var recipe, starErasedRecipe, starErasedRti,
        type = rti._cachedRuntimeType;
      if (type != null)
        return type;
      recipe = rti._canonicalRecipe;
      starErasedRecipe = recipe.replace(/\*/g, "");
      if (starErasedRecipe === recipe)
        return rti._cachedRuntimeType = new H._Type(rti);
      starErasedRti = H._Universe_eval(init.typeUniverse, starErasedRecipe, true);
      type = starErasedRti._cachedRuntimeType;
      return rti._cachedRuntimeType = type == null ? starErasedRti._cachedRuntimeType = new H._Type(starErasedRti) : type;
    },
    typeLiteral: function(recipe) {
      return H.createRuntimeType(H._Universe_eval(init.typeUniverse, recipe, false));
    },
    _installSpecializedIsTest: function(object) {
      var unstarred, isFn, testRti = this,
        t1 = type$.Object;
      if (testRti === t1)
        return H._finishIsFn(testRti, object, H._isObject);
      if (!H.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = testRti === t1;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return H._finishIsFn(testRti, object, H._isTop);
      t1 = testRti._kind;
      unstarred = t1 === 6 ? testRti._primary : testRti;
      if (unstarred === type$.int)
        isFn = H._isInt;
      else if (unstarred === type$.double || unstarred === type$.num)
        isFn = H._isNum;
      else if (unstarred === type$.String)
        isFn = H._isString;
      else
        isFn = unstarred === type$.bool ? H._isBool : null;
      if (isFn != null)
        return H._finishIsFn(testRti, object, isFn);
      if (unstarred._kind === 9) {
        t1 = unstarred._primary;
        if (unstarred._rest.every(H.isTopType)) {
          testRti._specializedTestResource = "$is" + t1;
          return H._finishIsFn(testRti, object, H._isTestViaProperty);
        }
      } else if (t1 === 7)
        return H._finishIsFn(testRti, object, H._generalNullableIsTestImplementation);
      return H._finishIsFn(testRti, object, H._generalIsTestImplementation);
    },
    _finishIsFn: function(testRti, object, isFn) {
      testRti._is = isFn;
      return testRti._is(object);
    },
    _installSpecializedAsCheck: function(object) {
      var t1, asFn, testRti = this;
      if (!H.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = testRti === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        asFn = H._asTop;
      else if (testRti === type$.Object)
        asFn = H._asObject;
      else
        asFn = H._generalNullableAsCheckImplementation;
      testRti._as = asFn;
      return testRti._as(object);
    },
    _nullIs: function(testRti) {
      var t1,
        kind = testRti._kind;
      if (!H.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          if (!(testRti === type$.legacy_Never))
            if (kind !== 7)
              t1 = kind === 8 && H._nullIs(testRti._primary) || testRti === type$.Null || testRti === type$.JSNull;
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    _generalIsTestImplementation: function(object) {
      var testRti = this;
      if (object == null)
        return H._nullIs(testRti);
      return H._isSubtype(init.typeUniverse, H.instanceOrFunctionType(object, testRti), null, testRti, null);
    },
    _generalNullableIsTestImplementation: function(object) {
      if (object == null)
        return true;
      return this._primary._is(object);
    },
    _isTestViaProperty: function(object) {
      var tag, testRti = this;
      if (object == null)
        return H._nullIs(testRti);
      tag = testRti._specializedTestResource;
      if (object instanceof P.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _generalAsCheckImplementation: function(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      H._failedAsCheck(object, testRti);
    },
    _generalNullableAsCheckImplementation: function(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      H._failedAsCheck(object, testRti);
    },
    _failedAsCheck: function(object, testRti) {
      throw H.wrapException(H._TypeError$fromMessage(H._Error_compose(object, H.instanceOrFunctionType(object, testRti), H._rtiToString(testRti, null))));
    },
    checkTypeBound: function(type, bound, variable, methodName) {
      var _null = null;
      if (H._isSubtype(init.typeUniverse, type, _null, bound, _null))
        return type;
      throw H.wrapException(H._TypeError$fromMessage("The type argument '" + H.S(H._rtiToString(type, _null)) + "' is not a subtype of the type variable bound '" + H.S(H._rtiToString(bound, _null)) + "' of type variable '" + H.S(variable) + "' in '" + H.S(methodName) + "'."));
    },
    _Error_compose: function(object, objectRti, checkedTypeDescription) {
      var objectDescription = P.Error_safeToString(object),
        objectTypeDescription = H._rtiToString(objectRti == null ? H.instanceType(object) : objectRti, null);
      return objectDescription + ": type '" + H.S(objectTypeDescription) + "' is not a subtype of type '" + H.S(checkedTypeDescription) + "'";
    },
    _TypeError$fromMessage: function(message) {
      return new H._TypeError("TypeError: " + message);
    },
    _TypeError__TypeError$forType: function(object, type) {
      return new H._TypeError("TypeError: " + H._Error_compose(object, null, type));
    },
    _isObject: function(object) {
      return object != null;
    },
    _asObject: function(object) {
      return object;
    },
    _isTop: function(object) {
      return true;
    },
    _asTop: function(object) {
      return object;
    },
    _isBool: function(object) {
      return true === object || false === object;
    },
    _asBool: function(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolS: function(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolQ: function(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool?"));
    },
    _asDouble: function(object) {
      if (typeof object == "number")
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleS: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleQ: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "double?"));
    },
    _isInt: function(object) {
      return typeof object == "number" && Math.floor(object) === object;
    },
    _asInt: function(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
    },
    _asIntS: function(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
    },
    _asIntQ: function(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "int?"));
    },
    _isNum: function(object) {
      return typeof object == "number";
    },
    _asNum: function(object) {
      if (typeof object == "number")
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
    },
    _asNumS: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
    },
    _asNumQ: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "num?"));
    },
    _isString: function(object) {
      return typeof object == "string";
    },
    _asString: function(object) {
      if (typeof object == "string")
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
    },
    _asStringS: function(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
    },
    _asStringQ: function(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "String?"));
    },
    _rtiArrayToString: function(array, genericContext) {
      var s, sep, i;
      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
        s += C.JSString_methods.$add(sep, H._rtiToString(array[i], genericContext));
      return s;
    },
    _functionRtiToString: function(functionType, genericContext, bounds) {
      var boundsLength, outerContextLength, offset, i, t1, t2, t3, typeParametersText, typeSep, t4, t5, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
      if (bounds != null) {
        boundsLength = bounds.length;
        if (genericContext == null) {
          genericContext = H.setRuntimeTypeInfo([], type$.JSArray_String);
          outerContextLength = null;
        } else
          outerContextLength = genericContext.length;
        offset = genericContext.length;
        for (i = boundsLength; i > 0; --i)
          C.JSArray_methods.add$1(genericContext, "T" + (offset + i));
        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, t3 = type$.Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
          typeParametersText += typeSep;
          t4 = genericContext.length;
          t5 = t4 - 1 - i;
          if (t5 < 0)
            return H.ioore(genericContext, t5);
          typeParametersText = C.JSString_methods.$add(typeParametersText, genericContext[t5]);
          boundRti = bounds[i];
          kind = boundRti._kind;
          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
            if (!(boundRti === t2))
              t4 = boundRti === t3;
            else
              t4 = true;
          else
            t4 = true;
          if (!t4)
            typeParametersText += C.JSString_methods.$add(" extends ", H._rtiToString(boundRti, genericContext));
        }
        typeParametersText += ">";
      } else {
        typeParametersText = "";
        outerContextLength = null;
      }
      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 = H._rtiToString(t1, genericContext);
      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
        argumentsText += C.JSString_methods.$add(sep, H._rtiToString(requiredPositional[i], genericContext));
      if (optionalPositionalLength > 0) {
        argumentsText += sep + "[";
        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
          argumentsText += C.JSString_methods.$add(sep, H._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 += J.$add$ansx(H._rtiToString(named[i + 2], genericContext), " ") + named[i];
        }
        argumentsText += "}";
      }
      if (outerContextLength != null) {
        genericContext.toString;
        genericContext.length = outerContextLength;
      }
      return typeParametersText + "(" + argumentsText + ") => " + H.S(returnTypeText);
    },
    _rtiToString: function(rti, genericContext) {
      var s, questionArgument, 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) {
        s = H._rtiToString(rti._primary, genericContext);
        return s;
      }
      if (kind === 7) {
        questionArgument = rti._primary;
        s = H._rtiToString(questionArgument, genericContext);
        argumentKind = questionArgument._kind;
        return J.$add$ansx(argumentKind === 11 || argumentKind === 12 ? C.JSString_methods.$add("(", s) + ")" : s, "?");
      }
      if (kind === 8)
        return "FutureOr<" + H.S(H._rtiToString(rti._primary, genericContext)) + ">";
      if (kind === 9) {
        $name = H._unminifyOrTag(rti._primary);
        $arguments = rti._rest;
        return $arguments.length !== 0 ? $name + ("<" + H._rtiArrayToString($arguments, genericContext) + ">") : $name;
      }
      if (kind === 11)
        return H._functionRtiToString(rti, genericContext, null);
      if (kind === 12)
        return H._functionRtiToString(rti._primary, genericContext, rti._rest);
      if (kind === 13) {
        genericContext.toString;
        t1 = rti._primary;
        t2 = genericContext.length;
        t1 = t2 - 1 - t1;
        if (t1 < 0 || t1 >= t2)
          return H.ioore(genericContext, t1);
        return genericContext[t1];
      }
      return "?";
    },
    _unminifyOrTag: function(rawClassName) {
      var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    _Universe_findRule: function(universe, targetType) {
      var rule = universe.tR[targetType];
      for (; typeof rule == "string";)
        rule = universe.tR[rule];
      return rule;
    },
    _Universe_findErasedType: function(universe, cls) {
      var $length, erased, $arguments, i, $interface,
        metadata = universe.eT,
        probe = metadata[cls];
      if (probe == null)
        return H._Universe_eval(universe, cls, false);
      else if (typeof probe == "number") {
        $length = probe;
        erased = H._Universe__lookupTerminalRti(universe, 5, "#");
        $arguments = [];
        for (i = 0; i < $length; ++i)
          $arguments.push(erased);
        $interface = H._Universe__lookupInterfaceRti(universe, cls, $arguments);
        metadata[cls] = $interface;
        return $interface;
      } else
        return probe;
    },
    _Universe_addRules: function(universe, rules) {
      return H._Utils_objectAssign(universe.tR, rules);
    },
    _Universe_addErasedTypes: function(universe, types) {
      return H._Utils_objectAssign(universe.eT, types);
    },
    _Universe_eval: function(universe, recipe, normalize) {
      var rti,
        cache = universe.eC,
        probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = H._Parser_parse(H._Parser_create(universe, null, recipe, normalize));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_evalInEnvironment: function(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 = H._Parser_parse(H._Parser_create(universe, environment, recipe, true));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_bind: function(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 = H._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 10 ? argumentsRti._rest : [argumentsRti]);
      cache.set(argumentsRecipe, rti);
      return rti;
    },
    _Universe__installTypeTests: function(universe, rti) {
      rti._as = H._installSpecializedAsCheck;
      rti._is = H._installSpecializedIsTest;
      return rti;
    },
    _Universe__lookupTerminalRti: function(universe, kind, key) {
      var rti, t1,
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = kind;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupStarRti: function(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "*",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createStarRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createStarRti: function(universe, baseType, key, normalize) {
      var baseKind, t1, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!H.isStrongTopType(baseType))
          t1 = baseType === type$.Null || baseType === type$.JSNull || baseKind === 7 || baseKind === 6;
        else
          t1 = true;
        if (t1)
          return baseType;
      }
      rti = new H.Rti(null, null);
      rti._kind = 6;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupQuestionRti: function(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "?",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createQuestionRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createQuestionRti: function(universe, baseType, key, normalize) {
      var baseKind, t1, starArgument, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!H.isStrongTopType(baseType))
          if (!(baseType === type$.Null || baseType === type$.JSNull))
            if (baseKind !== 7)
              t1 = baseKind === 8 && H.isNullable(baseType._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
        if (t1)
          return baseType;
        else if (baseKind === 1 || baseType === type$.legacy_Never)
          return type$.Null;
        else if (baseKind === 6) {
          starArgument = baseType._primary;
          if (starArgument._kind === 8 && H.isNullable(starArgument._primary))
            return starArgument;
          else
            return H.Rti__getQuestionFromStar(universe, baseType);
        }
      }
      rti = new H.Rti(null, null);
      rti._kind = 7;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupFutureOrRti: function(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "/",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createFutureOrRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createFutureOrRti: function(universe, baseType, key, normalize) {
      var t1, t2, rti;
      if (normalize) {
        t1 = baseType._kind;
        if (!H.isStrongTopType(baseType))
          if (!(baseType === type$.legacy_Object))
            t2 = baseType === type$.Object;
          else
            t2 = true;
        else
          t2 = true;
        if (t2 || baseType === type$.Object)
          return baseType;
        else if (t1 === 1)
          return H._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
        else if (baseType === type$.Null || baseType === type$.JSNull)
          return type$.nullable_Future_Null;
      }
      rti = new H.Rti(null, null);
      rti._kind = 8;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupGenericFunctionParameterRti: function(universe, index) {
      var rti, t1,
        key = "" + index + "^",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 13;
      rti._primary = index;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__canonicalRecipeJoin: function($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: function($arguments) {
      var s, sep, i, t1, nameSep, s0,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
        t1 = $arguments[i];
        nameSep = $arguments[i + 1] ? "!" : ":";
        s0 = $arguments[i + 2]._canonicalRecipe;
        s += sep + t1 + nameSep + s0;
      }
      return s;
    },
    _Universe__lookupInterfaceRti: function(universe, $name, $arguments) {
      var probe, rti, t1,
        s = $name;
      if ($arguments.length !== 0)
        s += "<" + H._Universe__canonicalRecipeJoin($arguments) + ">";
      probe = universe.eC.get(s);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 9;
      rti._primary = $name;
      rti._rest = $arguments;
      if ($arguments.length > 0)
        rti._precomputed1 = $arguments[0];
      rti._canonicalRecipe = s;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(s, t1);
      return t1;
    },
    _Universe__lookupBindingRti: function(universe, base, $arguments) {
      var newBase, newArguments, key, probe, rti, t1;
      if (base._kind === 10) {
        newBase = base._primary;
        newArguments = base._rest.concat($arguments);
      } else {
        newArguments = $arguments;
        newBase = base;
      }
      key = newBase._canonicalRecipe + (";<" + H._Universe__canonicalRecipeJoin(newArguments) + ">");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 10;
      rti._primary = newBase;
      rti._rest = newArguments;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupFunctionRti: function(universe, returnType, parameters) {
      var sep, t1, key, probe, rti,
        s = returnType._canonicalRecipe,
        requiredPositional = parameters._requiredPositional,
        requiredPositionalLength = requiredPositional.length,
        optionalPositional = parameters._optionalPositional,
        optionalPositionalLength = optionalPositional.length,
        named = parameters._named,
        namedLength = named.length,
        recipe = "(" + H._Universe__canonicalRecipeJoin(requiredPositional);
      if (optionalPositionalLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        t1 = H._Universe__canonicalRecipeJoin(optionalPositional);
        recipe += sep + "[" + t1 + "]";
      }
      if (namedLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        t1 = H._Universe__canonicalRecipeJoinNamed(named);
        recipe += sep + "{" + t1 + "}";
      }
      key = s + (recipe + ")");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 11;
      rti._primary = returnType;
      rti._rest = parameters;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupGenericFunctionRti: function(universe, baseFunctionType, bounds, normalize) {
      var t1,
        key = baseFunctionType._canonicalRecipe + ("<" + H._Universe__canonicalRecipeJoin(bounds) + ">"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createGenericFunctionRti: function(universe, baseFunctionType, bounds, key, normalize) {
      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
      if (normalize) {
        $length = bounds.length;
        typeArguments = new Array($length);
        for (count = 0, i = 0; i < $length; ++i) {
          bound = bounds[i];
          if (bound._kind === 1) {
            typeArguments[i] = bound;
            ++count;
          }
        }
        if (count > 0) {
          substitutedBase = H._substitute(universe, baseFunctionType, typeArguments, 0);
          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, 0);
          return H._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
        }
      }
      rti = new H.Rti(null, null);
      rti._kind = 12;
      rti._primary = baseFunctionType;
      rti._rest = bounds;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Parser_create: function(universe, environment, recipe, normalize) {
      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
    },
    _Parser_parse: function(parser) {
      var t1, i, ch, universe, array, head, base, u, parameters, optionalPositional, named, 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 = H._Parser_handleDigit(i + 1, ch, source, stack);
        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36)
          i = H._Parser_handleIdentifier(parser, i, source, stack, false);
        else if (ch === 46)
          i = H._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(H._Parser_toType(parser.u, parser.e, stack.pop()));
              break;
            case 94:
              stack.push(H._Universe__lookupGenericFunctionParameterRti(parser.u, stack.pop()));
              break;
            case 35:
              stack.push(H._Universe__lookupTerminalRti(parser.u, 5, "#"));
              break;
            case 64:
              stack.push(H._Universe__lookupTerminalRti(parser.u, 2, "@"));
              break;
            case 126:
              stack.push(H._Universe__lookupTerminalRti(parser.u, 3, "~"));
              break;
            case 60:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 62:
              universe = parser.u;
              array = stack.splice(parser.p);
              H._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              head = stack.pop();
              if (typeof head == "string")
                stack.push(H._Universe__lookupInterfaceRti(universe, head, array));
              else {
                base = H._Parser_toType(universe, parser.e, head);
                switch (base._kind) {
                  case 11:
                    stack.push(H._Universe__lookupGenericFunctionRti(universe, base, array, parser.n));
                    break;
                  default:
                    stack.push(H._Universe__lookupBindingRti(universe, base, array));
                    break;
                }
              }
              break;
            case 38:
              H._Parser_handleExtendedOperations(parser, stack);
              break;
            case 42:
              u = parser.u;
              stack.push(H._Universe__lookupStarRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 63:
              u = parser.u;
              stack.push(H._Universe__lookupQuestionRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 47:
              u = parser.u;
              stack.push(H._Universe__lookupFutureOrRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 40:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 41:
              universe = parser.u;
              parameters = new H._FunctionParameters();
              optionalPositional = universe.sEA;
              named = universe.sEA;
              head = stack.pop();
              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);
              array = stack.splice(parser.p);
              H._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              parameters._requiredPositional = array;
              parameters._optionalPositional = optionalPositional;
              parameters._named = named;
              stack.push(H._Universe__lookupFunctionRti(universe, H._Parser_toType(universe, parser.e, stack.pop()), parameters));
              break;
            case 91:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 93:
              array = stack.splice(parser.p);
              H._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);
              H._Parser_toTypesNamed(parser.u, parser.e, array);
              parser.p = stack.pop();
              stack.push(array);
              stack.push(-2);
              break;
            default:
              throw "Bad character " + ch;
          }
        }
      }
      item = stack.pop();
      return H._Parser_toType(parser.u, parser.e, item);
    },
    _Parser_handleDigit: function(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: function(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))
            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 === 10)
          environment = environment._primary;
        recipe = H._Universe_findRule(t1, environment._primary)[string];
        if (recipe == null)
          H.throwExpression('No "' + string + '" in "' + H.Rti__getCanonicalRecipe(environment) + '"');
        stack.push(H._Universe_evalInEnvironment(t1, environment, recipe));
      } else
        stack.push(string);
      return i;
    },
    _Parser_handleExtendedOperations: function(parser, stack) {
      var $top = stack.pop();
      if (0 === $top) {
        stack.push(H._Universe__lookupTerminalRti(parser.u, 1, "0&"));
        return;
      }
      if (1 === $top) {
        stack.push(H._Universe__lookupTerminalRti(parser.u, 4, "1&"));
        return;
      }
      throw H.wrapException(P.AssertionError$("Unexpected extended operation " + H.S($top)));
    },
    _Parser_toType: function(universe, environment, item) {
      if (typeof item == "string")
        return H._Universe__lookupInterfaceRti(universe, item, universe.sEA);
      else if (typeof item == "number")
        return H._Parser_indexToType(universe, environment, item);
      else
        return item;
    },
    _Parser_toTypes: function(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 0; i < $length; ++i)
        items[i] = H._Parser_toType(universe, environment, items[i]);
    },
    _Parser_toTypesNamed: function(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 2; i < $length; i += 3)
        items[i] = H._Parser_toType(universe, environment, items[i]);
    },
    _Parser_indexToType: function(universe, environment, index) {
      var typeArguments, len,
        kind = environment._kind;
      if (kind === 10) {
        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 !== 9)
        throw H.wrapException(P.AssertionError$("Indexed base must be an interface type"));
      typeArguments = environment._rest;
      if (index <= typeArguments.length)
        return typeArguments[index - 1];
      throw H.wrapException(P.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
    },
    _isSubtype: function(universe, s, sEnv, t, tEnv) {
      var t1, sKind, leftTypeVariable, tKind, sBounds, tBounds, sLength, i, sBound, tBound;
      if (s === t)
        return true;
      if (!H.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = t === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return true;
      sKind = s._kind;
      if (sKind === 4)
        return true;
      if (H.isStrongTopType(s))
        return false;
      if (s._kind !== 1)
        t1 = s === type$.Null || s === type$.JSNull;
      else
        t1 = true;
      if (t1)
        return true;
      leftTypeVariable = sKind === 13;
      if (leftTypeVariable)
        if (H._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
          return true;
      tKind = t._kind;
      if (sKind === 6)
        return H._isSubtype(universe, s._primary, sEnv, t, tEnv);
      if (tKind === 6) {
        t1 = t._primary;
        return H._isSubtype(universe, s, sEnv, t1, tEnv);
      }
      if (sKind === 8) {
        if (!H._isSubtype(universe, s._primary, sEnv, t, tEnv))
          return false;
        return H._isSubtype(universe, H.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
      }
      if (sKind === 7) {
        t1 = H._isSubtype(universe, s._primary, sEnv, t, tEnv);
        return t1;
      }
      if (tKind === 8) {
        if (H._isSubtype(universe, s, sEnv, t._primary, tEnv))
          return true;
        return H._isSubtype(universe, s, sEnv, H.Rti__getFutureFromFutureOr(universe, t), tEnv);
      }
      if (tKind === 7) {
        t1 = H._isSubtype(universe, s, sEnv, t._primary, tEnv);
        return t1;
      }
      if (leftTypeVariable)
        return false;
      t1 = sKind !== 11;
      if ((!t1 || sKind === 12) && t === type$.Function)
        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 (!H._isSubtype(universe, sBound, sEnv, tBound, tEnv) || !H._isSubtype(universe, tBound, tEnv, sBound, sEnv))
            return false;
        }
        return H._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv);
      }
      if (tKind === 11) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (t1)
          return false;
        return H._isFunctionSubtype(universe, s, sEnv, t, tEnv);
      }
      if (sKind === 9) {
        if (tKind !== 9)
          return false;
        return H._isInterfaceSubtype(universe, s, sEnv, t, tEnv);
      }
      return false;
    },
    _isFunctionSubtype: function(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;
      if (!H._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 (!H._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < requiredPositionalDelta; ++i) {
        t1 = sOptionalPositional[i];
        if (!H._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < tOptionalPositionalLength; ++i) {
        t1 = sOptionalPositional[requiredPositionalDelta + i];
        if (!H._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 (; true;) {
          if (sIndex >= sNamedLength)
            return false;
          sName = sNamed[sIndex];
          sIndex += 3;
          if (tName < sName)
            return false;
          if (sName < tName)
            continue;
          t1 = sNamed[sIndex - 1];
          if (!H._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
            return false;
          break;
        }
      }
      return true;
    },
    _isInterfaceSubtype: function(universe, s, sEnv, t, tEnv) {
      var sArgs, tArgs, $length, i, t1, t2, rule, supertypeArgs,
        sName = s._primary,
        tName = t._primary;
      if (sName === tName) {
        sArgs = s._rest;
        tArgs = t._rest;
        $length = sArgs.length;
        for (i = 0; i < $length; ++i) {
          t1 = sArgs[i];
          t2 = tArgs[i];
          if (!H._isSubtype(universe, t1, sEnv, t2, tEnv))
            return false;
        }
        return true;
      }
      if (t === type$.Object)
        return true;
      rule = H._Universe_findRule(universe, sName);
      if (rule == null)
        return false;
      supertypeArgs = rule[tName];
      if (supertypeArgs == null)
        return false;
      $length = supertypeArgs.length;
      tArgs = t._rest;
      for (i = 0; i < $length; ++i)
        if (!H._isSubtype(universe, H._Universe_evalInEnvironment(universe, s, supertypeArgs[i]), sEnv, tArgs[i], tEnv))
          return false;
      return true;
    },
    isNullable: function(t) {
      var t1,
        kind = t._kind;
      if (!(t === type$.Null || t === type$.JSNull))
        if (!H.isStrongTopType(t))
          if (kind !== 7)
            if (!(kind === 6 && H.isNullable(t._primary)))
              t1 = kind === 8 && H.isNullable(t._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isTopType: function(t) {
      var t1;
      if (!H.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = t === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isStrongTopType: function(t) {
      var kind = t._kind;
      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
    },
    _Utils_objectAssign: function(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];
      }
    },
    Rti: function Rti(t0, t1) {
      var _ = this;
      _._as = t0;
      _._is = t1;
      _._cachedRuntimeType = _._specializedTestResource = _._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;
    },
    isBrowserObject: function(o) {
      return type$.Blob._is(o) || type$.Event._is(o) || type$.KeyRange._is(o) || type$.ImageData._is(o) || type$.Node._is(o) || type$.Window._is(o) || type$.WorkerGlobalScope._is(o);
    },
    unmangleGlobalNameIfPreservedAnyways: function($name) {
      return init.mangledGlobalNames[$name];
    },
    printString: function(string) {
      if (typeof dartPrint == "function") {
        dartPrint(string);
        return;
      }
      if (typeof console == "object" && typeof console.log != "undefined") {
        console.log(string);
        return;
      }
      if (typeof window == "object")
        return;
      if (typeof print == "function") {
        print(string);
        return;
      }
      throw "Unable to print message: " + String(string);
    }
  },
  J = {
    makeDispatchRecord: function(interceptor, proto, extension, indexability) {
      return {i: interceptor, p: proto, e: extension, x: indexability};
    },
    getNativeInterceptor: function(object) {
      var proto, objectProto, $constructor, interceptor, t1,
        record = object[init.dispatchPropertyName];
      if (record == null)
        if ($.initNativeDispatchFlag == null) {
          H.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 H.wrapException(P.UnimplementedError$("Return interceptor for " + H.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 = H.lookupAndCacheInterceptor(object);
      if (interceptor != null)
        return interceptor;
      if (typeof object == "function")
        return C.JavaScriptFunction_methods;
      proto = Object.getPrototypeOf(object);
      if (proto == null)
        return C.PlainJavaScriptObject_methods;
      if (proto === Object.prototype)
        return C.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: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
        return C.UnknownJavaScriptObject_methods;
      }
      return C.UnknownJavaScriptObject_methods;
    },
    JSArray_JSArray$fixed: function($length, $E) {
      if (!H._isInt($length))
        throw H.wrapException(P.ArgumentError$value($length, "length", "is not an integer"));
      if ($length < 0 || $length > 4294967295)
        throw H.wrapException(P.RangeError$range($length, 0, 4294967295, "length", null));
      return J.JSArray_JSArray$markFixed(new Array($length), $E);
    },
    JSArray_JSArray$allocateGrowable: function($length, $E) {
      return H.setRuntimeTypeInfo(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$markFixed: function(allocation, $E) {
      return J.JSArray_markFixedList(H.setRuntimeTypeInfo(allocation, $E._eval$1("JSArray<0>")), $E);
    },
    JSArray_markFixedList: function(list, $T) {
      list.fixed$length = Array;
      return list;
    },
    JSArray__compareAny: function(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    getInterceptor$: function(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 (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ansx: function(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$asx: function(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ax: function(receiver) {
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$n: function(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof P.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$ns: function(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 P.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$s: function(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof P.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$x: function(receiver) {
      if (receiver == null)
        return receiver;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    set$_innerHtml$x: function(receiver, value) {
      return J.getInterceptor$x(receiver).set$_innerHtml(receiver, value);
    },
    get$attributes$x: function(receiver) {
      return J.getInterceptor$x(receiver).get$attributes(receiver);
    },
    get$digestsPath$x: function(receiver) {
      return J.getInterceptor$x(receiver).get$digestsPath(receiver);
    },
    get$first$ax: function(receiver) {
      return J.getInterceptor$ax(receiver).get$first(receiver);
    },
    get$hashCode$: function(receiver) {
      return J.getInterceptor$(receiver).get$hashCode(receiver);
    },
    get$isEmpty$asx: function(receiver) {
      return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
    },
    get$isNotEmpty$asx: function(receiver) {
      return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
    },
    get$iterator$ax: function(receiver) {
      return J.getInterceptor$ax(receiver).get$iterator(receiver);
    },
    get$keys$x: function(receiver) {
      return J.getInterceptor$x(receiver).get$keys(receiver);
    },
    get$length$asx: function(receiver) {
      return J.getInterceptor$asx(receiver).get$length(receiver);
    },
    get$message$x: function(receiver) {
      return J.getInterceptor$x(receiver).get$message(receiver);
    },
    get$moduleParentsGraph$x: function(receiver) {
      return J.getInterceptor$x(receiver).get$moduleParentsGraph(receiver);
    },
    get$runtimeType$: function(receiver) {
      return J.getInterceptor$(receiver).get$runtimeType(receiver);
    },
    $add$ansx: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver + a0;
      return J.getInterceptor$ansx(receiver).$add(receiver, a0);
    },
    $eq$: function(receiver, a0) {
      if (receiver == null)
        return a0 == null;
      if (typeof receiver != "object")
        return a0 != null && receiver === a0;
      return J.getInterceptor$(receiver).$eq(receiver, a0);
    },
    $get$1$x: function(receiver, a0) {
      return J.getInterceptor$x(receiver).$get$1(receiver, a0);
    },
    $index$asx: function(receiver, a0) {
      if (typeof a0 === "number")
        if (receiver.constructor == Array || typeof receiver == "string" || H.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: function(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
    },
    $sub$n: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver - a0;
      return J.getInterceptor$n(receiver).$sub(receiver, a0);
    },
    _clearChildren$0$x: function(receiver) {
      return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
    },
    _codeUnitAt$1$s: function(receiver, a0) {
      return J.getInterceptor$s(receiver)._codeUnitAt$1(receiver, a0);
    },
    _removeEventListener$3$x: function(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver)._removeEventListener$3(receiver, a0, a1, a2);
    },
    addAll$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).addAll$1(receiver, a0);
    },
    addEventListener$3$x: function(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
    },
    cast$1$0$ax: function(receiver, $T1) {
      return J.getInterceptor$ax(receiver).cast$1$0(receiver, $T1);
    },
    cast$2$0$ax: function(receiver, $T1, $T2) {
      return J.getInterceptor$ax(receiver).cast$2$0(receiver, $T1, $T2);
    },
    compareTo$1$ns: function(receiver, a0) {
      return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
    },
    contains$1$asx: function(receiver, a0) {
      return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
    },
    containsKey$1$x: function(receiver, a0) {
      return J.getInterceptor$x(receiver).containsKey$1(receiver, a0);
    },
    elementAt$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
    },
    forEach$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
    },
    forceLoadModule$3$x: function(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).forceLoadModule$3(receiver, a0, a1, a2);
    },
    getRange$2$ax: function(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).getRange$2(receiver, a0, a1);
    },
    indexOf$1$s: function(receiver, a0) {
      return J.getInterceptor$s(receiver).indexOf$1(receiver, a0);
    },
    keys$0$x: function(receiver) {
      return J.getInterceptor$x(receiver).keys$0(receiver);
    },
    map$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).map$1(receiver, a0);
    },
    map$1$1$ax: function(receiver, a0, $T1) {
      return J.getInterceptor$ax(receiver).map$1$1(receiver, a0, $T1);
    },
    map$2$1$ax: function(receiver, a0, $T1, $T2) {
      return J.getInterceptor$ax(receiver).map$2$1(receiver, a0, $T1, $T2);
    },
    noSuchMethod$1$: function(receiver, a0) {
      return J.getInterceptor$(receiver).noSuchMethod$1(receiver, a0);
    },
    remove$0$x: function(receiver) {
      return J.getInterceptor$x(receiver).remove$0(receiver);
    },
    replaceRange$3$s: function(receiver, a0, a1, a2) {
      return J.getInterceptor$s(receiver).replaceRange$3(receiver, a0, a1, a2);
    },
    skip$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
    },
    sort$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
    },
    startsWith$2$s: function(receiver, a0, a1) {
      return J.getInterceptor$s(receiver).startsWith$2(receiver, a0, a1);
    },
    substring$2$s: function(receiver, a0, a1) {
      return J.getInterceptor$s(receiver).substring$2(receiver, a0, a1);
    },
    then$1$1$x: function(receiver, a0, $T1) {
      return J.getInterceptor$x(receiver).then$1$1(receiver, a0, $T1);
    },
    then$2$x: function(receiver, a0, a1) {
      return J.getInterceptor$x(receiver).then$2(receiver, a0, a1);
    },
    toList$0$ax: function(receiver) {
      return J.getInterceptor$ax(receiver).toList$0(receiver);
    },
    toLowerCase$0$s: function(receiver) {
      return J.getInterceptor$s(receiver).toLowerCase$0(receiver);
    },
    toString$0$: function(receiver) {
      return J.getInterceptor$(receiver).toString$0(receiver);
    },
    Interceptor: function Interceptor() {
    },
    JSBool: function JSBool() {
    },
    JSNull: function JSNull() {
    },
    JavaScriptObject: function JavaScriptObject() {
    },
    PlainJavaScriptObject: function PlainJavaScriptObject() {
    },
    UnknownJavaScriptObject: function UnknownJavaScriptObject() {
    },
    JavaScriptFunction: function JavaScriptFunction() {
    },
    JSArray: function JSArray(t0) {
      this.$ti = t0;
    },
    JSUnmodifiableArray: function JSUnmodifiableArray(t0) {
      this.$ti = t0;
    },
    ArrayIterator: function ArrayIterator(t0, t1, t2) {
      var _ = this;
      _._iterable = t0;
      _.__interceptors$_length = t1;
      _._index = 0;
      _.__interceptors$_current = null;
      _.$ti = t2;
    },
    JSNumber: function JSNumber() {
    },
    JSInt: function JSInt() {
    },
    JSNumNotInt: function JSNumNotInt() {
    },
    JSString: function JSString() {
    }
  },
  P = {
    _AsyncRun__initializeScheduleImmediate: function() {
      var div, span, t1 = {};
      if (self.scheduleImmediate != null)
        return P.async__AsyncRun__scheduleImmediateJsOverride$closure();
      if (self.MutationObserver != null && self.document != null) {
        div = self.document.createElement("div");
        span = self.document.createElement("span");
        t1.storedCallback = null;
        new self.MutationObserver(H.convertDartClosureToJS(new P._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
        return new P._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
      } else if (self.setImmediate != null)
        return P.async__AsyncRun__scheduleImmediateWithSetImmediate$closure();
      return P.async__AsyncRun__scheduleImmediateWithTimer$closure();
    },
    _AsyncRun__scheduleImmediateJsOverride: function(callback) {
      self.scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithSetImmediate: function(callback) {
      self.setImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithTimer: function(callback) {
      P.Timer__createTimer(C.Duration_0, type$.void_Function._as(callback));
    },
    Timer__createTimer: function(duration, callback) {
      var milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return P._TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _TimerImpl$: function(milliseconds, callback) {
      var t1 = new P._TimerImpl(true);
      t1._TimerImpl$2(milliseconds, callback);
      return t1;
    },
    _TimerImpl$periodic: function(milliseconds, callback) {
      var t1 = new P._TimerImpl(false);
      t1._TimerImpl$periodic$2(milliseconds, callback);
      return t1;
    },
    _makeAsyncAwaitCompleter: function($T) {
      return new P._AsyncAwaitCompleter(new P._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
    },
    _asyncStartSync: function(bodyFunction, completer) {
      bodyFunction.call$2(0, null);
      completer.isSync = true;
      return completer._future;
    },
    _asyncAwait: function(object, bodyFunction) {
      P._awaitOnObject(object, bodyFunction);
    },
    _asyncReturn: function(object, completer) {
      completer.complete$1(0, object);
    },
    _asyncRethrow: function(object, completer) {
      completer.completeError$2(H.unwrapException(object), H.getTraceFromException(object));
    },
    _awaitOnObject: function(object, bodyFunction) {
      var t1, future,
        thenCallback = new P._awaitOnObject_closure(bodyFunction),
        errorCallback = new P._awaitOnObject_closure0(bodyFunction);
      if (object instanceof P._Future)
        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
      else {
        t1 = type$.dynamic;
        if (type$.Future_dynamic._is(object))
          object.then$1$2$onError(0, thenCallback, errorCallback, t1);
        else {
          future = new P._Future($.Zone__current, type$._Future_dynamic);
          future._state = 4;
          future._resultOrListeners = object;
          future._thenAwait$1$2(thenCallback, errorCallback, t1);
        }
      }
    },
    _wrapJsFunctionForAsync: function($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 P._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
    },
    AsyncError$: function(error, stackTrace) {
      var t1 = H.checkNotNullable(error, "error", type$.Object);
      return new P.AsyncError(t1, stackTrace == null ? P.AsyncError_defaultStackTrace(error) : stackTrace);
    },
    AsyncError_defaultStackTrace: function(error) {
      var stackTrace;
      if (type$.Error._is(error)) {
        stackTrace = error.get$stackTrace();
        if (stackTrace != null)
          return stackTrace;
      }
      return C.C__StringStackTrace;
    },
    Future_Future$microtask: function(computation, $T) {
      var result = new P._Future($.Zone__current, $T._eval$1("_Future<0>"));
      P.scheduleMicrotask(new P.Future_Future$microtask_closure(result, computation));
      return result;
    },
    _completeWithErrorCallback: function(result, error, stackTrace) {
      var replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = P.AsyncError_defaultStackTrace(error);
      result._completeError$2(error, stackTrace);
    },
    _Future__chainCoreFuture: function(source, target) {
      var t1, t2, listeners;
      for (t1 = type$._Future_dynamic; t2 = source._state, t2 === 2;)
        source = t1._as(source._resultOrListeners);
      if (t2 >= 4) {
        listeners = target._removeListeners$0();
        target._state = source._state;
        target._resultOrListeners = source._resultOrListeners;
        P._Future__propagateToListeners(target, listeners);
      } else {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._state = 2;
        target._resultOrListeners = source;
        source._prependListeners$1(listeners);
      }
    },
    _Future__propagateToListeners: function(source, listeners) {
      var t2, t3, t4, _box_0, hasError, asyncError, nextListener, nextListener0, t5, sourceResult, t6, t7, zone, oldZone, result, current, _box_1 = {},
        t1 = _box_1.source = source;
      for (t2 = type$.AsyncError, t3 = type$.nullable__FutureListener_dynamic_dynamic, t4 = type$.Future_dynamic; true;) {
        _box_0 = {};
        hasError = t1._state === 8;
        if (listeners == null) {
          if (hasError) {
            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;
          P._Future__propagateToListeners(_box_1.source, t1);
          _box_0.listener = nextListener;
          nextListener0 = nextListener._nextListener;
        }
        t5 = _box_1.source;
        sourceResult = t5._resultOrListeners;
        _box_0.listenerHasError = hasError;
        _box_0.listenerValueOrError = sourceResult;
        t6 = !hasError;
        if (t6) {
          t7 = t1.state;
          t7 = (t7 & 1) !== 0 || (t7 & 15) === 8;
        } else
          t7 = true;
        if (t7) {
          zone = t1.result._zone;
          if (hasError) {
            t1 = t5._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 P._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
          else if (t6) {
            if ((t1 & 1) !== 0)
              new P._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
          } else if ((t1 & 2) !== 0)
            new P._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
          if (oldZone != null)
            $.Zone__current = oldZone;
          t1 = _box_0.listenerValueOrError;
          if (t4._is(t1)) {
            t5 = _box_0.listener.$ti;
            t5 = t5._eval$1("Future<2>")._is(t1) || !t5._rest[1]._is(t1);
          } else
            t5 = false;
          if (t5) {
            t4._as(t1);
            result = _box_0.listener.result;
            if (t1 instanceof P._Future)
              if (t1._state >= 4) {
                current = t3._as(result._resultOrListeners);
                result._resultOrListeners = null;
                listeners = result._reverseListeners$1(current);
                result._state = t1._state;
                result._resultOrListeners = t1._resultOrListeners;
                _box_1.source = t1;
                continue;
              } else
                P._Future__chainCoreFuture(t1, result);
            else
              result._chainForeignFuture$1(t1);
            return;
          }
        }
        result = _box_0.listener.result;
        current = t3._as(result._resultOrListeners);
        result._resultOrListeners = null;
        listeners = result._reverseListeners$1(current);
        t1 = _box_0.listenerHasError;
        t5 = _box_0.listenerValueOrError;
        if (!t1) {
          result.$ti._precomputed1._as(t5);
          result._state = 4;
          result._resultOrListeners = t5;
        } else {
          t2._as(t5);
          result._state = 8;
          result._resultOrListeners = t5;
        }
        _box_1.source = result;
        t1 = result;
      }
    },
    _registerErrorHandler: function(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 H.wrapException(P.ArgumentError$value(errorHandler, "onError", "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a valid result"));
    },
    _microtaskLoop: function() {
      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: function() {
      $._isInCallbackLoop = true;
      try {
        P._microtaskLoop();
      } finally {
        $._lastPriorityCallback = null;
        $._isInCallbackLoop = false;
        if ($._nextCallback != null)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(P.async___startMicrotaskLoop$closure());
      }
    },
    _scheduleAsyncCallback: function(callback) {
      var newEntry = new P._AsyncCallbackEntry(callback),
        lastCallback = $._lastCallback;
      if (lastCallback == null) {
        $._nextCallback = $._lastCallback = newEntry;
        if (!$._isInCallbackLoop)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(P.async___startMicrotaskLoop$closure());
      } else
        $._lastCallback = lastCallback.next = newEntry;
    },
    _schedulePriorityAsyncCallback: function(callback) {
      var entry, lastPriorityCallback, next,
        t1 = $._nextCallback;
      if (t1 == null) {
        P._scheduleAsyncCallback(callback);
        $._lastPriorityCallback = $._lastCallback;
        return;
      }
      entry = new P._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: function(callback) {
      var t1, _null = null,
        currentZone = $.Zone__current;
      if (C.C__RootZone === currentZone) {
        P._rootScheduleMicrotask(_null, _null, C.C__RootZone, callback);
        return;
      }
      if (C.C__RootZone === currentZone.get$_scheduleMicrotask().zone)
        t1 = C.C__RootZone.get$errorZone() === currentZone.get$errorZone();
      else
        t1 = false;
      if (t1) {
        P._rootScheduleMicrotask(_null, _null, currentZone, currentZone.registerCallback$1$1(callback, type$.void));
        return;
      }
      t1 = $.Zone__current;
      t1.scheduleMicrotask$1(t1.bindCallbackGuarded$1(callback));
    },
    StreamIterator_StreamIterator: function(stream, $T) {
      H.checkNotNullable(stream, "stream", type$.Object);
      return new P._StreamIterator($T._eval$1("_StreamIterator<0>"));
    },
    StreamController_StreamController: function(onCancel, onListen, sync, $T) {
      var _null = null;
      return sync ? new P._SyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_SyncStreamController<0>")) : new P._AsyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_AsyncStreamController<0>"));
    },
    _runGuarded: function(notificationHandler) {
      var e, s, exception;
      if (notificationHandler == null)
        return;
      try {
        notificationHandler.call$0();
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        $.Zone__current.handleUncaughtError$2(e, s);
      }
    },
    _BufferingStreamSubscription__registerDataHandler: function(zone, handleData, $T) {
      var t1 = handleData == null ? P.async___nullDataHandler$closure() : handleData;
      return zone.registerUnaryCallback$2$1(t1, type$.void, $T);
    },
    _BufferingStreamSubscription__registerErrorHandler: function(zone, handleError) {
      if (handleError == null)
        handleError = P.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 H.wrapException(P.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace."));
    },
    _nullDataHandler: function(value) {
    },
    _nullErrorHandler: function(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      $.Zone__current.handleUncaughtError$2(error, stackTrace);
    },
    _nullDoneHandler: function() {
    },
    _cancelAndValue: function(subscription, future, value) {
      var cancelFuture = subscription.cancel$0(0);
      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new P._cancelAndValue_closure(future, value));
      else
        future._complete$1(value);
    },
    Timer_Timer: function(duration, callback) {
      var t1 = $.Zone__current;
      if (t1 === C.C__RootZone)
        return t1.createTimer$2(duration, callback);
      return t1.createTimer$2(duration, t1.bindCallbackGuarded$1(callback));
    },
    ZoneSpecification_ZoneSpecification$from: function(other, handleUncaughtError) {
      var t1 = handleUncaughtError == null ? other.handleUncaughtError : handleUncaughtError;
      return new P._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: function($self, $parent, zone, error, stackTrace) {
      P._schedulePriorityAsyncCallback(new P._rootHandleUncaughtError_closure(error, type$.StackTrace._as(stackTrace)));
    },
    _rootRun: function($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();
      if (!(zone instanceof P._Zone))
        throw H.wrapException(P.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$0();
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunUnary: function($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);
      if (!(zone instanceof P._Zone))
        throw H.wrapException(P.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$1(arg);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunBinary: function($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);
      if (!(zone instanceof P._Zone))
        throw H.wrapException(P.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$2(arg1, arg2);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRegisterCallback: function($self, $parent, zone, f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    _rootRegisterUnaryCallback: function($self, $parent, zone, f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    _rootRegisterBinaryCallback: function($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: function($self, $parent, zone, error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    _rootScheduleMicrotask: function($self, $parent, zone, f) {
      var t1, t2;
      type$.void_Function._as(f);
      if (C.C__RootZone !== zone) {
        t1 = C.C__RootZone.get$errorZone();
        t2 = zone.get$errorZone();
        f = t1 !== t2 ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
      }
      P._scheduleAsyncCallback(f);
    },
    _rootCreateTimer: function($self, $parent, zone, duration, callback) {
      type$.Duration._as(duration);
      callback = zone.bindCallback$1$1(type$.void_Function._as(callback), type$.void);
      return P.Timer__createTimer(duration, callback);
    },
    _rootCreatePeriodicTimer: function($self, $parent, zone, duration, callback) {
      var milliseconds;
      type$.Duration._as(duration);
      callback = zone.bindUnaryCallback$2$1(type$.void_Function_Timer._as(callback), type$.void, type$.Timer);
      milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return P._TimerImpl$periodic(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _rootPrint: function($self, $parent, zone, line) {
      H.printString(H._asStringS(line));
    },
    _printToZone: function(line) {
      $.Zone__current.print$1(0, line);
    },
    _rootFork: function($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 = P.async___printToZone$closure();
      if (specification == null)
        specification = C._ZoneSpecification_ALf;
      valueMap = zone.get$_async$_map();
      t1 = new P._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.set$_handleUncaughtError(new P._ZoneFunction(t1, handleUncaughtError, type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace));
      return t1;
    },
    runZonedGuarded: function(body, onError, $R) {
      var error, stackTrace, parentZone, errorHandler, t1, exception, _null = null, zoneSpecification = null, zoneValues = null;
      H.checkNotNullable(body, "body", $R._eval$1("0()"));
      H.checkNotNullable(onError, "onError", type$.void_Function_Object_StackTrace);
      parentZone = $.Zone__current;
      errorHandler = new P.runZonedGuarded_closure(parentZone, onError);
      if (zoneSpecification == null)
        zoneSpecification = new P._ZoneSpecification(errorHandler, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null);
      else
        zoneSpecification = P.ZoneSpecification_ZoneSpecification$from(zoneSpecification, errorHandler);
      try {
        t1 = parentZone.fork$2$specification$zoneValues(zoneSpecification, zoneValues).run$1$1(body, $R);
        return t1;
      } catch (exception) {
        error = H.unwrapException(exception);
        stackTrace = H.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;
    },
    AsyncError: function AsyncError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    Future_Future$microtask_closure: function Future_Future$microtask_closure(t0, t1) {
      this.result = t0;
      this.computation = t1;
    },
    _Completer: function _Completer() {
    },
    _AsyncCompleter: function _AsyncCompleter(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__chainForeignFuture_closure: function _Future__chainForeignFuture_closure(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure0: function _Future__chainForeignFuture_closure0(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure1: function _Future__chainForeignFuture_closure1(t0, t1, t2) {
      this.$this = t0;
      this.e = t1;
      this.s = t2;
    },
    _Future__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__chainFuture_closure: function _Future__chainFuture_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__asyncCompleteError_closure: function _Future__asyncCompleteError_closure(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _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) {
      this.originalSource = 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;
    },
    _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;
    },
    StreamSubscription: function StreamSubscription() {
    },
    StreamView: function StreamView(t0, t1) {
      this._stream = t0;
      this.$ti = t1;
    },
    StreamTransformerBase: function StreamTransformerBase() {
    },
    _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;
    },
    _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() {
    },
    _PendingEvents_schedule_closure: function _PendingEvents_schedule_closure(t0, t1) {
      this.$this = t0;
      this.dispatch = t1;
    },
    _StreamImplEvents: function _StreamImplEvents(t0) {
      var _ = this;
      _.lastPendingEvent = _.firstPendingEvent = null;
      _._state = 0;
      _.$ti = t0;
    },
    _StreamIterator: function _StreamIterator(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;
    },
    _RunNullaryZoneFunction: function _RunNullaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RunUnaryZoneFunction: function _RunUnaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RunBinaryZoneFunction: function _RunBinaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RegisterNullaryZoneFunction: function _RegisterNullaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RegisterUnaryZoneFunction: function _RegisterUnaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RegisterBinaryZoneFunction: function _RegisterBinaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _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;
      _._async$_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;
    },
    _rootHandleUncaughtError_closure: function _rootHandleUncaughtError_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_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: function(equals, hashCode, isValidKey, $K, $V) {
      if (isValidKey == null)
        if (hashCode == null) {
          if (equals == null)
            return new P._HashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_HashMap<1,2>"));
          hashCode = P.collection___defaultHashCode$closure();
        } else {
          if (P.core__identityHashCode$closure() === hashCode && P.core__identical$closure() === equals)
            return new P._IdentityHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_IdentityHashMap<1,2>"));
          if (equals == null)
            equals = P.collection___defaultEquals$closure();
        }
      else {
        if (hashCode == null)
          hashCode = P.collection___defaultHashCode$closure();
        if (equals == null)
          equals = P.collection___defaultEquals$closure();
      }
      return P._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
    },
    _HashMap__getTableEntry: function(table, key) {
      var entry = table[key];
      return entry === table ? null : entry;
    },
    _HashMap__setTableEntry: function(table, key, value) {
      if (value == null)
        table[key] = table;
      else
        table[key] = value;
    },
    _HashMap__newHashTable: function() {
      var table = Object.create(null);
      P._HashMap__setTableEntry(table, "<non-identifier-key>", table);
      delete table["<non-identifier-key>"];
      return table;
    },
    _CustomHashMap$: function(_equals, _hashCode, validKey, $K, $V) {
      var t1 = validKey != null ? validKey : new P._CustomHashMap_closure($K);
      return new P._CustomHashMap(_equals, _hashCode, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("_CustomHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap: function($K, $V) {
      return new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
      return $K._eval$1("@<0>")._bind$1($V)._eval$1("LinkedHashMap<1,2>")._as(H.fillLiteralMap(keyValuePairs, new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"))));
    },
    LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
      return new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    HashSet_HashSet: function(equals, hashCode, $E) {
      return new P._HashSet($E._eval$1("_HashSet<0>"));
    },
    _HashSet__newHashTable: function() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    LinkedHashSet_LinkedHashSet: function($E) {
      return new P._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    LinkedHashSet_LinkedHashSet$_empty: function($E) {
      return new P._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    _LinkedHashSet__newHashTable: function() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    _defaultEquals: function(a, b) {
      return J.$eq$(a, b);
    },
    _defaultHashCode: function(a) {
      return J.get$hashCode$(a);
    },
    IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
      var parts, t1;
      if (P._isToStringVisiting(iterable)) {
        if (leftDelimiter === "(" && rightDelimiter === ")")
          return "(...)";
        return leftDelimiter + "..." + rightDelimiter;
      }
      parts = H.setRuntimeTypeInfo([], type$.JSArray_String);
      C.JSArray_methods.add$1($._toStringVisiting, iterable);
      try {
        P._iterablePartsToStrings(iterable, parts);
      } finally {
        if (0 >= $._toStringVisiting.length)
          return H.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      t1 = P.StringBuffer__writeAll(leftDelimiter, type$.Iterable_dynamic._as(parts), ", ") + rightDelimiter;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
      var buffer, t1;
      if (P._isToStringVisiting(iterable))
        return leftDelimiter + "..." + rightDelimiter;
      buffer = new P.StringBuffer(leftDelimiter);
      C.JSArray_methods.add$1($._toStringVisiting, iterable);
      try {
        t1 = buffer;
        t1._contents = P.StringBuffer__writeAll(t1._contents, iterable, ", ");
      } finally {
        if (0 >= $._toStringVisiting.length)
          return H.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      buffer._contents += rightDelimiter;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _isToStringVisiting: function(o) {
      var t1, i;
      for (t1 = $._toStringVisiting.length, i = 0; i < t1; ++i)
        if (o === $._toStringVisiting[i])
          return true;
      return false;
    },
    _iterablePartsToStrings: function(iterable, parts) {
      var next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision,
        it = J.get$iterator$ax(iterable),
        $length = 0, count = 0;
      while (true) {
        if (!($length < 80 || count < 3))
          break;
        if (!it.moveNext$0())
          return;
        next = H.S(it.get$current(it));
        C.JSArray_methods.add$1(parts, next);
        $length += next.length + 2;
        ++count;
      }
      if (!it.moveNext$0()) {
        if (count <= 5)
          return;
        if (0 >= parts.length)
          return H.ioore(parts, -1);
        ultimateString = parts.pop();
        if (0 >= parts.length)
          return H.ioore(parts, -1);
        penultimateString = parts.pop();
      } else {
        penultimate = it.get$current(it);
        ++count;
        if (!it.moveNext$0()) {
          if (count <= 4) {
            C.JSArray_methods.add$1(parts, H.S(penultimate));
            return;
          }
          ultimateString = H.S(penultimate);
          if (0 >= parts.length)
            return H.ioore(parts, -1);
          penultimateString = parts.pop();
          $length += ultimateString.length + 2;
        } else {
          ultimate = it.get$current(it);
          ++count;
          for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
            ultimate0 = it.get$current(it);
            ++count;
            if (count > 100) {
              while (true) {
                if (!($length > 75 && count > 3))
                  break;
                if (0 >= parts.length)
                  return H.ioore(parts, -1);
                $length -= parts.pop().length + 2;
                --count;
              }
              C.JSArray_methods.add$1(parts, "...");
              return;
            }
          }
          penultimateString = H.S(penultimate);
          ultimateString = H.S(ultimate);
          $length += ultimateString.length + penultimateString.length + 4;
        }
      }
      if (count > parts.length + 2) {
        $length += 5;
        elision = "...";
      } else
        elision = null;
      while (true) {
        if (!($length > 80 && parts.length > 3))
          break;
        if (0 >= parts.length)
          return H.ioore(parts, -1);
        $length -= parts.pop().length + 2;
        if (elision == null) {
          $length += 5;
          elision = "...";
        }
      }
      if (elision != null)
        C.JSArray_methods.add$1(parts, elision);
      C.JSArray_methods.add$1(parts, penultimateString);
      C.JSArray_methods.add$1(parts, ultimateString);
    },
    LinkedHashMap_LinkedHashMap$from: function(other, $K, $V) {
      var result = P.LinkedHashMap_LinkedHashMap($K, $V);
      other.forEach$1(0, new P.LinkedHashMap_LinkedHashMap$from_closure(result, $K, $V));
      return result;
    },
    LinkedHashSet_LinkedHashSet$from: function(elements, $E) {
      var t1, _i,
        result = P.LinkedHashSet_LinkedHashSet($E);
      for (t1 = elements.length, _i = 0; _i < elements.length; elements.length === t1 || (0, H.throwConcurrentModificationError)(elements), ++_i)
        result.add$1(0, $E._as(elements[_i]));
      return result;
    },
    ListMixin__compareAny: function(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    MapBase_mapToString: function(m) {
      var result, t1 = {};
      if (P._isToStringVisiting(m))
        return "{...}";
      result = new P.StringBuffer("");
      try {
        C.JSArray_methods.add$1($._toStringVisiting, m);
        result._contents += "{";
        t1.first = true;
        J.forEach$1$ax(m, new P.MapBase_mapToString_closure(t1, result));
        result._contents += "}";
      } finally {
        if (0 >= $._toStringVisiting.length)
          return H.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      t1 = result._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    ListQueue__calculateCapacity: function(initialCapacity) {
      return 8;
    },
    SplayTreeSet$: function(compare, isValidKey, $E) {
      var t1 = isValidKey == null ? new P.SplayTreeSet_closure($E) : isValidKey;
      return new P.SplayTreeSet(compare, t1, $E._eval$1("SplayTreeSet<0>"));
    },
    _HashMap: function _HashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _HashMap_addAll_closure: function _HashMap_addAll_closure(t0) {
      this.$this = t0;
    },
    _IdentityHashMap: function _IdentityHashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_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 = _._collection$_nums = _._collection$_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;
    },
    _HashSet: function _HashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._elements = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _HashSetIterator: function _HashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._elements = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _LinkedHashSet: function _LinkedHashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_last = _._collection$_first = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _._collection$_modifications = 0;
      _.$ti = t0;
    },
    _LinkedHashSetCell: function _LinkedHashSetCell(t0) {
      this._collection$_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;
    },
    IterableMixin: function IterableMixin() {
    },
    LinkedHashMap_LinkedHashMap$from_closure: function LinkedHashMap_LinkedHashMap$from_closure(t0, t1, t2) {
      this.result = t0;
      this.K = t1;
      this.V = t2;
    },
    ListBase: function ListBase() {
    },
    ListMixin: function ListMixin() {
    },
    MapBase: function MapBase() {
    },
    MapBase_mapToString_closure: function MapBase_mapToString_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    MapMixin: function MapMixin() {
    },
    _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;
      _._collection$_position = t3;
      _._collection$_current = null;
      _.$ti = t4;
    },
    SetMixin: function SetMixin() {
    },
    _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_closure: function SplayTreeSet_closure(t0) {
      this.E = t0;
    },
    _ListBase_Object_ListMixin: function _ListBase_Object_ListMixin() {
    },
    _SplayTreeSet__SplayTree_IterableMixin: function _SplayTreeSet__SplayTree_IterableMixin() {
    },
    _SplayTreeSet__SplayTree_IterableMixin_SetMixin: function _SplayTreeSet__SplayTree_IterableMixin_SetMixin() {
    },
    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
    },
    __SetBase_Object_SetMixin: function __SetBase_Object_SetMixin() {
    },
    _parseJson: function(source, reviver) {
      var parsed, e, exception, t1;
      if (typeof source != "string")
        throw H.wrapException(H.argumentErrorValue(source));
      parsed = null;
      try {
        parsed = JSON.parse(source);
      } catch (exception) {
        e = H.unwrapException(exception);
        t1 = P.FormatException$(String(e), null, null);
        throw H.wrapException(t1);
      }
      t1 = P._convertJsonToDartLazy(parsed);
      return t1;
    },
    _convertJsonToDartLazy: function(object) {
      var i;
      if (object == null)
        return null;
      if (typeof object != "object")
        return object;
      if (Object.getPrototypeOf(object) !== Array.prototype)
        return new P._JsonMap(object, Object.create(null));
      for (i = 0; i < object.length; ++i)
        object[i] = P._convertJsonToDartLazy(object[i]);
      return object;
    },
    Base64Codec__checkPadding: function(source, sourceIndex, sourceEnd, firstPadding, paddingCount, $length) {
      if (C.JSInt_methods.$mod($length, 4) !== 0)
        throw H.wrapException(P.FormatException$("Invalid base64 padding, padded length must be multiple of four, is " + $length, source, sourceEnd));
      if (firstPadding + paddingCount !== $length)
        throw H.wrapException(P.FormatException$("Invalid base64 padding, '=' not at the end", source, sourceIndex));
      if (paddingCount > 2)
        throw H.wrapException(P.FormatException$("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
    },
    JsonUnsupportedObjectError$: function(unsupportedObject, cause, partialResult) {
      return new P.JsonUnsupportedObjectError(unsupportedObject, cause);
    },
    _defaultToEncodable: function(object) {
      return object.toJson$0();
    },
    _JsonStringStringifier$: function(_sink, _toEncodable) {
      return new P._JsonStringStringifier(_sink, [], P.convert___defaultToEncodable$closure());
    },
    _JsonStringStringifier_stringify: function(object, toEncodable, indent) {
      var t1,
        output = new P.StringBuffer("");
      P._JsonStringStringifier_printOn(object, output, toEncodable, indent);
      t1 = output._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _JsonStringStringifier_printOn: function(object, output, toEncodable, indent) {
      var stringifier = P._JsonStringStringifier$(output, toEncodable);
      stringifier.writeObject$1(object);
    },
    _JsonMap: function _JsonMap(t0, t1) {
      this._original = t0;
      this._processed = t1;
      this._data = null;
    },
    _JsonMap_addAll_closure: function _JsonMap_addAll_closure(t0) {
      this.$this = t0;
    },
    _JsonMapKeyIterable: function _JsonMapKeyIterable(t0) {
      this._parent = t0;
    },
    Base64Codec: function Base64Codec() {
    },
    Base64Encoder: function Base64Encoder() {
    },
    Codec: function Codec() {
    },
    Converter: function Converter() {
    },
    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;
    },
    _symbolMapToStringMap: function(map) {
      var result = new H.JsLinkedHashMap(type$.JsLinkedHashMap_String_dynamic);
      map.forEach$1(0, new P._symbolMapToStringMap_closure(result));
      return result;
    },
    identityHashCode: function(object) {
      return H.objectHashCode(object);
    },
    Function_apply: function($function, positionalArguments, namedArguments) {
      return H.Primitives_applyFunction($function, positionalArguments, namedArguments == null ? null : P._symbolMapToStringMap(namedArguments));
    },
    int_parse: function(source, radix) {
      var value = H.Primitives_parseInt(source, radix);
      if (value != null)
        return value;
      throw H.wrapException(P.FormatException$(source, null, null));
    },
    Error__objectToString: function(object) {
      if (object instanceof H.Closure)
        return object.toString$0(0);
      return "Instance of '" + H.S(H.Primitives_objectTypeName(object)) + "'";
    },
    DateTime$fromMillisecondsSinceEpoch: function(millisecondsSinceEpoch, isUtc) {
      var t1;
      if (Math.abs(millisecondsSinceEpoch) <= 864e13)
        t1 = false;
      else
        t1 = true;
      if (t1)
        H.throwExpression(P.ArgumentError$("DateTime is outside valid range: " + millisecondsSinceEpoch));
      H.checkNotNullable(isUtc, "isUtc", type$.bool);
      return new P.DateTime(millisecondsSinceEpoch, isUtc);
    },
    List_List$filled: function($length, fill, growable, $E) {
      var i,
        result = 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: function(elements, growable, $E) {
      var t1,
        list = H.setRuntimeTypeInfo([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        C.JSArray_methods.add$1(list, $E._as(t1.get$current(t1)));
      if (growable)
        return list;
      return J.JSArray_markFixedList(list, $E);
    },
    List_List$of: function(elements, growable, $E) {
      var t1;
      if (growable)
        return P.List_List$_of(elements, $E);
      t1 = J.JSArray_markFixedList(P.List_List$_of(elements, $E), $E);
      return t1;
    },
    List_List$_of: function(elements, $E) {
      var list, t1;
      if (Array.isArray(elements))
        return H.setRuntimeTypeInfo(elements.slice(0), $E._eval$1("JSArray<0>"));
      list = H.setRuntimeTypeInfo([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        C.JSArray_methods.add$1(list, t1.get$current(t1));
      return list;
    },
    String_String$fromCharCodes: function(charCodes, start, end) {
      if (type$.NativeUint8List._is(charCodes))
        return H.Primitives_stringFromNativeUint8List(charCodes, start, P.RangeError_checkValidRange(start, end, charCodes.length));
      return P.String__stringFromIterable(charCodes, start, end);
    },
    String__stringFromIterable: function(charCodes, start, end) {
      var t1, it, i, list, _null = null;
      if (start < 0)
        throw H.wrapException(P.RangeError$range(start, 0, charCodes.length, _null, _null));
      t1 = end == null;
      if (!t1 && end < start)
        throw H.wrapException(P.RangeError$range(end, start, charCodes.length, _null, _null));
      it = new H.ListIterator(charCodes, charCodes.length, H.instanceType(charCodes)._eval$1("ListIterator<ListMixin.E>"));
      for (i = 0; i < start; ++i)
        if (!it.moveNext$0())
          throw H.wrapException(P.RangeError$range(start, 0, i, _null, _null));
      list = [];
      if (t1)
        for (; it.moveNext$0();)
          list.push(it.__internal$_current);
      else
        for (i = start; i < end; ++i) {
          if (!it.moveNext$0())
            throw H.wrapException(P.RangeError$range(end, start, i, _null, _null));
          list.push(it.__internal$_current);
        }
      return H.Primitives_stringFromCharCodes(list);
    },
    RegExp_RegExp: function(source, caseSensitive) {
      return new H.JSSyntaxRegExp(source, H.JSSyntaxRegExp_makeNative(source, false, caseSensitive, false, false, false));
    },
    identical: function(a, b) {
      return a == null ? b == null : a === b;
    },
    StringBuffer__writeAll: function(string, objects, separator) {
      var iterator = J.get$iterator$ax(objects);
      if (!iterator.moveNext$0())
        return string;
      if (separator.length === 0) {
        do
          string += H.S(iterator.get$current(iterator));
        while (iterator.moveNext$0());
      } else {
        string += H.S(iterator.get$current(iterator));
        for (; iterator.moveNext$0();)
          string = string + separator + H.S(iterator.get$current(iterator));
      }
      return string;
    },
    NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments) {
      return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments);
    },
    StackTrace_current: function() {
      var stackTrace, exception;
      if (H.boolConversionCheck($.$get$_hasErrorStackProperty()))
        return H.getTraceFromException(new Error());
      try {
        throw H.wrapException("");
      } catch (exception) {
        H.unwrapException(exception);
        stackTrace = H.getTraceFromException(exception);
        return stackTrace;
      }
    },
    _BigIntImpl__parseDecimal: function(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 + C.JSString_methods._codeUnitAt$1(source, i) - 48;
        ++digitInPartCount;
        if (digitInPartCount === 4) {
          result = result.$mul(0, $.$get$_BigIntImpl__bigInt10000()).$add(0, P._BigIntImpl__BigIntImpl$_fromInt(part));
          part = 0;
          digitInPartCount = 0;
        }
      }
      if (isNegative)
        return result.$negate(0);
      return result;
    },
    _BigIntImpl__codeUnitToRadixValue: function(codeUnit) {
      if (48 <= codeUnit && codeUnit <= 57)
        return codeUnit - 48;
      return (codeUnit | 32) - 97 + 10;
    },
    _BigIntImpl__parseHex: function(source, startPos, isNegative) {
      var t3, i, chunk, j, i0, digitValue, digitIndex, digitIndex0,
        t1 = source.length,
        sourceLength = t1 - startPos,
        chunkCount = C.JSNumber_methods.ceil$0(sourceLength / 4),
        digits = new Uint16Array(chunkCount),
        t2 = chunkCount - 1,
        lastDigitLength = sourceLength - t2 * 4;
      for (t3 = J.getInterceptor$s(source), i = startPos, chunk = 0, j = 0; j < lastDigitLength; ++j, i = i0) {
        i0 = i + 1;
        digitValue = P._BigIntImpl__codeUnitToRadixValue(t3._codeUnitAt$1(source, i));
        if (digitValue >= 16)
          return null;
        chunk = chunk * 16 + digitValue;
      }
      digitIndex = t2 - 1;
      if (t2 < 0 || t2 >= chunkCount)
        return H.ioore(digits, t2);
      digits[t2] = chunk;
      for (; i < t1; digitIndex = digitIndex0) {
        for (chunk = 0, j = 0; j < 4; ++j, i = i0) {
          i0 = i + 1;
          digitValue = P._BigIntImpl__codeUnitToRadixValue(C.JSString_methods._codeUnitAt$1(source, i));
          if (digitValue >= 16)
            return null;
          chunk = chunk * 16 + digitValue;
        }
        digitIndex0 = digitIndex - 1;
        if (digitIndex < 0 || digitIndex >= chunkCount)
          return H.ioore(digits, digitIndex);
        digits[digitIndex] = chunk;
      }
      if (chunkCount === 1) {
        if (0 >= chunkCount)
          return H.ioore(digits, 0);
        t1 = digits[0] === 0;
      } else
        t1 = false;
      if (t1)
        return $.$get$_BigIntImpl_zero();
      t1 = P._BigIntImpl__normalize(chunkCount, digits);
      return new P._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__tryParse: function(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 H.ioore(t1, 1);
      isNegative = t1[1] === "-";
      if (4 >= t2)
        return H.ioore(t1, 4);
      decimalMatch = t1[4];
      hexMatch = t1[3];
      if (5 >= t2)
        return H.ioore(t1, 5);
      if (decimalMatch != null)
        return P._BigIntImpl__parseDecimal(decimalMatch, isNegative);
      if (hexMatch != null)
        return P._BigIntImpl__parseHex(hexMatch, 2, isNegative);
      return null;
    },
    _BigIntImpl__normalize: function(used, digits) {
      var t2,
        t1 = digits.length;
      while (true) {
        if (typeof used !== "number")
          return used.$gt();
        if (used > 0) {
          t2 = used - 1;
          if (t2 >= t1)
            return H.ioore(digits, t2);
          t2 = digits[t2] === 0;
        } else
          t2 = false;
        if (!t2)
          break;
        --used;
      }
      return used;
    },
    _BigIntImpl__cloneDigits: function(digits, from, to, $length) {
      var resultDigits, n, t1, i, t2;
      if (!H._isInt($length))
        H.throwExpression(P.ArgumentError$("Invalid length " + H.S($length)));
      resultDigits = new Uint16Array($length);
      if (typeof to !== "number")
        return to.$sub();
      if (typeof from !== "number")
        return H.iae(from);
      n = to - from;
      for (t1 = resultDigits.length, i = 0; i < n; ++i) {
        t2 = from + i;
        if (t2 < 0 || t2 >= digits.length)
          return H.ioore(digits, t2);
        t2 = digits[t2];
        if (i >= t1)
          return H.ioore(resultDigits, i);
        resultDigits[i] = t2;
      }
      return resultDigits;
    },
    _BigIntImpl__BigIntImpl$_fromInt: function(value) {
      var digits, t1, i, i0,
        isNegative = value < 0;
      if (isNegative) {
        if (value === -9223372036854776e3) {
          digits = new Uint16Array(4);
          digits[3] = 32768;
          t1 = P._BigIntImpl__normalize(4, digits);
          return new P._BigIntImpl(t1 !== 0 || false, digits, t1);
        }
        value = -value;
      }
      if (value < 65536) {
        digits = new Uint16Array(1);
        digits[0] = value;
        t1 = P._BigIntImpl__normalize(1, digits);
        return new P._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      if (value <= 4294967295) {
        digits = new Uint16Array(2);
        digits[0] = value & 65535;
        digits[1] = C.JSInt_methods._shrOtherPositive$1(value, 16);
        t1 = P._BigIntImpl__normalize(2, digits);
        return new P._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      t1 = C.JSInt_methods._tdivFast$1(C.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 H.ioore(digits, i);
        digits[i] = value & 65535;
        value = C.JSInt_methods._tdivFast$1(value, 65536);
      }
      t1 = P._BigIntImpl__normalize(t1, digits);
      return new P._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__dlShiftDigits: function(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.length; i >= 0; --i) {
        t3 = i + n;
        if (i >= t1)
          return H.ioore(xDigits, i);
        t4 = xDigits[i];
        if (t3 < 0 || t3 >= t2)
          return H.ioore(resultDigits, t3);
        resultDigits[t3] = t4;
      }
      for (i = n - 1; i >= 0; --i) {
        if (i >= t2)
          return H.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      return xUsed + n;
    },
    _BigIntImpl__lsh: function(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, carry, digit, t3, t4,
        digitShift = C.JSInt_methods._tdivFast$1(n, 16),
        bitShift = C.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = C.JSInt_methods.$shl(1, carryBitShift) - 1;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.length, carry = 0; i >= 0; --i) {
        if (i >= t1)
          return H.ioore(xDigits, i);
        digit = xDigits[i];
        t3 = i + digitShift + 1;
        t4 = C.JSInt_methods._shrReceiverPositive$1(digit, carryBitShift);
        if (t3 < 0 || t3 >= t2)
          return H.ioore(resultDigits, t3);
        resultDigits[t3] = (t4 | carry) >>> 0;
        carry = C.JSInt_methods.$shl(digit & bitMask, bitShift);
      }
      if (digitShift < 0 || digitShift >= t2)
        return H.ioore(resultDigits, digitShift);
      resultDigits[digitShift] = carry;
    },
    _BigIntImpl__lShiftDigits: function(xDigits, xUsed, n, resultDigits) {
      var resultUsed, t1, i, t2,
        digitsShift = C.JSInt_methods._tdivFast$1(n, 16);
      if (C.JSInt_methods.$mod(n, 16) === 0)
        return P._BigIntImpl__dlShiftDigits(xDigits, xUsed, digitsShift, resultDigits);
      resultUsed = xUsed + digitsShift + 1;
      P._BigIntImpl__lsh(xDigits, xUsed, n, resultDigits);
      for (t1 = resultDigits.length, i = digitsShift; --i, i >= 0;) {
        if (i >= t1)
          return H.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      t2 = resultUsed - 1;
      if (t2 < 0 || t2 >= t1)
        return H.ioore(resultDigits, t2);
      if (resultDigits[t2] === 0)
        resultUsed = t2;
      return resultUsed;
    },
    _BigIntImpl__rsh: function(xDigits, xUsed, n, resultDigits) {
      var carry, last, t2, i, t3, digit,
        digitsShift = C.JSInt_methods._tdivFast$1(n, 16),
        bitShift = C.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = C.JSInt_methods.$shl(1, bitShift) - 1,
        t1 = xDigits.length;
      if (digitsShift < 0 || digitsShift >= t1)
        return H.ioore(xDigits, digitsShift);
      carry = C.JSInt_methods._shrReceiverPositive$1(xDigits[digitsShift], bitShift);
      last = xUsed - digitsShift - 1;
      for (t2 = resultDigits.length, i = 0; i < last; ++i) {
        t3 = i + digitsShift + 1;
        if (t3 >= t1)
          return H.ioore(xDigits, t3);
        digit = xDigits[t3];
        t3 = C.JSInt_methods.$shl(digit & bitMask, carryBitShift);
        if (i >= t2)
          return H.ioore(resultDigits, i);
        resultDigits[i] = (t3 | carry) >>> 0;
        carry = C.JSInt_methods._shrReceiverPositive$1(digit, bitShift);
      }
      if (last < 0 || last >= t2)
        return H.ioore(resultDigits, last);
      resultDigits[last] = carry;
    },
    _BigIntImpl__compareDigits: function(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 H.ioore(digits, i);
          t3 = digits[i];
          if (i >= t2)
            return H.ioore(otherDigits, i);
          result = t3 - otherDigits[i];
          if (result !== 0)
            return result;
        }
      return result;
    },
    _BigIntImpl__absAdd: function(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (i >= t1)
          return H.ioore(digits, i);
        t4 = digits[i];
        if (i >= t2)
          return H.ioore(otherDigits, i);
        carry += t4 + otherDigits[i];
        if (i >= t3)
          return H.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = carry >>> 16;
      }
      for (i = otherUsed; i < used; ++i) {
        if (i < 0 || i >= t1)
          return H.ioore(digits, i);
        carry += digits[i];
        if (i >= t3)
          return H.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = carry >>> 16;
      }
      if (used < 0 || used >= t3)
        return H.ioore(resultDigits, used);
      resultDigits[used] = carry;
    },
    _BigIntImpl__absSub: function(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (i >= t1)
          return H.ioore(digits, i);
        t4 = digits[i];
        if (i >= t2)
          return H.ioore(otherDigits, i);
        carry += t4 - otherDigits[i];
        if (i >= t3)
          return H.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (C.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
      for (i = otherUsed; i < used; ++i) {
        if (i < 0 || i >= t1)
          return H.ioore(digits, i);
        carry += digits[i];
        if (i >= t3)
          return H.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (C.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
    },
    _BigIntImpl__mulAdd: function(x, multiplicandDigits, i, accumulatorDigits, j, n) {
      var t1, t2, c, i0, t3, combined, j0, l;
      if (x === 0)
        return;
      for (t1 = multiplicandDigits.length, t2 = accumulatorDigits.length, c = 0; --n, n >= 0; j = j0, i = i0) {
        i0 = i + 1;
        if (i >= t1)
          return H.ioore(multiplicandDigits, i);
        t3 = multiplicandDigits[i];
        if (j < 0 || j >= t2)
          return H.ioore(accumulatorDigits, j);
        combined = x * t3 + accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = combined & 65535;
        c = C.JSInt_methods._tdivFast$1(combined, 65536);
      }
      for (; c !== 0; j = j0) {
        if (j < 0 || j >= t2)
          return H.ioore(accumulatorDigits, j);
        l = accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = l & 65535;
        c = C.JSInt_methods._tdivFast$1(l, 65536);
      }
    },
    _BigIntImpl__estimateQuotientDigit: function(topDigitDivisor, digits, i) {
      var t2, t3, quotientDigit,
        t1 = digits.length;
      if (i < 0 || i >= t1)
        return H.ioore(digits, i);
      t2 = digits[i];
      if (t2 === topDigitDivisor)
        return 65535;
      t3 = i - 1;
      if (t3 < 0 || t3 >= t1)
        return H.ioore(digits, t3);
      quotientDigit = C.JSInt_methods.$tdiv((t2 << 16 | digits[t3]) >>> 0, topDigitDivisor);
      if (quotientDigit > 65535)
        return 65535;
      return quotientDigit;
    },
    DateTime__fourDigits: function(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: function(n) {
      if (n >= 100)
        return "" + n;
      if (n >= 10)
        return "0" + n;
      return "00" + n;
    },
    DateTime__twoDigits: function(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    Error_safeToString: function(object) {
      if (typeof object == "number" || H._isBool(object) || null == object)
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      return P.Error__objectToString(object);
    },
    AssertionError$: function(message) {
      return new P.AssertionError(message);
    },
    ArgumentError$: function(message) {
      return new P.ArgumentError(false, null, null, message);
    },
    ArgumentError$value: function(value, $name, message) {
      return new P.ArgumentError(true, value, $name, message);
    },
    ArgumentError$notNull: function($name) {
      return new P.ArgumentError(false, null, $name, "Must not be null");
    },
    RangeError$: function(message) {
      var _null = null;
      return new P.RangeError(_null, _null, false, _null, _null, message);
    },
    RangeError$value: function(value, $name) {
      return new P.RangeError(null, null, true, value, $name, "Value not in range");
    },
    RangeError$range: function(invalidValue, minValue, maxValue, $name, message) {
      return new P.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
    },
    RangeError_checkValidRange: function(start, end, $length) {
      if (0 > start || start > $length)
        throw H.wrapException(P.RangeError$range(start, 0, $length, "start", null));
      if (end != null) {
        if (start > end || end > $length)
          throw H.wrapException(P.RangeError$range(end, start, $length, "end", null));
        return end;
      }
      return $length;
    },
    RangeError_checkNotNegative: function(value, $name) {
      if (value < 0)
        throw H.wrapException(P.RangeError$range(value, 0, null, $name, null));
      return value;
    },
    IndexError$: function(invalidValue, indexable, $name, message, $length) {
      var t1 = H._asIntS($length == null ? J.get$length$asx(indexable) : $length);
      return new P.IndexError(t1, true, invalidValue, $name, "Index out of range");
    },
    UnsupportedError$: function(message) {
      return new P.UnsupportedError(message);
    },
    UnimplementedError$: function(message) {
      return new P.UnimplementedError(message);
    },
    StateError$: function(message) {
      return new P.StateError(message);
    },
    ConcurrentModificationError$: function(modifiedObject) {
      return new P.ConcurrentModificationError(modifiedObject);
    },
    Exception_Exception: function(message) {
      return new P._Exception(message);
    },
    FormatException$: function(message, source, offset) {
      return new P.FormatException(message, source, offset);
    },
    Map_castFrom: function(source, $K, $V, K2, V2) {
      return new H.CastMap(source, $K._eval$1("@<0>")._bind$1($V)._bind$1(K2)._bind$1(V2)._eval$1("CastMap<1,2,3,4>"));
    },
    print: function(object) {
      var toZone = $.printToZone;
      if (toZone == null)
        H.printString(object);
      else
        toZone.call$1(object);
    },
    Uri_parse: function(uri) {
      var delta, indices, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, isSimple, scheme, t1, t2, schemeAuth, queryStart0, pathStart0, userInfoStart, userInfo, host, portNumber, port, path, query, _null = null,
        end = uri.length;
      if (end >= 5) {
        delta = ((J._codeUnitAt$1$s(uri, 4) ^ 58) * 3 | C.JSString_methods._codeUnitAt$1(uri, 0) ^ 100 | C.JSString_methods._codeUnitAt$1(uri, 1) ^ 97 | C.JSString_methods._codeUnitAt$1(uri, 2) ^ 116 | C.JSString_methods._codeUnitAt$1(uri, 3) ^ 97) >>> 0;
        if (delta === 0)
          return P.UriData__parse(end < end ? C.JSString_methods.substring$2(uri, 0, end) : uri, 5, _null).get$uri();
        else if (delta === 32)
          return P.UriData__parse(C.JSString_methods.substring$2(uri, 5, end), 0, _null).get$uri();
      }
      indices = P.List_List$filled(8, 0, false, type$.int);
      C.JSArray_methods.$indexSet(indices, 0, 0);
      C.JSArray_methods.$indexSet(indices, 1, -1);
      C.JSArray_methods.$indexSet(indices, 2, -1);
      C.JSArray_methods.$indexSet(indices, 7, -1);
      C.JSArray_methods.$indexSet(indices, 3, 0);
      C.JSArray_methods.$indexSet(indices, 4, 0);
      C.JSArray_methods.$indexSet(indices, 5, end);
      C.JSArray_methods.$indexSet(indices, 6, end);
      if (P._scan(uri, 0, end, 0, indices) >= 14)
        C.JSArray_methods.$indexSet(indices, 7, end);
      schemeEnd = indices[1];
      if (schemeEnd >= 0)
        if (P._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;
      if (isSimple)
        if (hostStart > schemeEnd + 3) {
          scheme = _null;
          isSimple = false;
        } else {
          t1 = portStart > 0;
          if (t1 && portStart + 1 === pathStart) {
            scheme = _null;
            isSimple = false;
          } else {
            if (!(queryStart < end && queryStart === pathStart + 2 && J.startsWith$2$s(uri, "..", pathStart)))
              t2 = queryStart > pathStart + 2 && J.startsWith$2$s(uri, "/..", queryStart - 3);
            else
              t2 = true;
            if (t2) {
              scheme = _null;
              isSimple = false;
            } else {
              if (schemeEnd === 4)
                if (J.startsWith$2$s(uri, "file", 0)) {
                  if (hostStart <= 0) {
                    if (!C.JSString_methods.startsWith$2(uri, "/", pathStart)) {
                      schemeAuth = "file:///";
                      delta = 3;
                    } else {
                      schemeAuth = "file://";
                      delta = 2;
                    }
                    uri = schemeAuth + C.JSString_methods.substring$2(uri, pathStart, end);
                    schemeEnd -= 0;
                    t1 = delta - 0;
                    queryStart += t1;
                    fragmentStart += t1;
                    end = uri.length;
                    hostStart = 7;
                    portStart = 7;
                    pathStart = 7;
                  } else if (pathStart === queryStart) {
                    ++fragmentStart;
                    queryStart0 = queryStart + 1;
                    uri = C.JSString_methods.replaceRange$3(uri, pathStart, queryStart, "/");
                    ++end;
                    queryStart = queryStart0;
                  }
                  scheme = "file";
                } else if (C.JSString_methods.startsWith$2(uri, "http", 0)) {
                  if (t1 && portStart + 3 === pathStart && C.JSString_methods.startsWith$2(uri, "80", portStart + 1)) {
                    fragmentStart -= 3;
                    pathStart0 = pathStart - 3;
                    queryStart -= 3;
                    uri = C.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                    end -= 3;
                    pathStart = pathStart0;
                  }
                  scheme = "http";
                } else
                  scheme = _null;
              else if (schemeEnd === 5 && J.startsWith$2$s(uri, "https", 0)) {
                if (t1 && portStart + 4 === pathStart && J.startsWith$2$s(uri, "443", portStart + 1)) {
                  fragmentStart -= 4;
                  pathStart0 = pathStart - 4;
                  queryStart -= 4;
                  uri = J.replaceRange$3$s(uri, portStart, pathStart, "");
                  end -= 3;
                  pathStart = pathStart0;
                }
                scheme = "https";
              } else
                scheme = _null;
              isSimple = true;
            }
          }
        }
      else
        scheme = _null;
      if (isSimple) {
        t1 = uri.length;
        if (end < t1) {
          uri = J.substring$2$s(uri, 0, end);
          schemeEnd -= 0;
          hostStart -= 0;
          portStart -= 0;
          pathStart -= 0;
          queryStart -= 0;
          fragmentStart -= 0;
        }
        return new P._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
      }
      if (scheme == null)
        if (schemeEnd > 0)
          scheme = P._Uri__makeScheme(uri, 0, schemeEnd);
        else {
          if (schemeEnd === 0) {
            P._Uri__fail(uri, 0, "Invalid empty scheme");
            H.ReachabilityError$(string$._null_);
          }
          scheme = "";
        }
      if (hostStart > 0) {
        userInfoStart = schemeEnd + 3;
        userInfo = userInfoStart < hostStart ? P._Uri__makeUserInfo(uri, userInfoStart, hostStart - 1) : "";
        host = P._Uri__makeHost(uri, hostStart, portStart, false);
        t1 = portStart + 1;
        if (t1 < pathStart) {
          portNumber = H.Primitives_parseInt(J.substring$2$s(uri, t1, pathStart), _null);
          port = P._Uri__makePort(portNumber == null ? H.throwExpression(P.FormatException$("Invalid port", uri, t1)) : portNumber, scheme);
        } else
          port = _null;
      } else {
        port = _null;
        host = port;
        userInfo = "";
      }
      path = P._Uri__makePath(uri, pathStart, queryStart, _null, scheme, host != null);
      query = queryStart < fragmentStart ? P._Uri__makeQuery(uri, queryStart + 1, fragmentStart, _null) : _null;
      return P._Uri$_internal(scheme, userInfo, host, port, path, query, fragmentStart < end ? P._Uri__makeFragment(uri, fragmentStart + 1, end) : _null);
    },
    Uri__parseIPv4Address: function(host, start, end) {
      var i, partStart, partIndex, char, part, partIndex0,
        _s43_ = "IPv4 address should contain exactly 4 parts",
        _s37_ = "each part must be in the range 0..255",
        error = new P.Uri__parseIPv4Address_error(host),
        result = new Uint8Array(4);
      for (i = start, partStart = i, partIndex = 0; i < end; ++i) {
        char = C.JSString_methods.codeUnitAt$1(host, i);
        if (char !== 46) {
          if ((char ^ 48) > 9)
            error.call$2("invalid character", i);
        } else {
          if (partIndex === 3)
            error.call$2(_s43_, i);
          part = P.int_parse(C.JSString_methods.substring$2(host, partStart, i), null);
          if (part > 255)
            error.call$2(_s37_, partStart);
          partIndex0 = partIndex + 1;
          if (partIndex >= 4)
            return H.ioore(result, partIndex);
          result[partIndex] = part;
          partStart = i + 1;
          partIndex = partIndex0;
        }
      }
      if (partIndex !== 3)
        error.call$2(_s43_, end);
      part = P.int_parse(C.JSString_methods.substring$2(host, partStart, end), null);
      if (part > 255)
        error.call$2(_s37_, partStart);
      if (partIndex >= 4)
        return H.ioore(result, partIndex);
      result[partIndex] = part;
      return result;
    },
    Uri_parseIPv6Address: function(host, start, end) {
      var parts, i, partStart, wildcardSeen, seenDot, char, atEnd, t1, last, bytes, wildCardLength, index, value, j, t2,
        error = new P.Uri_parseIPv6Address_error(host),
        parseHex = new P.Uri_parseIPv6Address_parseHex(error, host);
      if (host.length < 2)
        error.call$1("address is too short");
      parts = H.setRuntimeTypeInfo([], type$.JSArray_int);
      for (i = start, partStart = i, wildcardSeen = false, seenDot = false; i < end; ++i) {
        char = C.JSString_methods.codeUnitAt$1(host, i);
        if (char === 58) {
          if (i === start) {
            ++i;
            if (C.JSString_methods.codeUnitAt$1(host, i) !== 58)
              error.call$2("invalid start colon.", i);
            partStart = i;
          }
          if (i === partStart) {
            if (wildcardSeen)
              error.call$2("only one wildcard `::` is allowed", i);
            C.JSArray_methods.add$1(parts, -1);
            wildcardSeen = true;
          } else
            C.JSArray_methods.add$1(parts, parseHex.call$2(partStart, i));
          partStart = i + 1;
        } else if (char === 46)
          seenDot = true;
      }
      if (parts.length === 0)
        error.call$1("too few parts");
      atEnd = partStart === end;
      t1 = C.JSArray_methods.get$last(parts);
      if (atEnd && t1 !== -1)
        error.call$2("expected a part after last `:`", end);
      if (!atEnd)
        if (!seenDot)
          C.JSArray_methods.add$1(parts, parseHex.call$2(partStart, end));
        else {
          last = P.Uri__parseIPv4Address(host, partStart, end);
          C.JSArray_methods.add$1(parts, (last[0] << 8 | last[1]) >>> 0);
          C.JSArray_methods.add$1(parts, (last[2] << 8 | last[3]) >>> 0);
        }
      if (wildcardSeen) {
        if (parts.length > 7)
          error.call$1("an address with a wildcard must have less than 7 parts");
      } else if (parts.length !== 8)
        error.call$1("an address without a wildcard must contain exactly 8 parts");
      bytes = new Uint8Array(16);
      for (t1 = parts.length, wildCardLength = 9 - t1, i = 0, index = 0; i < t1; ++i) {
        value = parts[i];
        if (value === -1)
          for (j = 0; j < wildCardLength; ++j) {
            if (index < 0 || index >= 16)
              return H.ioore(bytes, index);
            bytes[index] = 0;
            t2 = index + 1;
            if (t2 >= 16)
              return H.ioore(bytes, t2);
            bytes[t2] = 0;
            index += 2;
          }
        else {
          t2 = C.JSInt_methods._shrOtherPositive$1(value, 8);
          if (index < 0 || index >= 16)
            return H.ioore(bytes, index);
          bytes[index] = t2;
          t2 = index + 1;
          if (t2 >= 16)
            return H.ioore(bytes, t2);
          bytes[t2] = value & 255;
          index += 2;
        }
      }
      return bytes;
    },
    _Uri$_internal: function(scheme, _userInfo, _host, _port, path, _query, _fragment) {
      return new P._Uri(scheme, _userInfo, _host, _port, path, _query, _fragment);
    },
    _Uri__defaultPort: function(scheme) {
      if (scheme === "http")
        return 80;
      if (scheme === "https")
        return 443;
      return 0;
    },
    _Uri__compareScheme: function(scheme, uri) {
      var t1, i, schemeChar, uriChar, delta, lowerChar;
      for (t1 = scheme.length, i = 0; i < t1; ++i) {
        schemeChar = C.JSString_methods._codeUnitAt$1(scheme, i);
        uriChar = C.JSString_methods._codeUnitAt$1(uri, i);
        delta = schemeChar ^ uriChar;
        if (delta !== 0) {
          if (delta === 32) {
            lowerChar = uriChar | delta;
            if (97 <= lowerChar && lowerChar <= 122)
              continue;
          }
          return false;
        }
      }
      return true;
    },
    _Uri__fail: function(uri, index, message) {
      throw H.wrapException(P.FormatException$(message, uri, index));
    },
    _Uri__makePort: function(port, scheme) {
      if (port != null && port === P._Uri__defaultPort(scheme))
        return null;
      return port;
    },
    _Uri__makeHost: function(host, start, end, strictIPv6) {
      var t1, t2, index, zoneIDstart, zoneID, i;
      if (host == null)
        return null;
      if (start === end)
        return "";
      if (C.JSString_methods.codeUnitAt$1(host, start) === 91) {
        t1 = end - 1;
        if (C.JSString_methods.codeUnitAt$1(host, t1) !== 93) {
          P._Uri__fail(host, start, "Missing end `]` to match `[` in host");
          H.ReachabilityError$(string$._null_);
        }
        t2 = start + 1;
        index = P._Uri__checkZoneID(host, t2, t1);
        if (index < t1) {
          zoneIDstart = index + 1;
          zoneID = P._Uri__normalizeZoneID(host, C.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, t1, "%25");
        } else
          zoneID = "";
        P.Uri_parseIPv6Address(host, t2, index);
        return C.JSString_methods.substring$2(host, start, index).toLowerCase() + zoneID + "]";
      }
      for (i = start; i < end; ++i)
        if (C.JSString_methods.codeUnitAt$1(host, i) === 58) {
          index = C.JSString_methods.indexOf$2(host, "%", start);
          index = index >= start && index < end ? index : end;
          if (index < end) {
            zoneIDstart = index + 1;
            zoneID = P._Uri__normalizeZoneID(host, C.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, end, "%25");
          } else
            zoneID = "";
          P.Uri_parseIPv6Address(host, start, index);
          return "[" + C.JSString_methods.substring$2(host, start, index) + zoneID + "]";
        }
      return P._Uri__normalizeRegName(host, start, end);
    },
    _Uri__checkZoneID: function(host, start, end) {
      var index = C.JSString_methods.indexOf$2(host, "%", start);
      return index >= start && index < end ? index : end;
    },
    _Uri__normalizeZoneID: function(host, start, end, prefix) {
      var index, sectionStart, isNormalized, char, replacement, t1, t2, tail, sourceLength, slice,
        buffer = prefix !== "" ? new P.StringBuffer(prefix) : null;
      for (index = start, sectionStart = index, isNormalized = true; index < end;) {
        char = C.JSString_methods.codeUnitAt$1(host, index);
        if (char === 37) {
          replacement = P._Uri__normalizeEscape(host, index, true);
          t1 = replacement == null;
          if (t1 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new P.StringBuffer("");
          t2 = buffer._contents += C.JSString_methods.substring$2(host, sectionStart, index);
          if (t1)
            replacement = C.JSString_methods.substring$2(host, index, index + 3);
          else if (replacement === "%") {
            P._Uri__fail(host, index, "ZoneID should not contain % anymore");
            H.ReachabilityError$(string$._null_);
          }
          buffer._contents = t2 + replacement;
          index += 3;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t1 = char >>> 4;
            if (t1 >= 8)
              return H.ioore(C.List_nxB, t1);
            t1 = (C.List_nxB[t1] & 1 << (char & 15)) !== 0;
          } else
            t1 = false;
          if (t1) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new P.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += C.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if ((char & 64512) === 55296 && index + 1 < end) {
              tail = C.JSString_methods.codeUnitAt$1(host, index + 1);
              if ((tail & 64512) === 56320) {
                char = (char & 1023) << 10 | tail & 1023 | 65536;
                sourceLength = 2;
              } else
                sourceLength = 1;
            } else
              sourceLength = 1;
            slice = C.JSString_methods.substring$2(host, sectionStart, index);
            if (buffer == null) {
              buffer = new P.StringBuffer("");
              t1 = buffer;
            } else
              t1 = buffer;
            t1._contents += slice;
            t1._contents += P._Uri__escapeChar(char);
            index += sourceLength;
            sectionStart = index;
          }
        }
      }
      if (buffer == null)
        return C.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end)
        buffer._contents += C.JSString_methods.substring$2(host, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__normalizeRegName: function(host, start, end) {
      var index, sectionStart, buffer, isNormalized, char, replacement, t1, slice, t2, sourceLength, tail;
      for (index = start, sectionStart = index, buffer = null, isNormalized = true; index < end;) {
        char = C.JSString_methods.codeUnitAt$1(host, index);
        if (char === 37) {
          replacement = P._Uri__normalizeEscape(host, index, true);
          t1 = replacement == null;
          if (t1 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new P.StringBuffer("");
          slice = C.JSString_methods.substring$2(host, sectionStart, index);
          t2 = buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
          if (t1) {
            replacement = C.JSString_methods.substring$2(host, index, index + 3);
            sourceLength = 3;
          } else if (replacement === "%") {
            replacement = "%25";
            sourceLength = 1;
          } else
            sourceLength = 3;
          buffer._contents = t2 + replacement;
          index += sourceLength;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t1 = char >>> 4;
            if (t1 >= 8)
              return H.ioore(C.List_qNA, t1);
            t1 = (C.List_qNA[t1] & 1 << (char & 15)) !== 0;
          } else
            t1 = false;
          if (t1) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new P.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += C.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if (char <= 93) {
              t1 = char >>> 4;
              if (t1 >= 8)
                return H.ioore(C.List_2Vk, t1);
              t1 = (C.List_2Vk[t1] & 1 << (char & 15)) !== 0;
            } else
              t1 = false;
            if (t1) {
              P._Uri__fail(host, index, "Invalid character");
              H.ReachabilityError$(string$._null_);
            } else {
              if ((char & 64512) === 55296 && index + 1 < end) {
                tail = C.JSString_methods.codeUnitAt$1(host, index + 1);
                if ((tail & 64512) === 56320) {
                  char = (char & 1023) << 10 | tail & 1023 | 65536;
                  sourceLength = 2;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              slice = C.JSString_methods.substring$2(host, sectionStart, index);
              if (!isNormalized)
                slice = slice.toLowerCase();
              if (buffer == null) {
                buffer = new P.StringBuffer("");
                t1 = buffer;
              } else
                t1 = buffer;
              t1._contents += slice;
              t1._contents += P._Uri__escapeChar(char);
              index += sourceLength;
              sectionStart = index;
            }
          }
        }
      }
      if (buffer == null)
        return C.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end) {
        slice = C.JSString_methods.substring$2(host, sectionStart, end);
        buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
      }
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__makeScheme: function(scheme, start, end) {
      var i, containsUpperCase, codeUnit, t1,
        _s67_ = string$._null_;
      if (start === end)
        return "";
      if (!P._Uri__isAlphabeticCharacter(J._codeUnitAt$1$s(scheme, start))) {
        P._Uri__fail(scheme, start, "Scheme not starting with alphabetic character");
        H.ReachabilityError$(_s67_);
      }
      for (i = start, containsUpperCase = false; i < end; ++i) {
        codeUnit = C.JSString_methods._codeUnitAt$1(scheme, i);
        if (codeUnit < 128) {
          t1 = codeUnit >>> 4;
          if (t1 >= 8)
            return H.ioore(C.List_JYB, t1);
          t1 = (C.List_JYB[t1] & 1 << (codeUnit & 15)) !== 0;
        } else
          t1 = false;
        if (!t1) {
          P._Uri__fail(scheme, i, "Illegal scheme character");
          H.ReachabilityError$(_s67_);
        }
        if (65 <= codeUnit && codeUnit <= 90)
          containsUpperCase = true;
      }
      scheme = C.JSString_methods.substring$2(scheme, start, end);
      return P._Uri__canonicalizeScheme(containsUpperCase ? scheme.toLowerCase() : scheme);
    },
    _Uri__canonicalizeScheme: function(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: function(userInfo, start, end) {
      if (userInfo == null)
        return "";
      return P._Uri__normalizeOrSubstring(userInfo, start, end, C.List_gRj, false);
    },
    _Uri__makePath: function(path, start, end, pathSegments, scheme, hasAuthority) {
      var result,
        isFile = scheme === "file",
        ensureLeadingSlash = isFile || hasAuthority;
      if (path == null)
        return isFile ? "/" : "";
      else
        result = P._Uri__normalizeOrSubstring(path, start, end, C.List_qg4, true);
      if (result.length === 0) {
        if (isFile)
          return "/";
      } else if (ensureLeadingSlash && !C.JSString_methods.startsWith$1(result, "/"))
        result = "/" + result;
      return P._Uri__normalizePath(result, scheme, hasAuthority);
    },
    _Uri__normalizePath: function(path, scheme, hasAuthority) {
      var t1 = scheme.length === 0;
      if (t1 && !hasAuthority && !C.JSString_methods.startsWith$1(path, "/"))
        return P._Uri__normalizeRelativePath(path, !t1 || hasAuthority);
      return P._Uri__removeDotSegments(path);
    },
    _Uri__makeQuery: function(query, start, end, queryParameters) {
      if (query != null)
        return P._Uri__normalizeOrSubstring(query, start, end, C.List_CVk, true);
      return null;
    },
    _Uri__makeFragment: function(fragment, start, end) {
      if (fragment == null)
        return null;
      return P._Uri__normalizeOrSubstring(fragment, start, end, C.List_CVk, true);
    },
    _Uri__normalizeEscape: function(source, index, lowerCase) {
      var firstDigit, secondDigit, firstDigitValue, secondDigitValue, value,
        t1 = index + 2;
      if (t1 >= source.length)
        return "%";
      firstDigit = C.JSString_methods.codeUnitAt$1(source, index + 1);
      secondDigit = C.JSString_methods.codeUnitAt$1(source, t1);
      firstDigitValue = H.hexDigitValue(firstDigit);
      secondDigitValue = H.hexDigitValue(secondDigit);
      if (firstDigitValue < 0 || secondDigitValue < 0)
        return "%";
      value = firstDigitValue * 16 + secondDigitValue;
      if (value < 127) {
        t1 = C.JSInt_methods._shrOtherPositive$1(value, 4);
        if (t1 >= 8)
          return H.ioore(C.List_nxB, t1);
        t1 = (C.List_nxB[t1] & 1 << (value & 15)) !== 0;
      } else
        t1 = false;
      if (t1)
        return H.Primitives_stringFromCharCode(lowerCase && 65 <= value && 90 >= value ? (value | 32) >>> 0 : value);
      if (firstDigit >= 97 || secondDigit >= 97)
        return C.JSString_methods.substring$2(source, index, index + 3).toUpperCase();
      return null;
    },
    _Uri__escapeChar: function(char) {
      var codeUnits, flag, encodedBytes, t1, index, byte, t2, t3,
        _s16_ = "0123456789ABCDEF";
      if (char < 128) {
        codeUnits = new Uint8Array(3);
        codeUnits[0] = 37;
        codeUnits[1] = C.JSString_methods._codeUnitAt$1(_s16_, char >>> 4);
        codeUnits[2] = C.JSString_methods._codeUnitAt$1(_s16_, 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 = C.JSInt_methods._shrReceiverPositive$1(char, 6 * encodedBytes) & 63 | flag;
          if (index >= t1)
            return H.ioore(codeUnits, index);
          codeUnits[index] = 37;
          t2 = index + 1;
          t3 = C.JSString_methods._codeUnitAt$1(_s16_, byte >>> 4);
          if (t2 >= t1)
            return H.ioore(codeUnits, t2);
          codeUnits[t2] = t3;
          t3 = index + 2;
          t2 = C.JSString_methods._codeUnitAt$1(_s16_, byte & 15);
          if (t3 >= t1)
            return H.ioore(codeUnits, t3);
          codeUnits[t3] = t2;
          index += 3;
        }
      }
      return P.String_String$fromCharCodes(codeUnits, 0, null);
    },
    _Uri__normalizeOrSubstring: function(component, start, end, charTable, escapeDelimiters) {
      var t1 = P._Uri__normalize(component, start, end, charTable, escapeDelimiters);
      return t1 == null ? C.JSString_methods.substring$2(component, start, end) : t1;
    },
    _Uri__normalize: function(component, start, end, charTable, escapeDelimiters) {
      var t1, index, sectionStart, buffer, char, t2, replacement, sourceLength, tail, _null = null;
      for (t1 = !escapeDelimiters, index = start, sectionStart = index, buffer = _null; index < end;) {
        char = C.JSString_methods.codeUnitAt$1(component, index);
        if (char < 127) {
          t2 = char >>> 4;
          if (t2 >= 8)
            return H.ioore(charTable, t2);
          t2 = (charTable[t2] & 1 << (char & 15)) !== 0;
        } else
          t2 = false;
        if (t2)
          ++index;
        else {
          if (char === 37) {
            replacement = P._Uri__normalizeEscape(component, index, false);
            if (replacement == null) {
              index += 3;
              continue;
            }
            if ("%" === replacement) {
              replacement = "%25";
              sourceLength = 1;
            } else
              sourceLength = 3;
          } else {
            if (t1)
              if (char <= 93) {
                t2 = char >>> 4;
                if (t2 >= 8)
                  return H.ioore(C.List_2Vk, t2);
                t2 = (C.List_2Vk[t2] & 1 << (char & 15)) !== 0;
              } else
                t2 = false;
            else
              t2 = false;
            if (t2) {
              P._Uri__fail(component, index, "Invalid character");
              H.ReachabilityError$(string$._null_);
              sourceLength = _null;
              replacement = sourceLength;
            } else {
              if ((char & 64512) === 55296) {
                t2 = index + 1;
                if (t2 < end) {
                  tail = C.JSString_methods.codeUnitAt$1(component, t2);
                  if ((tail & 64512) === 56320) {
                    char = (char & 1023) << 10 | tail & 1023 | 65536;
                    sourceLength = 2;
                  } else
                    sourceLength = 1;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              replacement = P._Uri__escapeChar(char);
            }
          }
          if (buffer == null) {
            buffer = new P.StringBuffer("");
            t2 = buffer;
          } else
            t2 = buffer;
          t2._contents += C.JSString_methods.substring$2(component, sectionStart, index);
          t2._contents += H.S(replacement);
          if (typeof sourceLength !== "number")
            return H.iae(sourceLength);
          index += sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null)
        return _null;
      if (sectionStart < end)
        buffer._contents += C.JSString_methods.substring$2(component, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__mayContainDotSegments: function(path) {
      if (C.JSString_methods.startsWith$1(path, "."))
        return true;
      return C.JSString_methods.indexOf$1(path, "/.") !== -1;
    },
    _Uri__removeDotSegments: function(path) {
      var output, t1, t2, appendSlash, _i, segment, t3;
      if (!P._Uri__mayContainDotSegments(path))
        return path;
      output = H.setRuntimeTypeInfo([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (J.$eq$(segment, "..")) {
          t3 = output.length;
          if (t3 !== 0) {
            if (0 >= t3)
              return H.ioore(output, -1);
            output.pop();
            if (output.length === 0)
              C.JSArray_methods.add$1(output, "");
          }
          appendSlash = true;
        } else if ("." === segment)
          appendSlash = true;
        else {
          C.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      if (appendSlash)
        C.JSArray_methods.add$1(output, "");
      return C.JSArray_methods.join$1(output, "/");
    },
    _Uri__normalizeRelativePath: function(path, allowScheme) {
      var output, t1, t2, appendSlash, _i, segment;
      if (!P._Uri__mayContainDotSegments(path))
        return !allowScheme ? P._Uri__escapeScheme(path) : path;
      output = H.setRuntimeTypeInfo([], 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 && C.JSArray_methods.get$last(output) !== "..") {
            if (0 >= output.length)
              return H.ioore(output, -1);
            output.pop();
            appendSlash = true;
          } else {
            C.JSArray_methods.add$1(output, "..");
            appendSlash = false;
          }
        else if ("." === segment)
          appendSlash = true;
        else {
          C.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      t1 = output.length;
      if (t1 !== 0)
        if (t1 === 1) {
          if (0 >= t1)
            return H.ioore(output, 0);
          t1 = output[0].length === 0;
        } else
          t1 = false;
      else
        t1 = true;
      if (t1)
        return "./";
      if (appendSlash || C.JSArray_methods.get$last(output) === "..")
        C.JSArray_methods.add$1(output, "");
      if (!allowScheme) {
        if (0 >= output.length)
          return H.ioore(output, 0);
        C.JSArray_methods.$indexSet(output, 0, P._Uri__escapeScheme(output[0]));
      }
      return C.JSArray_methods.join$1(output, "/");
    },
    _Uri__escapeScheme: function(path) {
      var i, char, t2,
        t1 = path.length;
      if (t1 >= 2 && P._Uri__isAlphabeticCharacter(J._codeUnitAt$1$s(path, 0)))
        for (i = 1; i < t1; ++i) {
          char = C.JSString_methods._codeUnitAt$1(path, i);
          if (char === 58)
            return C.JSString_methods.substring$2(path, 0, i) + "%3A" + C.JSString_methods.substring$1(path, i + 1);
          if (char <= 127) {
            t2 = char >>> 4;
            if (t2 >= 8)
              return H.ioore(C.List_JYB, t2);
            t2 = (C.List_JYB[t2] & 1 << (char & 15)) === 0;
          } else
            t2 = true;
          if (t2)
            break;
        }
      return path;
    },
    _Uri__isAlphabeticCharacter: function(codeUnit) {
      var lowerCase = codeUnit | 32;
      return 97 <= lowerCase && lowerCase <= 122;
    },
    UriData__parse: function(text, start, sourceUri) {
      var t1, i, slashIndex, char, equalsIndex, lastSeparator, t2, data,
        _s17_ = "Invalid MIME type",
        indices = H.setRuntimeTypeInfo([start - 1], type$.JSArray_int);
      for (t1 = text.length, i = start, slashIndex = -1, char = null; i < t1; ++i) {
        char = C.JSString_methods._codeUnitAt$1(text, i);
        if (char === 44 || char === 59)
          break;
        if (char === 47) {
          if (slashIndex < 0) {
            slashIndex = i;
            continue;
          }
          throw H.wrapException(P.FormatException$(_s17_, text, i));
        }
      }
      if (slashIndex < 0 && i > start)
        throw H.wrapException(P.FormatException$(_s17_, text, i));
      for (; char !== 44;) {
        C.JSArray_methods.add$1(indices, i);
        ++i;
        for (equalsIndex = -1; i < t1; ++i) {
          char = C.JSString_methods._codeUnitAt$1(text, i);
          if (char === 61) {
            if (equalsIndex < 0)
              equalsIndex = i;
          } else if (char === 59 || char === 44)
            break;
        }
        if (equalsIndex >= 0)
          C.JSArray_methods.add$1(indices, equalsIndex);
        else {
          lastSeparator = C.JSArray_methods.get$last(indices);
          if (char !== 44 || i !== lastSeparator + 7 || !C.JSString_methods.startsWith$2(text, "base64", lastSeparator + 1))
            throw H.wrapException(P.FormatException$("Expecting '='", text, i));
          break;
        }
      }
      C.JSArray_methods.add$1(indices, i);
      t2 = i + 1;
      if ((indices.length & 1) === 1)
        text = C.C_Base64Codec.normalize$3(0, text, t2, t1);
      else {
        data = P._Uri__normalize(text, t2, t1, C.List_CVk, true);
        if (data != null)
          text = C.JSString_methods.replaceRange$3(text, t2, t1, data);
      }
      return new P.UriData(text, indices, sourceUri);
    },
    _createTables: function() {
      var _i, t2, t3, t4, t5,
        _s77_ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$&'()*+,;=",
        _s1_ = ".", _s1_0 = ":", _s1_1 = "/", _s1_2 = "?", _s1_3 = "#",
        t1 = type$.Uint8List,
        tables = J.JSArray_JSArray$allocateGrowable(22, t1);
      for (_i = 0; _i < 22; ++_i)
        tables[_i] = new Uint8Array(96);
      t2 = new P._createTables_build(tables);
      t3 = new P._createTables_setChars();
      t4 = new P._createTables_setRange();
      t5 = t1._as(t2.call$2(0, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_, 14);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 3);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(14, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_, 15);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(15, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, "%", 225);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 9);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(1, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 10);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(2, 235));
      t3.call$3(t5, _s77_, 139);
      t3.call$3(t5, _s1_1, 131);
      t3.call$3(t5, _s1_, 146);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(3, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 68);
      t3.call$3(t5, _s1_, 18);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(4, 229));
      t3.call$3(t5, _s77_, 5);
      t4.call$3(t5, "AZ", 229);
      t3.call$3(t5, _s1_0, 102);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, "[", 232);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(5, 229));
      t3.call$3(t5, _s77_, 5);
      t4.call$3(t5, "AZ", 229);
      t3.call$3(t5, _s1_0, 102);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(6, 231));
      t4.call$3(t5, "19", 7);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(7, 231));
      t4.call$3(t5, "09", 7);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t3.call$3(t1._as(t2.call$2(8, 8)), "]", 5);
      t5 = t1._as(t2.call$2(9, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 16);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(16, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 17);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(17, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 9);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(10, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 18);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(18, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 19);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(19, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(11, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 10);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(12, 236));
      t3.call$3(t5, _s77_, 12);
      t3.call$3(t5, _s1_2, 12);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(13, 237));
      t3.call$3(t5, _s77_, 13);
      t3.call$3(t5, _s1_2, 13);
      t4.call$3(t1._as(t2.call$2(20, 245)), "az", 21);
      t2 = t1._as(t2.call$2(21, 245));
      t4.call$3(t2, "az", 21);
      t4.call$3(t2, "09", 21);
      t3.call$3(t2, "+-.", 21);
      return tables;
    },
    _scan: function(uri, start, end, state, indices) {
      var t1, i, table, char, transition,
        tables = $.$get$_scannerTables();
      for (t1 = J.getInterceptor$s(uri), i = start; i < end; ++i) {
        if (state < 0 || state >= tables.length)
          return H.ioore(tables, state);
        table = tables[state];
        char = t1._codeUnitAt$1(uri, i) ^ 96;
        transition = table[char > 95 ? 31 : char];
        state = transition & 31;
        C.JSArray_methods.$indexSet(indices, transition >>> 5, i);
      }
      return state;
    },
    _symbolMapToStringMap_closure: function _symbolMapToStringMap_closure(t0) {
      this.result = t0;
    },
    NoSuchMethodError_toString_closure: function NoSuchMethodError_toString_closure(t0, t1) {
      this._box_0 = t0;
      this.sb = t1;
    },
    _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) {
      this._value = t0;
      this.isUtc = t1;
    },
    Duration: function Duration(t0) {
      this._duration = t0;
    },
    Duration_toString_sixDigits: function Duration_toString_sixDigits() {
    },
    Duration_toString_twoDigits: function Duration_toString_twoDigits() {
    },
    Error: function Error() {
    },
    AssertionError: function AssertionError(t0) {
      this.message = t0;
    },
    TypeError: function TypeError() {
    },
    NullThrownError: function NullThrownError() {
    },
    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;
    },
    NoSuchMethodError: function NoSuchMethodError(t0, t1, t2, t3) {
      var _ = this;
      _._core$_receiver = t0;
      _._core$_memberName = t1;
      _._core$_arguments = t2;
      _._namedArguments = t3;
    },
    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() {
    },
    CyclicInitializationError: function CyclicInitializationError(t0) {
      this.variableName = t0;
    },
    _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() {
    },
    Iterator: function Iterator() {
    },
    Null: function Null() {
    },
    Object: function Object() {
    },
    _StringStackTrace: function _StringStackTrace() {
    },
    StringBuffer: function StringBuffer(t0) {
      this._contents = t0;
    },
    Uri__parseIPv4Address_error: function Uri__parseIPv4Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_error: function Uri_parseIPv6Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_parseHex: function Uri_parseIPv6Address_parseHex(t0, t1) {
      this.error = t0;
      this.host = t1;
    },
    _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 = _.___Uri__text = $;
    },
    UriData: function UriData(t0, t1, t2) {
      this._text = t0;
      this._separatorIndices = t1;
      this._uriCache = t2;
    },
    _createTables_build: function _createTables_build(t0) {
      this.tables = t0;
    },
    _createTables_setChars: function _createTables_setChars() {
    },
    _createTables_setRange: function _createTables_setRange() {
    },
    _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 = _.___Uri__text = $;
    },
    convertNativeToDart_Dictionary: function(object) {
      var dict, keys, t1, _i, t2;
      if (object == null)
        return null;
      dict = P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = Object.getOwnPropertyNames(object);
      for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
        t2 = H._asStringS(keys[_i]);
        dict.$indexSet(0, t2, object[t2]);
      }
      return dict;
    },
    _convertDartToNative_Value: function(value) {
      var array;
      if (value == null)
        return value;
      if (typeof value == "string" || typeof value == "number" || H._isBool(value))
        return value;
      if (type$.Map_dynamic_dynamic._is(value))
        return P.convertDartToNative_Dictionary(value);
      if (type$.List_dynamic._is(value)) {
        array = [];
        J.forEach$1$ax(value, new P._convertDartToNative_Value_closure(array));
        value = array;
      }
      return value;
    },
    convertDartToNative_Dictionary: function(dict) {
      var object = {};
      J.forEach$1$ax(dict, new P.convertDartToNative_Dictionary_closure(object));
      return object;
    },
    _AcceptStructuredClone: function _AcceptStructuredClone() {
    },
    _AcceptStructuredClone_walk_closure: function _AcceptStructuredClone_walk_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _convertDartToNative_Value_closure: function _convertDartToNative_Value_closure(t0) {
      this.array = t0;
    },
    convertDartToNative_Dictionary_closure: function convertDartToNative_Dictionary_closure(t0) {
      this.object = t0;
    },
    _AcceptStructuredCloneDart2Js: function _AcceptStructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
      this.mustCopy = false;
    },
    KeyRange: function KeyRange() {
    },
    _callDartFunction: function(callback, captureThis, $self, $arguments) {
      var arguments0, t1, dartArgs;
      H._asBoolS(captureThis);
      type$.List_dynamic._as($arguments);
      if (H.boolConversionCheck(captureThis)) {
        arguments0 = [$self];
        C.JSArray_methods.addAll$1(arguments0, $arguments);
        $arguments = arguments0;
      }
      t1 = type$.dynamic;
      dartArgs = P.List_List$from(J.map$1$1$ax($arguments, P.js___convertToDart$closure(), t1), true, t1);
      return P._convertToJS(P.Function_apply(type$.Function._as(callback), dartArgs, null));
    },
    _defineProperty: function(o, $name, value) {
      var exception;
      try {
        if (Object.isExtensible(o) && !Object.prototype.hasOwnProperty.call(o, $name)) {
          Object.defineProperty(o, $name, {value: value});
          return true;
        }
      } catch (exception) {
        H.unwrapException(exception);
      }
      return false;
    },
    _getOwnProperty: function(o, $name) {
      if (Object.prototype.hasOwnProperty.call(o, $name))
        return o[$name];
      return null;
    },
    _convertToJS: function(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || H._isBool(o))
        return o;
      if (o instanceof P.JsObject)
        return o._js$_jsObject;
      if (H.isBrowserObject(o))
        return o;
      if (type$.TypedData._is(o))
        return o;
      if (o instanceof P.DateTime)
        return H.Primitives_lazyAsJsDate(o);
      if (type$.Function._is(o))
        return P._getJsProxy(o, "$dart_jsFunction", new P._convertToJS_closure());
      return P._getJsProxy(o, "_$dart_jsObject", new P._convertToJS_closure0($.$get$_dartProxyCtor()));
    },
    _getJsProxy: function(o, propertyName, createProxy) {
      var jsProxy = P._getOwnProperty(o, propertyName);
      if (jsProxy == null) {
        jsProxy = createProxy.call$1(o);
        P._defineProperty(o, propertyName, jsProxy);
      }
      return jsProxy;
    },
    _convertToDart: function(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
        return o;
      else if (o instanceof Object && H.isBrowserObject(o))
        return o;
      else if (o instanceof Object && type$.TypedData._is(o))
        return o;
      else if (o instanceof Date)
        return P.DateTime$fromMillisecondsSinceEpoch(H._asIntS(o.getTime()), false);
      else if (o.constructor === $.$get$_dartProxyCtor())
        return o.o;
      else
        return P._wrapToDart(o);
    },
    _wrapToDart: function(o) {
      if (typeof o == "function")
        return P._getDartProxy(o, $.$get$DART_CLOSURE_PROPERTY_NAME(), new P._wrapToDart_closure());
      if (o instanceof Array)
        return P._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure0());
      return P._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure1());
    },
    _getDartProxy: function(o, propertyName, createProxy) {
      var dartProxy = P._getOwnProperty(o, propertyName);
      if (dartProxy == null || !(o instanceof Object)) {
        dartProxy = createProxy.call$1(o);
        P._defineProperty(o, propertyName, dartProxy);
      }
      return dartProxy;
    },
    _convertDartFunctionFast: function(f) {
      var ret,
        existing = f.$dart_jsFunction;
      if (existing != null)
        return existing;
      ret = function(_call, f) {
        return function() {
          return _call(f, Array.prototype.slice.apply(arguments));
        };
      }(P._callDartFunctionFast, f);
      ret[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
      f.$dart_jsFunction = ret;
      return ret;
    },
    _callDartFunctionFast: function(callback, $arguments) {
      type$.List_dynamic._as($arguments);
      return P.Function_apply(type$.Function._as(callback), $arguments, null);
    },
    allowInterop: function(f, $F) {
      if (typeof f == "function")
        return f;
      else
        return $F._as(P._convertDartFunctionFast(f));
    },
    _convertToJS_closure: function _convertToJS_closure() {
    },
    _convertToJS_closure0: function _convertToJS_closure0(t0) {
      this.ctor = t0;
    },
    _wrapToDart_closure: function _wrapToDart_closure() {
    },
    _wrapToDart_closure0: function _wrapToDart_closure0() {
    },
    _wrapToDart_closure1: function _wrapToDart_closure1() {
    },
    JsObject: function JsObject(t0) {
      this._js$_jsObject = t0;
    },
    JsFunction: function JsFunction(t0) {
      this._js$_jsObject = t0;
    },
    JsArray: function JsArray(t0, t1) {
      this._js$_jsObject = t0;
      this.$ti = t1;
    },
    _JsArray_JsObject_ListMixin: function _JsArray_JsObject_ListMixin() {
    },
    promiseToFuture: function(jsPromise, $T) {
      var t1 = new P._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new P._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      jsPromise.then(H.convertDartClosureToJS(new P.promiseToFuture_closure(completer, $T), 1), H.convertDartClosureToJS(new P.promiseToFuture_closure0(completer), 1));
      return t1;
    },
    NullRejectionException: function NullRejectionException(t0) {
      this.isUndefined = t0;
    },
    promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
      this.completer = t0;
      this.T = t1;
    },
    promiseToFuture_closure0: function promiseToFuture_closure0(t0) {
      this.completer = t0;
    },
    Random_Random: function(seed) {
      var t1;
      if (seed == null)
        t1 = C.C__JSRandom;
      else {
        t1 = new P._Random();
        t1._Random$1(seed);
      }
      return t1;
    },
    _JSRandom: function _JSRandom() {
    },
    _Random: function _Random() {
      this._hi = this._lo = 0;
    },
    Length: function Length() {
    },
    LengthList: function LengthList() {
    },
    Number: function Number() {
    },
    NumberList: function NumberList() {
    },
    PointList: function PointList() {
    },
    ScriptElement0: function ScriptElement0() {
    },
    StringList: function StringList() {
    },
    SvgElement: function SvgElement() {
    },
    Transform: function Transform() {
    },
    TransformList: function TransformList() {
    },
    _LengthList_Interceptor_ListMixin: function _LengthList_Interceptor_ListMixin() {
    },
    _LengthList_Interceptor_ListMixin_ImmutableListMixin: function _LengthList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _NumberList_Interceptor_ListMixin: function _NumberList_Interceptor_ListMixin() {
    },
    _NumberList_Interceptor_ListMixin_ImmutableListMixin: function _NumberList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _StringList_Interceptor_ListMixin: function _StringList_Interceptor_ListMixin() {
    },
    _StringList_Interceptor_ListMixin_ImmutableListMixin: function _StringList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _TransformList_Interceptor_ListMixin: function _TransformList_Interceptor_ListMixin() {
    },
    _TransformList_Interceptor_ListMixin_ImmutableListMixin: function _TransformList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    AudioBuffer: function AudioBuffer() {
    },
    AudioParamMap: function AudioParamMap() {
    },
    AudioParamMap_keys_closure: function AudioParamMap_keys_closure(t0) {
      this.keys = t0;
    },
    AudioTrackList: function AudioTrackList() {
    },
    BaseAudioContext: function BaseAudioContext() {
    },
    OfflineAudioContext: function OfflineAudioContext() {
    },
    _AudioParamMap_Interceptor_MapMixin: function _AudioParamMap_Interceptor_MapMixin() {
    },
    SqlResultSetRowList: function SqlResultSetRowList() {
    },
    _SqlResultSetRowList_Interceptor_ListMixin: function _SqlResultSetRowList_Interceptor_ListMixin() {
    },
    _SqlResultSetRowList_Interceptor_ListMixin_ImmutableListMixin: function _SqlResultSetRowList_Interceptor_ListMixin_ImmutableListMixin() {
    }
  },
  W = {
    Element_Element$html: function(html, treeSanitizer, validator) {
      var fragment,
        t1 = document.body;
      t1.toString;
      fragment = C.BodyElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator);
      fragment.toString;
      t1 = type$._ChildNodeListLazy;
      t1 = new H.WhereIterable(new W._ChildNodeListLazy(fragment), t1._eval$1("bool(ListMixin.E)")._as(new W.Element_Element$html_closure()), t1._eval$1("WhereIterable<ListMixin.E>"));
      return type$.Element._as(t1.get$single(t1));
    },
    Element__safeTagName: function(element) {
      var t1, exception,
        result = "element tag unavailable";
      try {
        t1 = J.getInterceptor$x(element);
        if (typeof t1.get$tagName(element) == "string")
          result = t1.get$tagName(element);
      } catch (exception) {
        H.unwrapException(exception);
      }
      return result;
    },
    EventSource__factoryEventSource: function(url, eventSourceInitDict) {
      var t1 = new EventSource(url, P.convertDartToNative_Dictionary(eventSourceInitDict));
      return t1;
    },
    HttpRequest_request: function(url, method, responseType, sendData, withCredentials) {
      var t2, t3, t4,
        t1 = new P._Future($.Zone__current, type$._Future_HttpRequest),
        completer = new P._AsyncCompleter(t1, type$._AsyncCompleter_HttpRequest),
        xhr = new XMLHttpRequest();
      C.HttpRequest_methods.open$3$async(xhr, method, url, true);
      if (withCredentials != null)
        C.HttpRequest_methods.set$withCredentials(xhr, withCredentials);
      if (responseType != null)
        xhr.responseType = responseType;
      t2 = type$.nullable_void_Function_legacy_ProgressEvent;
      t3 = t2._as(new W.HttpRequest_request_closure(xhr, completer));
      type$.nullable_void_Function._as(null);
      t4 = type$.legacy_ProgressEvent;
      W._EventStreamSubscription$(xhr, "load", t3, false, t4);
      W._EventStreamSubscription$(xhr, "error", t2._as(completer.get$completeError()), false, t4);
      if (sendData != null)
        xhr.send(sendData);
      else
        xhr.send();
      return t1;
    },
    WebSocket_WebSocket: function(url, protocols) {
      return new WebSocket(url);
    },
    _JenkinsSmiHash_combine: function(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    _JenkinsSmiHash_hash4: function(a, b, c, d) {
      var t1 = W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(0, a), b), c), d),
        hash = t1 + ((t1 & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    _EventStreamSubscription$: function(_target, _eventType, onData, _useCapture, $T) {
      var t1 = onData == null ? null : W._wrapZone(new W._EventStreamSubscription_closure(onData), type$.Event);
      t1 = new W._EventStreamSubscription(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription<0>"));
      t1._tryResume$0();
      return t1;
    },
    _Html5NodeValidator$: function(uriPolicy) {
      var e = document.createElement("a"),
        t1 = new W._SameOriginUriPolicy(e, window.location);
      t1 = new W._Html5NodeValidator(t1);
      t1._Html5NodeValidator$1$uriPolicy(uriPolicy);
      return t1;
    },
    _Html5NodeValidator__standardAttributeValidator: function(element, attributeName, value, context) {
      type$.Element._as(element);
      H._asStringS(attributeName);
      H._asStringS(value);
      type$._Html5NodeValidator._as(context);
      return true;
    },
    _Html5NodeValidator__uriAttributeValidator: function(element, attributeName, value, context) {
      var t1, t2, t3;
      type$.Element._as(element);
      H._asStringS(attributeName);
      H._asStringS(value);
      t1 = type$._Html5NodeValidator._as(context).uriPolicy;
      t2 = t1._hiddenAnchor;
      C.AnchorElement_methods.set$href(t2, value);
      t3 = t2.hostname;
      t1 = t1._loc;
      if (!(t3 == t1.hostname && t2.port == t1.port && t2.protocol == t1.protocol))
        if (t3 === "")
          if (t2.port === "") {
            t1 = t2.protocol;
            t1 = t1 === ":" || t1 === "";
          } else
            t1 = false;
        else
          t1 = false;
      else
        t1 = true;
      return t1;
    },
    _TemplatingNodeValidator$: function() {
      var t1 = type$.String,
        t2 = P.LinkedHashSet_LinkedHashSet$from(C.List_wSV, t1),
        t3 = type$.String_Function_legacy_String._as(new W._TemplatingNodeValidator_closure()),
        t4 = H.setRuntimeTypeInfo(["TEMPLATE"], type$.JSArray_String);
      t1 = new W._TemplatingNodeValidator(t2, P.LinkedHashSet_LinkedHashSet(t1), P.LinkedHashSet_LinkedHashSet(t1), P.LinkedHashSet_LinkedHashSet(t1), null);
      t1._SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes(null, new H.MappedListIterable(C.List_wSV, t3, type$.MappedListIterable_of_legacy_String_and_String), t4, null);
      return t1;
    },
    _convertNativeToDart_XHR_Response: function(o) {
      if (type$.Document._is(o))
        return o;
      return new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(o, true);
    },
    _DOMWindowCrossFrame__createSafe: function(w) {
      if (w === window)
        return w;
      else
        return new W._DOMWindowCrossFrame();
    },
    _wrapZone: function(callback, $T) {
      var t1 = $.Zone__current;
      if (t1 === C.C__RootZone)
        return callback;
      return t1.bindUnaryCallbackGuarded$1$1(callback, $T);
    },
    HtmlElement: function HtmlElement() {
    },
    AccessibleNodeList: function AccessibleNodeList() {
    },
    AnchorElement: function AnchorElement() {
    },
    AreaElement: function AreaElement() {
    },
    BaseElement: function BaseElement() {
    },
    Blob: function Blob() {
    },
    BodyElement: function BodyElement() {
    },
    CharacterData: function CharacterData() {
    },
    CloseEvent: function CloseEvent() {
    },
    CssPerspective: function CssPerspective() {
    },
    CssRule: function CssRule() {
    },
    CssStyleDeclaration: function CssStyleDeclaration() {
    },
    CssStyleDeclarationBase: function CssStyleDeclarationBase() {
    },
    CssStyleValue: function CssStyleValue() {
    },
    CssTransformComponent: function CssTransformComponent() {
    },
    CssTransformValue: function CssTransformValue() {
    },
    CssUnparsedValue: function CssUnparsedValue() {
    },
    DataTransferItemList: function DataTransferItemList() {
    },
    Document: function Document() {
    },
    DomException: function DomException() {
    },
    DomImplementation: function DomImplementation() {
    },
    DomRectList: function DomRectList() {
    },
    DomRectReadOnly: function DomRectReadOnly() {
    },
    DomStringList: function DomStringList() {
    },
    DomTokenList: function DomTokenList() {
    },
    _FrozenElementList: function _FrozenElementList(t0, t1) {
      this._nodeList = t0;
      this.$ti = t1;
    },
    Element: function Element() {
    },
    Element_Element$html_closure: function Element_Element$html_closure() {
    },
    Event: function Event() {
    },
    EventSource: function EventSource() {
    },
    EventTarget: function EventTarget() {
    },
    File: function File() {
    },
    FileList: function FileList() {
    },
    FileWriter: function FileWriter() {
    },
    FormElement: function FormElement() {
    },
    Gamepad: function Gamepad() {
    },
    History: function History() {
    },
    HtmlCollection: function HtmlCollection() {
    },
    HtmlDocument: function HtmlDocument() {
    },
    HttpRequest: function HttpRequest() {
    },
    HttpRequest_request_closure: function HttpRequest_request_closure(t0, t1) {
      this.xhr = t0;
      this.completer = t1;
    },
    HttpRequestEventTarget: function HttpRequestEventTarget() {
    },
    ImageData: function ImageData() {
    },
    KeyboardEvent: function KeyboardEvent() {
    },
    Location: function Location() {
    },
    MediaList: function MediaList() {
    },
    MessageEvent: function MessageEvent() {
    },
    MidiInputMap: function MidiInputMap() {
    },
    MidiInputMap_keys_closure: function MidiInputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MidiOutputMap: function MidiOutputMap() {
    },
    MidiOutputMap_keys_closure: function MidiOutputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MimeType: function MimeType() {
    },
    MimeTypeArray: function MimeTypeArray() {
    },
    _ChildNodeListLazy: function _ChildNodeListLazy(t0) {
      this._this = t0;
    },
    Node: function Node() {
    },
    NodeList: function NodeList() {
    },
    Plugin: function Plugin() {
    },
    PluginArray: function PluginArray() {
    },
    ProgressEvent: function ProgressEvent() {
    },
    RtcStatsReport: function RtcStatsReport() {
    },
    RtcStatsReport_keys_closure: function RtcStatsReport_keys_closure(t0) {
      this.keys = t0;
    },
    ScriptElement: function ScriptElement() {
    },
    SelectElement: function SelectElement() {
    },
    SourceBuffer: function SourceBuffer() {
    },
    SourceBufferList: function SourceBufferList() {
    },
    SpeechGrammar: function SpeechGrammar() {
    },
    SpeechGrammarList: function SpeechGrammarList() {
    },
    SpeechRecognitionResult: function SpeechRecognitionResult() {
    },
    Storage: function Storage() {
    },
    Storage_addAll_closure: function Storage_addAll_closure(t0) {
      this.$this = t0;
    },
    Storage_keys_closure: function Storage_keys_closure(t0) {
      this.keys = t0;
    },
    StyleSheet: function StyleSheet() {
    },
    TableElement: function TableElement() {
    },
    TableRowElement: function TableRowElement() {
    },
    TableSectionElement: function TableSectionElement() {
    },
    TemplateElement: function TemplateElement() {
    },
    TextTrack: function TextTrack() {
    },
    TextTrackCue: function TextTrackCue() {
    },
    TextTrackCueList: function TextTrackCueList() {
    },
    TextTrackList: function TextTrackList() {
    },
    TimeRanges: function TimeRanges() {
    },
    Touch: function Touch() {
    },
    TouchList: function TouchList() {
    },
    TrackDefaultList: function TrackDefaultList() {
    },
    UIEvent: function UIEvent() {
    },
    Url: function Url() {
    },
    VideoTrackList: function VideoTrackList() {
    },
    WebSocket: function WebSocket() {
    },
    Window: function Window() {
    },
    WorkerGlobalScope: function WorkerGlobalScope() {
    },
    _Attr: function _Attr() {
    },
    _CssRuleList: function _CssRuleList() {
    },
    _DomRect: function _DomRect() {
    },
    _GamepadList: function _GamepadList() {
    },
    _NamedNodeMap: function _NamedNodeMap() {
    },
    _SpeechRecognitionResultList: function _SpeechRecognitionResultList() {
    },
    _StyleSheetList: function _StyleSheetList() {
    },
    _AttributeMap: function _AttributeMap() {
    },
    _AttributeMap_addAll_closure: function _AttributeMap_addAll_closure(t0) {
      this.$this = t0;
    },
    _ElementAttributeMap: function _ElementAttributeMap(t0) {
      this._element = t0;
    },
    EventStreamProvider: function EventStreamProvider(t0, t1) {
      this._eventType = t0;
      this.$ti = t1;
    },
    _EventStream: function _EventStream(t0, t1, t2, t3) {
      var _ = this;
      _._html$_target = t0;
      _._eventType = t1;
      _._useCapture = t2;
      _.$ti = t3;
    },
    _EventStreamSubscription: function _EventStreamSubscription(t0, t1, t2, t3, t4) {
      var _ = this;
      _._pauseCount = 0;
      _._html$_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;
    },
    _Html5NodeValidator: function _Html5NodeValidator(t0) {
      this.uriPolicy = t0;
    },
    ImmutableListMixin: function ImmutableListMixin() {
    },
    NodeValidatorBuilder: function NodeValidatorBuilder(t0) {
      this._validators = t0;
    },
    NodeValidatorBuilder_allowsElement_closure: function NodeValidatorBuilder_allowsElement_closure(t0) {
      this.element = t0;
    },
    NodeValidatorBuilder_allowsAttribute_closure: function NodeValidatorBuilder_allowsAttribute_closure(t0, t1, t2) {
      this.element = t0;
      this.attributeName = t1;
      this.value = t2;
    },
    _SimpleNodeValidator: function _SimpleNodeValidator() {
    },
    _SimpleNodeValidator_closure: function _SimpleNodeValidator_closure() {
    },
    _SimpleNodeValidator_closure0: function _SimpleNodeValidator_closure0() {
    },
    _TemplatingNodeValidator: function _TemplatingNodeValidator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._templateAttrs = t0;
      _.allowedElements = t1;
      _.allowedAttributes = t2;
      _.allowedUriAttributes = t3;
      _.uriPolicy = t4;
    },
    _TemplatingNodeValidator_closure: function _TemplatingNodeValidator_closure() {
    },
    _SvgNodeValidator: function _SvgNodeValidator() {
    },
    FixedSizeListIterator: function FixedSizeListIterator(t0, t1, t2) {
      var _ = this;
      _._array = t0;
      _._length = t1;
      _._position = -1;
      _._current = null;
      _.$ti = t2;
    },
    _DOMWindowCrossFrame: function _DOMWindowCrossFrame() {
    },
    _SameOriginUriPolicy: function _SameOriginUriPolicy(t0, t1) {
      this._hiddenAnchor = t0;
      this._loc = t1;
    },
    _ValidatingTreeSanitizer: function _ValidatingTreeSanitizer(t0) {
      this.validator = t0;
      this.modifiedTree = false;
    },
    _ValidatingTreeSanitizer_sanitizeTree_walk: function _ValidatingTreeSanitizer_sanitizeTree_walk(t0) {
      this.$this = t0;
    },
    _CssStyleDeclaration_Interceptor_CssStyleDeclarationBase: function _CssStyleDeclaration_Interceptor_CssStyleDeclarationBase() {
    },
    _DomRectList_Interceptor_ListMixin: function _DomRectList_Interceptor_ListMixin() {
    },
    _DomRectList_Interceptor_ListMixin_ImmutableListMixin: function _DomRectList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _DomStringList_Interceptor_ListMixin: function _DomStringList_Interceptor_ListMixin() {
    },
    _DomStringList_Interceptor_ListMixin_ImmutableListMixin: function _DomStringList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _FileList_Interceptor_ListMixin: function _FileList_Interceptor_ListMixin() {
    },
    _FileList_Interceptor_ListMixin_ImmutableListMixin: function _FileList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _HtmlCollection_Interceptor_ListMixin: function _HtmlCollection_Interceptor_ListMixin() {
    },
    _HtmlCollection_Interceptor_ListMixin_ImmutableListMixin: function _HtmlCollection_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _MidiInputMap_Interceptor_MapMixin: function _MidiInputMap_Interceptor_MapMixin() {
    },
    _MidiOutputMap_Interceptor_MapMixin: function _MidiOutputMap_Interceptor_MapMixin() {
    },
    _MimeTypeArray_Interceptor_ListMixin: function _MimeTypeArray_Interceptor_ListMixin() {
    },
    _MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin: function _MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _NodeList_Interceptor_ListMixin: function _NodeList_Interceptor_ListMixin() {
    },
    _NodeList_Interceptor_ListMixin_ImmutableListMixin: function _NodeList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _PluginArray_Interceptor_ListMixin: function _PluginArray_Interceptor_ListMixin() {
    },
    _PluginArray_Interceptor_ListMixin_ImmutableListMixin: function _PluginArray_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _RtcStatsReport_Interceptor_MapMixin: function _RtcStatsReport_Interceptor_MapMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin: function _SourceBufferList_EventTarget_ListMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin: function _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _SpeechGrammarList_Interceptor_ListMixin: function _SpeechGrammarList_Interceptor_ListMixin() {
    },
    _SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin: function _SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _Storage_Interceptor_MapMixin: function _Storage_Interceptor_MapMixin() {
    },
    _TextTrackCueList_Interceptor_ListMixin: function _TextTrackCueList_Interceptor_ListMixin() {
    },
    _TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin: function _TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin: function _TextTrackList_EventTarget_ListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin_ImmutableListMixin: function _TextTrackList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _TouchList_Interceptor_ListMixin: function _TouchList_Interceptor_ListMixin() {
    },
    _TouchList_Interceptor_ListMixin_ImmutableListMixin: function _TouchList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __CssRuleList_Interceptor_ListMixin: function __CssRuleList_Interceptor_ListMixin() {
    },
    __CssRuleList_Interceptor_ListMixin_ImmutableListMixin: function __CssRuleList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __GamepadList_Interceptor_ListMixin: function __GamepadList_Interceptor_ListMixin() {
    },
    __GamepadList_Interceptor_ListMixin_ImmutableListMixin: function __GamepadList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __NamedNodeMap_Interceptor_ListMixin: function __NamedNodeMap_Interceptor_ListMixin() {
    },
    __NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin: function __NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __SpeechRecognitionResultList_Interceptor_ListMixin: function __SpeechRecognitionResultList_Interceptor_ListMixin() {
    },
    __SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin: function __SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __StyleSheetList_Interceptor_ListMixin: function __StyleSheetList_Interceptor_ListMixin() {
    },
    __StyleSheetList_Interceptor_ListMixin_ImmutableListMixin: function __StyleSheetList_Interceptor_ListMixin_ImmutableListMixin() {
    }
  },
  O = {DelegatingStreamSink: function DelegatingStreamSink() {
    }, BigIntSerializer: function BigIntSerializer(t0) {
      this.types = t0;
    }, 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;
    }, JsonObjectSerializer: function JsonObjectSerializer(t0) {
      this.types = t0;
    }, UriSerializer: function UriSerializer(t0) {
      this.types = t0;
    }},
  S = {
    BuiltList_BuiltList$from: function(iterable, $E) {
      var t1, t2;
      if (iterable instanceof S._BuiltList) {
        t1 = H.createRuntimeType($E._eval$1("0*"));
        t1 = H.createRuntimeType(iterable.$ti._eval$1("1*")) === t1;
      } else
        t1 = false;
      if (t1)
        return $E._eval$1("BuiltList<0*>*")._as(iterable);
      else {
        t1 = $E._eval$1("0*");
        t2 = new S._BuiltList(P.List_List$from(iterable, false, t1), $E._eval$1("_BuiltList<0*>"));
        if (H.createRuntimeType(t1) === C.Type_dynamic_0Rz)
          H.throwExpression(P.UnsupportedError$(string$.explicBL));
        t2._BuiltList$copyAndCheckTypes$1(iterable, t1);
        return t2;
      }
    },
    ListBuilder_ListBuilder: function(iterable, $E) {
      var t1 = new S.ListBuilder($E._eval$1("ListBuilder<0*>"));
      if (H.createRuntimeType($E._eval$1("0*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$(string$.explicL));
      t1.replace$1(0, 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._listOwner = this._list = null;
      this.$ti = t0;
    },
    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._method = this._params = this._extension_request$_$v = null;
    },
    _$BatchedEvents: function _$BatchedEvents(t0) {
      this.events = t0;
    },
    BatchedEventsBuilder: function BatchedEventsBuilder() {
      this._events = this._extension_request$_$v = null;
    },
    toPromise: function(future, $T) {
      return new self.Promise(P.allowInterop(new S.toPromise_closure(future, $T), $T._eval$1("~(~(0*)*,~(@)*)*")), $T._eval$1("0*"));
    },
    Promise: function Promise() {
    },
    toPromise_closure: function toPromise_closure(t0, t1) {
      this.future = t0;
      this.T = t1;
    }
  },
  M = {
    BuiltListMultimap_BuiltListMultimap: function($K, $V) {
      var t1 = C.Map_empty.get$keys(C.Map_empty),
        t2 = $K._eval$1("0*"),
        t3 = $V._eval$1("0*"),
        t4 = P.LinkedHashMap_LinkedHashMap$_empty(t2, $V._eval$1("BuiltList<0*>*")),
        t5 = new M._BuiltListMultimap(t4, S.BuiltList_BuiltList$from(C.List_empty0, t3), $K._eval$1("@<0*>")._bind$1(t3)._eval$1("_BuiltListMultimap<1,2>"));
      t5.BuiltListMultimap$_$1(t4, t2, t3);
      t5._BuiltListMultimap$copyAndCheck$2(t1, new M.BuiltListMultimap_BuiltListMultimap_closure(C.Map_empty), t2, t3);
      return t5;
    },
    ListMultimapBuilder_ListMultimapBuilder: function($K, $V) {
      var t1 = $K._eval$1("@<0*>")._bind$1($V._eval$1("0*")),
        t2 = new M.ListMultimapBuilder(t1._eval$1("ListMultimapBuilder<1,2>"));
      if (H.createRuntimeType(t1._eval$1("1*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$('explicit key type required, for example "new ListMultimapBuilder<int, int>"'));
      if (H.createRuntimeType(t1._eval$1("2*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$('explicit value type required, for example "new ListMultimapBuilder<int, int>"'));
      t2.replace$1(0, C.Map_empty);
      return t2;
    },
    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;
      _._list_multimap$_builderMap = _._list_multimap$_builtMapOwner = _._list_multimap$_builtMap = null;
      _.$ti = t0;
    },
    ListMultimapBuilder_replace_closure: function ListMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    StringSerializer: function StringSerializer(t0) {
      this.types = t0;
    },
    DevToolsRequest: function DevToolsRequest() {
    },
    DevToolsResponse: function DevToolsResponse() {
    },
    _$DevToolsRequestSerializer: function _$DevToolsRequestSerializer() {
    },
    _$DevToolsResponseSerializer: function _$DevToolsResponseSerializer() {
    },
    _$DevToolsRequest: function _$DevToolsRequest(t0, t1, t2, t3) {
      var _ = this;
      _.appId = t0;
      _.instanceId = t1;
      _.contextId = t2;
      _.tabUrl = t3;
    },
    DevToolsRequestBuilder: function DevToolsRequestBuilder() {
      var _ = this;
      _._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;
    },
    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;
    },
    SseClient$: function(serverUrl) {
      var _null = null,
        t1 = type$.legacy_String;
      t1 = new M.SseClient(P.StreamController_StreamController(_null, _null, false, t1), P.StreamController_StreamController(_null, _null, false, t1), F.Logger_Logger("SseClient"), new P._AsyncCompleter(new P._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic));
      t1.SseClient$1(serverUrl);
      return t1;
    },
    SseClient: function SseClient(t0, t1, t2, t3) {
      var _ = this;
      _._incomingController = t0;
      _._outgoingController = t1;
      _._logger = t2;
      _._onConnected = t3;
      _._lastMessageId = -1;
      _._errorTimer = _._serverUrl = _._eventSource = 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;
    }
  },
  A = {
    BuiltMap_BuiltMap: function($K, $V) {
      var t1 = C.Map_empty.get$keys(C.Map_empty),
        t2 = $K._eval$1("0*"),
        t3 = $V._eval$1("0*"),
        t4 = P.LinkedHashMap_LinkedHashMap$_empty(t2, t3),
        t5 = new A._BuiltMap(null, t4, $K._eval$1("@<0*>")._bind$1(t3)._eval$1("_BuiltMap<1,2>"));
      t5.BuiltMap$_$2(null, t4, t2, t3);
      t5._BuiltMap$copyAndCheckTypes$2(t1, new A.BuiltMap_BuiltMap_closure(C.Map_empty), t2, t3);
      return t5;
    },
    _BuiltMap$withSafeMap: function(mapFactory, map, $K, $V) {
      var t1 = new A._BuiltMap(mapFactory, map, $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltMap<1,2>"));
      t1.BuiltMap$_$2(mapFactory, map, $K._eval$1("0*"), $V._eval$1("0*"));
      return t1;
    },
    MapBuilder_MapBuilder: function($K, $V) {
      var t1 = $K._eval$1("@<0*>")._bind$1($V._eval$1("0*")),
        t2 = new A.MapBuilder(null, null, null, t1._eval$1("MapBuilder<1,2>"));
      if (H.createRuntimeType(t1._eval$1("1*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$('explicit key type required, for example "new MapBuilder<int, int>"'));
      if (H.createRuntimeType(t1._eval$1("2*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$('explicit value type required, for example "new MapBuilder<int, int>"'));
      t2.replace$1(0, C.Map_empty);
      return t2;
    },
    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;
      _._map$_map = t1;
      _._mapOwner = t2;
      _.$ti = t3;
    },
    MapBuilder_replace_closure: function MapBuilder_replace_closure(t0, t1) {
      this.$this = t0;
      this.replacement = t1;
    },
    JsonObject_JsonObject: function(value) {
      if (typeof value == "number")
        return new A.NumJsonObject(value);
      else if (typeof value == "string")
        return new A.StringJsonObject(value);
      else if (H._isBool(value))
        return new A.BoolJsonObject(value);
      else if (type$.legacy_List_legacy_Object._is(value))
        return new A.ListJsonObject(new P.UnmodifiableListView(value, type$.UnmodifiableListView_legacy_Object));
      else if (type$.legacy_Map_of_legacy_String_and_legacy_Object._is(value))
        return new A.MapJsonObject(new P.UnmodifiableMapView(value, type$.UnmodifiableMapView_of_legacy_String_and_legacy_Object));
      else
        throw H.wrapException(P.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;
    },
    RunRequest: function RunRequest() {
    },
    _$RunRequestSerializer: function _$RunRequestSerializer() {
    },
    _$RunRequest: function _$RunRequest() {
    },
    hashObjects: function(objects) {
      return A._finish((objects && C.JSArray_methods).fold$1$2(objects, 0, new A.hashObjects_closure(), type$.legacy_int));
    },
    _combine: function(hash, value) {
      if (typeof hash !== "number")
        return hash.$add();
      if (typeof value !== "number")
        return H.iae(value);
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    _finish: function(hash) {
      if (typeof hash !== "number")
        return H.iae(hash);
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    hashObjects_closure: function hashObjects_closure() {
    },
    HtmlWebSocketChannel$connect: function(url, protocols) {
      var t2, t3, localToForeignController, foreignToLocalController, t4, t5, _null = null,
        t1 = W.WebSocket_WebSocket(url.toString$0(0), protocols);
      C.WebSocket_methods.set$binaryType(t1, "arraybuffer");
      t2 = new B.StreamChannelController(type$.StreamChannelController_dynamic);
      t3 = type$.dynamic;
      localToForeignController = P.StreamController_StreamController(_null, _null, true, t3);
      foreignToLocalController = P.StreamController_StreamController(_null, _null, true, t3);
      t4 = H._instanceType(foreignToLocalController);
      t5 = H._instanceType(localToForeignController);
      t2.set$__StreamChannelController__local(K.GuaranteeChannel$(new P._ControllerStream(foreignToLocalController, t4._eval$1("_ControllerStream<1>")), new P._StreamSinkWrapper(localToForeignController, t5._eval$1("_StreamSinkWrapper<1>")), true, t3));
      t3 = K.GuaranteeChannel$(new P._ControllerStream(localToForeignController, t5._eval$1("_ControllerStream<1>")), new P._StreamSinkWrapper(foreignToLocalController, t4._eval$1("_StreamSinkWrapper<1>")), false, t3);
      if (t2.__StreamChannelController__foreign === $)
        t2.set$__StreamChannelController__foreign(t3);
      else
        H.throwExpression(H.LateError$fieldAI("_foreign"));
      t2 = new A.HtmlWebSocketChannel(t1, t2);
      t2.HtmlWebSocketChannel$1(t1);
      return t2;
    },
    HtmlWebSocketChannel: function HtmlWebSocketChannel(t0, t1) {
      var _ = this;
      _._html0$_webSocket = t0;
      _._localCloseReason = _._localCloseCode = null;
      _._html0$_controller = t1;
      _.__HtmlWebSocketChannel_sink = $;
    },
    HtmlWebSocketChannel_closure: function HtmlWebSocketChannel_closure(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure0: function HtmlWebSocketChannel_closure0(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure1: function HtmlWebSocketChannel_closure1(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure2: function HtmlWebSocketChannel_closure2(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel__listen_closure: function HtmlWebSocketChannel__listen_closure(t0) {
      this.$this = t0;
    },
    _HtmlWebSocketSink: function _HtmlWebSocketSink(t0, t1) {
      this._html0$_channel = t0;
      this._sink = t1;
    }
  },
  L = {
    BuiltSet_BuiltSet$from: function(iterable, $E) {
      var t1 = $E._eval$1("0*"),
        t2 = P.LinkedHashSet_LinkedHashSet$_empty(t1),
        t3 = new L._BuiltSet(null, t2, $E._eval$1("_BuiltSet<0*>"));
      t3.BuiltSet$_$2(null, t2, t1);
      t3._BuiltSet$copyAndCheckTypes$1(iterable, t1);
      return t3;
    },
    SetBuilder_SetBuilder: function($E) {
      var t1 = new L.SetBuilder(null, null, null, $E._eval$1("SetBuilder<0*>"));
      if (H.createRuntimeType($E._eval$1("0*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$('explicit element type required, for example "new SetBuilder<int>"'));
      t1.replace$1(0, C.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;
      _._set$_set = t1;
      _._setOwner = t2;
      _.$ti = t3;
    },
    stronglyConnectedComponents: function(nodes, edges, $T) {
      var node, _null = null, _box_0 = {},
        result = H.setRuntimeTypeInfo([], $T._eval$1("JSArray<List<0>>")),
        t1 = type$.int,
        lowLinks = P.HashMap_HashMap(_null, _null, _null, $T, t1),
        indexes = P.HashMap_HashMap(_null, _null, _null, $T, t1),
        onStack = P.HashSet_HashSet(_null, _null, $T),
        _i = _box_0.index = 0,
        strongConnect = new L.stronglyConnectedComponents_strongConnect(_box_0, indexes, lowLinks, new P.ListQueue(P.List_List$filled(P.ListQueue__calculateCapacity(_null), _null, false, $T._eval$1("0?")), $T._eval$1("ListQueue<0>")), onStack, edges, L.strongly_connected_components___defaultEquals$closure(), result, $T);
      for (t1 = nodes.length; _i < nodes.length; nodes.length === t1 || (0, H.throwConcurrentModificationError)(nodes), ++_i) {
        node = nodes[_i];
        if (!indexes.containsKey$1(0, node))
          strongConnect.call$1(node);
      }
      return result;
    },
    _defaultEquals0: function(a, b) {
      return J.$eq$(a, b);
    },
    stronglyConnectedComponents_strongConnect: function stronglyConnectedComponents_strongConnect(t0, t1, t2, t3, t4, t5, t6, t7, t8) {
      var _ = this;
      _._box_0 = t0;
      _.indexes = t1;
      _.lowLinks = t2;
      _.lastVisited = t3;
      _.onStack = t4;
      _.edges = t5;
      _.nonNullEquals = t6;
      _.result = t7;
      _.T = t8;
    },
    LogRecord: function LogRecord(t0, t1, t2) {
      this.level = t0;
      this.message = t1;
      this.loggerName = t2;
    }
  },
  E = {
    SetMultimapBuilder_SetMultimapBuilder: function($K, $V) {
      var t1 = $K._eval$1("@<0*>")._bind$1($V._eval$1("0*")),
        t2 = new E.SetMultimapBuilder(t1._eval$1("SetMultimapBuilder<1,2>"));
      if (H.createRuntimeType(t1._eval$1("1*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$('explicit key type required, for example "new SetMultimapBuilder<int, int>"'));
      if (H.createRuntimeType(t1._eval$1("2*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$('explicit value type required, for example "new SetMultimapBuilder<int, int>"'));
      t2.replace$1(0, C.Map_empty);
      return t2;
    },
    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;
      _._builderMap = _._builtMapOwner = _._builtMap = null;
      _.$ti = t0;
    },
    SetMultimapBuilder_replace_closure: function SetMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    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 = _._appId = _._$v = null;
    },
    WebSocketChannelException: function WebSocketChannelException(t0) {
      this.message = t0;
    }
  },
  Y = {
    $jc: function(hash, value) {
      if (typeof value !== "number")
        return H.iae(value);
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $jf: function(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    BuiltValueNullFieldError$: function(type, field) {
      return new Y.BuiltValueNullFieldError(type, field);
    },
    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;
    },
    BuiltJsonSerializersBuilder$_: function(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins) {
      return new Y.BuiltJsonSerializersBuilder(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins);
    },
    _getRawName: function(type) {
      var $name = J.toString$0$(type),
        genericsStart = J.indexOf$1$s($name, "<");
      return genericsStart === -1 ? $name : C.JSString_methods.substring$2($name, 0, genericsStart);
    },
    BuiltJsonSerializers: function BuiltJsonSerializers(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _.builderFactories = t3;
      _._plugins = t4;
    },
    BuiltJsonSerializersBuilder: function BuiltJsonSerializersBuilder(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _._builderFactories = t3;
      _._plugins = t4;
    },
    Level: function Level(t0, t1) {
      this.name = t0;
      this.value = t1;
    }
  },
  U = {
    Serializers_Serializers: function() {
      var t1 = type$.legacy_Type,
        t2 = type$.legacy_Serializer_dynamic,
        t3 = A.MapBuilder_MapBuilder(t1, t2),
        t4 = type$.legacy_String,
        t5 = A.MapBuilder_MapBuilder(t4, t2);
      t2 = A.MapBuilder_MapBuilder(t4, t2);
      t4 = A.MapBuilder_MapBuilder(type$.legacy_FullType, type$.legacy_Function);
      t2 = new Y.BuiltJsonSerializersBuilder(t3, t5, t2, t4, S.ListBuilder_ListBuilder(C.List_empty0, type$.legacy_SerializerPlugin));
      t2.add$1(0, new O.BigIntSerializer(S.BuiltList_BuiltList$from([C.Type_BigInt_8OV, J.get$runtimeType$($.$get$_BigIntImpl_zero())], t1)));
      t2.add$1(0, new R.BoolSerializer(S.BuiltList_BuiltList$from([C.Type_bool_lhE], t1)));
      t5 = type$.legacy_Object;
      t2.add$1(0, new K.BuiltListSerializer(S.BuiltList_BuiltList$from([C.Type_BuiltList_iTR, H.getRuntimeType(S.BuiltList_BuiltList$from(C.List_empty0, t5))], t1)));
      t2.add$1(0, new R.BuiltListMultimapSerializer(S.BuiltList_BuiltList$from([C.Type_BuiltListMultimap_2Mt, H.getRuntimeType(M.BuiltListMultimap_BuiltListMultimap(t5, t5))], t1)));
      t2.add$1(0, new K.BuiltMapSerializer(S.BuiltList_BuiltList$from([C.Type_BuiltMap_qd4, H.getRuntimeType(A.BuiltMap_BuiltMap(t5, t5))], t1)));
      t2.add$1(0, new O.BuiltSetSerializer(S.BuiltList_BuiltList$from([C.Type_BuiltSet_fcN, H.getRuntimeType(L.BuiltSet_BuiltSet$from(C.List_empty0, t5))], t1)));
      t2.add$1(0, new R.BuiltSetMultimapSerializer(L.BuiltSet_BuiltSet$from([C.Type_BuiltSetMultimap_9Fi], t1)));
      t2.add$1(0, new Z.DateTimeSerializer(S.BuiltList_BuiltList$from([C.Type_DateTime_8AS], t1)));
      t2.add$1(0, new D.DoubleSerializer(S.BuiltList_BuiltList$from([C.Type_double_K1J], t1)));
      t2.add$1(0, new K.DurationSerializer(S.BuiltList_BuiltList$from([C.Type_Duration_SnA], t1)));
      t2.add$1(0, new B.IntSerializer(S.BuiltList_BuiltList$from([C.Type_int_tHn], t1)));
      t2.add$1(0, new Q.Int64Serializer(S.BuiltList_BuiltList$from([C.Type_Int64_gc6], t1)));
      t2.add$1(0, new O.JsonObjectSerializer(S.BuiltList_BuiltList$from([C.Type_JsonObject_gyf, C.Type_BoolJsonObject_8HQ, C.Type_ListJsonObject_yPV, C.Type_MapJsonObject_bBG, C.Type_NumJsonObject_H9C, C.Type_StringJsonObject_GAC], t1)));
      t2.add$1(0, new K.NumSerializer(S.BuiltList_BuiltList$from([C.Type_num_cv7], t1)));
      t2.add$1(0, new K.RegExpSerializer(S.BuiltList_BuiltList$from([C.Type_RegExp_Eeh, $.$get$_runtimeType()], t1)));
      t2.add$1(0, new M.StringSerializer(S.BuiltList_BuiltList$from([C.Type_String_k8F], t1)));
      t2.add$1(0, new O.UriSerializer(S.BuiltList_BuiltList$from([C.Type_Uri_EFX, H.getRuntimeType(P.Uri_parse("http://example.com")), H.getRuntimeType(P.Uri_parse("http://example.com:"))], t1)));
      t4.$indexSet(0, C.FullType_GJM, new U.Serializers_Serializers_closure());
      t4.$indexSet(0, C.FullType_UGJ, new U.Serializers_Serializers_closure0());
      t4.$indexSet(0, C.FullType_sEu, new U.Serializers_Serializers_closure1());
      t4.$indexSet(0, C.FullType_ECn, new U.Serializers_Serializers_closure2());
      t4.$indexSet(0, C.FullType_C1B, new U.Serializers_Serializers_closure3());
      return t2.build$0();
    },
    FullType__getRawName: function(type) {
      var $name = J.toString$0$(type),
        genericsStart = J.indexOf$1$s($name, "<");
      return genericsStart === -1 ? $name : C.JSString_methods.substring$2($name, 0, genericsStart);
    },
    DeserializationError_DeserializationError: function(json, type, error) {
      var limitedJson = J.toString$0$(json),
        t1 = limitedJson.length;
      return new U.DeserializationError(t1 > 80 ? J.replaceRange$3$s(limitedJson, 77, t1, "...") : limitedJson, 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) {
      this.root = t0;
      this.parameters = t1;
    },
    DeserializationError: function DeserializationError(t0, t1, t2) {
      this.json = t0;
      this.type = t1;
      this.error = t2;
    },
    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() {
    }
  },
  R = {BoolSerializer: function BoolSerializer(t0) {
      this.types = t0;
    }, 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;
    }, 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;
    }, 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() {
    }, StreamChannelMixin: function StreamChannelMixin() {
    }},
  K = {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;
    }, DurationSerializer: function DurationSerializer(t0) {
      this.types = t0;
    }, NumSerializer: function NumSerializer(t0) {
      this.types = t0;
    }, RegExpSerializer: function RegExpSerializer(t0) {
      this.types = t0;
    }, _$serializers_closure: function _$serializers_closure() {
    },
    GuaranteeChannel$: function(innerStream, innerSink, allowSinkErrors, $T) {
      var t2, t1 = {};
      t1.innerStream = innerStream;
      t2 = new K.GuaranteeChannel($T._eval$1("GuaranteeChannel<0>"));
      t2.GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, t1, $T);
      return t2;
    },
    GuaranteeChannel: function GuaranteeChannel(t0) {
      var _ = this;
      _.__GuaranteeChannel__streamController = _.__GuaranteeChannel__sink = $;
      _._guarantee_channel$_subscription = null;
      _._disconnected = false;
      _.$ti = t0;
    },
    GuaranteeChannel_closure: function GuaranteeChannel_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    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() {
    },
    Uuid: function Uuid() {
    }
  },
  Z = {DateTimeSerializer: function DateTimeSerializer(t0) {
      this.types = t0;
    }, LegacyRestarter: function LegacyRestarter() {
    }, LegacyRestarter_restart_closure: function LegacyRestarter_restart_closure(t0, t1) {
      this._box_0 = t0;
      this.reloadCompleter = t1;
    }},
  D = {DoubleSerializer: function DoubleSerializer(t0) {
      this.types = t0;
    },
    main: function() {
      var exception;
      try {
        self.chrome.runtime.sendMessage("pebbhcjfokadbgbnlmogdkkaahmamnap", "injected-client-started", D.RequestOptions$(null), P.allowInterop(new D.main_closure(), type$.legacy_Function));
      } catch (exception) {
        H.unwrapException(exception);
      }
      return P.runZonedGuarded(new D.main_closure0(), new D.main_closure1(), type$.legacy_Future_void);
    },
    RequestOptions$: function(receiver) {
      return new D.RequestOptions();
    },
    main_closure: function main_closure() {
    },
    main_closure0: function main_closure0() {
    },
    main__closure: function main__closure(t0) {
      this.manager = t0;
    },
    main__closure0: function main__closure0(t0) {
      this.client = t0;
    },
    main___closure: function main___closure() {
    },
    main__closure1: function main__closure1(t0) {
      this.manager = t0;
    },
    main__closure2: function main__closure2() {
    },
    main__closure3: function main__closure3() {
    },
    main__closure4: function main__closure4() {
    },
    main_closure1: function main_closure1() {
    },
    ChromeError: function ChromeError() {
    },
    RequestOptions: function RequestOptions() {
    }
  },
  Q = {Int64Serializer: function Int64Serializer(t0) {
      this.types = t0;
    },
    _$valueOf: function($name) {
      switch ($name) {
        case "started":
          return C.BuildStatus_started;
        case "succeeded":
          return C.BuildStatus_succeeded;
        case "failed":
          return C.BuildStatus_failed;
        default:
          throw H.wrapException(P.ArgumentError$($name));
      }
    },
    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;
    },
    ReloadingManager: function ReloadingManager(t0, t1) {
      this._client = t0;
      this._restarter = t1;
    }
  },
  B = {IntSerializer: function IntSerializer(t0) {
      this.types = t0;
    }, StreamChannelController: function StreamChannelController(t0) {
      this.__StreamChannelController__foreign = this.__StreamChannelController__local = $;
      this.$ti = t0;
    }},
  X = {ErrorResponse: function ErrorResponse() {
    }, _$ErrorResponseSerializer: function _$ErrorResponseSerializer() {
    }, _$ErrorResponse: function _$ErrorResponse(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    }, ErrorResponseBuilder: function ErrorResponseBuilder() {
      this._stackTrace = this._error_response$_error = this._error_response$_$v = null;
    },
    HotReloadFailedException$: function(_s) {
      return new X.HotReloadFailedException(_s);
    },
    RequireRestarter_create: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_RequireRestarter),
        $async$returnValue, reloader, t1, t2, t3;
      var $async$RequireRestarter_create = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.legacy_String;
              t2 = P.HashMap_HashMap(null, null, null, t1, type$.legacy_int);
              t3 = new P._AsyncCompleter(new P._Future($.Zone__current, type$._Future_legacy_bool), type$._AsyncCompleter_legacy_bool);
              t3.complete$0(0);
              reloader = new X.RequireRestarter(t2, t3);
              reloader.set$_dirtyModules(P.SplayTreeSet$(reloader.get$_moduleTopologicalCompare(), null, t1));
              $async$goto = 3;
              return P._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 P._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return P._asyncStartSync($async$RequireRestarter_create, $async$completer);
    },
    RequireLoader: function RequireLoader() {
    },
    HotReloadFailedException: function HotReloadFailedException(t0) {
      this._s = t0;
    },
    JsError: function JsError() {
    },
    JsMap: function JsMap() {
    },
    RequireRestarter: function RequireRestarter(t0, t1) {
      this._moduleOrdering = t0;
      this._dirtyModules = null;
      this._running = t1;
    },
    RequireRestarter__reload_closure: function RequireRestarter__reload_closure(t0) {
      this.childModule = t0;
    },
    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;
    }
  },
  V = {
    Int32__decodeDigit: function(c) {
      if (c >= 48 && c <= 57)
        return c - 48;
      else if (c >= 97 && c <= 122)
        return c - 97 + 10;
      else if (c >= 65 && c <= 90)
        return c - 65 + 10;
      else
        return -1;
    },
    Int64__parseRadix: function(s, radix) {
      var i, negative, d0, d1, d2, c, digit, d00, d10, _null = null,
        t1 = s.length;
      if (0 < t1 && s[0] === "-") {
        i = 1;
        negative = true;
      } else {
        i = 0;
        negative = false;
      }
      if (i >= t1)
        throw H.wrapException(P.FormatException$("No digits in '" + H.S(s) + "'", _null, _null));
      for (d0 = 0, d1 = 0, d2 = 0; i < t1; ++i, d1 = d10, d0 = d00) {
        c = C.JSString_methods._codeUnitAt$1(s, i);
        digit = V.Int32__decodeDigit(c);
        if (digit < 0 || digit >= radix)
          throw H.wrapException(P.FormatException$("Non-radix char code: " + c, _null, _null));
        d0 = d0 * radix + digit;
        d00 = d0 & 4194303;
        d1 = d1 * radix + C.JSInt_methods._shrOtherPositive$1(d0, 22);
        d10 = d1 & 4194303;
        d2 = d2 * radix + (d1 >>> 22) & 1048575;
      }
      if (negative)
        return V.Int64__sub(0, 0, 0, d0, d1, d2);
      return new V.Int64(d0 & 4194303, d1 & 4194303, d2 & 1048575);
    },
    Int64_Int64: function(value) {
      var negative, v2, v1, t1, t2, t3;
      if (value < 0) {
        value = -value;
        negative = true;
      } else
        negative = false;
      v2 = C.JSInt_methods._tdivFast$1(value, 17592186044416);
      value -= v2 * 17592186044416;
      v1 = C.JSInt_methods._tdivFast$1(value, 4194304);
      t1 = v1 & 4194303;
      t2 = v2 & 1048575;
      t3 = value - v1 * 4194304 & 4194303;
      return negative ? V.Int64__sub(0, 0, 0, t3, t1, t2) : new V.Int64(t3, t1, t2);
    },
    Int64__promote: function(value) {
      if (value instanceof V.Int64)
        return value;
      else if (H._isInt(value))
        return V.Int64_Int64(value);
      throw H.wrapException(P.ArgumentError$value(value, null, null));
    },
    Int64__toRadixStringUnsigned: function(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 H.ioore(C.List_WrN, radix);
      fatRadix = C.List_WrN[radix];
      chunk1 = "";
      chunk2 = "";
      chunk3 = "";
      while (true) {
        if (!!(d4 === 0 && d3 === 0))
          break;
        q = C.JSInt_methods.$tdiv(d4, fatRadix);
        d3 += d4 - q * fatRadix << 10 >>> 0;
        q0 = C.JSInt_methods.$tdiv(d3, fatRadix);
        d2 += d3 - q0 * fatRadix << 10 >>> 0;
        q1 = C.JSInt_methods.$tdiv(d2, fatRadix);
        d1 += d2 - q1 * fatRadix << 10 >>> 0;
        q2 = C.JSInt_methods.$tdiv(d1, fatRadix);
        d0 += d1 - q2 * fatRadix << 10 >>> 0;
        q3 = C.JSInt_methods.$tdiv(d0, fatRadix);
        chunk10 = C.JSString_methods.substring$1(C.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 ? "" : C.JSInt_methods.toRadixString$1(residue, radix)) + chunk1 + chunk2 + chunk3;
    },
    Int64__sub: function(a0, a1, a2, b0, b1, b2) {
      var diff0 = a0 - b0,
        diff1 = a1 - b1 - (C.JSInt_methods._shrOtherPositive$1(diff0, 22) & 1);
      return new V.Int64(diff0 & 4194303, diff1 & 4194303, a2 - b2 - (C.JSInt_methods._shrOtherPositive$1(diff1, 22) & 1) & 1048575);
    },
    Int64: function Int64(t0, t1, t2) {
      this._l = t0;
      this._m = t1;
      this._h = t2;
    },
    _findNonce: function() {
      var t2, elements, t3, nonceValue,
        t1 = window.document;
      H.checkTypeBound(type$.legacy_Element, type$.Element, "T", "querySelectorAll");
      t2 = type$._FrozenElementList_legacy_Element;
      elements = new W._FrozenElementList(t1.querySelectorAll("script"), t2);
      for (t1 = new H.ListIterator(elements, elements.get$length(elements), t2._eval$1("ListIterator<ListMixin.E>")), t2 = type$.legacy_HtmlElement; t1.moveNext$0();) {
        t3 = t2._as(t1.__internal$_current);
        nonceValue = t3.nonce;
        if (nonceValue == null)
          nonceValue = t3.getAttribute("nonce");
        if (nonceValue != null) {
          t3 = $.$get$_noncePattern()._nativeRegExp;
          t3 = t3.test(nonceValue);
        } else
          t3 = false;
        if (t3)
          return nonceValue;
      }
      return null;
    },
    runMain: function() {
      var t1,
        scriptElement = $.$get$_createScript().call$0();
      scriptElement.toString;
      t1 = J.getInterceptor$x(scriptElement);
      t1.setInnerHtml$1(scriptElement, "window.$dartRunMain();");
      document.body.appendChild(scriptElement);
      P.Future_Future$microtask(t1.get$remove(scriptElement), type$.void);
    },
    _createScript_closure: function _createScript_closure() {
    },
    _createScript__closure: function _createScript__closure() {
    },
    _createScript__closure0: function _createScript__closure0(t0) {
      this.nonce = t0;
    }
  },
  F = {
    Logger_Logger: function($name) {
      return $.Logger__loggers.putIfAbsent$2(0, $name, new F.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;
    }
  },
  T = {
    generateUuidV4: function() {
      var t1 = new T.generateUuidV4__printDigits(),
        t2 = new T.generateUuidV4__bitsDigits(t1, new T.generateUuidV4__generateBits(C.C__JSRandom)),
        t3 = C.C__JSRandom.nextInt$1(4);
      return H.S(t2.call$2(16, 4)) + H.S(t2.call$2(16, 4)) + "-" + H.S(t2.call$2(16, 4)) + "-4" + H.S(t2.call$2(12, 3)) + "-" + H.S(t1.call$2(8 + t3, 1)) + H.S(t2.call$2(12, 3)) + "-" + H.S(t2.call$2(16, 4)) + H.S(t2.call$2(16, 4)) + H.S(t2.call$2(16, 4));
    },
    generateUuidV4__generateBits: function generateUuidV4__generateBits(t0) {
      this.random = t0;
    },
    generateUuidV4__printDigits: function generateUuidV4__printDigits() {
    },
    generateUuidV4__bitsDigits: function generateUuidV4__bitsDigits(t0, t1) {
      this._printDigits = t0;
      this._generateBits = t1;
    },
    UuidUtil_mathRNG: function() {
      var i, t1,
        b = new Uint8Array(16),
        rand = $.$get$UuidUtil__random();
      for (i = 0; i < 16; ++i) {
        t1 = rand.nextInt$1(256);
        if (i >= 16)
          return H.ioore(b, i);
        b[i] = t1;
      }
      return b;
    }
  },
  N = {WebSocketChannel: function WebSocketChannel(t0) {
      this._webSocket = t0;
    }, WebSocketSink: function WebSocketSink(t0, t1) {
      this._webSocket = t0;
      this._sink = t1;
    }};
  var holders = [C, H, J, P, W, O, S, M, A, L, E, Y, U, R, K, Z, D, Q, B, X, V, F, T, N];
  hunkHelpers.setFunctionNamesIfNecessary(holders);
  var $ = {};
  H.JS_CONST.prototype = {};
  J.Interceptor.prototype = {
    $eq: function(receiver, other) {
      return receiver === other;
    },
    get$hashCode: function(receiver) {
      return H.Primitives_objectHashCode(receiver);
    },
    toString$0: function(receiver) {
      return "Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'";
    },
    noSuchMethod$1: function(receiver, invocation) {
      type$.Invocation._as(invocation);
      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
    },
    get$runtimeType: function(receiver) {
      return H.getRuntimeType(receiver);
    }
  };
  J.JSBool.prototype = {
    toString$0: function(receiver) {
      return String(receiver);
    },
    get$hashCode: function(receiver) {
      return receiver ? 519018 : 218159;
    },
    get$runtimeType: function(receiver) {
      return C.Type_bool_lhE;
    },
    $isbool: 1
  };
  J.JSNull.prototype = {
    $eq: function(receiver, other) {
      return null == other;
    },
    toString$0: function(receiver) {
      return "null";
    },
    get$hashCode: function(receiver) {
      return 0;
    },
    get$runtimeType: function(receiver) {
      return C.Type_Null_Yyn;
    },
    noSuchMethod$1: function(receiver, invocation) {
      return this.super$Interceptor$noSuchMethod(receiver, type$.Invocation._as(invocation));
    },
    $isNull: 1
  };
  J.JavaScriptObject.prototype = {
    get$hashCode: function(receiver) {
      return 0;
    },
    get$runtimeType: function(receiver) {
      return C.Type_JSObject_8k0;
    },
    toString$0: function(receiver) {
      return String(receiver);
    },
    $isPromise: 1,
    $isJsError: 1,
    get$message: function(obj) {
      return obj.message;
    },
    then$1$1: function(receiver, p0) {
      return receiver.then(p0);
    },
    then$2: function(receiver, p0, p1) {
      return receiver.then(p0, p1);
    },
    get$digestsPath: function(obj) {
      return obj.digestsPath;
    },
    get$moduleParentsGraph: function(obj) {
      return obj.moduleParentsGraph;
    },
    forceLoadModule$3: function(receiver, p0, p1, p2) {
      return receiver.forceLoadModule(p0, p1, p2);
    },
    $get$1: function(receiver, p0) {
      return receiver.get(p0);
    },
    get$keys: function(obj) {
      return obj.keys;
    },
    keys$0: function(receiver) {
      return receiver.keys();
    }
  };
  J.PlainJavaScriptObject.prototype = {};
  J.UnknownJavaScriptObject.prototype = {};
  J.JavaScriptFunction.prototype = {
    toString$0: function(receiver) {
      var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
      if (dartClosure == null)
        return this.super$JavaScriptObject$toString(receiver);
      return "JavaScript function for " + H.S(J.toString$0$(dartClosure));
    },
    $isFunction: 1
  };
  J.JSArray.prototype = {
    cast$1$0: function(receiver, $R) {
      return new H.CastList(receiver, H._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    add$1: function(receiver, value) {
      H._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.fixed$length)
        H.throwExpression(P.UnsupportedError$("add"));
      receiver.push(value);
    },
    addAll$1: function(receiver, collection) {
      var t1;
      H._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(collection);
      if (!!receiver.fixed$length)
        H.throwExpression(P.UnsupportedError$("addAll"));
      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(t1));
    },
    _addAllFromArray$1: function(receiver, array) {
      var len, i;
      type$.JSArray_dynamic._as(array);
      len = array.length;
      if (len === 0)
        return;
      if (receiver === array)
        throw H.wrapException(P.ConcurrentModificationError$(receiver));
      for (i = 0; i < len; ++i)
        receiver.push(array[i]);
    },
    forEach$1: function(receiver, f) {
      var end, i;
      H._arrayInstanceType(receiver)._eval$1("~(1)")._as(f);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        f.call$1(receiver[i]);
        if (receiver.length !== end)
          throw H.wrapException(P.ConcurrentModificationError$(receiver));
      }
    },
    map$1$1: function(receiver, f, $T) {
      var t1 = H._arrayInstanceType(receiver);
      return new H.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: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    join$1: function(receiver, separator) {
      var i,
        list = P.List_List$filled(receiver.length, "", false, type$.String);
      for (i = 0; i < receiver.length; ++i)
        this.$indexSet(list, i, H.S(receiver[i]));
      return list.join(separator);
    },
    skip$1: function(receiver, n) {
      return H.SubListIterable$(receiver, n, null, H._arrayInstanceType(receiver)._precomputed1);
    },
    fold$1$2: function(receiver, initialValue, combine, $T) {
      var $length, value, i;
      $T._as(initialValue);
      H._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 H.wrapException(P.ConcurrentModificationError$(receiver));
      }
      return value;
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      var t1 = receiver.length;
      if (start > t1)
        throw H.wrapException(P.RangeError$range(start, 0, t1, "start", null));
      if (start === t1)
        return H.setRuntimeTypeInfo([], H._arrayInstanceType(receiver));
      return H.setRuntimeTypeInfo(receiver.slice(start, t1), H._arrayInstanceType(receiver));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    getRange$2: function(receiver, start, end) {
      P.RangeError_checkValidRange(start, end, receiver.length);
      return H.SubListIterable$(receiver, start, end, H._arrayInstanceType(receiver)._precomputed1);
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(H.IterableElementError_noElement());
    },
    get$last: function(receiver) {
      var t1 = receiver.length;
      if (t1 > 0)
        return receiver[t1 - 1];
      throw H.wrapException(H.IterableElementError_noElement());
    },
    setRange$4: function(receiver, start, end, iterable, skipCount) {
      var $length, otherList, otherStart, t1, i;
      H._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(iterable);
      if (!!receiver.immutable$list)
        H.throwExpression(P.UnsupportedError$("setRange"));
      P.RangeError_checkValidRange(start, end, receiver.length);
      $length = end - start;
      if ($length === 0)
        return;
      P.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 H.wrapException(H.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);
    },
    any$1: function(receiver, test) {
      var end, i;
      H._arrayInstanceType(receiver)._eval$1("bool(1)")._as(test);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        if (H.boolConversionCheck(test.call$1(receiver[i])))
          return true;
        if (receiver.length !== end)
          throw H.wrapException(P.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    sort$1: function(receiver, compare) {
      var t2,
        t1 = H._arrayInstanceType(receiver);
      t1._eval$1("int(1,1)?")._as(compare);
      if (!!receiver.immutable$list)
        H.throwExpression(P.UnsupportedError$("sort"));
      t2 = compare == null ? J._interceptors_JSArray__compareAny$closure() : compare;
      H.Sort_sort(receiver, t2, t1._precomputed1);
    },
    sort$0: function($receiver) {
      return this.sort$1($receiver, null);
    },
    contains$1: function(receiver, other) {
      var i;
      for (i = 0; i < receiver.length; ++i)
        if (J.$eq$(receiver[i], other))
          return true;
      return false;
    },
    get$isEmpty: function(receiver) {
      return receiver.length === 0;
    },
    get$isNotEmpty: function(receiver) {
      return receiver.length !== 0;
    },
    toString$0: function(receiver) {
      return P.IterableBase_iterableToFullString(receiver, "[", "]");
    },
    toList$1$growable: function(receiver, growable) {
      var t1 = H.setRuntimeTypeInfo(receiver.slice(0), H._arrayInstanceType(receiver));
      return t1;
    },
    toList$0: function($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$iterator: function(receiver) {
      return new J.ArrayIterator(receiver, receiver.length, H._arrayInstanceType(receiver)._eval$1("ArrayIterator<1>"));
    },
    get$hashCode: function(receiver) {
      return H.Primitives_objectHashCode(receiver);
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    set$length: function(receiver, newLength) {
      if (!!receiver.fixed$length)
        H.throwExpression(P.UnsupportedError$("set length"));
      if (newLength < 0)
        throw H.wrapException(P.RangeError$range(newLength, 0, null, "newLength", null));
      receiver.length = newLength;
    },
    $index: function(receiver, index) {
      if (!H._isInt(index))
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      if (index >= receiver.length || index < 0)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.immutable$list)
        H.throwExpression(P.UnsupportedError$("indexed set"));
      if (!H._isInt(index))
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      if (index >= receiver.length || index < 0)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      receiver[index] = value;
    },
    $add: function(receiver, other) {
      var t1 = H._arrayInstanceType(receiver);
      t1._eval$1("List<1>")._as(other);
      t1 = P.List_List$of(receiver, true, t1._precomputed1);
      this.addAll$1(t1, other);
      return t1;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  J.JSUnmodifiableArray.prototype = {};
  J.ArrayIterator.prototype = {
    get$current: function(_) {
      return this.__interceptors$_current;
    },
    moveNext$0: function() {
      var t2, _this = this,
        t1 = _this._iterable,
        $length = t1.length;
      if (_this.__interceptors$_length !== $length)
        throw H.wrapException(H.throwConcurrentModificationError(t1));
      t2 = _this._index;
      if (t2 >= $length) {
        _this.set$__interceptors$_current(null);
        return false;
      }
      _this.set$__interceptors$_current(t1[t2]);
      ++_this._index;
      return true;
    },
    set$__interceptors$_current: function(_current) {
      this.__interceptors$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  J.JSNumber.prototype = {
    compareTo$1: function(receiver, b) {
      var bIsNegative;
      H._asNumS(b);
      if (typeof b != "number")
        throw H.wrapException(H.argumentErrorValue(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: function(receiver) {
      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
    },
    ceil$0: function(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 H.wrapException(P.UnsupportedError$("" + receiver + ".ceil()"));
    },
    floor$0: function(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 H.wrapException(P.UnsupportedError$("" + receiver + ".floor()"));
    },
    round$0: function(receiver) {
      if (receiver > 0) {
        if (receiver !== 1 / 0)
          return Math.round(receiver);
      } else if (receiver > -1 / 0)
        return 0 - Math.round(0 - receiver);
      throw H.wrapException(P.UnsupportedError$("" + receiver + ".round()"));
    },
    toRadixString$1: function(receiver, radix) {
      var result, match, t1, exponent;
      if (radix < 2 || radix > 36)
        throw H.wrapException(P.RangeError$range(radix, 2, 36, "radix", null));
      result = receiver.toString(radix);
      if (C.JSString_methods.codeUnitAt$1(result, result.length - 1) !== 41)
        return result;
      match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null)
        H.throwExpression(P.UnsupportedError$("Unexpected toString result: " + result));
      t1 = match.length;
      if (1 >= t1)
        return H.ioore(match, 1);
      result = match[1];
      if (3 >= t1)
        return H.ioore(match, 3);
      exponent = +match[3];
      t1 = match[2];
      if (t1 != null) {
        result += t1;
        exponent -= t1.length;
      }
      return result + C.JSString_methods.$mul("0", exponent);
    },
    toString$0: function(receiver) {
      if (receiver === 0 && 1 / receiver < 0)
        return "-0.0";
      else
        return "" + receiver;
    },
    get$hashCode: function(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: function(receiver, other) {
      if (typeof other != "number")
        throw H.wrapException(H.argumentErrorValue(other));
      return receiver + other;
    },
    $sub: function(receiver, other) {
      if (typeof other != "number")
        throw H.wrapException(H.argumentErrorValue(other));
      return receiver - other;
    },
    $mod: function(receiver, other) {
      var result = receiver % other;
      if (result === 0)
        return 0;
      if (result > 0)
        return result;
      if (other < 0)
        return result - other;
      else
        return result + other;
    },
    $tdiv: function(receiver, other) {
      if ((receiver | 0) === receiver)
        if (other >= 1 || other < -1)
          return receiver / other | 0;
      return this._tdivSlow$1(receiver, other);
    },
    _tdivFast$1: function(receiver, other) {
      return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
    },
    _tdivSlow$1: function(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 H.wrapException(P.UnsupportedError$("Result of truncating division is " + H.S(quotient) + ": " + H.S(receiver) + " ~/ " + other));
    },
    $shl: function(receiver, other) {
      if (other < 0)
        throw H.wrapException(H.argumentErrorValue(other));
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    _shlPositive$1: function(receiver, other) {
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    _shrOtherPositive$1: function(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: function(receiver, other) {
      if (other < 0)
        throw H.wrapException(H.argumentErrorValue(other));
      return this._shrBothPositive$1(receiver, other);
    },
    _shrBothPositive$1: function(receiver, other) {
      return other > 31 ? 0 : receiver >>> other;
    },
    get$runtimeType: function(receiver) {
      return C.Type_num_cv7;
    },
    $isComparable: 1,
    $isdouble: 1,
    $isnum: 1
  };
  J.JSInt.prototype = {
    get$bitLength: function(receiver) {
      var wordBits, i,
        t1 = receiver < 0 ? -receiver - 1 : receiver,
        nonneg = t1;
      for (wordBits = 32; nonneg >= 4294967296;) {
        nonneg = this._tdivFast$1(nonneg, 4294967296);
        wordBits += 32;
      }
      i = nonneg | nonneg >> 1;
      i |= i >> 2;
      i |= i >> 4;
      i |= i >> 8;
      i = (i | i >> 16) >>> 0;
      i = (i >>> 0) - (i >>> 1 & 1431655765);
      i = (i & 858993459) + (i >>> 2 & 858993459);
      i = i + (i >>> 4) & 252645135;
      i += i >>> 8;
      return wordBits - (32 - (i + (i >>> 16) & 63));
    },
    get$runtimeType: function(receiver) {
      return C.Type_int_tHn;
    },
    $isint: 1
  };
  J.JSNumNotInt.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_double_K1J;
    }
  };
  J.JSString.prototype = {
    codeUnitAt$1: function(receiver, index) {
      if (index < 0)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      if (index >= receiver.length)
        H.throwExpression(H.diagnoseIndexError(receiver, index));
      return receiver.charCodeAt(index);
    },
    _codeUnitAt$1: function(receiver, index) {
      if (index >= receiver.length)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      return receiver.charCodeAt(index);
    },
    $add: function(receiver, other) {
      H._asStringS(other);
      if (typeof other != "string")
        throw H.wrapException(P.ArgumentError$value(other, null, null));
      return receiver + other;
    },
    replaceRange$3: function(receiver, start, end, replacement) {
      var e = P.RangeError_checkValidRange(start, end, receiver.length),
        prefix = receiver.substring(0, start),
        suffix = receiver.substring(e);
      return prefix + replacement + suffix;
    },
    startsWith$2: function(receiver, pattern, index) {
      var endIndex;
      if (index < 0 || index > receiver.length)
        throw H.wrapException(P.RangeError$range(index, 0, receiver.length, null, null));
      endIndex = index + pattern.length;
      if (endIndex > receiver.length)
        return false;
      return pattern === receiver.substring(index, endIndex);
    },
    startsWith$1: function($receiver, pattern) {
      return this.startsWith$2($receiver, pattern, 0);
    },
    substring$2: function(receiver, startIndex, endIndex) {
      if (endIndex == null)
        endIndex = receiver.length;
      if (startIndex < 0)
        throw H.wrapException(P.RangeError$value(startIndex, null));
      if (startIndex > endIndex)
        throw H.wrapException(P.RangeError$value(startIndex, null));
      if (endIndex > receiver.length)
        throw H.wrapException(P.RangeError$value(endIndex, null));
      return receiver.substring(startIndex, endIndex);
    },
    substring$1: function($receiver, startIndex) {
      return this.substring$2($receiver, startIndex, null);
    },
    toLowerCase$0: function(receiver) {
      return receiver.toLowerCase();
    },
    $mul: function(receiver, times) {
      var s, result;
      if (0 >= times)
        return "";
      if (times === 1 || receiver.length === 0)
        return receiver;
      if (times !== times >>> 0)
        throw H.wrapException(C.C_OutOfMemoryError);
      for (s = receiver, result = ""; true;) {
        if ((times & 1) === 1)
          result = s + result;
        times = times >>> 1;
        if (times === 0)
          break;
        s += s;
      }
      return result;
    },
    padLeft$2: function(receiver, width, padding) {
      var delta = width - receiver.length;
      if (delta <= 0)
        return receiver;
      return this.$mul(padding, delta) + receiver;
    },
    indexOf$2: function(receiver, pattern, start) {
      var t1;
      if (start < 0 || start > receiver.length)
        throw H.wrapException(P.RangeError$range(start, 0, receiver.length, null, null));
      t1 = receiver.indexOf(pattern, start);
      return t1;
    },
    indexOf$1: function($receiver, pattern) {
      return this.indexOf$2($receiver, pattern, 0);
    },
    lastIndexOf$1: function(receiver, pattern) {
      var start = receiver.length,
        t1 = pattern.length;
      if (start + t1 > start)
        start -= t1;
      return receiver.lastIndexOf(pattern, start);
    },
    contains$1: function(receiver, other) {
      return H.stringContainsUnchecked(receiver, other, 0);
    },
    compareTo$1: function(receiver, other) {
      var t1;
      H._asStringS(other);
      if (typeof other != "string")
        throw H.wrapException(H.argumentErrorValue(other));
      if (receiver === other)
        t1 = 0;
      else
        t1 = receiver < other ? -1 : 1;
      return t1;
    },
    toString$0: function(receiver) {
      return receiver;
    },
    get$hashCode: function(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: function(receiver) {
      return C.Type_String_k8F;
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    $isComparable: 1,
    $isPattern: 1,
    $isString: 1
  };
  H._CastIterableBase.prototype = {
    get$iterator: function(_) {
      var t1 = H._instanceType(this);
      return new H.CastIterator(J.get$iterator$ax(this.get$__internal$_source()), t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("CastIterator<1,2>"));
    },
    get$length: function(_) {
      return J.get$length$asx(this.get$__internal$_source());
    },
    get$isEmpty: function(_) {
      return J.get$isEmpty$asx(this.get$__internal$_source());
    },
    get$isNotEmpty: function(_) {
      return J.get$isNotEmpty$asx(this.get$__internal$_source());
    },
    skip$1: function(_, count) {
      var t1 = H._instanceType(this);
      return H.CastIterable_CastIterable(J.skip$1$ax(this.get$__internal$_source(), count), t1._precomputed1, t1._rest[1]);
    },
    elementAt$1: function(_, index) {
      return H._instanceType(this)._rest[1]._as(J.elementAt$1$ax(this.get$__internal$_source(), index));
    },
    get$first: function(_) {
      return H._instanceType(this)._rest[1]._as(J.get$first$ax(this.get$__internal$_source()));
    },
    contains$1: function(_, other) {
      return J.contains$1$asx(this.get$__internal$_source(), other);
    },
    toString$0: function(_) {
      return J.toString$0$(this.get$__internal$_source());
    }
  };
  H.CastIterator.prototype = {
    moveNext$0: function() {
      return this.__internal$_source.moveNext$0();
    },
    get$current: function(_) {
      var t1 = this.__internal$_source;
      return this.$ti._rest[1]._as(t1.get$current(t1));
    },
    $isIterator: 1
  };
  H.CastIterable.prototype = {
    cast$1$0: function(_, $R) {
      return H.CastIterable_CastIterable(this.__internal$_source, H._instanceType(this)._precomputed1, $R);
    },
    get$__internal$_source: function() {
      return this.__internal$_source;
    }
  };
  H._EfficientLengthCastIterable.prototype = {$isEfficientLengthIterable: 1};
  H._CastListBase.prototype = {
    $index: function(_, index) {
      return this.$ti._rest[1]._as(J.$index$asx(this.__internal$_source, index));
    },
    $indexSet: function(_, index, value) {
      var t1 = this.$ti;
      J.$indexSet$ax(this.__internal$_source, H._asIntS(index), t1._precomputed1._as(t1._rest[1]._as(value)));
    },
    sort$1: function(_, compare) {
      var t1;
      this.$ti._eval$1("int(2,2)?")._as(compare);
      t1 = compare == null ? null : new H._CastListBase_sort_closure(this, compare);
      J.sort$1$ax(this.__internal$_source, t1);
    },
    getRange$2: function(_, start, end) {
      var t1 = this.$ti;
      return H.CastIterable_CastIterable(J.getRange$2$ax(this.__internal$_source, start, end), t1._precomputed1, t1._rest[1]);
    },
    $isEfficientLengthIterable: 1,
    $isList: 1
  };
  H._CastListBase_sort_closure.prototype = {
    call$2: function(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));
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: function() {
      return this.$this.$ti._eval$1("int(1,1)");
    }
  };
  H.CastList.prototype = {
    cast$1$0: function(_, $R) {
      return new H.CastList(this.__internal$_source, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    get$__internal$_source: function() {
      return this.__internal$_source;
    }
  };
  H.CastMap.prototype = {
    cast$2$0: function(_, RK, RV) {
      var t1 = this.$ti;
      return new H.CastMap(this.__internal$_source, t1._eval$1("@<1>")._bind$1(t1._rest[1])._bind$1(RK)._bind$1(RV)._eval$1("CastMap<1,2,3,4>"));
    },
    containsKey$1: function(_, key) {
      return J.containsKey$1$x(this.__internal$_source, key);
    },
    $index: function(_, key) {
      return this.$ti._eval$1("4?")._as(J.$index$asx(this.__internal$_source, key));
    },
    $indexSet: function(_, key, value) {
      var t1 = this.$ti;
      t1._rest[2]._as(key);
      t1._rest[3]._as(value);
      J.$indexSet$ax(this.__internal$_source, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    addAll$1: function(_, other) {
      var t1 = this.$ti;
      J.addAll$1$ax(this.__internal$_source, new H.CastMap(t1._eval$1("Map<3,4>")._as(other), t1._eval$1("@<3>")._bind$1(t1._rest[3])._bind$1(t1._precomputed1)._bind$1(t1._rest[1])._eval$1("CastMap<1,2,3,4>")));
    },
    forEach$1: function(_, f) {
      J.forEach$1$ax(this.__internal$_source, new H.CastMap_forEach_closure(this, this.$ti._eval$1("~(3,4)")._as(f)));
    },
    get$keys: function(_) {
      var t1 = this.$ti;
      return H.CastIterable_CastIterable(J.get$keys$x(this.__internal$_source), t1._precomputed1, t1._rest[2]);
    },
    get$length: function(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    get$isEmpty: function(_) {
      return J.get$isEmpty$asx(this.__internal$_source);
    }
  };
  H.CastMap_forEach_closure.prototype = {
    call$2: function(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: function() {
      return this.$this.$ti._eval$1("~(1,2)");
    }
  };
  H.LateError.prototype = {
    toString$0: function(_) {
      var message = this._message;
      return message != null ? "LateInitializationError: " + message : "LateInitializationError";
    }
  };
  H.ReachabilityError.prototype = {
    toString$0: function(_) {
      var t1 = "ReachabilityError: " + this._message;
      return t1;
    }
  };
  H.nullFuture_closure.prototype = {
    call$0: function() {
      var t1 = new P._Future($.Zone__current, type$._Future_Null);
      t1._asyncComplete$1(null);
      return t1;
    },
    $signature: 33
  };
  H.NotNullableError.prototype = {
    toString$0: function(_) {
      return "Null is not a valid value for the parameter '" + this.__internal$_name + "' of type '" + H.createRuntimeType(this.$ti._precomputed1).toString$0(0) + "'";
    }
  };
  H.EfficientLengthIterable.prototype = {};
  H.ListIterable.prototype = {
    get$iterator: function(_) {
      var _this = this;
      return new H.ListIterator(_this, _this.get$length(_this), H._instanceType(_this)._eval$1("ListIterator<ListIterable.E>"));
    },
    get$isEmpty: function(_) {
      return this.get$length(this) === 0;
    },
    get$first: function(_) {
      if (this.get$length(this) === 0)
        throw H.wrapException(H.IterableElementError_noElement());
      return this.elementAt$1(0, 0);
    },
    contains$1: function(_, 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 H.wrapException(P.ConcurrentModificationError$(_this));
      }
      return false;
    },
    join$1: function(_, separator) {
      var first, t1, i, _this = this,
        $length = _this.get$length(_this);
      if (separator.length !== 0) {
        if ($length === 0)
          return "";
        first = H.S(_this.elementAt$1(0, 0));
        if ($length !== _this.get$length(_this))
          throw H.wrapException(P.ConcurrentModificationError$(_this));
        for (t1 = first, i = 1; i < $length; ++i) {
          t1 = t1 + separator + H.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw H.wrapException(P.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      } else {
        for (i = 0, t1 = ""; i < $length; ++i) {
          t1 += H.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw H.wrapException(P.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      }
    },
    join$0: function($receiver) {
      return this.join$1($receiver, "");
    },
    where$1: function(_, test) {
      return this.super$Iterable$where(0, H._instanceType(this)._eval$1("bool(ListIterable.E)")._as(test));
    },
    map$1$1: function(_, f, $T) {
      var t1 = H._instanceType(this);
      return new H.MappedListIterable(this, t1._bind$1($T)._eval$1("1(ListIterable.E)")._as(f), t1._eval$1("@<ListIterable.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    skip$1: function(_, count) {
      return H.SubListIterable$(this, count, null, H._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$1$growable: function(_, growable) {
      return P.List_List$of(this, growable, H._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$0: function($receiver) {
      return this.toList$1$growable($receiver, true);
    }
  };
  H.SubListIterable.prototype = {
    get$_endIndex: function() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength > $length)
        return $length;
      return endOrLength;
    },
    get$_startIndex: function() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this._start;
      if (t1 > $length)
        return $length;
      return t1;
    },
    get$length: function(_) {
      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;
      if (typeof endOrLength !== "number")
        return endOrLength.$sub();
      return endOrLength - t1;
    },
    elementAt$1: function(_, index) {
      var _this = this,
        realIndex = _this.get$_startIndex() + index;
      if (index < 0 || realIndex >= _this.get$_endIndex())
        throw H.wrapException(P.IndexError$(index, _this, "index", null, null));
      return J.elementAt$1$ax(_this.__internal$_iterable, realIndex);
    },
    skip$1: function(_, count) {
      var newStart, endOrLength, _this = this;
      P.RangeError_checkNotNegative(count, "count");
      newStart = _this._start + count;
      endOrLength = _this._endOrLength;
      if (endOrLength != null && newStart >= endOrLength)
        return new H.EmptyIterable(_this.$ti._eval$1("EmptyIterable<1>"));
      return H.SubListIterable$(_this.__internal$_iterable, newStart, endOrLength, _this.$ti._precomputed1);
    },
    toList$1$growable: function(_, 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;
      if (typeof end !== "number")
        return end.$sub();
      $length = end - start;
      if ($length <= 0) {
        t1 = J.JSArray_JSArray$fixed(0, _this.$ti._precomputed1);
        return t1;
      }
      result = P.List_List$filled($length, t2.elementAt$1(t1, start), false, _this.$ti._precomputed1);
      for (i = 1; i < $length; ++i) {
        C.JSArray_methods.$indexSet(result, i, t2.elementAt$1(t1, start + i));
        if (t2.get$length(t1) < end)
          throw H.wrapException(P.ConcurrentModificationError$(_this));
      }
      return result;
    }
  };
  H.ListIterator.prototype = {
    get$current: function(_) {
      return this.__internal$_current;
    },
    moveNext$0: function() {
      var t3, _this = this,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        $length = t2.get$length(t1);
      if (_this.__internal$_length !== $length)
        throw H.wrapException(P.ConcurrentModificationError$(t1));
      t3 = _this.__internal$_index;
      if (t3 >= $length) {
        _this.set$__internal$_current(null);
        return false;
      }
      _this.set$__internal$_current(t2.elementAt$1(t1, t3));
      ++_this.__internal$_index;
      return true;
    },
    set$__internal$_current: function(_current) {
      this.__internal$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  H.MappedIterable.prototype = {
    get$iterator: function(_) {
      var t1 = H._instanceType(this);
      return new H.MappedIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MappedIterator<1,2>"));
    },
    get$length: function(_) {
      return J.get$length$asx(this.__internal$_iterable);
    },
    get$isEmpty: function(_) {
      return J.get$isEmpty$asx(this.__internal$_iterable);
    },
    get$first: function(_) {
      return this._f.call$1(J.get$first$ax(this.__internal$_iterable));
    },
    elementAt$1: function(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_iterable, index));
    }
  };
  H.EfficientLengthMappedIterable.prototype = {$isEfficientLengthIterable: 1};
  H.MappedIterator.prototype = {
    moveNext$0: function() {
      var _this = this,
        t1 = _this._iterator;
      if (t1.moveNext$0()) {
        _this.set$__internal$_current(_this._f.call$1(t1.get$current(t1)));
        return true;
      }
      _this.set$__internal$_current(null);
      return false;
    },
    get$current: function(_) {
      return this.__internal$_current;
    },
    set$__internal$_current: function(_current) {
      this.__internal$_current = this.$ti._eval$1("2?")._as(_current);
    }
  };
  H.MappedListIterable.prototype = {
    get$length: function(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1: function(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_source, index));
    }
  };
  H.WhereIterable.prototype = {
    get$iterator: function(_) {
      return new H.WhereIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, this.$ti._eval$1("WhereIterator<1>"));
    },
    map$1$1: function(_, f, $T) {
      var t1 = this.$ti;
      return new H.MappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    }
  };
  H.WhereIterator.prototype = {
    moveNext$0: function() {
      var t1, t2;
      for (t1 = this._iterator, t2 = this._f; t1.moveNext$0();)
        if (H.boolConversionCheck(t2.call$1(t1.get$current(t1))))
          return true;
      return false;
    },
    get$current: function(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    }
  };
  H.SkipIterable.prototype = {
    skip$1: function(_, count) {
      P.RangeError_checkNotNegative(count, "count");
      return new H.SkipIterable(this.__internal$_iterable, this._skipCount + count, H._instanceType(this)._eval$1("SkipIterable<1>"));
    },
    get$iterator: function(_) {
      return new H.SkipIterator(J.get$iterator$ax(this.__internal$_iterable), this._skipCount, H._instanceType(this)._eval$1("SkipIterator<1>"));
    }
  };
  H.EfficientLengthSkipIterable.prototype = {
    get$length: function(_) {
      var $length = J.get$length$asx(this.__internal$_iterable) - this._skipCount;
      if ($length >= 0)
        return $length;
      return 0;
    },
    skip$1: function(_, count) {
      P.RangeError_checkNotNegative(count, "count");
      return new H.EfficientLengthSkipIterable(this.__internal$_iterable, this._skipCount + count, this.$ti);
    },
    $isEfficientLengthIterable: 1
  };
  H.SkipIterator.prototype = {
    moveNext$0: function() {
      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: function(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    }
  };
  H.EmptyIterable.prototype = {
    get$iterator: function(_) {
      return C.C_EmptyIterator;
    },
    get$isEmpty: function(_) {
      return true;
    },
    get$length: function(_) {
      return 0;
    },
    get$first: function(_) {
      throw H.wrapException(H.IterableElementError_noElement());
    },
    elementAt$1: function(_, index) {
      throw H.wrapException(P.RangeError$range(index, 0, 0, "index", null));
    },
    contains$1: function(_, element) {
      return false;
    },
    map$1$1: function(_, f, $T) {
      this.$ti._bind$1($T)._eval$1("1(2)")._as(f);
      return new H.EmptyIterable($T._eval$1("EmptyIterable<0>"));
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    skip$1: function(_, count) {
      P.RangeError_checkNotNegative(count, "count");
      return this;
    },
    toList$1$growable: function(_, growable) {
      var t1 = J.JSArray_JSArray$fixed(0, this.$ti._precomputed1);
      return t1;
    }
  };
  H.EmptyIterator.prototype = {
    moveNext$0: function() {
      return false;
    },
    get$current: function(_) {
      throw H.wrapException(H.IterableElementError_noElement());
    },
    $isIterator: 1
  };
  H.FixedLengthListMixin.prototype = {};
  H.UnmodifiableListMixin.prototype = {
    $indexSet: function(_, index, value) {
      H._asIntS(index);
      H._instanceType(this)._eval$1("UnmodifiableListMixin.E")._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
    },
    sort$1: function(_, compare) {
      H._instanceType(this)._eval$1("int(UnmodifiableListMixin.E,UnmodifiableListMixin.E)?")._as(compare);
      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
    }
  };
  H.UnmodifiableListBase.prototype = {};
  H.ReversedListIterable.prototype = {
    get$length: function(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1: function(_, index) {
      var t1 = this.__internal$_source,
        t2 = J.getInterceptor$asx(t1);
      return t2.elementAt$1(t1, t2.get$length(t1) - 1 - index);
    }
  };
  H.Symbol.prototype = {
    get$hashCode: function(_) {
      var hash = this._hashCode;
      if (hash != null)
        return hash;
      hash = 664597 * J.get$hashCode$(this.__internal$_name) & 536870911;
      this._hashCode = hash;
      return hash;
    },
    toString$0: function(_) {
      return 'Symbol("' + H.S(this.__internal$_name) + '")';
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof H.Symbol && this.__internal$_name == other.__internal$_name;
    },
    $isSymbol0: 1
  };
  H.__CastListBase__CastIterableBase_ListMixin.prototype = {};
  H.ConstantMapView.prototype = {};
  H.ConstantMap.prototype = {
    cast$2$0: function(_, RK, RV) {
      var t1 = H._instanceType(this);
      return P.Map_castFrom(this, t1._precomputed1, t1._rest[1], RK, RV);
    },
    get$isEmpty: function(_) {
      return this.get$length(this) === 0;
    },
    toString$0: function(_) {
      return P.MapBase_mapToString(this);
    },
    $indexSet: function(_, key, val) {
      var t1 = H._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(val);
      H.ConstantMap__throwUnmodifiable();
      H.ReachabilityError$(string$._null_);
    },
    addAll$1: function(_, other) {
      H._instanceType(this)._eval$1("Map<1,2>")._as(other);
      H.ConstantMap__throwUnmodifiable();
      return H.ReachabilityError$(string$._null_);
    },
    map$2$1: function(_, transform, K2, V2) {
      var result = P.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      this.forEach$1(0, new H.ConstantMap_map_closure(this, H._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result));
      return result;
    },
    map$1: function($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  H.ConstantMap_map_closure.prototype = {
    call$2: function(key, value) {
      var t1 = H._instanceType(this.$this),
        entry = this.transform.call$2(t1._precomputed1._as(key), t1._rest[1]._as(value));
      this.result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  H.ConstantStringMap.prototype = {
    get$length: function(_) {
      return this.__js_helper$_length;
    },
    containsKey$1: function(_, key) {
      if (typeof key != "string")
        return false;
      if ("__proto__" === key)
        return false;
      return this._jsObject.hasOwnProperty(key);
    },
    $index: function(_, key) {
      if (!this.containsKey$1(0, key))
        return null;
      return this._fetch$1(key);
    },
    _fetch$1: function(key) {
      return this._jsObject[H._asStringS(key)];
    },
    forEach$1: function(_, f) {
      var keys, t2, i, key,
        t1 = H._instanceType(this);
      t1._eval$1("~(1,2)")._as(f);
      keys = this.__js_helper$_keys;
      for (t2 = keys.length, t1 = t1._rest[1], i = 0; i < t2; ++i) {
        key = keys[i];
        f.call$2(key, t1._as(this._fetch$1(key)));
      }
    },
    get$keys: function(_) {
      return new H._ConstantMapKeyIterable(this, H._instanceType(this)._eval$1("_ConstantMapKeyIterable<1>"));
    }
  };
  H._ConstantMapKeyIterable.prototype = {
    get$iterator: function(_) {
      var t1 = this._map.__js_helper$_keys;
      return new J.ArrayIterator(t1, t1.length, H._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    get$length: function(_) {
      return this._map.__js_helper$_keys.length;
    }
  };
  H.JSInvocationMirror.prototype = {
    get$memberName: function() {
      var t1 = this._memberName;
      return t1;
    },
    get$positionalArguments: function() {
      var t1, argumentCount, list, index, _this = this;
      if (_this.__js_helper$_kind === 1)
        return C.List_empty0;
      t1 = _this._arguments;
      argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
      if (argumentCount === 0)
        return C.List_empty0;
      list = [];
      for (index = 0; index < argumentCount; ++index) {
        if (index >= t1.length)
          return H.ioore(t1, index);
        list.push(t1[index]);
      }
      list.fixed$length = Array;
      list.immutable$list = Array;
      return list;
    },
    get$namedArguments: function() {
      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4, _this = this;
      if (_this.__js_helper$_kind !== 0)
        return C.Map_empty0;
      t1 = _this._namedArgumentNames;
      namedArgumentCount = t1.length;
      t2 = _this._arguments;
      namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
      if (namedArgumentCount === 0)
        return C.Map_empty0;
      map = new H.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
      for (i = 0; i < namedArgumentCount; ++i) {
        if (i >= t1.length)
          return H.ioore(t1, i);
        t3 = t1[i];
        t4 = namedArgumentsStartIndex + i;
        if (t4 < 0 || t4 >= t2.length)
          return H.ioore(t2, t4);
        map.$indexSet(0, new H.Symbol(t3), t2[t4]);
      }
      return new H.ConstantMapView(map, type$.ConstantMapView_Symbol_dynamic);
    },
    $isInvocation: 1
  };
  H.Primitives_functionNoSuchMethod_closure.prototype = {
    call$2: function($name, argument) {
      var t1;
      H._asStringS($name);
      t1 = this._box_0;
      t1.names = t1.names + "$" + H.S($name);
      C.JSArray_methods.add$1(this.namedArgumentList, $name);
      C.JSArray_methods.add$1(this.$arguments, argument);
      ++t1.argumentCount;
    },
    $signature: 4
  };
  H.TypeErrorDecoder.prototype = {
    matchTypeError$1: function(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.__js_helper$_method;
      if (t1 !== -1)
        result.method = match[t1 + 1];
      t1 = _this._receiver;
      if (t1 !== -1)
        result.receiver = match[t1 + 1];
      return result;
    }
  };
  H.NullError.prototype = {
    toString$0: function(_) {
      var t1 = this.__js_helper$_method;
      if (t1 == null)
        return "NoSuchMethodError: " + H.S(this.__js_helper$_message);
      return "NoSuchMethodError: method not found: '" + t1 + "' on null";
    }
  };
  H.JsNoSuchMethodError.prototype = {
    toString$0: function(_) {
      var t2, _this = this,
        _s38_ = "NoSuchMethodError: method not found: '",
        t1 = _this.__js_helper$_method;
      if (t1 == null)
        return "NoSuchMethodError: " + H.S(_this.__js_helper$_message);
      t2 = _this._receiver;
      if (t2 == null)
        return _s38_ + t1 + "' (" + H.S(_this.__js_helper$_message) + ")";
      return _s38_ + t1 + "' on '" + t2 + "' (" + H.S(_this.__js_helper$_message) + ")";
    }
  };
  H.UnknownJsTypeError.prototype = {
    toString$0: function(_) {
      var t1 = this.__js_helper$_message;
      return t1.length === 0 ? "Error" : "Error: " + t1;
    }
  };
  H.NullThrownFromJavaScriptException.prototype = {
    toString$0: function(_) {
      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
    }
  };
  H.ExceptionAndStackTrace.prototype = {};
  H._StackTrace.prototype = {
    toString$0: function(_) {
      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
  };
  H.Closure.prototype = {
    toString$0: function(_) {
      var $constructor = this.constructor,
        $name = $constructor == null ? null : $constructor.name;
      return "Closure '" + H.unminifyOrTag($name == null ? "unknown" : $name) + "'";
    },
    $isFunction: 1,
    get$$call: function() {
      return this;
    },
    "call*": "call$1",
    $requiredArgCount: 1,
    $defaultValues: null
  };
  H.TearOffClosure.prototype = {};
  H.StaticClosure.prototype = {
    toString$0: function(_) {
      var $name = this.$static_name;
      if ($name == null)
        return "Closure of unknown static method";
      return "Closure '" + H.unminifyOrTag($name) + "'";
    }
  };
  H.BoundClosure.prototype = {
    $eq: function(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (_this === other)
        return true;
      if (!(other instanceof H.BoundClosure))
        return false;
      return _this._self === other._self && _this._target === other._target && _this._receiver === other._receiver;
    },
    get$hashCode: function(_) {
      var receiverHashCode,
        t1 = this._receiver;
      if (t1 == null)
        receiverHashCode = H.Primitives_objectHashCode(this._self);
      else
        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
      t1 = H.Primitives_objectHashCode(this._target);
      if (typeof receiverHashCode !== "number")
        return receiverHashCode.$xor();
      return (receiverHashCode ^ t1) >>> 0;
    },
    toString$0: function(_) {
      var receiver = this._receiver;
      if (receiver == null)
        receiver = this._self;
      return "Closure '" + H.S(this._name) + "' of " + ("Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'");
    }
  };
  H.RuntimeError.prototype = {
    toString$0: function(_) {
      return "RuntimeError: " + this.message;
    }
  };
  H._AssertionError.prototype = {
    toString$0: function(_) {
      return "Assertion failed: " + P.Error_safeToString(this.message);
    }
  };
  H._Required.prototype = {};
  H.JsLinkedHashMap.prototype = {
    get$length: function(_) {
      return this.__js_helper$_length;
    },
    get$isEmpty: function(_) {
      return this.__js_helper$_length === 0;
    },
    get$isNotEmpty: function(_) {
      return !this.get$isEmpty(this);
    },
    get$keys: function(_) {
      return new H.LinkedHashMapKeyIterable(this, H._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
    },
    containsKey$1: function(_, key) {
      var strings, t1;
      if (typeof key == "string") {
        strings = this._strings;
        if (strings == null)
          return false;
        return this._containsTableEntry$2(strings, key);
      } else {
        t1 = this.internalContainsKey$1(key);
        return t1;
      }
    },
    internalContainsKey$1: function(key) {
      var _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return false;
      return _this.internalFindBucketIndex$2(_this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key)), key) >= 0;
    },
    addAll$1: function(_, other) {
      J.forEach$1$ax(H._instanceType(this)._eval$1("Map<1,2>")._as(other), new H.JsLinkedHashMap_addAll_closure(this));
    },
    $index: function(_, key) {
      var strings, cell, t1, nums, _this = this, _null = null;
      if (typeof key == "string") {
        strings = _this._strings;
        if (strings == null)
          return _null;
        cell = _this._getTableCell$2(strings, key);
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
        nums = _this._nums;
        if (nums == null)
          return _null;
        cell = _this._getTableCell$2(nums, key);
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else
        return _this.internalGet$1(key);
    },
    internalGet$1: function(key) {
      var bucket, index, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      bucket = _this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key));
      index = _this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      return bucket[index].hashMapCellValue;
    },
    $indexSet: function(_, key, value) {
      var strings, nums, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string") {
        strings = _this._strings;
        _this._addHashTableEntry$3(strings == null ? _this._strings = _this._newHashTable$0() : strings, key, value);
      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
        nums = _this._nums;
        _this._addHashTableEntry$3(nums == null ? _this._nums = _this._newHashTable$0() : nums, key, value);
      } else
        _this.internalSet$2(key, value);
    },
    internalSet$2: function(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = H._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 = _this._getTableBucket$2(rest, hash);
      if (bucket == null)
        _this._setTableEntry$3(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: function(_, key, ifAbsent) {
      var value, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(key);
      t1._eval$1("2()")._as(ifAbsent);
      if (_this.containsKey$1(0, key))
        return _this.$index(0, key);
      value = ifAbsent.call$0();
      _this.$indexSet(0, key, value);
      return value;
    },
    remove$1: function(_, key) {
      var _this = this;
      if (typeof key == "string")
        return _this._removeHashTableEntry$2(_this._strings, key);
      else if (typeof key == "number" && (key & 0x3ffffff) === key)
        return _this._removeHashTableEntry$2(_this._nums, key);
      else
        return _this.internalRemove$1(key);
    },
    internalRemove$1: function(key) {
      var hash, bucket, index, cell, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      hash = _this.internalComputeHashCode$1(key);
      bucket = _this._getTableBucket$2(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)
        _this._deleteTableEntry$2(rest, hash);
      return cell.hashMapCellValue;
    },
    forEach$1: function(_, action) {
      var cell, modifications, _this = this;
      H._instanceType(_this)._eval$1("~(1,2)")._as(action);
      cell = _this._first;
      modifications = _this._modifications;
      for (; cell != null;) {
        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
        if (modifications !== _this._modifications)
          throw H.wrapException(P.ConcurrentModificationError$(_this));
        cell = cell._next;
      }
    },
    _addHashTableEntry$3: function(table, key, value) {
      var cell, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      cell = _this._getTableCell$2(table, key);
      if (cell == null)
        _this._setTableEntry$3(table, key, _this._newLinkedCell$2(key, value));
      else
        cell.hashMapCellValue = value;
    },
    _removeHashTableEntry$2: function(table, key) {
      var cell;
      if (table == null)
        return null;
      cell = this._getTableCell$2(table, key);
      if (cell == null)
        return null;
      this._unlinkCell$1(cell);
      this._deleteTableEntry$2(table, key);
      return cell.hashMapCellValue;
    },
    _modified$0: function() {
      this._modifications = this._modifications + 1 & 67108863;
    },
    _newLinkedCell$2: function(key, value) {
      var _this = this,
        t1 = H._instanceType(_this),
        cell = new H.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: function(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: function(key) {
      return J.get$hashCode$(key) & 0x3ffffff;
    },
    internalFindBucketIndex$2: function(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: function(_) {
      return P.MapBase_mapToString(this);
    },
    _getTableCell$2: function(table, key) {
      return table[key];
    },
    _getTableBucket$2: function(table, key) {
      return table[key];
    },
    _setTableEntry$3: function(table, key, value) {
      table[key] = value;
    },
    _deleteTableEntry$2: function(table, key) {
      delete table[key];
    },
    _containsTableEntry$2: function(table, key) {
      return this._getTableCell$2(table, key) != null;
    },
    _newHashTable$0: function() {
      var _s20_ = "<non-identifier-key>",
        table = Object.create(null);
      this._setTableEntry$3(table, _s20_, table);
      this._deleteTableEntry$2(table, _s20_);
      return table;
    },
    $isLinkedHashMap: 1
  };
  H.JsLinkedHashMap_addAll_closure.prototype = {
    call$2: function(key, value) {
      var t1 = this.$this,
        t2 = H._instanceType(t1);
      t1.$indexSet(0, t2._precomputed1._as(key), t2._rest[1]._as(value));
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  H.LinkedHashMapCell.prototype = {};
  H.LinkedHashMapKeyIterable.prototype = {
    get$length: function(_) {
      return this._map.__js_helper$_length;
    },
    get$isEmpty: function(_) {
      return this._map.__js_helper$_length === 0;
    },
    get$iterator: function(_) {
      var t1 = this._map,
        t2 = new H.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti._eval$1("LinkedHashMapKeyIterator<1>"));
      t2._cell = t1._first;
      return t2;
    },
    contains$1: function(_, element) {
      return this._map.containsKey$1(0, element);
    }
  };
  H.LinkedHashMapKeyIterator.prototype = {
    get$current: function(_) {
      return this.__js_helper$_current;
    },
    moveNext$0: function() {
      var cell, _this = this,
        t1 = _this._map;
      if (_this._modifications !== t1._modifications)
        throw H.wrapException(P.ConcurrentModificationError$(t1));
      cell = _this._cell;
      if (cell == null) {
        _this.set$__js_helper$_current(null);
        return false;
      } else {
        _this.set$__js_helper$_current(cell.hashMapCellKey);
        _this._cell = cell._next;
        return true;
      }
    },
    set$__js_helper$_current: function(_current) {
      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  H.initHooks_closure.prototype = {
    call$1: function(o) {
      return this.getTag(o);
    },
    $signature: 2
  };
  H.initHooks_closure0.prototype = {
    call$2: function(o, tag) {
      return this.getUnknownTag(o, tag);
    },
    $signature: 50
  };
  H.initHooks_closure1.prototype = {
    call$1: function(tag) {
      return this.prototypeForTag(H._asStringS(tag));
    },
    $signature: 35
  };
  H.JSSyntaxRegExp.prototype = {
    toString$0: function(_) {
      return "RegExp/" + H.S(this.pattern) + "/" + this._nativeRegExp.flags;
    },
    firstMatch$1: function(string) {
      var m;
      if (typeof string != "string")
        H.throwExpression(H.argumentErrorValue(string));
      m = this._nativeRegExp.exec(string);
      if (m == null)
        return null;
      return new H._MatchImplementation(m);
    },
    $isPattern: 1,
    $isRegExp: 1
  };
  H._MatchImplementation.prototype = {};
  H.NativeByteBuffer.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_ByteBuffer_RkP;
    },
    $isByteBuffer: 1
  };
  H.NativeTypedData.prototype = {$isTypedData: 1};
  H.NativeByteData.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_ByteData_zNC;
    }
  };
  H.NativeTypedArray.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $isJavaScriptIndexingBehavior: 1
  };
  H.NativeTypedArrayOfDouble.prototype = {
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._asDoubleS(value);
      H._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  H.NativeTypedArrayOfInt.prototype = {
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._asIntS(value);
      H._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  H.NativeFloat32List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Float32List_LB7;
    },
    sublist$2: function(receiver, start, end) {
      return new Float32Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  H.NativeFloat64List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Float64List_LB7;
    },
    sublist$2: function(receiver, start, end) {
      return new Float64Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  H.NativeInt16List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Int16List_uXf;
    },
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      return new Int16Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  H.NativeInt32List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Int32List_O50;
    },
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      return new Int32Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  H.NativeInt8List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Int8List_ekJ;
    },
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      return new Int8Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  H.NativeUint16List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint16List_2bx;
    },
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      return new Uint16Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isUint16List: 1
  };
  H.NativeUint32List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint32List_2bx;
    },
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      return new Uint32Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  H.NativeUint8ClampedList.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint8ClampedList_Jik;
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      return new Uint8ClampedArray(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  H.NativeUint8List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint8List_WLA;
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2: function(receiver, start, end) {
      return new Uint8Array(receiver.subarray(start, H._checkValidRange(start, end, receiver.length)));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isNativeUint8List: 1,
    $isUint8List: 1
  };
  H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.prototype = {};
  H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
  H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  H.Rti.prototype = {
    _eval$1: function(recipe) {
      return H._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
    },
    _bind$1: function(typeOrTuple) {
      return H._Universe_bind(init.typeUniverse, this, typeOrTuple);
    }
  };
  H._FunctionParameters.prototype = {};
  H._Type.prototype = {
    toString$0: function(_) {
      return H._rtiToString(this._rti, null);
    },
    $isType: 1
  };
  H._Error.prototype = {
    toString$0: function(_) {
      return this.__rti$_message;
    }
  };
  H._TypeError.prototype = {};
  P._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
    call$1: function(_) {
      var t1 = this._box_0,
        f = t1.storedCallback;
      t1.storedCallback = null;
      f.call$0();
    },
    $signature: 6
  };
  P._AsyncRun__initializeScheduleImmediate_closure.prototype = {
    call$1: function(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: 51
  };
  P._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
    call$0: function() {
      this.callback.call$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
    call$0: function() {
      this.callback.call$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  P._TimerImpl.prototype = {
    _TimerImpl$2: function(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setTimeout(H.convertDartClosureToJS(new P._TimerImpl_internalCallback(this, callback), 0), milliseconds);
      else
        throw H.wrapException(P.UnsupportedError$("`setTimeout()` not found."));
    },
    _TimerImpl$periodic$2: function(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setInterval(H.convertDartClosureToJS(new P._TimerImpl$periodic_closure(this, milliseconds, Date.now(), callback), 0), milliseconds);
      else
        throw H.wrapException(P.UnsupportedError$("Periodic timer."));
    },
    cancel$0: function(_) {
      var t1;
      if (self.setTimeout != null) {
        t1 = this._handle;
        if (t1 == null)
          return;
        if (this._once)
          self.clearTimeout(t1);
        else
          self.clearInterval(t1);
        this._handle = null;
      } else
        throw H.wrapException(P.UnsupportedError$("Canceling a timer."));
    },
    $isTimer: 1
  };
  P._TimerImpl_internalCallback.prototype = {
    call$0: function() {
      var t1 = this.$this;
      t1._handle = null;
      t1._tick = 1;
      this.callback.call$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._TimerImpl$periodic_closure.prototype = {
    call$0: function() {
      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 = C.JSInt_methods.$tdiv(duration, t2);
      }
      t1._tick = tick;
      _this.callback.call$1(t1);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  P._AsyncAwaitCompleter.prototype = {
    complete$1: function(_, value) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/?")._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(t1._precomputed1._as(value));
      }
    },
    completeError$2: function(e, st) {
      var t1;
      if (st == null)
        st = P.AsyncError_defaultStackTrace(e);
      t1 = this._future;
      if (this.isSync)
        t1._completeError$2(e, st);
      else
        t1._asyncCompleteError$2(e, st);
    },
    $isCompleter: 1
  };
  P._awaitOnObject_closure.prototype = {
    call$1: function(result) {
      return this.bodyFunction.call$2(0, result);
    },
    $signature: 5
  };
  P._awaitOnObject_closure0.prototype = {
    call$2: function(error, stackTrace) {
      this.bodyFunction.call$2(1, new H.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 52
  };
  P._wrapJsFunctionForAsync_closure.prototype = {
    call$2: function(errorCode, result) {
      this.$protected(H._asIntS(errorCode), result);
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 60
  };
  P.AsyncError.prototype = {
    toString$0: function(_) {
      return H.S(this.error);
    },
    $isError: 1,
    get$stackTrace: function() {
      return this.stackTrace;
    }
  };
  P.Future_Future$microtask_closure.prototype = {
    call$0: function() {
      var e, s, exception;
      try {
        this.result._complete$1(this.computation.call$0());
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._completeWithErrorCallback(this.result, e, s);
      }
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._Completer.prototype = {
    completeError$2: function(error, stackTrace) {
      var t1, replacement;
      type$.nullable_StackTrace._as(stackTrace);
      H.checkNotNullable(error, "error", type$.Object);
      t1 = this.future;
      if (t1._state !== 0)
        throw H.wrapException(P.StateError$("Future already completed"));
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = P.AsyncError_defaultStackTrace(error);
      t1._asyncCompleteError$2(error, stackTrace);
    },
    completeError$1: function(error) {
      return this.completeError$2(error, null);
    },
    $isCompleter: 1
  };
  P._AsyncCompleter.prototype = {
    complete$1: function(_, value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if (t2._state !== 0)
        throw H.wrapException(P.StateError$("Future already completed"));
      t2._asyncComplete$1(t1._eval$1("1/")._as(value));
    },
    complete$0: function($receiver) {
      return this.complete$1($receiver, null);
    }
  };
  P._FutureListener.prototype = {
    matchesErrorTest$1: function(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: function(asyncError) {
      var errorCallback = this.errorCallback,
        t1 = type$.dynamic,
        t2 = type$.Object,
        t3 = this.$ti._eval$1("2/"),
        t4 = this.result._zone;
      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
        return t3._as(t4.runBinary$3$3(errorCallback, asyncError.error, asyncError.stackTrace, t1, t2, type$.StackTrace));
      else
        return t3._as(t4.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), asyncError.error, t1, t2));
    }
  };
  P._Future.prototype = {
    then$1$2$onError: function(_, 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 !== C.C__RootZone) {
        f = currentZone.registerUnaryCallback$2$1(f, $R._eval$1("0/"), t1._precomputed1);
        if (onError != null)
          onError = P._registerErrorHandler(onError, currentZone);
      }
      result = new P._Future($.Zone__current, $R._eval$1("_Future<0>"));
      t2 = onError == null ? 1 : 3;
      this._addListener$1(new P._FutureListener(result, t2, f, onError, t1._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    then$1$1: function($receiver, f, $R) {
      return this.then$1$2$onError($receiver, f, null, $R);
    },
    _thenAwait$1$2: function(f, onError, $E) {
      var result,
        t1 = this.$ti;
      t1._bind$1($E)._eval$1("1/(2)")._as(f);
      result = new P._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this._addListener$1(new P._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    catchError$1: function(onError) {
      var t1 = this.$ti,
        t2 = $.Zone__current,
        result = new P._Future(t2, t1);
      if (t2 !== C.C__RootZone)
        onError = P._registerErrorHandler(onError, t2);
      this._addListener$1(new P._FutureListener(result, 2, null, onError, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    whenComplete$1: function(action) {
      var t1, t2, result;
      type$.dynamic_Function._as(action);
      t1 = this.$ti;
      t2 = $.Zone__current;
      result = new P._Future(t2, t1);
      if (t2 !== C.C__RootZone)
        action = t2.registerCallback$1$1(action, type$.dynamic);
      this._addListener$1(new P._FutureListener(result, 8, action, null, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    _addListener$1: function(listener) {
      var source, _this = this,
        t1 = _this._state;
      if (t1 <= 1) {
        listener._nextListener = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listener;
      } else {
        if (t1 === 2) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          t1 = source._state;
          if (t1 < 4) {
            source._addListener$1(listener);
            return;
          }
          _this._state = t1;
          _this._resultOrListeners = source._resultOrListeners;
        }
        _this._zone.scheduleMicrotask$1(new P._Future__addListener_closure(_this, listener));
      }
    },
    _prependListeners$1: function(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 <= 1) {
        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 === 2) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          t1 = source._state;
          if (t1 < 4) {
            source._prependListeners$1(listeners);
            return;
          }
          _this._state = t1;
          _this._resultOrListeners = source._resultOrListeners;
        }
        _box_0.listeners = _this._reverseListeners$1(listeners);
        _this._zone.scheduleMicrotask$1(new P._Future__prependListeners_closure(_box_0, _this));
      }
    },
    _removeListeners$0: function() {
      var current = type$.nullable__FutureListener_dynamic_dynamic._as(this._resultOrListeners);
      this._resultOrListeners = null;
      return this._reverseListeners$1(current);
    },
    _reverseListeners$1: function(listeners) {
      var current, prev, next;
      for (current = listeners, prev = null; current != null; prev = current, current = next) {
        next = current._nextListener;
        current._nextListener = prev;
      }
      return prev;
    },
    _chainForeignFuture$1: function(source) {
      var e, s, exception, _this = this;
      _this._state = 1;
      try {
        source.then$1$2$onError(0, new P._Future__chainForeignFuture_closure(_this), new P._Future__chainForeignFuture_closure0(_this), type$.Null);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P.scheduleMicrotask(new P._Future__chainForeignFuture_closure1(_this, e, s));
      }
    },
    _complete$1: function(value) {
      var listeners, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value))
        if (t1._is(value))
          P._Future__chainCoreFuture(value, _this);
        else
          _this._chainForeignFuture$1(value);
      else {
        listeners = _this._removeListeners$0();
        t1._precomputed1._as(value);
        _this._state = 4;
        _this._resultOrListeners = value;
        P._Future__propagateToListeners(_this, listeners);
      }
    },
    _completeWithValue$1: function(value) {
      var listeners, _this = this;
      _this.$ti._precomputed1._as(value);
      listeners = _this._removeListeners$0();
      _this._state = 4;
      _this._resultOrListeners = value;
      P._Future__propagateToListeners(_this, listeners);
    },
    _completeError$2: function(error, stackTrace) {
      var listeners, t1, _this = this;
      type$.StackTrace._as(stackTrace);
      listeners = _this._removeListeners$0();
      t1 = P.AsyncError$(error, stackTrace);
      _this._state = 8;
      _this._resultOrListeners = t1;
      P._Future__propagateToListeners(_this, listeners);
    },
    _asyncComplete$1: function(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(t1._precomputed1._as(value));
    },
    _asyncCompleteWithValue$1: function(value) {
      var _this = this;
      _this.$ti._precomputed1._as(value);
      _this._state = 1;
      _this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteWithValue_closure(_this, value));
    },
    _chainFuture$1: function(value) {
      var _this = this,
        t1 = _this.$ti;
      t1._eval$1("Future<1>")._as(value);
      if (t1._is(value)) {
        if (value._state === 8) {
          _this._state = 1;
          _this._zone.scheduleMicrotask$1(new P._Future__chainFuture_closure(_this, value));
        } else
          P._Future__chainCoreFuture(value, _this);
        return;
      }
      _this._chainForeignFuture$1(value);
    },
    _asyncCompleteError$2: function(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._state = 1;
      this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteError_closure(this, error, stackTrace));
    },
    $isFuture: 1
  };
  P._Future__addListener_closure.prototype = {
    call$0: function() {
      P._Future__propagateToListeners(this.$this, this.listener);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._Future__prependListeners_closure.prototype = {
    call$0: function() {
      P._Future__propagateToListeners(this.$this, this._box_0.listeners);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._Future__chainForeignFuture_closure.prototype = {
    call$1: function(value) {
      var error, stackTrace, exception,
        t1 = this.$this;
      t1._state = 0;
      try {
        t1._completeWithValue$1(t1.$ti._precomputed1._as(value));
      } catch (exception) {
        error = H.unwrapException(exception);
        stackTrace = H.getTraceFromException(exception);
        t1._completeError$2(error, stackTrace);
      }
    },
    $signature: 6
  };
  P._Future__chainForeignFuture_closure0.prototype = {
    call$2: function(error, stackTrace) {
      this.$this._completeError$2(error, type$.StackTrace._as(stackTrace));
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 15
  };
  P._Future__chainForeignFuture_closure1.prototype = {
    call$0: function() {
      this.$this._completeError$2(this.e, this.s);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._Future__asyncCompleteWithValue_closure.prototype = {
    call$0: function() {
      this.$this._completeWithValue$1(this.value);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._Future__chainFuture_closure.prototype = {
    call$0: function() {
      P._Future__chainCoreFuture(this.value, this.$this);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._Future__asyncCompleteError_closure.prototype = {
    call$0: function() {
      this.$this._completeError$2(this.error, this.stackTrace);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
    call$0: function() {
      var e, s, t1, exception, t2, originalSource, _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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        if (_this.hasError) {
          t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners).error;
          t2 = e;
          t2 = t1 == null ? t2 == null : t1 === t2;
          t1 = t2;
        } else
          t1 = false;
        t2 = _this._box_0;
        if (t1)
          t2.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        else
          t2.listenerValueOrError = P.AsyncError$(e, s);
        t2.listenerHasError = true;
        return;
      }
      if (completeResult instanceof P._Future && completeResult._state >= 4) {
        if (completeResult._state === 8) {
          t1 = _this._box_0;
          t1.listenerValueOrError = type$.AsyncError._as(completeResult._resultOrListeners);
          t1.listenerHasError = true;
        }
        return;
      }
      if (type$.Future_dynamic._is(completeResult)) {
        originalSource = _this._box_1.source;
        t1 = _this._box_0;
        t1.listenerValueOrError = J.then$1$1$x(completeResult, new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), type$.dynamic);
        t1.listenerHasError = false;
      }
    },
    $signature: 0
  };
  P._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
    call$1: function(_) {
      return this.originalSource;
    },
    $signature: 32
  };
  P._Future__propagateToListeners_handleValueCallback.prototype = {
    call$0: function() {
      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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        t1 = this._box_0;
        t1.listenerValueOrError = P.AsyncError$(e, s);
        t1.listenerHasError = true;
      }
    },
    $signature: 0
  };
  P._Future__propagateToListeners_handleError.prototype = {
    call$0: function() {
      var asyncError, e, s, t1, exception, t2, t3, t4, _this = this;
      try {
        asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t1 = _this._box_0;
        if (H.boolConversionCheck(t1.listener.matchesErrorTest$1(asyncError)) && t1.listener.errorCallback != null) {
          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
          t1.listenerHasError = false;
        }
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t2 = t1.error;
        t3 = e;
        t4 = _this._box_0;
        if (t2 == null ? t3 == null : t2 === t3)
          t4.listenerValueOrError = t1;
        else
          t4.listenerValueOrError = P.AsyncError$(e, s);
        t4.listenerHasError = true;
      }
    },
    $signature: 0
  };
  P._AsyncCallbackEntry.prototype = {};
  P.Stream.prototype = {
    map$1$1: function(_, convert, $S) {
      var t1 = H._instanceType(this);
      return new P._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: function($receiver, convert) {
      return this.map$1$1($receiver, convert, type$.dynamic);
    },
    get$length: function(_) {
      var t1 = {},
        future = new P._Future($.Zone__current, type$._Future_int);
      t1.count = 0;
      this.listen$4$cancelOnError$onDone$onError(new P.Stream_length_closure(t1, this), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
      return future;
    },
    get$first: function(_) {
      var future = new P._Future($.Zone__current, H._instanceType(this)._eval$1("_Future<Stream.T>")),
        subscription = this.listen$4$cancelOnError$onDone$onError(null, true, new P.Stream_first_closure(future), future.get$_completeError());
      subscription.onData$1(new P.Stream_first_closure0(this, subscription, future));
      return future;
    }
  };
  P.Stream_length_closure.prototype = {
    call$1: function(_) {
      H._instanceType(this.$this)._eval$1("Stream.T")._as(_);
      ++this._box_0.count;
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  P.Stream_length_closure0.prototype = {
    call$0: function() {
      this.future._complete$1(this._box_0.count);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P.Stream_first_closure.prototype = {
    call$0: function() {
      var e, s, t1, exception;
      try {
        t1 = H.IterableElementError_noElement();
        throw H.wrapException(t1);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._completeWithErrorCallback(this.future, e, s);
      }
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P.Stream_first_closure0.prototype = {
    call$1: function(value) {
      P._cancelAndValue(this.subscription, this.future, H._instanceType(this.$this)._eval$1("Stream.T")._as(value));
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  P.StreamSubscription.prototype = {};
  P.StreamView.prototype = {
    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
      return this._stream.listen$4$cancelOnError$onDone$onError(this.$ti._eval$1("~(1)?")._as(onData), cancelOnError, type$.nullable_void_Function._as(onDone), onError);
    },
    listen$3$onDone$onError: function(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    },
    listen$2$onDone: function(onData, onDone) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, null);
    }
  };
  P.StreamTransformerBase.prototype = {$isStreamTransformer: 1};
  P._StreamController.prototype = {
    get$_pendingEvents: function() {
      var t1, _this = this;
      if ((_this._state & 8) === 0)
        return H._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData);
      t1 = H._instanceType(_this);
      return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData());
    },
    _ensurePendingEvents$0: function() {
      var events, t1, _this = this;
      if ((_this._state & 8) === 0) {
        events = _this._varData;
        if (events == null)
          events = _this._varData = new P._StreamImplEvents(H._instanceType(_this)._eval$1("_StreamImplEvents<1>"));
        return H._instanceType(_this)._eval$1("_StreamImplEvents<1>")._as(events);
      }
      t1 = H._instanceType(_this);
      events = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData();
      return t1._eval$1("_StreamImplEvents<1>")._as(events);
    },
    get$_subscription: function() {
      var varData = this._varData;
      if ((this._state & 8) !== 0)
        varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData).get$varData();
      return H._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData);
    },
    _badEventState$0: function() {
      if ((this._state & 4) !== 0)
        return new P.StateError("Cannot add event after closing");
      return new P.StateError("Cannot add event while adding a stream");
    },
    _ensureDoneFuture$0: function() {
      var t1 = this._doneFuture;
      if (t1 == null)
        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new P._Future($.Zone__current, type$._Future_void);
      return t1;
    },
    add$1: function(_, value) {
      var t2, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(value);
      t2 = _this._state;
      if (t2 >= 4)
        throw H.wrapException(_this._badEventState$0());
      if ((t2 & 1) !== 0)
        _this._sendData$1(value);
      else if ((t2 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new P._DelayedData(value, t1._eval$1("_DelayedData<1>")));
    },
    addError$2: function(error, stackTrace) {
      var replacement, t1, _this = this;
      type$.nullable_StackTrace._as(stackTrace);
      H.checkNotNullable(error, "error", type$.Object);
      if (_this._state >= 4)
        throw H.wrapException(_this._badEventState$0());
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = P.AsyncError_defaultStackTrace(error);
      t1 = _this._state;
      if ((t1 & 1) !== 0)
        _this._sendError$2(error, stackTrace);
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace));
    },
    addError$1: function(error) {
      return this.addError$2(error, null);
    },
    close$0: function(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 4) !== 0)
        return _this._ensureDoneFuture$0();
      if (t1 >= 4)
        throw H.wrapException(_this._badEventState$0());
      t1 = _this._state = t1 | 4;
      if ((t1 & 1) !== 0)
        _this._sendDone$0();
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, C.C__DelayedDone);
      return _this._ensureDoneFuture$0();
    },
    _subscribe$4: function(onData, onError, onDone, cancelOnError) {
      var t2, t3, t4, t5, t6, subscription, pendingEvents, addState, _this = this,
        t1 = H._instanceType(_this);
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      if ((_this._state & 3) !== 0)
        throw H.wrapException(P.StateError$("Stream has already been listened to."));
      t2 = $.Zone__current;
      t3 = cancelOnError ? 1 : 0;
      t4 = P._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._precomputed1);
      t5 = P._BufferingStreamSubscription__registerErrorHandler(t2, onError);
      t6 = onDone == null ? P.async___nullDoneHandler$closure() : onDone;
      subscription = new P._ControllerSubscription(_this, t4, t5, t2.registerCallback$1$1(t6, type$.void), t2, t3, t1._eval$1("_ControllerSubscription<1>"));
      pendingEvents = _this.get$_pendingEvents();
      t3 = _this._state |= 1;
      if ((t3 & 8) !== 0) {
        addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
        addState.set$varData(subscription);
        addState.resume$0(0);
      } else
        _this._varData = subscription;
      subscription._setPendingEvents$1(pendingEvents);
      subscription._guardCallback$1(new P._StreamController__subscribe_closure(_this));
      return subscription;
    },
    _recordCancel$1: function(subscription) {
      var result, onCancel, cancelResult, e, s, exception, result0, _this = this,
        t1 = H._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(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 (type$.Future_void._is(cancelResult))
              result = cancelResult;
          } catch (exception) {
            e = H.unwrapException(exception);
            s = H.getTraceFromException(exception);
            result0 = new P._Future($.Zone__current, type$._Future_void);
            result0._asyncCompleteError$2(e, s);
            result = result0;
          }
        else
          result = result.whenComplete$1(onCancel);
      t1 = new P._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
  };
  P._StreamController__subscribe_closure.prototype = {
    call$0: function() {
      P._runGuarded(this.$this.onListen);
    },
    $signature: 0
  };
  P._StreamController__recordCancel_complete.prototype = {
    call$0: function() {
      var doneFuture = this.$this._doneFuture;
      if (doneFuture != null && doneFuture._state === 0)
        doneFuture._asyncComplete$1(null);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._SyncStreamControllerDispatch.prototype = {
    _sendData$1: function(data) {
      this.$ti._precomputed1._as(data);
      this.get$_subscription()._add$1(0, data);
    },
    _sendError$2: function(error, stackTrace) {
      this.get$_subscription()._addError$2(error, stackTrace);
    },
    _sendDone$0: function() {
      this.get$_subscription()._close$0();
    }
  };
  P._AsyncStreamControllerDispatch.prototype = {
    _sendData$1: function(data) {
      var t1 = this.$ti;
      t1._precomputed1._as(data);
      this.get$_subscription()._addPending$1(new P._DelayedData(data, t1._eval$1("_DelayedData<1>")));
    },
    _sendError$2: function(error, stackTrace) {
      this.get$_subscription()._addPending$1(new P._DelayedError(error, stackTrace));
    },
    _sendDone$0: function() {
      this.get$_subscription()._addPending$1(C.C__DelayedDone);
    }
  };
  P._AsyncStreamController.prototype = {};
  P._SyncStreamController.prototype = {};
  P._ControllerStream.prototype = {
    get$hashCode: function(_) {
      return (H.Primitives_objectHashCode(this._controller) ^ 892482866) >>> 0;
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return other instanceof P._ControllerStream && other._controller === this._controller;
    }
  };
  P._ControllerSubscription.prototype = {
    _onCancel$0: function() {
      return this._controller._recordCancel$1(this);
    },
    _onPause$0: function() {
      var t1 = this._controller,
        t2 = H._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).pause$0(0);
      P._runGuarded(t1.onPause);
    },
    _onResume$0: function() {
      var t1 = this._controller,
        t2 = H._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).resume$0(0);
      P._runGuarded(t1.onResume);
    }
  };
  P._StreamSinkWrapper.prototype = {
    add$1: function(_, data) {
      this._async$_target.add$1(0, this.$ti._precomputed1._as(data));
    },
    addError$2: function(error, stackTrace) {
      this._async$_target.addError$2(error, stackTrace);
    },
    addError$1: function(error) {
      return this.addError$2(error, null);
    },
    close$0: function(_) {
      return this._async$_target.close$0(0);
    },
    $isStreamSink: 1
  };
  P._BufferingStreamSubscription.prototype = {
    _setPendingEvents$1: function(pendingEvents) {
      var _this = this;
      H._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(pendingEvents);
      if (pendingEvents == null)
        return;
      _this.set$_pending(pendingEvents);
      if (pendingEvents.lastPendingEvent != null) {
        _this._state = (_this._state | 64) >>> 0;
        pendingEvents.schedule$1(_this);
      }
    },
    onData$1: function(handleData) {
      var t1 = H._instanceType(this);
      this.set$_async$_onData(P._BufferingStreamSubscription__registerDataHandler(this._zone, t1._eval$1("~(_BufferingStreamSubscription.T)?")._as(handleData), t1._eval$1("_BufferingStreamSubscription.T")));
    },
    pause$0: function(_) {
      var t2, t3, _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t2 = (t1 + 128 | 4) >>> 0;
      _this._state = t2;
      if (t1 < 128) {
        t3 = _this._pending;
        if (t3 != null)
          if (t3._state === 1)
            t3._state = 3;
      }
      if ((t1 & 4) === 0 && (t2 & 32) === 0)
        _this._guardCallback$1(_this.get$_onPause());
    },
    resume$0: function(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 >= 128) {
        t1 = _this._state = t1 - 128;
        if (t1 < 128)
          if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent != null)
            _this._pending.schedule$1(_this);
          else {
            t1 = (t1 & 4294967291) >>> 0;
            _this._state = t1;
            if ((t1 & 32) === 0)
              _this._guardCallback$1(_this.get$_onResume());
          }
      }
    },
    cancel$0: function(_) {
      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: function(futureValue, $E) {
      var result, t1 = {};
      $E._eval$1("0?")._as(futureValue);
      t1.resultValue = null;
      t1.resultValue = $E._as(futureValue);
      result = new P._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this.set$_onDone(new P._BufferingStreamSubscription_asFuture_closure(t1, result));
      this._onError = new P._BufferingStreamSubscription_asFuture_closure0(this, result);
      return result;
    },
    _cancel$0: function() {
      var t2, _this = this,
        t1 = _this._state = (_this._state | 8) >>> 0;
      if ((t1 & 64) !== 0) {
        t2 = _this._pending;
        if (t2._state === 1)
          t2._state = 3;
      }
      if ((t1 & 32) === 0)
        _this.set$_pending(null);
      _this._cancelFuture = _this._onCancel$0();
    },
    _add$1: function(_, data) {
      var t2, _this = this,
        t1 = H._instanceType(_this);
      t1._eval$1("_BufferingStreamSubscription.T")._as(data);
      t2 = _this._state;
      if ((t2 & 8) !== 0)
        return;
      if (t2 < 32)
        _this._sendData$1(data);
      else
        _this._addPending$1(new P._DelayedData(data, t1._eval$1("_DelayedData<_BufferingStreamSubscription.T>")));
    },
    _addError$2: function(error, stackTrace) {
      var t1 = this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 < 32)
        this._sendError$2(error, stackTrace);
      else
        this._addPending$1(new P._DelayedError(error, stackTrace));
    },
    _close$0: function() {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t1 = (t1 | 2) >>> 0;
      _this._state = t1;
      if (t1 < 32)
        _this._sendDone$0();
      else
        _this._addPending$1(C.C__DelayedDone);
    },
    _onPause$0: function() {
    },
    _onResume$0: function() {
    },
    _onCancel$0: function() {
      return null;
    },
    _addPending$1: function($event) {
      var _this = this,
        t1 = H._instanceType(_this),
        pending = t1._eval$1("_StreamImplEvents<_BufferingStreamSubscription.T>?")._as(_this._pending);
      if (pending == null)
        pending = new P._StreamImplEvents(t1._eval$1("_StreamImplEvents<_BufferingStreamSubscription.T>"));
      _this.set$_pending(pending);
      pending.add$1(0, $event);
      t1 = _this._state;
      if ((t1 & 64) === 0) {
        t1 = (t1 | 64) >>> 0;
        _this._state = t1;
        if (t1 < 128)
          pending.schedule$1(_this);
      }
    },
    _sendData$1: function(data) {
      var t2, _this = this,
        t1 = H._instanceType(_this)._eval$1("_BufferingStreamSubscription.T");
      t1._as(data);
      t2 = _this._state;
      _this._state = (t2 | 32) >>> 0;
      _this._zone.runUnaryGuarded$1$2(_this._async$_onData, data, t1);
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t2 & 4) !== 0);
    },
    _sendError$2: function(error, stackTrace) {
      var cancelFuture, _this = this,
        t1 = _this._state,
        t2 = new P._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: function() {
      var cancelFuture, _this = this,
        t1 = new P._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: function(callback) {
      var t1, _this = this;
      type$.void_Function._as(callback);
      t1 = _this._state;
      _this._state = (t1 | 32) >>> 0;
      callback.call$0();
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t1 & 4) !== 0);
    },
    _checkState$1: function(wasInputPaused) {
      var t2, isInputPaused, _this = this,
        t1 = _this._state;
      if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent == null) {
        t1 = _this._state = (t1 & 4294967231) >>> 0;
        if ((t1 & 4) !== 0)
          if (t1 < 128) {
            t2 = _this._pending;
            t2 = t2 == null ? null : t2.lastPendingEvent == null;
            t2 = t2 !== false;
          } else
            t2 = false;
        else
          t2 = false;
        if (t2) {
          t1 = (t1 & 4294967291) >>> 0;
          _this._state = t1;
        }
      }
      for (; true; wasInputPaused = isInputPaused) {
        if ((t1 & 8) !== 0) {
          _this.set$_pending(null);
          return;
        }
        isInputPaused = (t1 & 4) !== 0;
        if (wasInputPaused === isInputPaused)
          break;
        _this._state = (t1 ^ 32) >>> 0;
        if (isInputPaused)
          _this._onPause$0();
        else
          _this._onResume$0();
        t1 = (_this._state & 4294967263) >>> 0;
        _this._state = t1;
      }
      if ((t1 & 64) !== 0 && t1 < 128)
        _this._pending.schedule$1(_this);
    },
    set$_async$_onData: function(_onData) {
      this._async$_onData = H._instanceType(this)._eval$1("~(_BufferingStreamSubscription.T)")._as(_onData);
    },
    set$_onDone: function(_onDone) {
      this._onDone = type$.void_Function._as(_onDone);
    },
    set$_pending: function(_pending) {
      this._pending = H._instanceType(this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(_pending);
    },
    $isStreamSubscription: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  P._BufferingStreamSubscription_asFuture_closure.prototype = {
    call$0: function() {
      this.result._complete$1(this._box_0.resultValue);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._BufferingStreamSubscription_asFuture_closure0.prototype = {
    call$2: function(error, stackTrace) {
      var cancelFuture, t1;
      type$.StackTrace._as(stackTrace);
      cancelFuture = this.$this.cancel$0(0);
      t1 = this.result;
      if (cancelFuture != $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new P._BufferingStreamSubscription_asFuture__closure(t1, error, stackTrace));
      else
        t1._completeError$2(error, stackTrace);
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 15
  };
  P._BufferingStreamSubscription_asFuture__closure.prototype = {
    call$0: function() {
      this.result._completeError$2(this.error, this.stackTrace);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  P._BufferingStreamSubscription__sendError_sendError.prototype = {
    call$0: function() {
      var onError, t3, t4,
        t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
        return;
      t1._state = (t2 | 32) >>> 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 & 4294967263) >>> 0;
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._BufferingStreamSubscription__sendDone_sendDone.prototype = {
    call$0: function() {
      var t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 16) === 0)
        return;
      t1._state = (t2 | 42) >>> 0;
      t1._zone.runGuarded$1(t1._onDone);
      t1._state = (t1._state & 4294967263) >>> 0;
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._StreamImpl.prototype = {
    listen$4$cancelOnError$onDone$onError: function(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$2$onError: function(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError: function(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    },
    listen$2$cancelOnError: function(onData, cancelOnError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, cancelOnError, null, null);
    },
    listen$2$onDone: function(onData, onDone) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, null);
    }
  };
  P._DelayedEvent.prototype = {
    set$next: function(_, next) {
      this.next = type$.nullable__DelayedEvent_dynamic._as(next);
    },
    get$next: function(receiver) {
      return this.next;
    }
  };
  P._DelayedData.prototype = {
    perform$1: function(dispatch) {
      this.$ti._eval$1("_EventDispatch<1>")._as(dispatch)._sendData$1(this.value);
    }
  };
  P._DelayedError.prototype = {
    perform$1: function(dispatch) {
      dispatch._sendError$2(this.error, this.stackTrace);
    }
  };
  P._DelayedDone.prototype = {
    perform$1: function(dispatch) {
      dispatch._sendDone$0();
    },
    get$next: function(_) {
      return null;
    },
    set$next: function(_, _0) {
      throw H.wrapException(P.StateError$("No events after a done."));
    },
    $is_DelayedEvent: 1
  };
  P._PendingEvents.prototype = {
    schedule$1: function(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;
      }
      P.scheduleMicrotask(new P._PendingEvents_schedule_closure(_this, dispatch));
      _this._state = 1;
    }
  };
  P._PendingEvents_schedule_closure.prototype = {
    call$0: function() {
      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($event);
      t1.firstPendingEvent = nextEvent;
      if (nextEvent == null)
        t1.lastPendingEvent = null;
      $event.perform$1(t2);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._StreamImplEvents.prototype = {
    add$1: function(_, $event) {
      var _this = this,
        lastEvent = _this.lastPendingEvent;
      if (lastEvent == null)
        _this.firstPendingEvent = _this.lastPendingEvent = $event;
      else {
        lastEvent.set$next(0, $event);
        _this.lastPendingEvent = $event;
      }
    }
  };
  P._StreamIterator.prototype = {};
  P._cancelAndValue_closure.prototype = {
    call$0: function() {
      return this.future._complete$1(this.value);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._ForwardingStream.prototype = {
    listen$4$cancelOnError$onDone$onError: function(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 = t1._rest[1];
      t3 = $.Zone__current;
      t4 = cancelOnError === true ? 1 : 0;
      t5 = P._BufferingStreamSubscription__registerDataHandler(t3, onData, t2);
      t6 = P._BufferingStreamSubscription__registerErrorHandler(t3, onError);
      t7 = onDone == null ? P.async___nullDoneHandler$closure() : onDone;
      t2 = new P._ForwardingStreamSubscription(this, t5, t6, t3.registerCallback$1$1(t7, type$.void), t3, t4, t1._eval$1("@<1>")._bind$1(t2)._eval$1("_ForwardingStreamSubscription<1,2>"));
      t2.set$_subscription(this._source.listen$3$onDone$onError(t2.get$_handleData(), t2.get$_handleDone(), t2.get$_handleError()));
      return t2;
    },
    listen$2$onError: function(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError: function(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  P._ForwardingStreamSubscription.prototype = {
    _add$1: function(_, data) {
      this.$ti._rest[1]._as(data);
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_add(0, data);
    },
    _addError$2: function(error, stackTrace) {
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_addError(error, stackTrace);
    },
    _onPause$0: function() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.pause$0(0);
    },
    _onResume$0: function() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.resume$0(0);
    },
    _onCancel$0: function() {
      var subscription = this._subscription;
      if (subscription != null) {
        this.set$_subscription(null);
        return subscription.cancel$0(0);
      }
      return null;
    },
    _handleData$1: function(data) {
      this._stream._handleData$2(this.$ti._precomputed1._as(data), this);
    },
    _handleError$2: function(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._addError$2(error, stackTrace);
    },
    _handleDone$0: function() {
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._close$0();
    },
    set$_subscription: function(_subscription) {
      this._subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  P._MapStream.prototype = {
    _handleData$2: function(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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        error = e;
        stackTrace = s;
        replacement = $.Zone__current.errorCallback$2(error, stackTrace);
        if (replacement != null) {
          error = replacement.error;
          stackTrace = replacement.stackTrace;
        }
        sink._addError$2(error, stackTrace);
        return;
      }
      sink._add$1(0, outputEvent);
    }
  };
  P._ZoneFunction.prototype = {};
  P._RunNullaryZoneFunction.prototype = {};
  P._RunUnaryZoneFunction.prototype = {};
  P._RunBinaryZoneFunction.prototype = {};
  P._RegisterNullaryZoneFunction.prototype = {};
  P._RegisterUnaryZoneFunction.prototype = {};
  P._RegisterBinaryZoneFunction.prototype = {};
  P._ZoneSpecification.prototype = {$isZoneSpecification: 1};
  P._ZoneDelegate.prototype = {
    handleUncaughtError$3: function(zone, error, stackTrace) {
      var implementation, implZone;
      type$.StackTrace._as(stackTrace);
      implementation = this._delegationTarget.get$_handleUncaughtError();
      implZone = implementation.zone;
      return implementation.$function.call$5(implZone, implZone.get$_parentDelegate(), zone, error, stackTrace);
    },
    $isZoneDelegate: 1
  };
  P._Zone.prototype = {$isZone: 1};
  P._CustomZone.prototype = {
    get$_delegate: function() {
      var t1 = this._delegateCache;
      return t1 == null ? this._delegateCache = new P._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate: function() {
      return this.parent.get$_delegate();
    },
    get$errorZone: function() {
      return this._handleUncaughtError.zone;
    },
    runGuarded$1: function(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        this.run$1$1(f, type$.void);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        this.handleUncaughtError$2(e, s);
      }
    },
    runUnaryGuarded$1$2: function(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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        this.handleUncaughtError$2(e, s);
      }
    },
    runBinaryGuarded$2$3: function(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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        this.handleUncaughtError$2(e, s);
      }
    },
    bindCallback$1$1: function(f, $R) {
      return new P._CustomZone_bindCallback_closure(this, this.registerCallback$1$1($R._eval$1("0()")._as(f), $R), $R);
    },
    bindUnaryCallback$2$1: function(f, $R, $T) {
      return new P._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: function(f) {
      return new P._CustomZone_bindCallbackGuarded_closure(this, this.registerCallback$1$1(type$.void_Function._as(f), type$.void));
    },
    bindUnaryCallbackGuarded$1$1: function(f, $T) {
      return new P._CustomZone_bindUnaryCallbackGuarded_closure(this, this.registerUnaryCallback$2$1($T._eval$1("~(0)")._as(f), type$.void, $T), $T);
    },
    handleUncaughtError$2: function(error, stackTrace) {
      var implementation, t1;
      type$.StackTrace._as(stackTrace);
      implementation = this._handleUncaughtError;
      t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, error, stackTrace);
    },
    fork$2$specification$zoneValues: function(specification, zoneValues) {
      var implementation = this._fork,
        t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, specification, zoneValues);
    },
    run$1$1: function(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: function(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: function(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: function(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: function(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: function(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: function(error, stackTrace) {
      var implementation, implementationZone;
      H.checkNotNullable(error, "error", type$.Object);
      implementation = this._errorCallback;
      implementationZone = implementation.zone;
      if (implementationZone === C.C__RootZone)
        return null;
      return implementation.$function.call$5(implementationZone, implementationZone.get$_parentDelegate(), this, error, stackTrace);
    },
    scheduleMicrotask$1: function(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: function(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: function(_, line) {
      var implementation = this._print,
        t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, line);
    },
    set$_handleUncaughtError: function(_handleUncaughtError) {
      this._handleUncaughtError = type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace._as(_handleUncaughtError);
    },
    get$_run: function() {
      return this._run;
    },
    get$_runUnary: function() {
      return this._runUnary;
    },
    get$_runBinary: function() {
      return this._runBinary;
    },
    get$_registerCallback: function() {
      return this._registerCallback;
    },
    get$_registerUnaryCallback: function() {
      return this._registerUnaryCallback;
    },
    get$_registerBinaryCallback: function() {
      return this._registerBinaryCallback;
    },
    get$_errorCallback: function() {
      return this._errorCallback;
    },
    get$_scheduleMicrotask: function() {
      return this._scheduleMicrotask;
    },
    get$_createTimer: function() {
      return this._createTimer;
    },
    get$_createPeriodicTimer: function() {
      return this._createPeriodicTimer;
    },
    get$_print: function() {
      return this._print;
    },
    get$_fork: function() {
      return this._fork;
    },
    get$_handleUncaughtError: function() {
      return this._handleUncaughtError;
    },
    get$_async$_map: function() {
      return this._async$_map;
    }
  };
  P._CustomZone_bindCallback_closure.prototype = {
    call$0: function() {
      return this.$this.run$1$1(this.registered, this.R);
    },
    $signature: function() {
      return this.R._eval$1("0()");
    }
  };
  P._CustomZone_bindUnaryCallback_closure.prototype = {
    call$1: function(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.registered, t1._as(arg), _this.R, t1);
    },
    $signature: function() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  P._CustomZone_bindCallbackGuarded_closure.prototype = {
    call$0: function() {
      return this.$this.runGuarded$1(this.registered);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._CustomZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1: function(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.registered, t1._as(arg), t1);
    },
    $signature: function() {
      return this.T._eval$1("~(0)");
    }
  };
  P._rootHandleUncaughtError_closure.prototype = {
    call$0: function() {
      var error = H.wrapException(this.error);
      error.stack = J.toString$0$(this.stackTrace);
      throw error;
    },
    $signature: 0
  };
  P._RootZone.prototype = {
    get$_run: function() {
      return C._RunNullaryZoneFunction__RootZone__rootRun;
    },
    get$_runUnary: function() {
      return C._RunUnaryZoneFunction__RootZone__rootRunUnary;
    },
    get$_runBinary: function() {
      return C._RunBinaryZoneFunction__RootZone__rootRunBinary;
    },
    get$_registerCallback: function() {
      return C._RegisterNullaryZoneFunction__RootZone__rootRegisterCallback;
    },
    get$_registerUnaryCallback: function() {
      return C._RegisterUnaryZoneFunction_Bqo;
    },
    get$_registerBinaryCallback: function() {
      return C._RegisterBinaryZoneFunction_kGu;
    },
    get$_errorCallback: function() {
      return C._ZoneFunction__RootZone__rootErrorCallback;
    },
    get$_scheduleMicrotask: function() {
      return C._ZoneFunction__RootZone__rootScheduleMicrotask;
    },
    get$_createTimer: function() {
      return C._ZoneFunction__RootZone__rootCreateTimer;
    },
    get$_createPeriodicTimer: function() {
      return C._ZoneFunction_3bB;
    },
    get$_print: function() {
      return C._ZoneFunction__RootZone__rootPrint;
    },
    get$_fork: function() {
      return C._ZoneFunction__RootZone__rootFork;
    },
    get$_handleUncaughtError: function() {
      return C._ZoneFunction_NMc;
    },
    get$_async$_map: function() {
      return $.$get$_RootZone__rootMap();
    },
    get$_delegate: function() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new P._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate: function() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new P._ZoneDelegate(this) : t1;
    },
    get$errorZone: function() {
      return this;
    },
    runGuarded$1: function(f) {
      var e, s, exception, _null = null;
      type$.void_Function._as(f);
      try {
        if (C.C__RootZone === $.Zone__current) {
          f.call$0();
          return;
        }
        P._rootRun(_null, _null, this, f, type$.void);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2: function(f, arg, $T) {
      var e, s, exception, _null = null;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        if (C.C__RootZone === $.Zone__current) {
          f.call$1(arg);
          return;
        }
        P._rootRunUnary(_null, _null, this, f, arg, type$.void, $T);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3: function(f, arg1, arg2, T1, T2) {
      var e, s, exception, _null = null;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        if (C.C__RootZone === $.Zone__current) {
          f.call$2(arg1, arg2);
          return;
        }
        P._rootRunBinary(_null, _null, this, f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1: function(f, $R) {
      return new P._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
    },
    bindCallbackGuarded$1: function(f) {
      return new P._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
    },
    bindUnaryCallbackGuarded$1$1: function(f, $T) {
      return new P._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
    },
    handleUncaughtError$2: function(error, stackTrace) {
      P._rootHandleUncaughtError(null, null, this, error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues: function(specification, zoneValues) {
      return P._rootFork(null, null, this, specification, zoneValues);
    },
    run$1$1: function(f, $R) {
      $R._eval$1("0()")._as(f);
      if ($.Zone__current === C.C__RootZone)
        return f.call$0();
      return P._rootRun(null, null, this, f, $R);
    },
    runUnary$2$2: function(f, arg, $R, $T) {
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      if ($.Zone__current === C.C__RootZone)
        return f.call$1(arg);
      return P._rootRunUnary(null, null, this, f, arg, $R, $T);
    },
    runBinary$3$3: function(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 === C.C__RootZone)
        return f.call$2(arg1, arg2);
      return P._rootRunBinary(null, null, this, f, arg1, arg2, $R, T1, T2);
    },
    registerCallback$1$1: function(f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    registerUnaryCallback$2$1: function(f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    registerBinaryCallback$3$1: function(f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    },
    errorCallback$2: function(error, stackTrace) {
      return null;
    },
    scheduleMicrotask$1: function(f) {
      P._rootScheduleMicrotask(null, null, this, type$.void_Function._as(f));
    },
    createTimer$2: function(duration, f) {
      return P.Timer__createTimer(duration, type$.void_Function._as(f));
    },
    print$1: function(_, line) {
      H.printString(line);
    }
  };
  P._RootZone_bindCallback_closure.prototype = {
    call$0: function() {
      return this.$this.run$1$1(this.f, this.R);
    },
    $signature: function() {
      return this.R._eval$1("0()");
    }
  };
  P._RootZone_bindCallbackGuarded_closure.prototype = {
    call$0: function() {
      return this.$this.runGuarded$1(this.f);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1: function(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.f, t1._as(arg), t1);
    },
    $signature: function() {
      return this.T._eval$1("~(0)");
    }
  };
  P.runZonedGuarded_closure.prototype = {
    call$5: function($self, $parent, zone, error, stackTrace) {
      var e, s, exception,
        t1 = type$.StackTrace;
      t1._as(stackTrace);
      try {
        this.parentZone.runBinary$3$3(this.onError, error, stackTrace, type$.void, type$.Object, t1);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        t1 = e;
        if (t1 == null ? error == null : t1 === error)
          $parent.handleUncaughtError$3(zone, error, stackTrace);
        else
          $parent.handleUncaughtError$3(zone, e, s);
      }
    },
    $signature: 34
  };
  P._HashMap.prototype = {
    get$length: function(_) {
      return this._collection$_length;
    },
    get$isEmpty: function(_) {
      return this._collection$_length === 0;
    },
    get$keys: function(_) {
      return new P._HashMapKeyIterable(this, H._instanceType(this)._eval$1("_HashMapKeyIterable<1>"));
    },
    containsKey$1: function(_, key) {
      var strings, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[key] != null;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[key] != null;
      } else
        return this._containsKey$1(key);
    },
    _containsKey$1: function(key) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(this._getBucket$2(rest, key), key) >= 0;
    },
    addAll$1: function(_, other) {
      J.forEach$1$ax(H._instanceType(this)._eval$1("Map<1,2>")._as(other), new P._HashMap_addAll_closure(this));
    },
    $index: function(_, key) {
      var strings, t1, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        t1 = strings == null ? null : P._HashMap__getTableEntry(strings, key);
        return t1;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        t1 = nums == null ? null : P._HashMap__getTableEntry(nums, key);
        return t1;
      } else
        return this._get$1(0, key);
    },
    _get$1: function(_, 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: function(_, key, value) {
      var strings, nums, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string" && key !== "__proto__") {
        strings = _this._collection$_strings;
        _this._collection$_addHashTableEntry$3(strings == null ? _this._collection$_strings = P._HashMap__newHashTable() : strings, key, value);
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = _this._collection$_nums;
        _this._collection$_addHashTableEntry$3(nums == null ? _this._collection$_nums = P._HashMap__newHashTable() : nums, key, value);
      } else
        _this._set$2(key, value);
    },
    _set$2: function(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = P._HashMap__newHashTable();
      hash = _this._computeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null) {
        P._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: function(_, action) {
      var keys, $length, i, key, _this = this,
        t1 = H._instanceType(_this);
      t1._eval$1("~(1,2)")._as(action);
      keys = _this._computeKeys$0();
      for ($length = keys.length, t1 = t1._precomputed1, i = 0; i < $length; ++i) {
        key = keys[i];
        action.call$2(t1._as(key), _this.$index(0, key));
        if (keys !== _this._keys)
          throw H.wrapException(P.ConcurrentModificationError$(_this));
      }
    },
    _computeKeys$0: function() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._keys;
      if (result != null)
        return result;
      result = P.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_strings;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (index = 0, i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      } else
        index = 0;
      nums = _this._collection$_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: function(table, key, value) {
      var t1 = H._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (table[key] == null) {
        ++this._collection$_length;
        this._keys = null;
      }
      P._HashMap__setTableEntry(table, key, value);
    },
    _computeHashCode$1: function(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    _getBucket$2: function(table, key) {
      return table[this._computeHashCode$1(key)];
    },
    _findBucketIndex$2: function(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
  };
  P._HashMap_addAll_closure.prototype = {
    call$2: function(key, value) {
      var t1 = this.$this,
        t2 = H._instanceType(t1);
      t1.$indexSet(0, t2._precomputed1._as(key), t2._rest[1]._as(value));
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  P._IdentityHashMap.prototype = {
    _computeHashCode$1: function(key) {
      return H.objectHashCode(key) & 1073741823;
    },
    _findBucketIndex$2: function(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;
    }
  };
  P._CustomHashMap.prototype = {
    $index: function(_, key) {
      if (!H.boolConversionCheck(this._validKey.call$1(key)))
        return null;
      return this.super$_HashMap$_get(0, key);
    },
    $indexSet: function(_, key, value) {
      var t1 = this.$ti;
      this.super$_HashMap$_set(t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1: function(_, key) {
      if (!H.boolConversionCheck(this._validKey.call$1(key)))
        return false;
      return this.super$_HashMap$_containsKey(key);
    },
    _computeHashCode$1: function(key) {
      return this._hashCode.call$1(this.$ti._precomputed1._as(key)) & 1073741823;
    },
    _findBucketIndex$2: function(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 (H.boolConversionCheck(t2.call$2(bucket[i], t1._as(key))))
          return i;
      return -1;
    }
  };
  P._CustomHashMap_closure.prototype = {
    call$1: function(v) {
      return this.K._is(v);
    },
    $signature: 17
  };
  P._HashMapKeyIterable.prototype = {
    get$length: function(_) {
      return this._collection$_map._collection$_length;
    },
    get$isEmpty: function(_) {
      return this._collection$_map._collection$_length === 0;
    },
    get$iterator: function(_) {
      var t1 = this._collection$_map;
      return new P._HashMapKeyIterator(t1, t1._computeKeys$0(), this.$ti._eval$1("_HashMapKeyIterator<1>"));
    },
    contains$1: function(_, element) {
      return this._collection$_map.containsKey$1(0, element);
    }
  };
  P._HashMapKeyIterator.prototype = {
    get$current: function(_) {
      return this._collection$_current;
    },
    moveNext$0: function() {
      var _this = this,
        keys = _this._keys,
        offset = _this._offset,
        t1 = _this._collection$_map;
      if (keys !== t1._keys)
        throw H.wrapException(P.ConcurrentModificationError$(t1));
      else if (offset >= keys.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(keys[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current: function(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  P._HashSet.prototype = {
    get$iterator: function(_) {
      return new P._HashSetIterator(this, this._computeElements$0(), H._instanceType(this)._eval$1("_HashSetIterator<1>"));
    },
    get$length: function(_) {
      return this._collection$_length;
    },
    get$isEmpty: function(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty: function(_) {
      return this._collection$_length !== 0;
    },
    contains$1: function(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[object] != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[object] != null;
      } else
        return this._contains$1(object);
    },
    _contains$1: function(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    add$1: function(_, element) {
      var strings, nums, _this = this;
      H._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = P._HashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = P._HashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1: function(_, element) {
      var rest, hash, bucket, _this = this;
      H._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = P._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._elements = null;
      return true;
    },
    remove$1: function(_, object) {
      var _this = this;
      if (typeof object == "string" && object !== "__proto__")
        return _this._collection$_removeHashTableEntry$2(_this._collection$_strings, object);
      else if (typeof object == "number" && (object & 1073741823) === object)
        return _this._collection$_removeHashTableEntry$2(_this._collection$_nums, object);
      else
        return _this._remove$1(0, object);
    },
    _remove$1: function(_, 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._elements = null;
      bucket.splice(index, 1);
      if (0 === bucket.length)
        delete rest[hash];
      return true;
    },
    _computeElements$0: function() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._elements;
      if (result != null)
        return result;
      result = P.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_strings;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (index = 0, i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      } else
        index = 0;
      nums = _this._collection$_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._elements = result;
    },
    _collection$_addHashTableEntry$2: function(table, element) {
      H._instanceType(this)._precomputed1._as(element);
      if (table[element] != null)
        return false;
      table[element] = 0;
      ++this._collection$_length;
      this._elements = null;
      return true;
    },
    _collection$_removeHashTableEntry$2: function(table, element) {
      if (table != null && table[element] != null) {
        delete table[element];
        --this._collection$_length;
        this._elements = null;
        return true;
      } else
        return false;
    },
    _computeHashCode$1: function(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2: function(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;
    }
  };
  P._HashSetIterator.prototype = {
    get$current: function(_) {
      return this._collection$_current;
    },
    moveNext$0: function() {
      var _this = this,
        elements = _this._elements,
        offset = _this._offset,
        t1 = _this._set;
      if (elements !== t1._elements)
        throw H.wrapException(P.ConcurrentModificationError$(t1));
      else if (offset >= elements.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(elements[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current: function(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  P._LinkedHashSet.prototype = {
    get$iterator: function(_) {
      var _this = this,
        t1 = new P._LinkedHashSetIterator(_this, _this._collection$_modifications, H._instanceType(_this)._eval$1("_LinkedHashSetIterator<1>"));
      t1._collection$_cell = _this._collection$_first;
      return t1;
    },
    get$length: function(_) {
      return this._collection$_length;
    },
    get$isEmpty: function(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty: function(_) {
      return this._collection$_length !== 0;
    },
    contains$1: function(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        if (strings == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(strings[object]) != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        if (nums == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(nums[object]) != null;
      } else
        return this._contains$1(object);
    },
    _contains$1: function(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    get$first: function(_) {
      var first = this._collection$_first;
      if (first == null)
        throw H.wrapException(P.StateError$("No elements"));
      return H._instanceType(this)._precomputed1._as(first._collection$_element);
    },
    add$1: function(_, element) {
      var strings, nums, _this = this;
      H._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = P._LinkedHashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = P._LinkedHashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1: function(_, element) {
      var rest, hash, bucket, _this = this;
      H._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = P._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: function(table, element) {
      H._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: function(element) {
      var _this = this,
        cell = new P._LinkedHashSetCell(H._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: function(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2: function(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i]._collection$_element, element))
          return i;
      return -1;
    }
  };
  P._LinkedHashSetCell.prototype = {};
  P._LinkedHashSetIterator.prototype = {
    get$current: function(_) {
      return this._collection$_current;
    },
    moveNext$0: function() {
      var _this = this,
        cell = _this._collection$_cell,
        t1 = _this._set;
      if (_this._collection$_modifications !== t1._collection$_modifications)
        throw H.wrapException(P.ConcurrentModificationError$(t1));
      else if (cell == null) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(_this.$ti._eval$1("1?")._as(cell._collection$_element));
        _this._collection$_cell = cell._collection$_next;
        return true;
      }
    },
    set$_collection$_current: function(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  P.UnmodifiableListView.prototype = {
    cast$1$0: function(_, $R) {
      return new P.UnmodifiableListView(J.cast$1$0$ax(this._collection$_source, $R), $R._eval$1("UnmodifiableListView<0>"));
    },
    get$length: function(_) {
      return J.get$length$asx(this._collection$_source);
    },
    $index: function(_, index) {
      return J.elementAt$1$ax(this._collection$_source, index);
    }
  };
  P.IterableMixin.prototype = {
    map$1$1: function(_, f, $T) {
      var t1 = this.$ti;
      return H.MappedIterable_MappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._precomputed1, $T);
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    contains$1: function(_, element) {
      var t1;
      for (t1 = this.$ti, t1 = new P._SplayTreeKeyIterator(this, H.setRuntimeTypeInfo([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>")); t1.moveNext$0();)
        if (J.$eq$(t1.get$current(t1), element))
          return true;
      return false;
    },
    get$length: function(_) {
      var count,
        t1 = this.$ti,
        it = new P._SplayTreeKeyIterator(this, H.setRuntimeTypeInfo([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    get$isEmpty: function(_) {
      var t1 = this.$ti;
      return !new P._SplayTreeKeyIterator(this, H.setRuntimeTypeInfo([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>")).moveNext$0();
    },
    get$isNotEmpty: function(_) {
      return this._root != null;
    },
    skip$1: function(_, count) {
      return H.SkipIterable_SkipIterable(this, count, this.$ti._precomputed1);
    },
    get$first: function(_) {
      var t1 = this.$ti,
        it = new P._SplayTreeKeyIterator(this, H.setRuntimeTypeInfo([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
      if (!it.moveNext$0())
        throw H.wrapException(H.IterableElementError_noElement());
      return it.get$current(it);
    },
    elementAt$1: function(_, index) {
      var t1, elementIndex, element, _this = this, _s5_ = "index";
      H.checkNotNullable(index, _s5_, type$.int);
      P.RangeError_checkNotNegative(index, _s5_);
      for (t1 = _this.$ti, t1 = new P._SplayTreeKeyIterator(_this, H.setRuntimeTypeInfo([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), _this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>")), elementIndex = 0; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (index === elementIndex)
          return element;
        ++elementIndex;
      }
      throw H.wrapException(P.IndexError$(index, _this, _s5_, null, elementIndex));
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToShortString(this, "(", ")");
    }
  };
  P.LinkedHashMap_LinkedHashMap$from_closure.prototype = {
    call$2: function(k, v) {
      this.result.$indexSet(0, this.K._as(k), this.V._as(v));
    },
    $signature: 18
  };
  P.ListBase.prototype = {$isEfficientLengthIterable: 1, $isIterable: 1, $isList: 1};
  P.ListMixin.prototype = {
    get$iterator: function(receiver) {
      return new H.ListIterator(receiver, this.get$length(receiver), H.instanceType(receiver)._eval$1("ListIterator<ListMixin.E>"));
    },
    elementAt$1: function(receiver, index) {
      return this.$index(receiver, index);
    },
    forEach$1: function(receiver, action) {
      var $length, i;
      H.instanceType(receiver)._eval$1("~(ListMixin.E)")._as(action);
      $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        action.call$1(this.$index(receiver, i));
        if ($length !== this.get$length(receiver))
          throw H.wrapException(P.ConcurrentModificationError$(receiver));
      }
    },
    get$isEmpty: function(receiver) {
      return this.get$length(receiver) === 0;
    },
    get$isNotEmpty: function(receiver) {
      return !this.get$isEmpty(receiver);
    },
    get$first: function(receiver) {
      if (this.get$length(receiver) === 0)
        throw H.wrapException(H.IterableElementError_noElement());
      return this.$index(receiver, 0);
    },
    contains$1: function(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 H.wrapException(P.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    map$1$1: function(receiver, f, $T) {
      var t1 = H.instanceType(receiver);
      return new H.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(ListMixin.E)")._as(f), t1._eval$1("@<ListMixin.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    skip$1: function(receiver, count) {
      return H.SubListIterable$(receiver, count, null, H.instanceType(receiver)._eval$1("ListMixin.E"));
    },
    cast$1$0: function(receiver, $R) {
      return new H.CastList(receiver, H.instanceType(receiver)._eval$1("@<ListMixin.E>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    sort$1: function(receiver, compare) {
      var t2,
        t1 = H.instanceType(receiver);
      t1._eval$1("int(ListMixin.E,ListMixin.E)?")._as(compare);
      t2 = compare == null ? P.collection_ListMixin__compareAny$closure() : compare;
      H.Sort_sort(receiver, t2, t1._eval$1("ListMixin.E"));
    },
    $add: function(receiver, other) {
      var t1 = H.instanceType(receiver);
      t1._eval$1("List<ListMixin.E>")._as(other);
      t1 = P.List_List$of(receiver, true, t1._eval$1("ListMixin.E"));
      C.JSArray_methods.addAll$1(t1, other);
      return t1;
    },
    sublist$2: function(receiver, start, end) {
      var listLength = this.get$length(receiver);
      P.RangeError_checkValidRange(start, listLength, listLength);
      return P.List_List$from(this.getRange$2(receiver, start, listLength), true, H.instanceType(receiver)._eval$1("ListMixin.E"));
    },
    sublist$1: function($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    getRange$2: function(receiver, start, end) {
      P.RangeError_checkValidRange(start, end, this.get$length(receiver));
      return H.SubListIterable$(receiver, start, end, H.instanceType(receiver)._eval$1("ListMixin.E"));
    },
    fillRange$3: function(receiver, start, end, fill) {
      var i;
      H.instanceType(receiver)._eval$1("ListMixin.E?")._as(fill);
      P.RangeError_checkValidRange(start, end, this.get$length(receiver));
      for (i = start; i < end; ++i)
        this.$indexSet(receiver, i, fill);
    },
    toString$0: function(receiver) {
      return P.IterableBase_iterableToFullString(receiver, "[", "]");
    }
  };
  P.MapBase.prototype = {};
  P.MapBase_mapToString_closure.prototype = {
    call$2: function(k, v) {
      var t2,
        t1 = this._box_0;
      if (!t1.first)
        this.result._contents += ", ";
      t1.first = false;
      t1 = this.result;
      t2 = t1._contents += H.S(k);
      t1._contents = t2 + ": ";
      t1._contents += H.S(v);
    },
    $signature: 19
  };
  P.MapMixin.prototype = {
    cast$2$0: function(receiver, RK, RV) {
      var t1 = H.instanceType(receiver);
      return P.Map_castFrom(receiver, t1._eval$1("MapMixin.K"), t1._eval$1("MapMixin.V"), RK, RV);
    },
    forEach$1: function(receiver, action) {
      var t1, key;
      H.instanceType(receiver)._eval$1("~(MapMixin.K,MapMixin.V)")._as(action);
      for (t1 = J.get$iterator$ax(this.get$keys(receiver)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        action.call$2(key, this.$index(receiver, key));
      }
    },
    addAll$1: function(receiver, other) {
      var t1, t2, key;
      H.instanceType(receiver)._eval$1("Map<MapMixin.K,MapMixin.V>")._as(other);
      for (t1 = J.getInterceptor$x(other), t2 = J.get$iterator$ax(t1.get$keys(other)); t2.moveNext$0();) {
        key = t2.get$current(t2);
        this.$indexSet(receiver, key, t1.$index(other, key));
      }
    },
    map$2$1: function(receiver, transform, K2, V2) {
      var result, t1, key, entry;
      H.instanceType(receiver)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(MapMixin.K,MapMixin.V)")._as(transform);
      result = P.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      for (t1 = J.get$iterator$ax(this.get$keys(receiver)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        entry = transform.call$2(key, this.$index(receiver, key));
        result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
      }
      return result;
    },
    map$1: function($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    containsKey$1: function(receiver, key) {
      return J.contains$1$asx(this.get$keys(receiver), key);
    },
    get$length: function(receiver) {
      return J.get$length$asx(this.get$keys(receiver));
    },
    get$isEmpty: function(receiver) {
      return J.get$isEmpty$asx(this.get$keys(receiver));
    },
    toString$0: function(receiver) {
      return P.MapBase_mapToString(receiver);
    },
    $isMap: 1
  };
  P._UnmodifiableMapMixin.prototype = {
    $indexSet: function(_, key, value) {
      var t1 = H._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable map"));
    },
    addAll$1: function(_, other) {
      H._instanceType(this)._eval$1("Map<1,2>")._as(other);
      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable map"));
    }
  };
  P.MapView.prototype = {
    cast$2$0: function(_, RK, RV) {
      return J.cast$2$0$ax(this._collection$_map, RK, RV);
    },
    $index: function(_, key) {
      return J.$index$asx(this._collection$_map, key);
    },
    $indexSet: function(_, key, value) {
      var t1 = H._instanceType(this);
      J.$indexSet$ax(this._collection$_map, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    addAll$1: function(_, other) {
      J.addAll$1$ax(this._collection$_map, H._instanceType(this)._eval$1("Map<1,2>")._as(other));
    },
    containsKey$1: function(_, key) {
      return J.containsKey$1$x(this._collection$_map, key);
    },
    forEach$1: function(_, action) {
      J.forEach$1$ax(this._collection$_map, H._instanceType(this)._eval$1("~(1,2)")._as(action));
    },
    get$isEmpty: function(_) {
      return J.get$isEmpty$asx(this._collection$_map);
    },
    get$length: function(_) {
      return J.get$length$asx(this._collection$_map);
    },
    get$keys: function(_) {
      return J.get$keys$x(this._collection$_map);
    },
    toString$0: function(_) {
      return J.toString$0$(this._collection$_map);
    },
    map$2$1: function(_, transform, K2, V2) {
      return J.map$2$1$ax(this._collection$_map, H._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2);
    },
    map$1: function($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  P.UnmodifiableMapView.prototype = {
    cast$2$0: function(_, RK, RV) {
      return new P.UnmodifiableMapView(J.cast$2$0$ax(this._collection$_map, RK, RV), RK._eval$1("@<0>")._bind$1(RV)._eval$1("UnmodifiableMapView<1,2>"));
    }
  };
  P.ListQueue.prototype = {
    get$iterator: function(_) {
      var _this = this;
      return new P._ListQueueIterator(_this, _this._tail, _this._modificationCount, _this._head, _this.$ti._eval$1("_ListQueueIterator<1>"));
    },
    get$isEmpty: function(_) {
      return this._head === this._tail;
    },
    get$length: function(_) {
      return (this._tail - this._head & this._table.length - 1) >>> 0;
    },
    get$first: function(_) {
      var t2,
        t1 = this._head;
      if (t1 === this._tail)
        throw H.wrapException(H.IterableElementError_noElement());
      t2 = this._table;
      if (t1 >= t2.length)
        return H.ioore(t2, t1);
      return t2[t1];
    },
    elementAt$1: function(_, index) {
      var t1, t2, t3, _this = this,
        $length = _this.get$length(_this);
      if (0 > index || index >= $length)
        H.throwExpression(P.IndexError$(index, _this, "index", null, $length));
      t1 = _this._table;
      t2 = t1.length;
      t3 = (_this._head + index & t2 - 1) >>> 0;
      if (t3 < 0 || t3 >= t2)
        return H.ioore(t1, t3);
      return t1[t3];
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToFullString(this, "{", "}");
    },
    set$_table: function(_table) {
      this._table = this.$ti._eval$1("List<1?>")._as(_table);
    }
  };
  P._ListQueueIterator.prototype = {
    get$current: function(_) {
      return this._collection$_current;
    },
    moveNext$0: function() {
      var t2, t3, _this = this,
        t1 = _this._queue;
      if (_this._modificationCount !== t1._modificationCount)
        H.throwExpression(P.ConcurrentModificationError$(t1));
      t2 = _this._collection$_position;
      if (t2 === _this._end) {
        _this.set$_collection$_current(null);
        return false;
      }
      t3 = t1._table;
      if (t2 >= t3.length)
        return H.ioore(t3, t2);
      _this.set$_collection$_current(t3[t2]);
      _this._collection$_position = (_this._collection$_position + 1 & t1._table.length - 1) >>> 0;
      return true;
    },
    set$_collection$_current: function(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  P.SetMixin.prototype = {
    get$isEmpty: function(_) {
      return this.get$length(this) === 0;
    },
    get$isNotEmpty: function(_) {
      return this.get$length(this) !== 0;
    },
    addAll$1: function(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(H._instanceType(this)._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this.add$1(0, t1.get$current(t1));
    },
    containsAll$1: function(other) {
      var t1;
      for (t1 = other._set$_set, t1 = t1.get$iterator(t1); t1.moveNext$0();)
        if (!this.contains$1(0, t1.get$current(t1)))
          return false;
      return true;
    },
    map$1$1: function(_, f, $T) {
      var t1 = H._instanceType(this);
      return new H.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: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToFullString(this, "{", "}");
    },
    skip$1: function(_, n) {
      return H.SkipIterable_SkipIterable(this, n, H._instanceType(this)._precomputed1);
    },
    get$first: function(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw H.wrapException(H.IterableElementError_noElement());
      return it.get$current(it);
    },
    elementAt$1: function(_, index) {
      var t1, elementIndex, element, _s5_ = "index";
      H.checkNotNullable(index, _s5_, type$.int);
      P.RangeError_checkNotNegative(index, _s5_);
      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (index === elementIndex)
          return element;
        ++elementIndex;
      }
      throw H.wrapException(P.IndexError$(index, this, _s5_, null, elementIndex));
    }
  };
  P._SetBase.prototype = {$isEfficientLengthIterable: 1, $isIterable: 1, $isSet: 1};
  P._SplayTreeNode.prototype = {
    set$_left: function(_, _left) {
      this._left = this.$ti._eval$1("_SplayTreeNode.1?")._as(_left);
    },
    set$_right: function(_, _right) {
      this._right = this.$ti._eval$1("_SplayTreeNode.1?")._as(_right);
    }
  };
  P._SplayTreeSetNode.prototype = {};
  P._SplayTree.prototype = {
    _splay$1: function(key) {
      var root, compare, comp, 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 (comp = _null, current = root, newTreeLeft = comp, left = newTreeLeft, newTreeRight = left, right = newTreeRight; true;) {
        comp = compare.call$2(current.key, key);
        if (typeof comp !== "number")
          return comp.$gt();
        if (comp > 0) {
          currentLeft = current._left;
          if (currentLeft == null)
            break;
          comp = compare.call$2(currentLeft.key, key);
          if (typeof comp !== "number")
            return comp.$gt();
          if (comp > 0) {
            current.set$_left(0, currentLeft._right);
            currentLeft.set$_right(0, current);
            currentLeft0 = currentLeft._left;
            if (currentLeft0 == null) {
              current = currentLeft;
              break;
            }
            current = currentLeft;
            currentLeft = currentLeft0;
          }
          if (right == null)
            newTreeRight = current;
          else
            right.set$_left(0, current);
          right = current;
          current = currentLeft;
        } else {
          if (comp < 0) {
            currentRight = current._right;
            if (currentRight == null)
              break;
            comp = compare.call$2(currentRight.key, key);
            if (typeof comp !== "number")
              return comp.$lt();
            if (comp < 0) {
              current.set$_right(0, currentRight._left);
              currentRight.set$_left(0, current);
              currentRight0 = currentRight._right;
              if (currentRight0 == null) {
                current = currentRight;
                break;
              }
              current = currentRight;
              currentRight = currentRight0;
            }
            if (left == null)
              newTreeLeft = current;
            else
              left.set$_right(0, current);
          } else
            break;
          left = current;
          current = currentRight;
        }
      }
      if (left != null) {
        left.set$_right(0, current._left);
        current.set$_left(0, newTreeLeft);
      }
      if (right != null) {
        right.set$_left(0, current._right);
        current.set$_right(0, newTreeRight);
      }
      if (_this._root !== current) {
        _this.set$_root(current);
        ++_this._splayCount;
      }
      return comp;
    },
    _splayMin$1: function(node) {
      var nextLeft, current, nextLeft0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextLeft = node._left;
      for (current = node; nextLeft != null; current = nextLeft, nextLeft = nextLeft0) {
        current.set$_left(0, nextLeft._right);
        nextLeft.set$_right(0, current);
        nextLeft0 = nextLeft._left;
      }
      return current;
    },
    _splayMax$1: function(node) {
      var nextRight, current, nextRight0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextRight = node._right;
      for (current = node; nextRight != null; current = nextRight, nextRight = nextRight0) {
        current.set$_right(0, nextRight._left);
        nextRight.set$_left(0, current);
        nextRight0 = nextRight._right;
      }
      return current;
    },
    _remove$1: function(_, key) {
      var root, left, t1, root0, _this = this;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      if (_this._root == null)
        return null;
      if (_this._splay$1(key) !== 0)
        return null;
      root = _this._root;
      left = root._left;
      --_this._count;
      t1 = root._right;
      if (left == null)
        _this.set$_root(t1);
      else {
        root0 = _this._splayMax$1(left);
        root0.set$_right(0, t1);
        _this.set$_root(root0);
      }
      ++_this._modificationCount;
      return root;
    },
    _addNewRoot$2: function(node, comp) {
      var root, _this = this;
      _this.$ti._eval$1("_SplayTree.1")._as(node);
      ++_this._count;
      ++_this._modificationCount;
      root = _this._root;
      if (root == null) {
        _this.set$_root(node);
        return;
      }
      if (typeof comp !== "number")
        return comp.$lt();
      if (comp < 0) {
        node.set$_left(0, root);
        node.set$_right(0, root._right);
        root.set$_right(0, null);
      } else {
        node.set$_right(0, root);
        node.set$_left(0, root._left);
        root.set$_left(0, null);
      }
      _this.set$_root(node);
    },
    get$_collection$_first: function() {
      var _this = this,
        root = _this._root;
      if (root == null)
        return null;
      _this.set$_root(_this._splayMin$1(root));
      return _this._root;
    }
  };
  P._SplayTreeIterator.prototype = {
    get$current: function(_) {
      var t1 = this._path;
      if (t1.length === 0)
        return null;
      return this.$ti._rest[1]._as(C.JSArray_methods.get$last(t1)).key;
    },
    moveNext$0: function() {
      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;) {
            C.JSArray_methods.add$1(t1, node);
            node = node._left;
          }
          return t1.length !== 0;
        }
        throw H.wrapException(P.ConcurrentModificationError$(t2));
      }
      t1 = _this._path;
      if (t1.length === 0)
        return false;
      if (_this._splayCount !== t2._splayCount) {
        t3 = _this.$ti._eval$1("_SplayTreeIterator.K")._as(C.JSArray_methods.get$last(t1).key);
        C.JSArray_methods.set$length(t1, 0);
        t2._splay$1(t3);
        t3 = t2._root;
        t3.toString;
        C.JSArray_methods.add$1(t1, t3);
        _this._splayCount = t2._splayCount;
      }
      node = C.JSArray_methods.get$last(t1);
      next = node._right;
      if (next != null) {
        for (; next != null;) {
          C.JSArray_methods.add$1(t1, next);
          next = next._left;
        }
        return true;
      }
      if (0 >= t1.length)
        return H.ioore(t1, -1);
      t1.pop();
      while (true) {
        if (!(t1.length !== 0 && C.JSArray_methods.get$last(t1)._right == node))
          break;
        if (0 >= t1.length)
          return H.ioore(t1, -1);
        node = t1.pop();
      }
      return t1.length !== 0;
    },
    $isIterator: 1
  };
  P._SplayTreeKeyIterator.prototype = {};
  P.SplayTreeSet.prototype = {
    get$iterator: function(_) {
      var t1 = this.$ti;
      return new P._SplayTreeKeyIterator(this, H.setRuntimeTypeInfo([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
    },
    get$length: function(_) {
      return this._count;
    },
    get$isEmpty: function(_) {
      return this._root == null;
    },
    get$isNotEmpty: function(_) {
      return this._root != null;
    },
    get$first: function(_) {
      if (this._count === 0)
        throw H.wrapException(H.IterableElementError_noElement());
      return this.get$_collection$_first().key;
    },
    contains$1: function(_, element) {
      return H.boolConversionCheck(this._validKey.call$1(element)) && this._splay$1(this.$ti._precomputed1._as(element)) === 0;
    },
    add$1: function(_, element) {
      return this._collection$_add$1(0, this.$ti._precomputed1._as(element));
    },
    _collection$_add$1: function(_, element) {
      var compare,
        t1 = this.$ti;
      t1._precomputed1._as(element);
      compare = this._splay$1(element);
      if (compare === 0)
        return false;
      this._addNewRoot$2(new P._SplayTreeSetNode(element, t1._eval$1("_SplayTreeSetNode<1>")), compare);
      return true;
    },
    remove$1: function(_, object) {
      if (!H.boolConversionCheck(this._validKey.call$1(object)))
        return false;
      return this._remove$1(0, this.$ti._precomputed1._as(object)) != null;
    },
    addAll$1: function(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(this.$ti._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this._collection$_add$1(0, t1.get$current(t1));
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToFullString(this, "{", "}");
    },
    set$_root: function(_root) {
      this._root = this.$ti._eval$1("_SplayTreeSetNode<1>?")._as(_root);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isSet: 1
  };
  P.SplayTreeSet_closure.prototype = {
    call$1: function(v) {
      return this.E._is(v);
    },
    $signature: 17
  };
  P._ListBase_Object_ListMixin.prototype = {};
  P._SplayTreeSet__SplayTree_IterableMixin.prototype = {};
  P._SplayTreeSet__SplayTree_IterableMixin_SetMixin.prototype = {};
  P._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
  P.__SetBase_Object_SetMixin.prototype = {};
  P._JsonMap.prototype = {
    $index: function(_, key) {
      var result,
        t1 = this._processed;
      if (t1 == null)
        return this._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: function(_) {
      var t1;
      if (this._processed == null) {
        t1 = this._data;
        t1 = t1.get$length(t1);
      } else
        t1 = this._convert$_computeKeys$0().length;
      return t1;
    },
    get$isEmpty: function(_) {
      return this.get$length(this) === 0;
    },
    get$keys: function(_) {
      var t1;
      if (this._processed == null) {
        t1 = this._data;
        return t1.get$keys(t1);
      }
      return new P._JsonMapKeyIterable(this);
    },
    $indexSet: function(_, key, value) {
      var processed, original, _this = this;
      H._asStringS(key);
      if (_this._processed == null)
        _this._data.$indexSet(0, key, value);
      else if (_this.containsKey$1(0, 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);
    },
    addAll$1: function(_, other) {
      J.forEach$1$ax(type$.Map_String_dynamic._as(other), new P._JsonMap_addAll_closure(this));
    },
    containsKey$1: function(_, key) {
      if (this._processed == null)
        return this._data.containsKey$1(0, key);
      if (typeof key != "string")
        return false;
      return Object.prototype.hasOwnProperty.call(this._original, key);
    },
    forEach$1: function(_, f) {
      var keys, i, key, value, _this = this;
      type$.void_Function_String_dynamic._as(f);
      if (_this._processed == null)
        return _this._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 = P._convertJsonToDartLazy(_this._original[key]);
          _this._processed[key] = value;
        }
        f.call$2(key, value);
        if (keys !== _this._data)
          throw H.wrapException(P.ConcurrentModificationError$(_this));
      }
    },
    _convert$_computeKeys$0: function() {
      var keys = type$.nullable_List_dynamic._as(this._data);
      if (keys == null)
        keys = this._data = H.setRuntimeTypeInfo(Object.keys(this._original), type$.JSArray_String);
      return keys;
    },
    _upgrade$0: function() {
      var result, keys, i, t1, key, _this = this;
      if (_this._processed == null)
        return _this._data;
      result = P.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)
        C.JSArray_methods.add$1(keys, "");
      else
        C.JSArray_methods.set$length(keys, 0);
      _this._original = _this._processed = null;
      return _this._data = result;
    },
    _process$1: function(key) {
      var result;
      if (!Object.prototype.hasOwnProperty.call(this._original, key))
        return null;
      result = P._convertJsonToDartLazy(this._original[key]);
      return this._processed[key] = result;
    }
  };
  P._JsonMap_addAll_closure.prototype = {
    call$2: function(key, value) {
      this.$this.$indexSet(0, H._asStringS(key), value);
    },
    $signature: 4
  };
  P._JsonMapKeyIterable.prototype = {
    get$length: function(_) {
      var t1 = this._parent;
      return t1.get$length(t1);
    },
    elementAt$1: function(_, index) {
      var t1 = this._parent;
      if (t1._processed == null)
        t1 = t1.get$keys(t1).elementAt$1(0, index);
      else {
        t1 = t1._convert$_computeKeys$0();
        if (index < 0 || index >= t1.length)
          return H.ioore(t1, index);
        t1 = t1[index];
      }
      return t1;
    },
    get$iterator: function(_) {
      var t1 = this._parent;
      if (t1._processed == null) {
        t1 = t1.get$keys(t1);
        t1 = t1.get$iterator(t1);
      } else {
        t1 = t1._convert$_computeKeys$0();
        t1 = new J.ArrayIterator(t1, t1.length, H._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
      }
      return t1;
    },
    contains$1: function(_, key) {
      return this._parent.containsKey$1(0, key);
    }
  };
  P.Base64Codec.prototype = {
    normalize$3: function(_, source, start, end) {
      var inverseAlphabet, i, sliceStart, buffer, firstPadding, firstPaddingSourceIndex, paddingCount, i0, char, i1, digit1, digit2, char0, value, t1, t2, endLength, $length,
        _s31_ = "Invalid base64 encoding length ";
      end = P.RangeError_checkValidRange(start, end, source.length);
      inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (i = start, sliceStart = i, buffer = null, firstPadding = -1, firstPaddingSourceIndex = -1, paddingCount = 0; i < end; i = i0) {
        i0 = i + 1;
        char = C.JSString_methods._codeUnitAt$1(source, i);
        if (char === 37) {
          i1 = i0 + 2;
          if (i1 <= end) {
            digit1 = H.hexDigitValue(C.JSString_methods._codeUnitAt$1(source, i0));
            digit2 = H.hexDigitValue(C.JSString_methods._codeUnitAt$1(source, i0 + 1));
            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 >= inverseAlphabet.length)
            return H.ioore(inverseAlphabet, char0);
          value = inverseAlphabet[char0];
          if (value >= 0) {
            char0 = C.JSString_methods.codeUnitAt$1("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", value);
            if (char0 === char)
              continue;
            char = char0;
          } else {
            if (value === -1) {
              if (firstPadding < 0) {
                t1 = buffer == null ? null : buffer._contents.length;
                if (t1 == null)
                  t1 = 0;
                firstPadding = t1 + (i - sliceStart);
                firstPaddingSourceIndex = i;
              }
              ++paddingCount;
              if (char === 61)
                continue;
            }
            char = char0;
          }
          if (value !== -2) {
            if (buffer == null) {
              buffer = new P.StringBuffer("");
              t1 = buffer;
            } else
              t1 = buffer;
            t1._contents += C.JSString_methods.substring$2(source, sliceStart, i);
            t1._contents += H.Primitives_stringFromCharCode(char);
            sliceStart = i0;
            continue;
          }
        }
        throw H.wrapException(P.FormatException$("Invalid base64 data", source, i));
      }
      if (buffer != null) {
        t1 = buffer._contents += C.JSString_methods.substring$2(source, sliceStart, end);
        t2 = t1.length;
        if (firstPadding >= 0)
          P.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, t2);
        else {
          endLength = C.JSInt_methods.$mod(t2 - 1, 4) + 1;
          if (endLength === 1)
            throw H.wrapException(P.FormatException$(_s31_, source, end));
          for (; endLength < 4;) {
            t1 += "=";
            buffer._contents = t1;
            ++endLength;
          }
        }
        t1 = buffer._contents;
        return C.JSString_methods.replaceRange$3(source, start, end, t1.charCodeAt(0) == 0 ? t1 : t1);
      }
      $length = end - start;
      if (firstPadding >= 0)
        P.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, $length);
      else {
        endLength = C.JSInt_methods.$mod($length, 4);
        if (endLength === 1)
          throw H.wrapException(P.FormatException$(_s31_, source, end));
        if (endLength > 1)
          source = C.JSString_methods.replaceRange$3(source, end, end, endLength === 2 ? "==" : "=");
      }
      return source;
    }
  };
  P.Base64Encoder.prototype = {};
  P.Codec.prototype = {};
  P.Converter.prototype = {};
  P.JsonUnsupportedObjectError.prototype = {
    toString$0: function(_) {
      var safeString = P.Error_safeToString(this.unsupportedObject);
      return (this.cause != null ? "Converting object to an encodable object failed:" : "Converting object did not return an encodable object:") + " " + safeString;
    }
  };
  P.JsonCyclicError.prototype = {
    toString$0: function(_) {
      return "Cyclic error in JSON stringify";
    }
  };
  P.JsonCodec.prototype = {
    decode$2$reviver: function(_, source, reviver) {
      var t1;
      type$.nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object._as(reviver);
      t1 = P._parseJson(source, this.get$decoder()._reviver);
      return t1;
    },
    encode$2$toEncodable: function(value, toEncodable) {
      var t1;
      type$.nullable_nullable_Object_Function_dynamic._as(toEncodable);
      t1 = P._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
      return t1;
    },
    get$encoder: function() {
      return C.JsonEncoder_null;
    },
    get$decoder: function() {
      return C.JsonDecoder_null;
    }
  };
  P.JsonEncoder.prototype = {};
  P.JsonDecoder.prototype = {};
  P._JsonStringifier.prototype = {
    writeStringContent$1: function(s) {
      var t1, offset, i, charCode, t2, t3, _this = this,
        $length = s.length;
      for (t1 = J.getInterceptor$s(s), offset = 0, i = 0; i < $length; ++i) {
        charCode = t1._codeUnitAt$1(s, i);
        if (charCode > 92) {
          if (charCode >= 55296) {
            t2 = charCode & 64512;
            if (t2 === 55296) {
              t3 = i + 1;
              t3 = !(t3 < $length && (C.JSString_methods._codeUnitAt$1(s, t3) & 64512) === 56320);
            } else
              t3 = false;
            if (!t3)
              if (t2 === 56320) {
                t2 = i - 1;
                t2 = !(t2 >= 0 && (C.JSString_methods.codeUnitAt$1(s, t2) & 64512) === 55296);
              } else
                t2 = false;
            else
              t2 = true;
            if (t2) {
              if (i > offset)
                _this.writeStringSlice$3(s, offset, i);
              offset = i + 1;
              _this.writeCharCode$1(92);
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(100);
              t2 = charCode >>> 8 & 15;
              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
              t2 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
              t2 = charCode & 15;
              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
            }
          }
          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);
              t2 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
              t2 = charCode & 15;
              _this.writeCharCode$1(t2 < 10 ? 48 + t2 : 87 + t2);
              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: function(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 H.wrapException(new P.JsonCyclicError(object, null));
      }
      C.JSArray_methods.add$1(t1, object);
    },
    writeObject$1: function(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 = P.JsonUnsupportedObjectError$(object, null, _this.get$_partialResult());
          throw H.wrapException(t1);
        }
        t1 = _this._seen;
        if (0 >= t1.length)
          return H.ioore(t1, -1);
        t1.pop();
      } catch (exception) {
        e = H.unwrapException(exception);
        t1 = P.JsonUnsupportedObjectError$(object, e, _this.get$_partialResult());
        throw H.wrapException(t1);
      }
    },
    writeJsonValue$1: function(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 H.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 H.ioore(t1, -1);
        t1.pop();
        return success;
      } else
        return false;
    },
    writeList$1: function(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: function(map) {
      var t2, keyValueList, i, separator, _this = this, _box_0 = {},
        t1 = J.getInterceptor$asx(map);
      if (t1.get$isEmpty(map)) {
        _this.writeString$1("{}");
        return true;
      }
      t2 = t1.get$length(map);
      if (typeof t2 !== "number")
        return t2.$mul();
      t2 *= 2;
      keyValueList = P.List_List$filled(t2, null, false, type$.nullable_Object);
      i = _box_0.i = 0;
      _box_0.allStringKeys = true;
      t1.forEach$1(map, new P._JsonStringifier_writeMap_closure(_box_0, keyValueList));
      if (!_box_0.allStringKeys)
        return false;
      _this.writeString$1("{");
      for (separator = '"'; i < t2; i += 2, separator = ',"') {
        _this.writeString$1(separator);
        _this.writeStringContent$1(H._asStringS(keyValueList[i]));
        _this.writeString$1('":');
        t1 = i + 1;
        if (t1 >= t2)
          return H.ioore(keyValueList, t1);
        _this.writeObject$1(keyValueList[t1]);
      }
      _this.writeString$1("}");
      return true;
    }
  };
  P._JsonStringifier_writeMap_closure.prototype = {
    call$2: function(key, value) {
      var t1, t2;
      if (typeof key != "string")
        this._box_0.allStringKeys = false;
      t1 = this.keyValueList;
      t2 = this._box_0;
      C.JSArray_methods.$indexSet(t1, t2.i++, key);
      C.JSArray_methods.$indexSet(t1, t2.i++, value);
    },
    $signature: 19
  };
  P._JsonStringStringifier.prototype = {
    get$_partialResult: function() {
      var t1 = this._convert$_sink;
      return t1 instanceof P.StringBuffer ? t1.toString$0(0) : null;
    },
    writeNumber$1: function(number) {
      this._convert$_sink.write$1(0, C.JSNumber_methods.toString$0(number));
    },
    writeString$1: function(string) {
      this._convert$_sink.write$1(0, string);
    },
    writeStringSlice$3: function(string, start, end) {
      this._convert$_sink.write$1(0, C.JSString_methods.substring$2(string, start, end));
    },
    writeCharCode$1: function(charCode) {
      this._convert$_sink.writeCharCode$1(charCode);
    }
  };
  P._symbolMapToStringMap_closure.prototype = {
    call$2: function(key, value) {
      this.result.$indexSet(0, type$.Symbol._as(key).__internal$_name, value);
    },
    $signature: 20
  };
  P.NoSuchMethodError_toString_closure.prototype = {
    call$2: function(key, value) {
      var t1, t2, t3;
      type$.Symbol._as(key);
      t1 = this.sb;
      t2 = this._box_0;
      t1._contents += t2.comma;
      t3 = t1._contents += H.S(key.__internal$_name);
      t1._contents = t3 + ": ";
      t1._contents += P.Error_safeToString(value);
      t2.comma = ", ";
    },
    $signature: 20
  };
  P._BigIntImpl.prototype = {
    $negate: function(_) {
      var t2, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return _this;
      t2 = !_this._isNegative;
      t3 = _this._digits;
      t1 = P._BigIntImpl__normalize(t1, t3);
      return new P._BigIntImpl(t1 === 0 ? false : t2, t3, t1);
    },
    _drShift$1: function(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 H.ioore(digits, i);
        t3 = digits[i];
        if (t2 >= resultUsed)
          return H.ioore(resultDigits, t2);
        resultDigits[t2] = t3;
      }
      t2 = _this._isNegative;
      t3 = P._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new P._BigIntImpl(t3 === 0 ? false : t2, resultDigits, t3);
      if (t2)
        for (i = 0; i < n; ++i) {
          if (i >= t1)
            return H.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      return result;
    },
    $shr: function(_, shiftAmount) {
      var t1, digitShift, bitShift, resultUsed, digits, resultDigits, t2, result, i, _this = this;
      if (typeof shiftAmount !== "number")
        return shiftAmount.$lt();
      if (shiftAmount < 0)
        throw H.wrapException(P.ArgumentError$("shift-amount must be posititve " + shiftAmount));
      t1 = _this._used;
      if (t1 === 0)
        return _this;
      digitShift = C.JSInt_methods._tdivFast$1(shiftAmount, 16);
      bitShift = C.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);
      P._BigIntImpl__rsh(digits, t1, shiftAmount, resultDigits);
      t1 = _this._isNegative;
      t2 = P._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new P._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
      if (t1) {
        t1 = digits.length;
        if (digitShift < 0 || digitShift >= t1)
          return H.ioore(digits, digitShift);
        if ((digits[digitShift] & C.JSInt_methods.$shl(1, bitShift) - 1) !== 0)
          return result.$sub(0, $.$get$_BigIntImpl_one());
        for (i = 0; i < digitShift; ++i) {
          if (i >= t1)
            return H.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      }
      return result;
    },
    compareTo$1: function(_, other) {
      var t1, result;
      type$._BigIntImpl._as(other);
      t1 = this._isNegative;
      if (t1 === other._isNegative) {
        result = P._BigIntImpl__compareDigits(this._digits, this._used, other._digits, other._used);
        return t1 ? 0 - result : result;
      }
      return t1 ? -1 : 1;
    },
    _absAddSetSign$2: function(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);
      P._BigIntImpl__absAdd(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = P._BigIntImpl__normalize(resultUsed, resultDigits);
      return new P._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    _absSubSetSign$2: function(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);
      P._BigIntImpl__absSub(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = P._BigIntImpl__normalize(used, resultDigits);
      return new P._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    $add: function(_, other) {
      var t1, t2, isNegative, _this = this;
      type$._BigIntImpl._as(other);
      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 (P._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $sub: function(_, other) {
      var t1, t2, isNegative, _this = this;
      type$._BigIntImpl._as(other);
      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 (P._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $mul: function(_, 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 H.ioore(otherDigits, i);
        P._BigIntImpl__mulAdd(otherDigits[i], digits, 0, resultDigits, i, used);
        ++i;
      }
      t1 = this._isNegative !== other._isNegative;
      t2 = P._BigIntImpl__normalize(resultUsed, resultDigits);
      return new P._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
    },
    _div$1: function(other) {
      var t1, t2, t3, t4, lastQuo_used, quo_digits, quo;
      if (this._used < other._used)
        return $.$get$_BigIntImpl_zero();
      this._divRem$1(other);
      t1 = $._BigIntImpl____lastQuoRemUsed;
      t2 = t1 === $ ? H.throwExpression(H.LateError$fieldNI("_lastQuoRemUsed")) : t1;
      t3 = $._BigIntImpl____lastRemUsed;
      t4 = t3 === $ ? H.throwExpression(H.LateError$fieldNI("_lastRemUsed")) : t3;
      if (typeof t2 !== "number")
        return t2.$sub();
      if (typeof t4 !== "number")
        return H.iae(t4);
      lastQuo_used = t2 - t4;
      t4 = $._BigIntImpl____lastQuoRemDigits;
      t2 = t4 === $ ? H.throwExpression(H.LateError$fieldNI("_lastQuoRemDigits")) : t4;
      quo_digits = P._BigIntImpl__cloneDigits(t2, t3, t1, lastQuo_used);
      t1 = P._BigIntImpl__normalize(lastQuo_used, quo_digits);
      quo = new P._BigIntImpl(false, quo_digits, t1);
      return this._isNegative !== other._isNegative && t1 > 0 ? quo.$negate(0) : quo;
    },
    _rem$1: function(other) {
      var t1, t2, t3, remDigits, rem, _this = this,
        _s12_ = "_lastRemUsed";
      if (_this._used < other._used)
        return _this;
      _this._divRem$1(other);
      t1 = $._BigIntImpl____lastQuoRemDigits;
      if (t1 === $)
        t1 = H.throwExpression(H.LateError$fieldNI("_lastQuoRemDigits"));
      t2 = $._BigIntImpl____lastRemUsed;
      t3 = t2 === $ ? H.throwExpression(H.LateError$fieldNI(_s12_)) : t2;
      remDigits = P._BigIntImpl__cloneDigits(t1, 0, t3, t2);
      t1 = $._BigIntImpl____lastRemUsed;
      t1 = P._BigIntImpl__normalize(t1 === $ ? H.throwExpression(H.LateError$fieldNI(_s12_)) : t1, remDigits);
      rem = new P._BigIntImpl(false, remDigits, t1);
      t1 = $._BigIntImpl____lastRem_nsh;
      t2 = t1 === $ ? H.throwExpression(H.LateError$fieldNI("_lastRem_nsh")) : t1;
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0)
        rem = rem.$shr(0, t1);
      return _this._isNegative && rem._used > 0 ? rem.$negate(0) : rem;
    },
    _divRem$1: function(other) {
      var yDigits, yUsed, t1, nsh, yDigits0, yUsed0, resultDigits, resultUsed0, topDigitDivisor, j, tmpDigits, tmpUsed, resultUsed1, t2, 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 H.ioore(yDigits, t1);
      nsh = 16 - C.JSInt_methods.get$bitLength(yDigits[t1]);
      if (nsh > 0) {
        yDigits0 = new Uint16Array(yUsed + 5);
        yUsed0 = P._BigIntImpl__lShiftDigits(yDigits, yUsed, nsh, yDigits0);
        resultDigits = new Uint16Array(resultUsed + 5);
        resultUsed0 = P._BigIntImpl__lShiftDigits(_this._digits, resultUsed, nsh, resultDigits);
      } else {
        resultDigits = P._BigIntImpl__cloneDigits(_this._digits, 0, resultUsed, resultUsed + 2);
        yUsed0 = yUsed;
        yDigits0 = yDigits;
        resultUsed0 = resultUsed;
      }
      t1 = yUsed0 - 1;
      if (t1 < 0 || t1 >= yDigits0.length)
        return H.ioore(yDigits0, t1);
      topDigitDivisor = yDigits0[t1];
      j = resultUsed0 - yUsed0;
      tmpDigits = new Uint16Array(resultUsed0);
      tmpUsed = P._BigIntImpl__dlShiftDigits(yDigits0, yUsed0, j, tmpDigits);
      resultUsed1 = resultUsed0 + 1;
      t1 = resultDigits.length;
      if (P._BigIntImpl__compareDigits(resultDigits, resultUsed0, tmpDigits, tmpUsed) >= 0) {
        if (resultUsed0 < 0 || resultUsed0 >= t1)
          return H.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 1;
        P._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
      } else {
        if (resultUsed0 < 0 || resultUsed0 >= t1)
          return H.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 0;
      }
      t2 = yUsed0 + 2;
      nyDigits = new Uint16Array(t2);
      if (yUsed0 < 0 || yUsed0 >= t2)
        return H.ioore(nyDigits, yUsed0);
      nyDigits[yUsed0] = 1;
      P._BigIntImpl__absSub(nyDigits, yUsed0 + 1, yDigits0, yUsed0, nyDigits);
      i = resultUsed0 - 1;
      for (; j > 0;) {
        estimatedQuotientDigit = P._BigIntImpl__estimateQuotientDigit(topDigitDivisor, resultDigits, i);
        --j;
        P._BigIntImpl__mulAdd(estimatedQuotientDigit, nyDigits, 0, resultDigits, j, yUsed0);
        if (i < 0 || i >= t1)
          return H.ioore(resultDigits, i);
        if (resultDigits[i] < estimatedQuotientDigit) {
          tmpUsed = P._BigIntImpl__dlShiftDigits(nyDigits, yUsed0, j, tmpDigits);
          P._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
          for (; --estimatedQuotientDigit, resultDigits[i] < estimatedQuotientDigit;)
            P._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
        }
        --i;
      }
      $._BigIntImpl__lastDividendDigits = _this._digits;
      $._BigIntImpl__lastDividendUsed = resultUsed;
      $._BigIntImpl__lastDivisorDigits = yDigits;
      $._BigIntImpl__lastDivisorUsed = yUsed;
      $._BigIntImpl____lastQuoRemDigits = resultDigits;
      $._BigIntImpl____lastQuoRemUsed = resultUsed1;
      $._BigIntImpl____lastRemUsed = yUsed0;
      $._BigIntImpl____lastRem_nsh = nsh;
    },
    get$hashCode: function(_) {
      var hash, t2, t3, i,
        combine = new P._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 H.ioore(t2, i);
        hash = combine.call$2(hash, t2[i]);
      }
      return new P._BigIntImpl_hashCode_finish().call$1(hash);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof P._BigIntImpl && this.compareTo$1(0, other) === 0;
    },
    toString$0: function(_) {
      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 H.ioore(t1, 0);
          return C.JSInt_methods.toString$0(-t1[0]);
        }
        t1 = _this._digits;
        if (0 >= t1.length)
          return H.ioore(t1, 0);
        return C.JSInt_methods.toString$0(t1[0]);
      }
      decimalDigitChunks = H.setRuntimeTypeInfo([], type$.JSArray_String);
      t1 = _this._isNegative;
      rest = t1 ? _this.$negate(0) : _this;
      for (; rest._used > 1;) {
        t2 = $.$get$_BigIntImpl__bigInt10000();
        if (t2._used === 0)
          H.throwExpression(C.C_IntegerDivisionByZeroException);
        digits4 = J.toString$0$(rest._rem$1(t2));
        C.JSArray_methods.add$1(decimalDigitChunks, digits4);
        t3 = digits4.length;
        if (t3 === 1)
          C.JSArray_methods.add$1(decimalDigitChunks, "000");
        if (t3 === 2)
          C.JSArray_methods.add$1(decimalDigitChunks, "00");
        if (t3 === 3)
          C.JSArray_methods.add$1(decimalDigitChunks, "0");
        rest = rest._div$1(t2);
      }
      t2 = rest._digits;
      if (0 >= t2.length)
        return H.ioore(t2, 0);
      C.JSArray_methods.add$1(decimalDigitChunks, C.JSInt_methods.toString$0(t2[0]));
      if (t1)
        C.JSArray_methods.add$1(decimalDigitChunks, "-");
      return new H.ReversedListIterable(decimalDigitChunks, type$.ReversedListIterable_String).join$0(0);
    },
    $isBigInt: 1,
    $isComparable: 1
  };
  P._BigIntImpl_hashCode_combine.prototype = {
    call$2: function(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $signature: 21
  };
  P._BigIntImpl_hashCode_finish.prototype = {
    call$1: function(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    $signature: 58
  };
  P.DateTime.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof P.DateTime && this._value === other._value && this.isUtc === other.isUtc;
    },
    compareTo$1: function(_, other) {
      return C.JSInt_methods.compareTo$1(this._value, type$.DateTime._as(other)._value);
    },
    get$hashCode: function(_) {
      var t1 = this._value;
      return (t1 ^ C.JSInt_methods._shrOtherPositive$1(t1, 30)) & 1073741823;
    },
    toString$0: function(_) {
      var _this = this,
        y = P.DateTime__fourDigits(H.Primitives_getYear(_this)),
        m = P.DateTime__twoDigits(H.Primitives_getMonth(_this)),
        d = P.DateTime__twoDigits(H.Primitives_getDay(_this)),
        h = P.DateTime__twoDigits(H.Primitives_getHours(_this)),
        min = P.DateTime__twoDigits(H.Primitives_getMinutes(_this)),
        sec = P.DateTime__twoDigits(H.Primitives_getSeconds(_this)),
        ms = P.DateTime__threeDigits(H.Primitives_getMilliseconds(_this));
      if (_this.isUtc)
        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
      else
        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
    },
    $isComparable: 1
  };
  P.Duration.prototype = {
    $add: function(_, other) {
      return new P.Duration(C.JSInt_methods.$add(this._duration, type$.Duration._as(other).get$_duration()));
    },
    $sub: function(_, other) {
      return new P.Duration(C.JSInt_methods.$sub(this._duration, type$.Duration._as(other).get$_duration()));
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof P.Duration && this._duration === other._duration;
    },
    get$hashCode: function(_) {
      return C.JSInt_methods.get$hashCode(this._duration);
    },
    compareTo$1: function(_, other) {
      return C.JSInt_methods.compareTo$1(this._duration, type$.Duration._as(other)._duration);
    },
    toString$0: function(_) {
      var twoDigitMinutes, twoDigitSeconds, sixDigitUs,
        t1 = new P.Duration_toString_twoDigits(),
        t2 = this._duration;
      if (t2 < 0)
        return "-" + new P.Duration(0 - t2).toString$0(0);
      twoDigitMinutes = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 60000000) % 60);
      twoDigitSeconds = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 1000000) % 60);
      sixDigitUs = new P.Duration_toString_sixDigits().call$1(t2 % 1000000);
      return "" + C.JSInt_methods._tdivFast$1(t2, 3600000000) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
    },
    $isComparable: 1
  };
  P.Duration_toString_sixDigits.prototype = {
    call$1: function(n) {
      if (n >= 100000)
        return "" + n;
      if (n >= 10000)
        return "0" + n;
      if (n >= 1000)
        return "00" + n;
      if (n >= 100)
        return "000" + n;
      if (n >= 10)
        return "0000" + n;
      return "00000" + n;
    },
    $signature: 22
  };
  P.Duration_toString_twoDigits.prototype = {
    call$1: function(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    $signature: 22
  };
  P.Error.prototype = {
    get$stackTrace: function() {
      return H.getTraceFromException(this.$thrownJsError);
    }
  };
  P.AssertionError.prototype = {
    toString$0: function(_) {
      var t1 = this.message;
      if (t1 != null)
        return "Assertion failed: " + P.Error_safeToString(t1);
      return "Assertion failed";
    }
  };
  P.TypeError.prototype = {};
  P.NullThrownError.prototype = {
    toString$0: function(_) {
      return "Throw of null.";
    }
  };
  P.ArgumentError.prototype = {
    get$_errorName: function() {
      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
    },
    get$_errorExplanation: function() {
      return "";
    },
    toString$0: function(_) {
      var explanation, errorValue, _this = this,
        $name = _this.name,
        nameString = $name == null ? "" : " (" + $name + ")",
        message = _this.message,
        messageString = message == null ? "" : ": " + H.S(message),
        prefix = _this.get$_errorName() + nameString + messageString;
      if (!_this._hasValue)
        return prefix;
      explanation = _this.get$_errorExplanation();
      errorValue = P.Error_safeToString(_this.invalidValue);
      return prefix + explanation + ": " + errorValue;
    }
  };
  P.RangeError.prototype = {
    get$_errorName: function() {
      return "RangeError";
    },
    get$_errorExplanation: function() {
      var explanation,
        start = this.start,
        end = this.end;
      if (start == null)
        explanation = end != null ? ": Not less than or equal to " + H.S(end) : "";
      else if (end == null)
        explanation = ": Not greater than or equal to " + H.S(start);
      else if (end > start)
        explanation = ": Not in inclusive range " + H.S(start) + ".." + H.S(end);
      else
        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + H.S(start);
      return explanation;
    }
  };
  P.IndexError.prototype = {
    get$_errorName: function() {
      return "RangeError";
    },
    get$_errorExplanation: function() {
      var t1,
        invalidValue = H._asIntS(this.invalidValue);
      if (typeof invalidValue !== "number")
        return invalidValue.$lt();
      if (invalidValue < 0)
        return ": index must not be negative";
      t1 = this.length;
      if (t1 === 0)
        return ": no indices are valid";
      return ": index should be less than " + H.S(t1);
    },
    get$length: function(receiver) {
      return this.length;
    }
  };
  P.NoSuchMethodError.prototype = {
    toString$0: function(_) {
      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
        sb = new P.StringBuffer("");
      _box_0.comma = "";
      $arguments = _this._core$_arguments;
      for (t1 = $arguments.length, _i = 0, t2 = "", t3 = ""; _i < t1; ++_i, t3 = ", ") {
        argument = $arguments[_i];
        sb._contents = t2 + t3;
        t2 = sb._contents += P.Error_safeToString(argument);
        _box_0.comma = ", ";
      }
      _this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(_box_0, sb));
      receiverText = P.Error_safeToString(_this._core$_receiver);
      actualParameters = sb.toString$0(0);
      t1 = "NoSuchMethodError: method not found: '" + H.S(_this._core$_memberName.__internal$_name) + "'\nReceiver: " + receiverText + "\nArguments: [" + actualParameters + "]";
      return t1;
    }
  };
  P.UnsupportedError.prototype = {
    toString$0: function(_) {
      return "Unsupported operation: " + this.message;
    }
  };
  P.UnimplementedError.prototype = {
    toString$0: function(_) {
      var message = this.message;
      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
    }
  };
  P.StateError.prototype = {
    toString$0: function(_) {
      return "Bad state: " + this.message;
    }
  };
  P.ConcurrentModificationError.prototype = {
    toString$0: function(_) {
      var t1 = this.modifiedObject;
      if (t1 == null)
        return "Concurrent modification during iteration.";
      return "Concurrent modification during iteration: " + P.Error_safeToString(t1) + ".";
    }
  };
  P.OutOfMemoryError.prototype = {
    toString$0: function(_) {
      return "Out of Memory";
    },
    get$stackTrace: function() {
      return null;
    },
    $isError: 1
  };
  P.StackOverflowError.prototype = {
    toString$0: function(_) {
      return "Stack Overflow";
    },
    get$stackTrace: function() {
      return null;
    },
    $isError: 1
  };
  P.CyclicInitializationError.prototype = {
    toString$0: function(_) {
      var variableName = this.variableName;
      return variableName == null ? "Reading static variable during its initialization" : "Reading static variable '" + variableName + "' during its initialization";
    }
  };
  P._Exception.prototype = {
    toString$0: function(_) {
      return "Exception: " + this.message;
    }
  };
  P.FormatException.prototype = {
    toString$0: function(_) {
      var t1, lineNum, lineStart, previousCharWasCR, i, char, lineEnd, end, start, prefix, postfix, slice,
        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 = C.JSString_methods.substring$2(source, 0, 75) + "...";
          return report + "\n" + source;
        }
        for (lineNum = 1, lineStart = 0, previousCharWasCR = false, i = 0; i < offset; ++i) {
          char = C.JSString_methods._codeUnitAt$1(source, 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");
        lineEnd = source.length;
        for (i = offset; i < lineEnd; ++i) {
          char = C.JSString_methods.codeUnitAt$1(source, i);
          if (char === 10 || char === 13) {
            lineEnd = i;
            break;
          }
        }
        if (lineEnd - lineStart > 78)
          if (offset - lineStart < 75) {
            end = lineStart + 75;
            start = lineStart;
            prefix = "";
            postfix = "...";
          } else {
            if (lineEnd - offset < 75) {
              start = lineEnd - 75;
              end = lineEnd;
              postfix = "";
            } else {
              start = offset - 36;
              end = offset + 36;
              postfix = "...";
            }
            prefix = "...";
          }
        else {
          end = lineEnd;
          start = lineStart;
          prefix = "";
          postfix = "";
        }
        slice = C.JSString_methods.substring$2(source, start, end);
        return report + prefix + slice + postfix + "\n" + C.JSString_methods.$mul(" ", offset - start + prefix.length) + "^\n";
      } else
        return offset != null ? report + (" (at offset " + H.S(offset) + ")") : report;
    }
  };
  P.IntegerDivisionByZeroException.prototype = {
    toString$0: function(_) {
      return "IntegerDivisionByZeroException";
    }
  };
  P.Iterable.prototype = {
    cast$1$0: function(_, $R) {
      return H.CastIterable_CastIterable(this, H._instanceType(this)._eval$1("Iterable.E"), $R);
    },
    map$1$1: function(_, f, $T) {
      var t1 = H._instanceType(this);
      return H.MappedIterable_MappedIterable(this, t1._bind$1($T)._eval$1("1(Iterable.E)")._as(f), t1._eval$1("Iterable.E"), $T);
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    where$1: function(_, test) {
      var t1 = H._instanceType(this);
      return new H.WhereIterable(this, t1._eval$1("bool(Iterable.E)")._as(test), t1._eval$1("WhereIterable<Iterable.E>"));
    },
    contains$1: function(_, element) {
      var t1;
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        if (J.$eq$(t1.get$current(t1), element))
          return true;
      return false;
    },
    forEach$1: function(_, f) {
      var t1;
      H._instanceType(this)._eval$1("~(Iterable.E)")._as(f);
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        f.call$1(t1.get$current(t1));
    },
    toList$1$growable: function(_, growable) {
      return P.List_List$of(this, growable, H._instanceType(this)._eval$1("Iterable.E"));
    },
    toList$0: function($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$length: function(_) {
      var count,
        it = this.get$iterator(this);
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    get$isEmpty: function(_) {
      return !this.get$iterator(this).moveNext$0();
    },
    get$isNotEmpty: function(_) {
      return !this.get$isEmpty(this);
    },
    skip$1: function(_, count) {
      return H.SkipIterable_SkipIterable(this, count, H._instanceType(this)._eval$1("Iterable.E"));
    },
    get$first: function(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw H.wrapException(H.IterableElementError_noElement());
      return it.get$current(it);
    },
    get$single: function(_) {
      var result,
        it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw H.wrapException(H.IterableElementError_noElement());
      result = it.get$current(it);
      if (it.moveNext$0())
        throw H.wrapException(H.IterableElementError_tooMany());
      return result;
    },
    elementAt$1: function(_, index) {
      var t1, elementIndex, element;
      P.RangeError_checkNotNegative(index, "index");
      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (index === elementIndex)
          return element;
        ++elementIndex;
      }
      throw H.wrapException(P.IndexError$(index, this, "index", null, elementIndex));
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToShortString(this, "(", ")");
    }
  };
  P.Iterator.prototype = {};
  P.Null.prototype = {
    get$hashCode: function(_) {
      return P.Object.prototype.get$hashCode.call(this, this);
    },
    toString$0: function(_) {
      return "null";
    }
  };
  P.Object.prototype = {constructor: P.Object, $isObject: 1,
    $eq: function(_, other) {
      return this === other;
    },
    get$hashCode: function(_) {
      return H.Primitives_objectHashCode(this);
    },
    toString$0: function(_) {
      return "Instance of '" + H.S(H.Primitives_objectTypeName(this)) + "'";
    },
    noSuchMethod$1: function(_, invocation) {
      type$.Invocation._as(invocation);
      throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
    },
    get$runtimeType: function(_) {
      return H.getRuntimeType(this);
    },
    toString: function() {
      return this.toString$0(this);
    }
  };
  P._StringStackTrace.prototype = {
    toString$0: function(_) {
      return "";
    },
    $isStackTrace: 1
  };
  P.StringBuffer.prototype = {
    get$length: function(_) {
      return this._contents.length;
    },
    write$1: function(_, obj) {
      this._contents += H.S(obj);
    },
    writeCharCode$1: function(charCode) {
      this._contents += H.Primitives_stringFromCharCode(charCode);
    },
    toString$0: function(_) {
      var t1 = this._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    $isStringSink: 1
  };
  P.Uri__parseIPv4Address_error.prototype = {
    call$2: function(msg, position) {
      throw H.wrapException(P.FormatException$("Illegal IPv4 address, " + msg, this.host, position));
    },
    $signature: 62
  };
  P.Uri_parseIPv6Address_error.prototype = {
    call$2: function(msg, position) {
      throw H.wrapException(P.FormatException$("Illegal IPv6 address, " + msg, this.host, position));
    },
    call$1: function(msg) {
      return this.call$2(msg, null);
    },
    $signature: 63
  };
  P.Uri_parseIPv6Address_parseHex.prototype = {
    call$2: function(start, end) {
      var value;
      if (end - start > 4)
        this.error.call$2("an IPv6 part can only contain a maximum of 4 hex digits", start);
      value = P.int_parse(C.JSString_methods.substring$2(this.host, start, end), 16);
      if (value < 0 || value > 65535)
        this.error.call$2("each part must be in the range of `0x0..0xFFFF`", start);
      return value;
    },
    $signature: 21
  };
  P._Uri.prototype = {
    get$_text: function() {
      var t2, t3, t4, _this = this,
        t1 = _this.___Uri__text;
      if (t1 === $) {
        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 + ":" + H.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;
        t1 = t1.charCodeAt(0) == 0 ? t1 : t1;
        if (_this.___Uri__text === $)
          _this.___Uri__text = t1;
        else
          t1 = H.throwExpression(H.LateError$fieldADI("_text"));
      }
      return t1;
    },
    get$hashCode: function(_) {
      var _this = this,
        t1 = _this.___Uri_hashCode;
      if (t1 === $) {
        t1 = J.get$hashCode$(_this.get$_text());
        if (_this.___Uri_hashCode === $)
          _this.___Uri_hashCode = t1;
        else
          t1 = H.throwExpression(H.LateError$fieldADI("hashCode"));
      }
      return t1;
    },
    get$userInfo: function() {
      return this._userInfo;
    },
    get$host: function(_) {
      var host = this._host;
      if (host == null)
        return "";
      if (C.JSString_methods.startsWith$1(host, "["))
        return C.JSString_methods.substring$2(host, 1, host.length - 1);
      return host;
    },
    get$port: function(_) {
      var t1 = this._port;
      return t1 == null ? P._Uri__defaultPort(this.scheme) : t1;
    },
    get$query: function(_) {
      var t1 = this._query;
      return t1 == null ? "" : t1;
    },
    get$fragment: function() {
      var t1 = this._fragment;
      return t1 == null ? "" : t1;
    },
    isScheme$1: function(scheme) {
      var thisScheme = this.scheme;
      if (scheme.length !== thisScheme.length)
        return false;
      return P._Uri__compareScheme(scheme, thisScheme);
    },
    replace$1$scheme: function(_, scheme) {
      var isFile, userInfo, port, host, currentPath, t1, path, _this = this;
      scheme = P._Uri__makeScheme(scheme, 0, scheme.length);
      isFile = scheme === "file";
      userInfo = _this._userInfo;
      port = _this._port;
      if (scheme !== _this.scheme)
        port = P._Uri__makePort(port, scheme);
      host = _this._host;
      if (!(host != null))
        host = userInfo.length !== 0 || port != null || isFile ? "" : null;
      currentPath = _this.path;
      if (!isFile)
        t1 = host != null && currentPath.length !== 0;
      else
        t1 = true;
      if (t1 && !C.JSString_methods.startsWith$1(currentPath, "/"))
        currentPath = "/" + currentPath;
      path = currentPath;
      return P._Uri$_internal(scheme, userInfo, host, port, path, _this._query, _this._fragment);
    },
    get$hasAuthority: function() {
      return this._host != null;
    },
    get$hasQuery: function() {
      return this._query != null;
    },
    get$hasFragment: function() {
      return this._fragment != null;
    },
    toString$0: function(_) {
      return this.get$_text();
    },
    $eq: function(_, other) {
      var t1, t2, _this = this;
      if (other == null)
        return false;
      if (_this === other)
        return true;
      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(_this) === other.get$host(other))
                if (_this.get$port(_this) === other.get$port(other))
                  if (_this.path === other.get$path(other)) {
                    t1 = _this._query;
                    t2 = t1 == null;
                    if (!t2 === other.get$hasQuery()) {
                      if (t2)
                        t1 = "";
                      if (t1 === other.get$query(other)) {
                        t1 = _this._fragment;
                        t2 = t1 == null;
                        if (!t2 === other.get$hasFragment()) {
                          if (t2)
                            t1 = "";
                          t1 = t1 === other.get$fragment();
                        } else
                          t1 = false;
                      } else
                        t1 = false;
                    } else
                      t1 = false;
                  } else
                    t1 = false;
                else
                  t1 = false;
              else
                t1 = false;
            else
              t1 = false;
          else
            t1 = false;
        else
          t1 = false;
      else
        t1 = false;
      return t1;
    },
    $isUri: 1,
    get$scheme: function() {
      return this.scheme;
    },
    get$path: function(receiver) {
      return this.path;
    }
  };
  P.UriData.prototype = {
    get$uri: function() {
      var t2, queryIndex, end, query, _this = this, _null = null,
        t1 = _this._uriCache;
      if (t1 == null) {
        t1 = _this._separatorIndices;
        if (0 >= t1.length)
          return H.ioore(t1, 0);
        t2 = _this._text;
        t1 = t1[0] + 1;
        queryIndex = C.JSString_methods.indexOf$2(t2, "?", t1);
        end = t2.length;
        if (queryIndex >= 0) {
          query = P._Uri__normalizeOrSubstring(t2, queryIndex + 1, end, C.List_CVk, false);
          end = queryIndex;
        } else
          query = _null;
        t1 = _this._uriCache = new P._DataUri("data", "", _null, _null, P._Uri__normalizeOrSubstring(t2, t1, end, C.List_qg4, false), query, _null);
      }
      return t1;
    },
    toString$0: function(_) {
      var t2,
        t1 = this._separatorIndices;
      if (0 >= t1.length)
        return H.ioore(t1, 0);
      t2 = this._text;
      return t1[0] === -1 ? "data:" + t2 : t2;
    }
  };
  P._createTables_build.prototype = {
    call$2: function(state, defaultTransition) {
      var t1 = this.tables;
      if (state >= t1.length)
        return H.ioore(t1, state);
      t1 = t1[state];
      C.NativeUint8List_methods.fillRange$3(t1, 0, 96, defaultTransition);
      return t1;
    },
    $signature: 78
  };
  P._createTables_setChars.prototype = {
    call$3: function(target, chars, transition) {
      var t1, i, t2;
      for (t1 = chars.length, i = 0; i < t1; ++i) {
        t2 = C.JSString_methods._codeUnitAt$1(chars, i) ^ 96;
        if (t2 >= 96)
          return H.ioore(target, t2);
        target[t2] = transition;
      }
    },
    $signature: 23
  };
  P._createTables_setRange.prototype = {
    call$3: function(target, range, transition) {
      var i, n, t1;
      for (i = C.JSString_methods._codeUnitAt$1(range, 0), n = C.JSString_methods._codeUnitAt$1(range, 1); i <= n; ++i) {
        t1 = (i ^ 96) >>> 0;
        if (t1 >= 96)
          return H.ioore(target, t1);
        target[t1] = transition;
      }
    },
    $signature: 23
  };
  P._SimpleUri.prototype = {
    get$hasAuthority: function() {
      return this._hostStart > 0;
    },
    get$hasPort: function() {
      return this._hostStart > 0 && this._portStart + 1 < this._pathStart;
    },
    get$hasQuery: function() {
      return this._queryStart < this._fragmentStart;
    },
    get$hasFragment: function() {
      return this._fragmentStart < this._uri.length;
    },
    isScheme$1: function(scheme) {
      var t1 = scheme.length;
      if (t1 === 0)
        return this._schemeEnd < 0;
      if (t1 !== this._schemeEnd)
        return false;
      return P._Uri__compareScheme(scheme, this._uri);
    },
    get$scheme: function() {
      var t1 = this._schemeCache;
      return t1 == null ? this._schemeCache = this._computeScheme$0() : t1;
    },
    _computeScheme$0: function() {
      var t2, _this = this,
        t1 = _this._schemeEnd;
      if (t1 <= 0)
        return "";
      t2 = t1 === 4;
      if (t2 && C.JSString_methods.startsWith$1(_this._uri, "http"))
        return "http";
      if (t1 === 5 && C.JSString_methods.startsWith$1(_this._uri, "https"))
        return "https";
      if (t2 && C.JSString_methods.startsWith$1(_this._uri, "file"))
        return "file";
      if (t1 === 7 && C.JSString_methods.startsWith$1(_this._uri, "package"))
        return "package";
      return C.JSString_methods.substring$2(_this._uri, 0, t1);
    },
    get$userInfo: function() {
      var t1 = this._hostStart,
        t2 = this._schemeEnd + 3;
      return t1 > t2 ? C.JSString_methods.substring$2(this._uri, t2, t1 - 1) : "";
    },
    get$host: function(_) {
      var t1 = this._hostStart;
      return t1 > 0 ? C.JSString_methods.substring$2(this._uri, t1, this._portStart) : "";
    },
    get$port: function(_) {
      var t1, _this = this;
      if (_this.get$hasPort())
        return P.int_parse(C.JSString_methods.substring$2(_this._uri, _this._portStart + 1, _this._pathStart), null);
      t1 = _this._schemeEnd;
      if (t1 === 4 && C.JSString_methods.startsWith$1(_this._uri, "http"))
        return 80;
      if (t1 === 5 && C.JSString_methods.startsWith$1(_this._uri, "https"))
        return 443;
      return 0;
    },
    get$path: function(_) {
      return C.JSString_methods.substring$2(this._uri, this._pathStart, this._queryStart);
    },
    get$query: function(_) {
      var t1 = this._queryStart,
        t2 = this._fragmentStart;
      return t1 < t2 ? C.JSString_methods.substring$2(this._uri, t1 + 1, t2) : "";
    },
    get$fragment: function() {
      var t1 = this._fragmentStart,
        t2 = this._uri;
      return t1 < t2.length ? C.JSString_methods.substring$1(t2, t1 + 1) : "";
    },
    replace$1$scheme: function(_, scheme) {
      var schemeChanged, isFile, t1, userInfo, port, host, t2, path, t3, query, fragment, _this = this, _null = null;
      scheme = P._Uri__makeScheme(scheme, 0, scheme.length);
      schemeChanged = !(_this._schemeEnd === scheme.length && C.JSString_methods.startsWith$1(_this._uri, scheme));
      isFile = scheme === "file";
      t1 = _this._hostStart;
      userInfo = t1 > 0 ? C.JSString_methods.substring$2(_this._uri, _this._schemeEnd + 3, t1) : "";
      port = _this.get$hasPort() ? _this.get$port(_this) : _null;
      if (schemeChanged)
        port = P._Uri__makePort(port, scheme);
      t1 = _this._hostStart;
      if (t1 > 0)
        host = C.JSString_methods.substring$2(_this._uri, t1, _this._portStart);
      else
        host = userInfo.length !== 0 || port != null || isFile ? "" : _null;
      t1 = _this._uri;
      t2 = _this._queryStart;
      path = C.JSString_methods.substring$2(t1, _this._pathStart, t2);
      if (!isFile)
        t3 = host != null && path.length !== 0;
      else
        t3 = true;
      if (t3 && !C.JSString_methods.startsWith$1(path, "/"))
        path = "/" + path;
      t3 = _this._fragmentStart;
      query = t2 < t3 ? C.JSString_methods.substring$2(t1, t2 + 1, t3) : _null;
      t2 = _this._fragmentStart;
      fragment = t2 < t1.length ? C.JSString_methods.substring$1(t1, t2 + 1) : _null;
      return P._Uri$_internal(scheme, userInfo, host, port, path, query, fragment);
    },
    get$hashCode: function(_) {
      var t1 = this._hashCodeCache;
      return t1 == null ? this._hashCodeCache = C.JSString_methods.get$hashCode(this._uri) : t1;
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return type$.Uri._is(other) && this._uri === other.toString$0(0);
    },
    toString$0: function(_) {
      return this._uri;
    },
    $isUri: 1
  };
  P._DataUri.prototype = {};
  W.HtmlElement.prototype = {$isHtmlElement: 1};
  W.AccessibleNodeList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.AnchorElement.prototype = {
    set$href: function(receiver, value) {
      receiver.href = value;
    },
    toString$0: function(receiver) {
      return String(receiver);
    },
    $isAnchorElement: 1
  };
  W.AreaElement.prototype = {
    toString$0: function(receiver) {
      return String(receiver);
    }
  };
  W.BaseElement.prototype = {$isBaseElement: 1};
  W.Blob.prototype = {$isBlob: 1};
  W.BodyElement.prototype = {$isBodyElement: 1};
  W.CharacterData.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.CloseEvent.prototype = {$isCloseEvent: 1};
  W.CssPerspective.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.CssRule.prototype = {$isCssRule: 1};
  W.CssStyleDeclaration.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.CssStyleDeclarationBase.prototype = {};
  W.CssStyleValue.prototype = {};
  W.CssTransformComponent.prototype = {};
  W.CssTransformValue.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.CssUnparsedValue.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.DataTransferItemList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.Document.prototype = {$isDocument: 1};
  W.DomException.prototype = {
    toString$0: function(receiver) {
      return String(receiver);
    }
  };
  W.DomImplementation.prototype = {
    createHtmlDocument$1: function(receiver, title) {
      return receiver.createHTMLDocument(title);
    }
  };
  W.DomRectList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Rectangle_num._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.DomRectReadOnly.prototype = {
    toString$0: function(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t1 = "Rectangle (" + H.S(t1) + ", ";
      t2 = receiver.top;
      t2.toString;
      return t1 + H.S(t2) + ") " + H.S(this.get$width(receiver)) + " x " + H.S(this.get$height(receiver));
    },
    $eq: function(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = J.getInterceptor$x(other);
            t1 = this.get$width(receiver) == t1.get$width(other) && this.get$height(receiver) == t1.get$height(other);
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode: function(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t1 = C.JSNumber_methods.get$hashCode(t1);
      t2 = receiver.top;
      t2.toString;
      return W._JenkinsSmiHash_hash4(t1, C.JSNumber_methods.get$hashCode(t2), J.get$hashCode$(this.get$width(receiver)), J.get$hashCode$(this.get$height(receiver)));
    },
    get$_height: function(receiver) {
      return receiver.height;
    },
    get$height: function(receiver) {
      var t1 = this.get$_height(receiver);
      t1.toString;
      return t1;
    },
    get$_width: function(receiver) {
      return receiver.width;
    },
    get$width: function(receiver) {
      var t1 = this.get$_width(receiver);
      t1.toString;
      return t1;
    },
    $isRectangle: 1
  };
  W.DomStringList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._asStringS(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.DomTokenList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W._FrozenElementList.prototype = {
    get$length: function(_) {
      return this._nodeList.length;
    },
    $index: function(_, index) {
      var t1 = this._nodeList;
      if (index < 0 || index >= t1.length)
        return H.ioore(t1, index);
      return this.$ti._precomputed1._as(t1[index]);
    },
    $indexSet: function(_, index, value) {
      H._asIntS(index);
      this.$ti._precomputed1._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
    },
    sort$1: function(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      throw H.wrapException(P.UnsupportedError$("Cannot sort list"));
    },
    get$first: function(_) {
      return this.$ti._precomputed1._as(C.NodeList_methods.get$first(this._nodeList));
    }
  };
  W.Element.prototype = {
    get$attributes: function(receiver) {
      return new W._ElementAttributeMap(receiver);
    },
    toString$0: function(receiver) {
      return receiver.localName;
    },
    createFragment$3$treeSanitizer$validator: function(receiver, html, treeSanitizer, validator) {
      var t1, t2, contextElement, fragment;
      if (treeSanitizer == null) {
        t1 = $.Element__defaultValidator;
        if (t1 == null) {
          t1 = H.setRuntimeTypeInfo([], type$.JSArray_NodeValidator);
          t2 = new W.NodeValidatorBuilder(t1);
          C.JSArray_methods.add$1(t1, W._Html5NodeValidator$(null));
          C.JSArray_methods.add$1(t1, W._TemplatingNodeValidator$());
          $.Element__defaultValidator = t2;
          validator = t2;
        } else
          validator = t1;
        t1 = $.Element__defaultSanitizer;
        if (t1 == null) {
          t1 = new W._ValidatingTreeSanitizer(validator);
          $.Element__defaultSanitizer = t1;
          treeSanitizer = t1;
        } else {
          t1.validator = validator;
          treeSanitizer = t1;
        }
      }
      if ($.Element__parseDocument == null) {
        t1 = document;
        t2 = t1.implementation;
        t2.toString;
        t2 = C.DomImplementation_methods.createHtmlDocument$1(t2, "");
        $.Element__parseDocument = t2;
        $.Element__parseRange = t2.createRange();
        t2 = $.Element__parseDocument.createElement("base");
        type$.BaseElement._as(t2);
        t1 = t1.baseURI;
        t1.toString;
        t2.href = t1;
        $.Element__parseDocument.head.appendChild(t2);
      }
      t1 = $.Element__parseDocument;
      if (t1.body == null) {
        t2 = t1.createElement("body");
        C.HtmlDocument_methods.set$body(t1, type$.BodyElement._as(t2));
      }
      t1 = $.Element__parseDocument;
      if (type$.BodyElement._is(receiver)) {
        t1 = t1.body;
        t1.toString;
        contextElement = t1;
      } else {
        t1.toString;
        contextElement = t1.createElement(receiver.tagName);
        $.Element__parseDocument.body.appendChild(contextElement);
      }
      if ("createContextualFragment" in window.Range.prototype && !C.JSArray_methods.contains$1(C.List_ego, receiver.tagName)) {
        $.Element__parseRange.selectNodeContents(contextElement);
        t1 = $.Element__parseRange;
        fragment = t1.createContextualFragment(html);
      } else {
        J.set$_innerHtml$x(contextElement, html);
        fragment = $.Element__parseDocument.createDocumentFragment();
        for (; t1 = contextElement.firstChild, t1 != null;)
          fragment.appendChild(t1);
      }
      if (contextElement !== $.Element__parseDocument.body)
        J.remove$0$x(contextElement);
      treeSanitizer.sanitizeTree$1(fragment);
      document.adoptNode(fragment);
      return fragment;
    },
    createFragment$2$treeSanitizer: function($receiver, html, treeSanitizer) {
      return this.createFragment$3$treeSanitizer$validator($receiver, html, treeSanitizer, null);
    },
    setInnerHtml$1: function(receiver, html) {
      this.set$text(receiver, null);
      receiver.appendChild(this.createFragment$3$treeSanitizer$validator(receiver, html, null, null));
    },
    set$_innerHtml: function(receiver, value) {
      receiver.innerHTML = value;
    },
    get$tagName: function(receiver) {
      return receiver.tagName;
    },
    $isElement: 1
  };
  W.Element_Element$html_closure.prototype = {
    call$1: function(e) {
      return type$.Element._is(type$.Node._as(e));
    },
    $signature: 80
  };
  W.Event.prototype = {$isEvent: 1};
  W.EventSource.prototype = {$isEventSource: 1};
  W.EventTarget.prototype = {
    addEventListener$3: function(receiver, type, listener, useCapture) {
      type$.nullable_dynamic_Function_Event._as(listener);
      if (listener != null)
        this._addEventListener$3(receiver, type, listener, useCapture);
    },
    addEventListener$2: function($receiver, type, listener) {
      return this.addEventListener$3($receiver, type, listener, null);
    },
    _addEventListener$3: function(receiver, type, listener, options) {
      return receiver.addEventListener(type, H.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), options);
    },
    _removeEventListener$3: function(receiver, type, listener, options) {
      return receiver.removeEventListener(type, H.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), false);
    },
    $isEventTarget: 1
  };
  W.File.prototype = {$isFile: 1};
  W.FileList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.File._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.FileWriter.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.FormElement.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.Gamepad.prototype = {$isGamepad: 1};
  W.History.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.HtmlCollection.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Node._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.HtmlDocument.prototype = {
    set$body: function(receiver, value) {
      receiver.body = value;
    }
  };
  W.HttpRequest.prototype = {
    open$3$async: function(receiver, method, url, async) {
      return receiver.open(method, url, true);
    },
    set$withCredentials: function(receiver, value) {
      receiver.withCredentials = true;
    },
    $isHttpRequest: 1
  };
  W.HttpRequest_request_closure.prototype = {
    call$1: function(e) {
      var t1, t2, accepted, unknownRedirect, t3;
      type$.ProgressEvent._as(e);
      t1 = this.xhr;
      t2 = t1.status;
      t2.toString;
      accepted = t2 >= 200 && t2 < 300;
      unknownRedirect = t2 > 307 && t2 < 400;
      t2 = accepted || t2 === 0 || t2 === 304 || unknownRedirect;
      t3 = this.completer;
      if (t2)
        t3.complete$1(0, t1);
      else
        t3.completeError$1(e);
    },
    $signature: 95
  };
  W.HttpRequestEventTarget.prototype = {};
  W.ImageData.prototype = {$isImageData: 1};
  W.KeyboardEvent.prototype = {$isKeyboardEvent: 1};
  W.Location.prototype = {
    toString$0: function(receiver) {
      return String(receiver);
    },
    $isLocation: 1
  };
  W.MediaList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.MessageEvent.prototype = {$isMessageEvent: 1};
  W.MidiInputMap.prototype = {
    addAll$1: function(receiver, other) {
      type$.Map_String_dynamic._as(other);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    containsKey$1: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key))) != null;
    },
    $index: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key)));
    },
    forEach$1: function(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], P.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys: function(receiver) {
      var keys = H.setRuntimeTypeInfo([], type$.JSArray_String);
      this.forEach$1(receiver, new W.MidiInputMap_keys_closure(keys));
      return keys;
    },
    get$length: function(receiver) {
      return receiver.size;
    },
    get$isEmpty: function(receiver) {
      return receiver.size === 0;
    },
    $indexSet: function(receiver, key, value) {
      H._asStringS(key);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  W.MidiInputMap_keys_closure.prototype = {
    call$2: function(k, v) {
      return C.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 4
  };
  W.MidiOutputMap.prototype = {
    addAll$1: function(receiver, other) {
      type$.Map_String_dynamic._as(other);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    containsKey$1: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key))) != null;
    },
    $index: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key)));
    },
    forEach$1: function(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], P.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys: function(receiver) {
      var keys = H.setRuntimeTypeInfo([], type$.JSArray_String);
      this.forEach$1(receiver, new W.MidiOutputMap_keys_closure(keys));
      return keys;
    },
    get$length: function(receiver) {
      return receiver.size;
    },
    get$isEmpty: function(receiver) {
      return receiver.size === 0;
    },
    $indexSet: function(receiver, key, value) {
      H._asStringS(key);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  W.MidiOutputMap_keys_closure.prototype = {
    call$2: function(k, v) {
      return C.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 4
  };
  W.MimeType.prototype = {$isMimeType: 1};
  W.MimeTypeArray.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.MimeType._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W._ChildNodeListLazy.prototype = {
    get$first: function(_) {
      var result = this._this.firstChild;
      if (result == null)
        throw H.wrapException(P.StateError$("No elements"));
      return result;
    },
    get$single: function(_) {
      var t1 = this._this,
        l = t1.childNodes.length;
      if (l === 0)
        throw H.wrapException(P.StateError$("No elements"));
      if (l > 1)
        throw H.wrapException(P.StateError$("More than one element"));
      t1 = t1.firstChild;
      t1.toString;
      return t1;
    },
    addAll$1: function(_, iterable) {
      var t1, t2, len, i, t3;
      type$.Iterable_Node._as(iterable);
      if (iterable instanceof W._ChildNodeListLazy) {
        t1 = iterable._this;
        t2 = this._this;
        if (t1 !== t2)
          for (len = t1.childNodes.length, i = 0; i < len; ++i) {
            t3 = t1.firstChild;
            t3.toString;
            t2.appendChild(t3);
          }
        return;
      }
      for (t1 = iterable.get$iterator(iterable), t2 = this._this; t1.moveNext$0();)
        t2.appendChild(t1.get$current(t1));
    },
    $indexSet: function(_, index, value) {
      var t1;
      H._asIntS(index);
      t1 = this._this;
      t1.replaceChild(type$.Node._as(value), C.NodeList_methods.$index(t1.childNodes, index));
    },
    get$iterator: function(_) {
      var t1 = this._this.childNodes;
      return new W.FixedSizeListIterator(t1, t1.length, H.instanceType(t1)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1: function(_, compare) {
      type$.nullable_int_Function_Node_Node._as(compare);
      throw H.wrapException(P.UnsupportedError$("Cannot sort Node list"));
    },
    get$length: function(_) {
      return this._this.childNodes.length;
    },
    $index: function(_, index) {
      return C.NodeList_methods.$index(this._this.childNodes, index);
    }
  };
  W.Node.prototype = {
    remove$0: function(receiver) {
      var t1 = receiver.parentNode;
      if (t1 != null)
        t1.removeChild(receiver);
    },
    _clearChildren$0: function(receiver) {
      var t1;
      for (; t1 = receiver.firstChild, t1 != null;)
        receiver.removeChild(t1);
    },
    toString$0: function(receiver) {
      var value = receiver.nodeValue;
      return value == null ? this.super$Interceptor$toString(receiver) : value;
    },
    set$text: function(receiver, value) {
      receiver.textContent = value;
    },
    $isNode: 1
  };
  W.NodeList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Node._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.Plugin.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $isPlugin: 1
  };
  W.PluginArray.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Plugin._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.ProgressEvent.prototype = {$isProgressEvent: 1};
  W.RtcStatsReport.prototype = {
    addAll$1: function(receiver, other) {
      type$.Map_String_dynamic._as(other);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    containsKey$1: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key))) != null;
    },
    $index: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key)));
    },
    forEach$1: function(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], P.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys: function(receiver) {
      var keys = H.setRuntimeTypeInfo([], type$.JSArray_String);
      this.forEach$1(receiver, new W.RtcStatsReport_keys_closure(keys));
      return keys;
    },
    get$length: function(receiver) {
      return receiver.size;
    },
    get$isEmpty: function(receiver) {
      return receiver.size === 0;
    },
    $indexSet: function(receiver, key, value) {
      H._asStringS(key);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  W.RtcStatsReport_keys_closure.prototype = {
    call$2: function(k, v) {
      return C.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 4
  };
  W.ScriptElement.prototype = {$isScriptElement: 1};
  W.SelectElement.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.SourceBuffer.prototype = {$isSourceBuffer: 1};
  W.SourceBufferList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.SourceBuffer._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.SpeechGrammar.prototype = {$isSpeechGrammar: 1};
  W.SpeechGrammarList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.SpeechGrammar._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.SpeechRecognitionResult.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $isSpeechRecognitionResult: 1
  };
  W.Storage.prototype = {
    addAll$1: function(receiver, other) {
      J.forEach$1$ax(type$.Map_String_String._as(other), new W.Storage_addAll_closure(receiver));
    },
    containsKey$1: function(receiver, key) {
      return receiver.getItem(H._asStringS(key)) != null;
    },
    $index: function(receiver, key) {
      return receiver.getItem(H._asStringS(key));
    },
    $indexSet: function(receiver, key, value) {
      receiver.setItem(H._asStringS(key), H._asStringS(value));
    },
    forEach$1: function(receiver, f) {
      var i, key, t1;
      type$.void_Function_String_String._as(f);
      for (i = 0; true; ++i) {
        key = receiver.key(i);
        if (key == null)
          return;
        t1 = receiver.getItem(key);
        t1.toString;
        f.call$2(key, t1);
      }
    },
    get$keys: function(receiver) {
      var keys = H.setRuntimeTypeInfo([], type$.JSArray_String);
      this.forEach$1(receiver, new W.Storage_keys_closure(keys));
      return keys;
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    get$isEmpty: function(receiver) {
      return receiver.key(0) == null;
    },
    $isMap: 1
  };
  W.Storage_addAll_closure.prototype = {
    call$2: function(k, v) {
      this.$this.setItem(H._asStringS(k), H._asStringS(v));
    },
    $signature: 7
  };
  W.Storage_keys_closure.prototype = {
    call$2: function(k, v) {
      return C.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 7
  };
  W.StyleSheet.prototype = {$isStyleSheet: 1};
  W.TableElement.prototype = {
    createFragment$3$treeSanitizer$validator: function(receiver, html, treeSanitizer, validator) {
      var table, fragment;
      if ("createContextualFragment" in window.Range.prototype)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      table = W.Element_Element$html("<table>" + html + "</table>", treeSanitizer, validator);
      fragment = document.createDocumentFragment();
      fragment.toString;
      table.toString;
      new W._ChildNodeListLazy(fragment).addAll$1(0, new W._ChildNodeListLazy(table));
      return fragment;
    }
  };
  W.TableRowElement.prototype = {
    createFragment$3$treeSanitizer$validator: function(receiver, html, treeSanitizer, validator) {
      var t1, fragment, section, row;
      if ("createContextualFragment" in window.Range.prototype)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      fragment = t1.createDocumentFragment();
      t1 = C.TableElement_methods.createFragment$3$treeSanitizer$validator(t1.createElement("table"), html, treeSanitizer, validator);
      t1.toString;
      t1 = new W._ChildNodeListLazy(t1);
      section = t1.get$single(t1);
      section.toString;
      t1 = new W._ChildNodeListLazy(section);
      row = t1.get$single(t1);
      fragment.toString;
      row.toString;
      new W._ChildNodeListLazy(fragment).addAll$1(0, new W._ChildNodeListLazy(row));
      return fragment;
    }
  };
  W.TableSectionElement.prototype = {
    createFragment$3$treeSanitizer$validator: function(receiver, html, treeSanitizer, validator) {
      var t1, fragment, section;
      if ("createContextualFragment" in window.Range.prototype)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      fragment = t1.createDocumentFragment();
      t1 = C.TableElement_methods.createFragment$3$treeSanitizer$validator(t1.createElement("table"), html, treeSanitizer, validator);
      t1.toString;
      t1 = new W._ChildNodeListLazy(t1);
      section = t1.get$single(t1);
      fragment.toString;
      section.toString;
      new W._ChildNodeListLazy(fragment).addAll$1(0, new W._ChildNodeListLazy(section));
      return fragment;
    }
  };
  W.TemplateElement.prototype = {
    setInnerHtml$1: function(receiver, html) {
      var t1, fragment;
      this.set$text(receiver, null);
      t1 = receiver.content;
      t1.toString;
      J._clearChildren$0$x(t1);
      fragment = this.createFragment$3$treeSanitizer$validator(receiver, html, null, null);
      receiver.content.appendChild(fragment);
    },
    $isTemplateElement: 1
  };
  W.TextTrack.prototype = {$isTextTrack: 1};
  W.TextTrackCue.prototype = {$isTextTrackCue: 1};
  W.TextTrackCueList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.TextTrackCue._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.TextTrackList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.TextTrack._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.TimeRanges.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.Touch.prototype = {$isTouch: 1};
  W.TouchList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Touch._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W.TrackDefaultList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.UIEvent.prototype = {};
  W.Url.prototype = {
    toString$0: function(receiver) {
      return String(receiver);
    }
  };
  W.VideoTrackList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  W.WebSocket.prototype = {
    set$binaryType: function(receiver, value) {
      receiver.binaryType = value;
    },
    send$1: function(receiver, data) {
      return receiver.send(data);
    },
    $isWebSocket: 1
  };
  W.Window.prototype = {
    open$2: function(receiver, url, $name) {
      var t1 = W._DOMWindowCrossFrame__createSafe(receiver.open(url, $name));
      return t1;
    },
    alert$1: function(receiver, message) {
      return receiver.alert(message);
    },
    confirm$1: function(receiver, message) {
      return receiver.confirm(message);
    },
    $isWindow: 1
  };
  W.WorkerGlobalScope.prototype = {$isWorkerGlobalScope: 1};
  W._Attr.prototype = {$is_Attr: 1};
  W._CssRuleList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.CssRule._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W._DomRect.prototype = {
    toString$0: function(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t1 = "Rectangle (" + H.S(t1) + ", ";
      t2 = receiver.top;
      t2.toString;
      t2 = t1 + H.S(t2) + ") ";
      t1 = receiver.width;
      t1.toString;
      t1 = t2 + H.S(t1) + " x ";
      t2 = receiver.height;
      t2.toString;
      return t1 + H.S(t2);
    },
    $eq: function(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = receiver.width;
            t1.toString;
            t2 = J.getInterceptor$x(other);
            if (t1 === t2.get$width(other)) {
              t1 = receiver.height;
              t1.toString;
              t2 = t1 === t2.get$height(other);
              t1 = t2;
            } else
              t1 = false;
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode: function(receiver) {
      var t2, t3, t4,
        t1 = receiver.left;
      t1.toString;
      t1 = C.JSNumber_methods.get$hashCode(t1);
      t2 = receiver.top;
      t2.toString;
      t2 = C.JSNumber_methods.get$hashCode(t2);
      t3 = receiver.width;
      t3.toString;
      t3 = C.JSNumber_methods.get$hashCode(t3);
      t4 = receiver.height;
      t4.toString;
      return W._JenkinsSmiHash_hash4(t1, t2, t3, C.JSNumber_methods.get$hashCode(t4));
    },
    get$_height: function(receiver) {
      return receiver.height;
    },
    get$height: function(receiver) {
      var t1 = receiver.height;
      t1.toString;
      return t1;
    },
    get$_width: function(receiver) {
      return receiver.width;
    },
    get$width: function(receiver) {
      var t1 = receiver.width;
      t1.toString;
      return t1;
    }
  };
  W._GamepadList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.nullable_Gamepad._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W._NamedNodeMap.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Node._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W._SpeechRecognitionResultList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.SpeechRecognitionResult._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W._StyleSheetList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.StyleSheet._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  W._AttributeMap.prototype = {
    addAll$1: function(_, other) {
      J.forEach$1$ax(type$.Map_String_String._as(other), new W._AttributeMap_addAll_closure(this));
    },
    cast$2$0: function(_, $K, $V) {
      var t1 = type$.String;
      return P.Map_castFrom(this, t1, t1, $K, $V);
    },
    forEach$1: function(_, f) {
      var t1, t2, t3, _i, t4;
      type$.void_Function_String_String._as(f);
      for (t1 = this.get$keys(this), t2 = t1.length, t3 = this._element, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
        t4 = H._asStringS(t1[_i]);
        f.call$2(t4, t3.getAttribute(t4));
      }
    },
    get$keys: function(_) {
      var keys, len, t2, i, attr, t3,
        t1 = this._element.attributes;
      t1.toString;
      keys = H.setRuntimeTypeInfo([], type$.JSArray_String);
      for (len = t1.length, t2 = type$._Attr, i = 0; i < len; ++i) {
        if (i >= t1.length)
          return H.ioore(t1, i);
        attr = t2._as(t1[i]);
        if (attr.namespaceURI == null) {
          t3 = attr.name;
          t3.toString;
          C.JSArray_methods.add$1(keys, t3);
        }
      }
      return keys;
    },
    get$isEmpty: function(_) {
      return this.get$keys(this).length === 0;
    }
  };
  W._AttributeMap_addAll_closure.prototype = {
    call$2: function(k, v) {
      this.$this._element.setAttribute(H._asStringS(k), H._asStringS(v));
    },
    $signature: 7
  };
  W._ElementAttributeMap.prototype = {
    containsKey$1: function(_, key) {
      return typeof key == "string" && H.boolConversionCheck(this._element.hasAttribute(key));
    },
    $index: function(_, key) {
      return this._element.getAttribute(H._asStringS(key));
    },
    $indexSet: function(_, key, value) {
      this._element.setAttribute(H._asStringS(key), H._asStringS(value));
    },
    get$length: function(_) {
      return this.get$keys(this).length;
    }
  };
  W.EventStreamProvider.prototype = {};
  W._EventStream.prototype = {
    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return W._EventStreamSubscription$(this._html$_target, this._eventType, onData, false, t1._precomputed1);
    },
    listen$3$onDone$onError: function(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  W._EventStreamSubscription.prototype = {
    cancel$0: function(_) {
      var _this = this;
      if (_this._html$_target == null)
        return $.$get$nullFuture();
      _this._unlisten$0();
      _this._html$_target = null;
      _this.set$_onData(null);
      return $.$get$nullFuture();
    },
    onData$1: function(handleData) {
      var t1, _this = this;
      _this.$ti._eval$1("~(1)?")._as(handleData);
      if (_this._html$_target == null)
        throw H.wrapException(P.StateError$("Subscription has been canceled."));
      _this._unlisten$0();
      t1 = W._wrapZone(new W._EventStreamSubscription_onData_closure(handleData), type$.Event);
      _this.set$_onData(t1);
      _this._tryResume$0();
    },
    pause$0: function(_) {
      if (this._html$_target == null)
        return;
      ++this._pauseCount;
      this._unlisten$0();
    },
    resume$0: function(_) {
      var _this = this;
      if (_this._html$_target == null || _this._pauseCount <= 0)
        return;
      --_this._pauseCount;
      _this._tryResume$0();
    },
    _tryResume$0: function() {
      var t2, _this = this,
        t1 = _this._onData;
      if (t1 != null && _this._pauseCount <= 0) {
        t2 = _this._html$_target;
        t2.toString;
        J.addEventListener$3$x(t2, _this._eventType, t1, false);
      }
    },
    _unlisten$0: function() {
      var t2,
        t1 = this._onData;
      if (t1 != null) {
        t2 = this._html$_target;
        t2.toString;
        J._removeEventListener$3$x(t2, this._eventType, type$.nullable_dynamic_Function_Event._as(t1), false);
      }
    },
    set$_onData: function(_onData) {
      this._onData = type$.nullable_dynamic_Function_Event._as(_onData);
    }
  };
  W._EventStreamSubscription_closure.prototype = {
    call$1: function(e) {
      return this.onData.call$1(type$.Event._as(e));
    },
    $signature: 24
  };
  W._EventStreamSubscription_onData_closure.prototype = {
    call$1: function(e) {
      return this.handleData.call$1(type$.Event._as(e));
    },
    $signature: 24
  };
  W._Html5NodeValidator.prototype = {
    _Html5NodeValidator$1$uriPolicy: function(uriPolicy) {
      var _i;
      if ($._Html5NodeValidator__attributeValidators.get$isEmpty($._Html5NodeValidator__attributeValidators)) {
        for (_i = 0; _i < 262; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, C.List_2Zi[_i], W.html__Html5NodeValidator__standardAttributeValidator$closure());
        for (_i = 0; _i < 12; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, C.List_yrN[_i], W.html__Html5NodeValidator__uriAttributeValidator$closure());
      }
    },
    allowsElement$1: function(element) {
      return $.$get$_Html5NodeValidator__allowedElements().contains$1(0, W.Element__safeTagName(element));
    },
    allowsAttribute$3: function(element, attributeName, value) {
      var validator = $._Html5NodeValidator__attributeValidators.$index(0, H.S(W.Element__safeTagName(element)) + "::" + attributeName);
      if (validator == null)
        validator = $._Html5NodeValidator__attributeValidators.$index(0, "*::" + attributeName);
      if (validator == null)
        return false;
      return H._asBoolS(validator.call$4(element, attributeName, value, this));
    },
    $isNodeValidator: 1
  };
  W.ImmutableListMixin.prototype = {
    get$iterator: function(receiver) {
      return new W.FixedSizeListIterator(receiver, this.get$length(receiver), H.instanceType(receiver)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1: function(receiver, compare) {
      H.instanceType(receiver)._eval$1("int(ImmutableListMixin.E,ImmutableListMixin.E)?")._as(compare);
      throw H.wrapException(P.UnsupportedError$("Cannot sort immutable List."));
    }
  };
  W.NodeValidatorBuilder.prototype = {
    allowsElement$1: function(element) {
      return C.JSArray_methods.any$1(this._validators, new W.NodeValidatorBuilder_allowsElement_closure(element));
    },
    allowsAttribute$3: function(element, attributeName, value) {
      return C.JSArray_methods.any$1(this._validators, new W.NodeValidatorBuilder_allowsAttribute_closure(element, attributeName, value));
    },
    $isNodeValidator: 1
  };
  W.NodeValidatorBuilder_allowsElement_closure.prototype = {
    call$1: function(v) {
      return type$.NodeValidator._as(v).allowsElement$1(this.element);
    },
    $signature: 25
  };
  W.NodeValidatorBuilder_allowsAttribute_closure.prototype = {
    call$1: function(v) {
      return type$.NodeValidator._as(v).allowsAttribute$3(this.element, this.attributeName, this.value);
    },
    $signature: 25
  };
  W._SimpleNodeValidator.prototype = {
    _SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes: function(uriPolicy, allowedAttributes, allowedElements, allowedUriAttributes) {
      var legalAttributes, extraUriAttributes, t1;
      this.allowedElements.addAll$1(0, allowedElements);
      legalAttributes = allowedAttributes.where$1(0, new W._SimpleNodeValidator_closure());
      extraUriAttributes = allowedAttributes.where$1(0, new W._SimpleNodeValidator_closure0());
      this.allowedAttributes.addAll$1(0, legalAttributes);
      t1 = this.allowedUriAttributes;
      t1.addAll$1(0, C.List_empty);
      t1.addAll$1(0, extraUriAttributes);
    },
    allowsElement$1: function(element) {
      return this.allowedElements.contains$1(0, W.Element__safeTagName(element));
    },
    allowsAttribute$3: function(element, attributeName, value) {
      var _this = this,
        tagName = W.Element__safeTagName(element),
        t1 = _this.allowedUriAttributes;
      if (t1.contains$1(0, H.S(tagName) + "::" + attributeName))
        return _this.uriPolicy.allowsUri$1(value);
      else if (t1.contains$1(0, "*::" + attributeName))
        return _this.uriPolicy.allowsUri$1(value);
      else {
        t1 = _this.allowedAttributes;
        if (t1.contains$1(0, H.S(tagName) + "::" + attributeName))
          return true;
        else if (t1.contains$1(0, "*::" + attributeName))
          return true;
        else if (t1.contains$1(0, H.S(tagName) + "::*"))
          return true;
        else if (t1.contains$1(0, "*::*"))
          return true;
      }
      return false;
    },
    $isNodeValidator: 1
  };
  W._SimpleNodeValidator_closure.prototype = {
    call$1: function(x) {
      return !C.JSArray_methods.contains$1(C.List_yrN, H._asStringS(x));
    },
    $signature: 26
  };
  W._SimpleNodeValidator_closure0.prototype = {
    call$1: function(x) {
      return C.JSArray_methods.contains$1(C.List_yrN, H._asStringS(x));
    },
    $signature: 26
  };
  W._TemplatingNodeValidator.prototype = {
    allowsAttribute$3: function(element, attributeName, value) {
      if (this.super$_SimpleNodeValidator$allowsAttribute(element, attributeName, value))
        return true;
      if (attributeName === "template" && value === "")
        return true;
      if (element.getAttribute("template") === "")
        return this._templateAttrs.contains$1(0, attributeName);
      return false;
    }
  };
  W._TemplatingNodeValidator_closure.prototype = {
    call$1: function(attr) {
      return "TEMPLATE::" + H.S(H._asStringS(attr));
    },
    $signature: 37
  };
  W._SvgNodeValidator.prototype = {
    allowsElement$1: function(element) {
      var t1;
      if (type$.ScriptElement._is(element))
        return false;
      t1 = type$.SvgElement._is(element);
      if (t1 && W.Element__safeTagName(element) === "foreignObject")
        return false;
      if (t1)
        return true;
      return false;
    },
    allowsAttribute$3: function(element, attributeName, value) {
      if (attributeName === "is" || C.JSString_methods.startsWith$1(attributeName, "on"))
        return false;
      return this.allowsElement$1(element);
    },
    $isNodeValidator: 1
  };
  W.FixedSizeListIterator.prototype = {
    moveNext$0: function() {
      var _this = this,
        nextPosition = _this._position + 1,
        t1 = _this._length;
      if (nextPosition < t1) {
        _this.set$_current(J.$index$asx(_this._array, nextPosition));
        _this._position = nextPosition;
        return true;
      }
      _this.set$_current(null);
      _this._position = t1;
      return false;
    },
    get$current: function(_) {
      return this._current;
    },
    set$_current: function(_current) {
      this._current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  W._DOMWindowCrossFrame.prototype = {$isEventTarget: 1};
  W._SameOriginUriPolicy.prototype = {$isUriPolicy: 1};
  W._ValidatingTreeSanitizer.prototype = {
    sanitizeTree$1: function(node) {
      var _this = this,
        walk = new W._ValidatingTreeSanitizer_sanitizeTree_walk(_this);
      _this.modifiedTree = false;
      walk.call$2(node, null);
      for (; _this.modifiedTree;) {
        _this.modifiedTree = false;
        walk.call$2(node, null);
      }
    },
    _removeNode$2: function(node, $parent) {
      var t1 = this.modifiedTree = true;
      if ($parent != null ? $parent !== node.parentNode : t1)
        J.remove$0$x(node);
      else
        $parent.removeChild(node);
    },
    _sanitizeUntrustedElement$2: function(element, $parent) {
      var corruptedTest1, elementText, elementTagName, exception, t1,
        corrupted = true,
        attrs = null, isAttr = null;
      try {
        attrs = J.get$attributes$x(element);
        isAttr = attrs._element.getAttribute("is");
        type$.Element._as(element);
        corruptedTest1 = function(element) {
          if (!(element.attributes instanceof NamedNodeMap))
            return true;
          if (element.id == 'lastChild' || element.name == 'lastChild' || element.id == 'previousSibling' || element.name == 'previousSibling' || element.id == 'children' || element.name == 'children')
            return true;
          var childNodes = element.childNodes;
          if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1])
            return true;
          if (element.children)
            if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList))
              return true;
          var length = 0;
          if (element.children)
            length = element.children.length;
          for (var i = 0; i < length; i++) {
            var child = element.children[i];
            if (child.id == 'attributes' || child.name == 'attributes' || child.id == 'lastChild' || child.name == 'lastChild' || child.id == 'previousSibling' || child.name == 'previousSibling' || child.id == 'children' || child.name == 'children')
              return true;
          }
          return false;
        }(element);
        corrupted = H.boolConversionCheck(corruptedTest1) ? true : !(element.attributes instanceof NamedNodeMap);
      } catch (exception) {
        H.unwrapException(exception);
      }
      elementText = "element unprintable";
      try {
        elementText = J.toString$0$(element);
      } catch (exception) {
        H.unwrapException(exception);
      }
      try {
        elementTagName = W.Element__safeTagName(element);
        this._sanitizeElement$7(type$.Element._as(element), $parent, corrupted, elementText, elementTagName, type$.Map_dynamic_dynamic._as(attrs), H._asStringQ(isAttr));
      } catch (exception) {
        if (H.unwrapException(exception) instanceof P.ArgumentError)
          throw exception;
        else {
          this._removeNode$2(element, $parent);
          window;
          t1 = "Removing corrupted element " + H.S(elementText);
          if (typeof console != "undefined")
            window.console.warn(t1);
        }
      }
    },
    _sanitizeElement$7: function(element, $parent, corrupted, text, tag, attrs, isAttr) {
      var t1, keys, i, $name, t2, t3, _this = this;
      if (corrupted) {
        _this._removeNode$2(element, $parent);
        window;
        t1 = "Removing element due to corrupted attributes on <" + text + ">";
        if (typeof console != "undefined")
          window.console.warn(t1);
        return;
      }
      if (!_this.validator.allowsElement$1(element)) {
        _this._removeNode$2(element, $parent);
        window;
        t1 = "Removing disallowed element <" + H.S(tag) + "> from " + H.S($parent);
        if (typeof console != "undefined")
          window.console.warn(t1);
        return;
      }
      if (isAttr != null)
        if (!_this.validator.allowsAttribute$3(element, "is", isAttr)) {
          _this._removeNode$2(element, $parent);
          window;
          t1 = "Removing disallowed type extension <" + H.S(tag) + ' is="' + isAttr + '">';
          if (typeof console != "undefined")
            window.console.warn(t1);
          return;
        }
      t1 = attrs.get$keys(attrs);
      keys = H.setRuntimeTypeInfo(t1.slice(0), H._arrayInstanceType(t1));
      for (i = attrs.get$keys(attrs).length - 1, t1 = attrs._element; i >= 0; --i) {
        if (i >= keys.length)
          return H.ioore(keys, i);
        $name = keys[i];
        t2 = _this.validator;
        t3 = J.toLowerCase$0$s($name);
        H._asStringS($name);
        if (!t2.allowsAttribute$3(element, t3, t1.getAttribute($name))) {
          window;
          t2 = "Removing disallowed attribute <" + H.S(tag) + " " + $name + '="' + H.S(t1.getAttribute($name)) + '">';
          if (typeof console != "undefined")
            window.console.warn(t2);
          t1.removeAttribute($name);
        }
      }
      if (type$.TemplateElement._is(element)) {
        t1 = element.content;
        t1.toString;
        _this.sanitizeTree$1(t1);
      }
    },
    $isNodeTreeSanitizer: 1
  };
  W._ValidatingTreeSanitizer_sanitizeTree_walk.prototype = {
    call$2: function(node, $parent) {
      var child, nextChild, t2, t3, t4, exception,
        t1 = this.$this;
      switch (node.nodeType) {
        case 1:
          t1._sanitizeUntrustedElement$2(node, $parent);
          break;
        case 8:
        case 11:
        case 3:
        case 4:
          break;
        default:
          t1._removeNode$2(node, $parent);
      }
      child = node.lastChild;
      for (t2 = type$.Node; null != child;) {
        nextChild = null;
        try {
          nextChild = child.previousSibling;
          if (nextChild != null) {
            t3 = nextChild.nextSibling;
            t4 = child;
            t4 = t3 == null ? t4 != null : t3 !== t4;
            t3 = t4;
          } else
            t3 = false;
          if (t3) {
            t3 = P.StateError$("Corrupt HTML");
            throw H.wrapException(t3);
          }
        } catch (exception) {
          H.unwrapException(exception);
          t3 = t2._as(child);
          t1.modifiedTree = true;
          t4 = t3.parentNode;
          t4 = node == null ? t4 != null : node !== t4;
          if (t4) {
            t4 = t3.parentNode;
            if (t4 != null)
              t4.removeChild(t3);
          } else
            node.removeChild(t3);
          child = null;
          nextChild = node.lastChild;
        }
        if (child != null)
          this.call$2(child, node);
        child = nextChild;
      }
    },
    $signature: 38
  };
  W._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase.prototype = {};
  W._DomRectList_Interceptor_ListMixin.prototype = {};
  W._DomRectList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._DomStringList_Interceptor_ListMixin.prototype = {};
  W._DomStringList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._FileList_Interceptor_ListMixin.prototype = {};
  W._FileList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._HtmlCollection_Interceptor_ListMixin.prototype = {};
  W._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._MidiInputMap_Interceptor_MapMixin.prototype = {};
  W._MidiOutputMap_Interceptor_MapMixin.prototype = {};
  W._MimeTypeArray_Interceptor_ListMixin.prototype = {};
  W._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._NodeList_Interceptor_ListMixin.prototype = {};
  W._NodeList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._PluginArray_Interceptor_ListMixin.prototype = {};
  W._PluginArray_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._RtcStatsReport_Interceptor_MapMixin.prototype = {};
  W._SourceBufferList_EventTarget_ListMixin.prototype = {};
  W._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  W._SpeechGrammarList_Interceptor_ListMixin.prototype = {};
  W._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._Storage_Interceptor_MapMixin.prototype = {};
  W._TextTrackCueList_Interceptor_ListMixin.prototype = {};
  W._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W._TextTrackList_EventTarget_ListMixin.prototype = {};
  W._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  W._TouchList_Interceptor_ListMixin.prototype = {};
  W._TouchList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W.__CssRuleList_Interceptor_ListMixin.prototype = {};
  W.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W.__GamepadList_Interceptor_ListMixin.prototype = {};
  W.__GamepadList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W.__NamedNodeMap_Interceptor_ListMixin.prototype = {};
  W.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W.__SpeechRecognitionResultList_Interceptor_ListMixin.prototype = {};
  W.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  W.__StyleSheetList_Interceptor_ListMixin.prototype = {};
  W.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  P._AcceptStructuredClone.prototype = {
    findSlot$1: function(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      C.JSArray_methods.add$1(t1, value);
      C.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1: function(e) {
      var proto, slot, t1, copy, t2, l, $length, i, _this = this, _box_0 = {};
      if (e == null)
        return e;
      if (H._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      if (e instanceof Date)
        return P.DateTime$fromMillisecondsSinceEpoch(e.getTime(), true);
      if (e instanceof RegExp)
        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
      if (typeof Promise != "undefined" && e instanceof Promise)
        return P.promiseToFuture(e, type$.dynamic);
      proto = Object.getPrototypeOf(e);
      if (proto === Object.prototype || proto === null) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (slot >= t1.length)
          return H.ioore(t1, slot);
        copy = _box_0.copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = type$.dynamic;
        copy = P.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
        _box_0.copy = copy;
        C.JSArray_methods.$indexSet(t1, slot, copy);
        _this.forEachJsField$2(e, new P._AcceptStructuredClone_walk_closure(_box_0, _this));
        return _box_0.copy;
      }
      if (e instanceof Array) {
        l = e;
        slot = _this.findSlot$1(l);
        t1 = _this.copies;
        if (slot >= t1.length)
          return H.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = J.getInterceptor$asx(l);
        $length = t2.get$length(l);
        copy = _this.mustCopy ? new Array($length) : l;
        C.JSArray_methods.$indexSet(t1, slot, copy);
        for (t1 = J.getInterceptor$ax(copy), i = 0; i < $length; ++i)
          t1.$indexSet(copy, i, _this.walk$1(t2.$index(l, i)));
        return copy;
      }
      return e;
    },
    convertNativeToDart_AcceptStructuredClone$2$mustCopy: function(object, mustCopy) {
      this.mustCopy = true;
      return this.walk$1(object);
    }
  };
  P._AcceptStructuredClone_walk_closure.prototype = {
    call$2: function(key, value) {
      var t1 = this._box_0.copy,
        t2 = this.$this.walk$1(value);
      J.$indexSet$ax(t1, key, t2);
      return t2;
    },
    $signature: 39
  };
  P._convertDartToNative_Value_closure.prototype = {
    call$1: function(element) {
      this.array.push(P._convertDartToNative_Value(element));
    },
    $signature: 5
  };
  P.convertDartToNative_Dictionary_closure.prototype = {
    call$2: function(key, value) {
      this.object[key] = P._convertDartToNative_Value(value);
    },
    $signature: 18
  };
  P._AcceptStructuredCloneDart2Js.prototype = {
    forEachJsField$2: function(object, action) {
      var t1, t2, _i, key;
      type$.dynamic_Function_dynamic_dynamic._as(action);
      for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  P.KeyRange.prototype = {$isKeyRange: 1};
  P._convertToJS_closure.prototype = {
    call$1: function(o) {
      var jsFunction;
      type$.Function._as(o);
      jsFunction = function(_call, f, captureThis) {
        return function() {
          return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
        };
      }(P._callDartFunction, o, false);
      P._defineProperty(jsFunction, $.$get$DART_CLOSURE_PROPERTY_NAME(), o);
      return jsFunction;
    },
    $signature: 2
  };
  P._convertToJS_closure0.prototype = {
    call$1: function(o) {
      return new this.ctor(o);
    },
    $signature: 2
  };
  P._wrapToDart_closure.prototype = {
    call$1: function(o) {
      return new P.JsFunction(o);
    },
    $signature: 40
  };
  P._wrapToDart_closure0.prototype = {
    call$1: function(o) {
      return new P.JsArray(o, type$.JsArray_dynamic);
    },
    $signature: 41
  };
  P._wrapToDart_closure1.prototype = {
    call$1: function(o) {
      return new P.JsObject(o);
    },
    $signature: 42
  };
  P.JsObject.prototype = {
    $index: function(_, property) {
      if (typeof property != "string" && typeof property != "number")
        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
      return P._convertToDart(this._js$_jsObject[property]);
    },
    $indexSet: function(_, property, value) {
      if (typeof property != "string" && typeof property != "number")
        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
      this._js$_jsObject[property] = P._convertToJS(value);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof P.JsObject && this._js$_jsObject === other._js$_jsObject;
    },
    toString$0: function(_) {
      var t1, exception;
      try {
        t1 = String(this._js$_jsObject);
        return t1;
      } catch (exception) {
        H.unwrapException(exception);
        t1 = this.super$Object$toString(0);
        return t1;
      }
    },
    callMethod$2: function(method, args) {
      var t2,
        t1 = this._js$_jsObject;
      if (args == null)
        t2 = null;
      else {
        t2 = H._arrayInstanceType(args);
        t2 = P.List_List$from(new H.MappedListIterable(args, t2._eval$1("@(1)")._as(P.js___convertToJS$closure()), t2._eval$1("MappedListIterable<1,@>")), true, type$.dynamic);
      }
      return P._convertToDart(t1[method].apply(t1, t2));
    },
    callMethod$1: function(method) {
      return this.callMethod$2(method, null);
    },
    get$hashCode: function(_) {
      return 0;
    }
  };
  P.JsFunction.prototype = {};
  P.JsArray.prototype = {
    _checkIndex$1: function(index) {
      var _this = this,
        t1 = index < 0 || index >= _this.get$length(_this);
      if (t1)
        throw H.wrapException(P.RangeError$range(index, 0, _this.get$length(_this), null, null));
    },
    $index: function(_, index) {
      if (H._isInt(index))
        this._checkIndex$1(index);
      return this.$ti._precomputed1._as(this.super$JsObject$$index(0, index));
    },
    $indexSet: function(_, index, value) {
      if (H._isInt(index))
        this._checkIndex$1(index);
      this.super$_JsArray_JsObject_ListMixin$$indexSet(0, index, value);
    },
    get$length: function(_) {
      var len = this._js$_jsObject.length;
      if (typeof len === "number" && len >>> 0 === len)
        return len;
      throw H.wrapException(P.StateError$("Bad JsArray length"));
    },
    sort$1: function(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      this.callMethod$2("sort", compare == null ? [] : [compare]);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  P._JsArray_JsObject_ListMixin.prototype = {
    $indexSet: function(_, property, value) {
      return this.super$JsObject$$indexSet(0, property, value);
    }
  };
  P.NullRejectionException.prototype = {
    toString$0: function(_) {
      return "Promise was rejected with a value of `" + (this.isUndefined ? "undefined" : "null") + "`.";
    }
  };
  P.promiseToFuture_closure.prototype = {
    call$1: function(r) {
      return this.completer.complete$1(0, this.T._eval$1("0/?")._as(r));
    },
    $signature: 5
  };
  P.promiseToFuture_closure0.prototype = {
    call$1: function(e) {
      if (e == null)
        return this.completer.completeError$1(new P.NullRejectionException(e === undefined));
      return this.completer.completeError$1(e);
    },
    $signature: 5
  };
  P._JSRandom.prototype = {
    nextInt$1: function(max) {
      if (max <= 0 || max > 4294967296)
        throw H.wrapException(P.RangeError$(string$.max_mu + max));
      return Math.random() * max >>> 0;
    }
  };
  P._Random.prototype = {
    _Random$1: function(seed) {
      var low, high, tmplow, low0, t1, t2, t3, _this = this, _4294967296 = 4294967296,
        empty_seed = seed < 0 ? -1 : 0;
      do {
        low = seed >>> 0;
        seed = C.JSInt_methods._tdivFast$1(seed - low, _4294967296);
        high = seed >>> 0;
        seed = C.JSInt_methods._tdivFast$1(seed - high, _4294967296);
        tmplow = (~low >>> 0) + (low << 21 >>> 0);
        low0 = tmplow >>> 0;
        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + C.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296) >>> 0;
        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 24) >>> 0) * 265 + C.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 14) >>> 0) * 21 + C.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
        high = (high ^ high >>> 28) >>> 0;
        tmplow = (low << 31 >>> 0) + low;
        low0 = tmplow >>> 0;
        t1 = C.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296);
        tmplow = _this._lo * 1037;
        t2 = _this._lo = tmplow >>> 0;
        t3 = _this._hi * 1037 + C.JSInt_methods._tdivFast$1(tmplow - t2, _4294967296) >>> 0;
        _this._hi = t3;
        t2 = (t2 ^ low0) >>> 0;
        _this._lo = t2;
        t1 = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 >>> 0) >>> 0;
        _this._hi = t1;
      } while (seed !== empty_seed);
      if (t1 === 0 && t2 === 0)
        _this._lo = 23063;
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
    },
    _nextState$0: function() {
      var _this = this,
        t1 = _this._lo,
        tmpHi = 4294901760 * t1,
        tmpHiLo = tmpHi >>> 0,
        tmpLo = 55905 * t1,
        tmpLoLo = tmpLo >>> 0,
        newLo = tmpLoLo + tmpHiLo + _this._hi;
      t1 = newLo >>> 0;
      _this._lo = t1;
      _this._hi = C.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) >>> 0;
    },
    nextInt$1: function(max) {
      var t1, rnd32, result, _this = this;
      if (max <= 0 || max > 4294967296)
        throw H.wrapException(P.RangeError$(string$.max_mu + max));
      t1 = max - 1;
      if ((max & t1) >>> 0 === 0) {
        _this._nextState$0();
        return (_this._lo & t1) >>> 0;
      }
      do {
        _this._nextState$0();
        rnd32 = _this._lo;
        result = rnd32 % max;
      } while (rnd32 - result + max >= 4294967296);
      return result;
    }
  };
  P.Length.prototype = {$isLength: 1};
  P.LengthList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Length._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  P.Number.prototype = {$isNumber: 1};
  P.NumberList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Number._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  P.PointList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  P.ScriptElement0.prototype = {$isScriptElement0: 1};
  P.StringList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._asStringS(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  P.SvgElement.prototype = {
    createFragment$3$treeSanitizer$validator: function(receiver, svg, treeSanitizer, validator) {
      var html, t2, fragment, svgFragment, root,
        t1 = H.setRuntimeTypeInfo([], type$.JSArray_NodeValidator);
      C.JSArray_methods.add$1(t1, W._Html5NodeValidator$(null));
      C.JSArray_methods.add$1(t1, W._TemplatingNodeValidator$());
      C.JSArray_methods.add$1(t1, new W._SvgNodeValidator());
      treeSanitizer = new W._ValidatingTreeSanitizer(new W.NodeValidatorBuilder(t1));
      html = '<svg version="1.1">' + svg + "</svg>";
      t1 = document;
      t2 = t1.body;
      t2.toString;
      fragment = C.BodyElement_methods.createFragment$2$treeSanitizer(t2, html, treeSanitizer);
      svgFragment = t1.createDocumentFragment();
      fragment.toString;
      t1 = new W._ChildNodeListLazy(fragment);
      root = t1.get$single(t1);
      for (; t1 = root.firstChild, t1 != null;)
        svgFragment.appendChild(t1);
      return svgFragment;
    },
    $isSvgElement: 1
  };
  P.Transform.prototype = {$isTransform: 1};
  P.TransformList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Transform._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  P._LengthList_Interceptor_ListMixin.prototype = {};
  P._LengthList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  P._NumberList_Interceptor_ListMixin.prototype = {};
  P._NumberList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  P._StringList_Interceptor_ListMixin.prototype = {};
  P._StringList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  P._TransformList_Interceptor_ListMixin.prototype = {};
  P._TransformList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  P.AudioBuffer.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  P.AudioParamMap.prototype = {
    addAll$1: function(receiver, other) {
      type$.Map_String_dynamic._as(other);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    containsKey$1: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key))) != null;
    },
    $index: function(receiver, key) {
      return P.convertNativeToDart_Dictionary(receiver.get(H._asStringS(key)));
    },
    forEach$1: function(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], P.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys: function(receiver) {
      var keys = H.setRuntimeTypeInfo([], type$.JSArray_String);
      this.forEach$1(receiver, new P.AudioParamMap_keys_closure(keys));
      return keys;
    },
    get$length: function(receiver) {
      return receiver.size;
    },
    get$isEmpty: function(receiver) {
      return receiver.size === 0;
    },
    $indexSet: function(receiver, key, value) {
      H._asStringS(key);
      throw H.wrapException(P.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  P.AudioParamMap_keys_closure.prototype = {
    call$2: function(k, v) {
      return C.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 4
  };
  P.AudioTrackList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  P.BaseAudioContext.prototype = {};
  P.OfflineAudioContext.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    }
  };
  P._AudioParamMap_Interceptor_MapMixin.prototype = {};
  P.SqlResultSetRowList.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      var t1;
      if (index >>> 0 !== index || index >= receiver.length)
        throw H.wrapException(P.IndexError$(index, receiver, null, null, null));
      t1 = P.convertNativeToDart_Dictionary(receiver.item(index));
      t1.toString;
      return t1;
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      type$.Map_dynamic_dynamic._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(P.StateError$("No elements"));
    },
    elementAt$1: function(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  P._SqlResultSetRowList_Interceptor_ListMixin.prototype = {};
  P._SqlResultSetRowList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  O.DelegatingStreamSink.prototype = {
    add$1: function(_, data) {
      this._sink.add$1(0, H._instanceType(this)._eval$1("DelegatingStreamSink.T")._as(data));
    },
    addError$2: function(error, stackTrace) {
      this._sink.addError$2(error, stackTrace);
    },
    addError$1: function(error) {
      return this.addError$2(error, null);
    },
    close$0: function(_) {
      return this._sink.close$0(0);
    },
    $isStreamSink: 1
  };
  S.BuiltList.prototype = {
    toBuilder$0: function() {
      return S.ListBuilder_ListBuilder(this, this.$ti._eval$1("BuiltList.E*"));
    },
    get$hashCode: function(_) {
      var t1 = this._list$_hashCode;
      return t1 == null ? this._list$_hashCode = A.hashObjects(this._list) : t1;
    },
    $eq: function(_, other) {
      var t1, t2, i, t3, t4, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof S.BuiltList))
        return false;
      t1 = other._list;
      t2 = _this._list;
      if (t1.length !== t2.length)
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (i = 0; t3 = t2.length, i !== t3; ++i) {
        if (i >= t1.length)
          return H.ioore(t1, i);
        t4 = t1[i];
        if (i >= t3)
          return H.ioore(t2, i);
        if (!J.$eq$(t4, t2[i]))
          return false;
      }
      return true;
    },
    toString$0: function(_) {
      return J.toString$0$(this._list);
    },
    $add: function(_, other) {
      var t1 = this.$ti,
        t2 = this._list;
      t2 = (t2 && C.JSArray_methods).$add(t2, t1._eval$1("BuiltList<BuiltList.E*>*")._as(other).get$_list());
      if (H.createRuntimeType(t1._eval$1("BuiltList.E*")) === C.Type_dynamic_0Rz)
        H.throwExpression(P.UnsupportedError$(string$.explicBL));
      return new S._BuiltList(t2, t1._eval$1("_BuiltList<BuiltList.E*>"));
    },
    get$length: function(_) {
      return this._list.length;
    },
    get$iterator: function(_) {
      var t1 = this._list;
      return new J.ArrayIterator(t1, t1.length, H.instanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    map$1$1: function(_, f, $T) {
      var t1, t2, t3;
      this.$ti._bind$1($T)._eval$1("1*(BuiltList.E*)*")._as(f);
      t1 = this._list;
      t2 = $T._eval$1("0*");
      t1.toString;
      t3 = H._arrayInstanceType(t1);
      return new H.MappedListIterable(t1, t3._bind$1(t2)._eval$1("1(2)")._as(f), t3._eval$1("@<1>")._bind$1(t2)._eval$1("MappedListIterable<1,2>"));
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    contains$1: function(_, element) {
      var t1 = this._list;
      return (t1 && C.JSArray_methods).contains$1(t1, element);
    },
    get$isEmpty: function(_) {
      return this._list.length === 0;
    },
    get$isNotEmpty: function(_) {
      return this._list.length !== 0;
    },
    skip$1: function(_, n) {
      var t1 = this._list;
      t1.toString;
      return H.SubListIterable$(t1, n, null, H._arrayInstanceType(t1)._precomputed1);
    },
    get$first: function(_) {
      var t1 = this._list;
      return (t1 && C.JSArray_methods).get$first(t1);
    },
    elementAt$1: function(_, index) {
      var t1 = this._list;
      if (index < 0 || index >= t1.length)
        return H.ioore(t1, index);
      return t1[index];
    },
    $isIterable: 1
  };
  S._BuiltList.prototype = {
    _BuiltList$copyAndCheckTypes$1: function(iterable, $E) {
      var t1, t2, t3, _i, element;
      for (t1 = this._list, t2 = t1.length, t3 = $E._eval$1("0*"), _i = 0; _i < t2; ++_i) {
        element = t1[_i];
        if (!t3._is(element))
          throw H.wrapException(P.ArgumentError$("iterable contained invalid element: " + H.S(element)));
      }
    }
  };
  S.ListBuilder.prototype = {
    build$0: function() {
      var t1, t2, _this = this;
      if (_this._listOwner == null) {
        t1 = _this._list;
        t2 = _this.$ti;
        if (H.createRuntimeType(t2._eval$1("1*")) === C.Type_dynamic_0Rz)
          H.throwExpression(P.UnsupportedError$(string$.explicBL));
        t2 = t2._eval$1("_BuiltList<1*>*")._as(new S._BuiltList(t1, t2._eval$1("_BuiltList<1*>")));
        _this.set$_list(t1);
        _this.set$_listOwner(t2);
      }
      return _this._listOwner;
    },
    replace$1: function(_, iterable) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_BuiltList<1*>*");
      if (t2._is(iterable)) {
        t2._as(iterable);
        _this.set$_list(iterable._list);
        _this.set$_listOwner(iterable);
      } else {
        _this.set$_list(t1._eval$1("List<1*>*")._as(P.List_List$from(iterable, true, t1._eval$1("1*"))));
        _this.set$_listOwner(null);
      }
    },
    get$length: function(_) {
      return this._list.length;
    },
    map$1: function(_, f) {
      var t2, t3, t4, t5, result, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1*(1*)*")._as(f);
      t2 = _this._list;
      t3 = t1._eval$1("1*");
      t2.toString;
      t4 = H._arrayInstanceType(t2);
      t5 = t4._eval$1("@<1>")._bind$1(t3)._eval$1("MappedListIterable<1,2>");
      result = P.List_List$of(new H.MappedListIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t5), true, t5._eval$1("ListIterable.E"));
      _this._list$_checkElements$1(result);
      _this.set$_list(t1._eval$1("List<1*>*")._as(result));
      _this.set$_listOwner(null);
    },
    _list$_checkElements$1: function(elements) {
      var t2, _i,
        t1 = this.$ti;
      t1._eval$1("Iterable<1*>*")._as(elements);
      for (t2 = elements.length, t1 = t1._eval$1("1*"), _i = 0; _i < t2; ++_i)
        if (t1._as(elements[_i]) == null)
          H.throwExpression(P.ArgumentError$("null element"));
    },
    set$_list: function(_list) {
      this._list = this.$ti._eval$1("List<1*>*")._as(_list);
    },
    set$_listOwner: function(_listOwner) {
      this._listOwner = this.$ti._eval$1("_BuiltList<1*>*")._as(_listOwner);
    }
  };
  M.BuiltListMultimap.prototype = {
    get$hashCode: function(_) {
      var t2, _this = this,
        t1 = _this._list_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._list_multimap$_map;
        t1 = t1.get$keys(t1);
        t2 = H._instanceType(t1);
        t2 = H.MappedIterable_MappedIterable(t1, t2._eval$1("int*(Iterable.E)")._as(new M.BuiltListMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.legacy_int);
        t2 = P.List_List$of(t2, false, H._instanceType(t2)._eval$1("Iterable.E"));
        C.JSArray_methods.sort$0(t2);
        t2 = _this._list_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq: function(_, 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 M.BuiltListMultimap))
        return false;
      t1 = other._list_multimap$_map;
      t2 = _this._list_multimap$_map;
      if (t1.get$length(t1) !== t2.get$length(t2))
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t3 = t3.get$iterator(t3), t4 = other._emptyList, t5 = _this._emptyList; t3.moveNext$0();) {
        key = t3.get$current(t3);
        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: function(_) {
      return J.toString$0$(this._list_multimap$_map);
    },
    get$keys: function(_) {
      var t1, _this = this;
      if (_this._list_multimap$_keys == null) {
        t1 = _this._list_multimap$_map;
        _this.set$_list_multimap$_keys(t1.get$keys(t1));
      }
      return _this._list_multimap$_keys;
    },
    get$length: function(_) {
      var t1 = this._list_multimap$_map;
      return t1.get$length(t1);
    },
    BuiltListMultimap$_$1: function(_map, $K, $V) {
      if (H.createRuntimeType($K._eval$1("0*")) === C.Type_dynamic_0Rz)
        throw H.wrapException(P.UnsupportedError$('explicit key type required, for example "new BuiltListMultimap<int, int>"'));
      if (H.createRuntimeType($V._eval$1("0*")) === C.Type_dynamic_0Rz)
        throw H.wrapException(P.UnsupportedError$('explicit value type required, for example "new BuiltListMultimap<int, int>"'));
    },
    set$_list_multimap$_keys: function(_keys) {
      this._list_multimap$_keys = this.$ti._eval$1("Iterable<BuiltListMultimap.K*>*")._as(_keys);
    }
  };
  M.BuiltListMultimap_BuiltListMultimap_closure.prototype = {
    call$1: function(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 2
  };
  M.BuiltListMultimap_hashCode_closure.prototype = {
    call$1: function(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._eval$1("BuiltListMultimap.K*")._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, J.get$hashCode$(t2)), J.get$hashCode$(t1)));
    },
    $signature: function() {
      return this.$this.$ti._eval$1("int*(BuiltListMultimap.K*)");
    }
  };
  M._BuiltListMultimap.prototype = {
    _BuiltListMultimap$copyAndCheck$2: function(keys, lookup, $K, $V) {
      var t1, t2, t3, t4, t5, key;
      for (t1 = J.get$iterator$ax(keys), t2 = this._list_multimap$_map, t3 = type$.legacy_Iterable_dynamic, t4 = $V._eval$1("0*"), t5 = $K._eval$1("0*"); t1.moveNext$0();) {
        key = t1.get$current(t1);
        if (t5._is(key))
          t2.$indexSet(0, key, S.BuiltList_BuiltList$from(t3._as(lookup.call$1(key)), t4));
        else
          throw H.wrapException(P.ArgumentError$("map contained invalid key: " + H.S(key)));
      }
    }
  };
  M.ListMultimapBuilder.prototype = {
    build$0: function() {
      var t1, key, t2, t3, t4, builtList, _this = this;
      if (_this._list_multimap$_builtMapOwner == null) {
        for (t1 = _this._list_multimap$_builderMap, t1 = t1.get$keys(t1), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
          key = t1.get$current(t1);
          t2 = _this._list_multimap$_builderMap.$index(0, key);
          if (t2._listOwner == null) {
            t3 = t2._list;
            t4 = H._instanceType(t2);
            if (H.createRuntimeType(t4._eval$1("1*")) === C.Type_dynamic_0Rz)
              H.throwExpression(P.UnsupportedError$(string$.explicBL));
            t4 = t4._eval$1("_BuiltList<1*>*")._as(new S._BuiltList(t3, t4._eval$1("_BuiltList<1*>")));
            t2.set$_list(t3);
            t2.set$_listOwner(t4);
          }
          builtList = t2._listOwner;
          t2 = builtList._list.length;
          t3 = _this._list_multimap$_builtMap;
          if (t2 === 0)
            t3.remove$1(0, key);
          else
            t3.$indexSet(0, key, builtList);
        }
        t1 = _this._list_multimap$_builtMap;
        t2 = _this.$ti;
        t3 = t2._eval$1("2*");
        t4 = new M._BuiltListMultimap(t1, S.BuiltList_BuiltList$from(C.List_empty0, t3), t2._eval$1("@<1*>")._bind$1(t3)._eval$1("_BuiltListMultimap<1,2>"));
        t4.BuiltListMultimap$_$1(t1, t2._eval$1("1*"), t3);
        _this.set$_list_multimap$_builtMapOwner(t4);
      }
      return _this._list_multimap$_builtMapOwner;
    },
    replace$1: function(_, multimap) {
      this._list_multimap$_setWithCopyAndCheck$2(multimap.get$keys(multimap), new M.ListMultimapBuilder_replace_closure(multimap));
    },
    _list_multimap$_getValuesBuilder$1: function(key) {
      var result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1*")._as(key);
      result = _this._list_multimap$_builderMap.$index(0, key);
      if (result == null) {
        builtValues = _this._list_multimap$_builtMap.$index(0, key);
        result = builtValues == null ? S.ListBuilder_ListBuilder(C.List_empty0, t1._eval$1("2*")) : S.ListBuilder_ListBuilder(builtValues, builtValues.$ti._eval$1("BuiltList.E*"));
        _this._list_multimap$_builderMap.$indexSet(0, key, result);
      }
      return result;
    },
    _list_multimap$_setWithCopyAndCheck$2: function(keys, lookup) {
      var t1, t2, t3, t4, t5, key, t6, value, t7, t8, t9, _this = this;
      _this.set$_list_multimap$_builtMapOwner(null);
      t1 = _this.$ti;
      t2 = t1._eval$1("1*");
      t3 = t1._eval$1("BuiltList<2*>*");
      _this.set$_list_multimap$_builtMap(P.LinkedHashMap_LinkedHashMap$_empty(t2, t3));
      _this.set$_list_multimap$_builderMap(P.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("ListBuilder<2*>*")));
      for (t4 = J.get$iterator$ax(keys), t5 = type$.legacy_Iterable_dynamic, t1 = t1._eval$1("2*"); t4.moveNext$0();) {
        key = t4.get$current(t4);
        if (t2._is(key))
          for (t6 = J.get$iterator$ax(t5._as(lookup.call$1(key))); t6.moveNext$0();) {
            value = t6.get$current(t6);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._list_multimap$_builtMapOwner != null) {
                _this.set$_list_multimap$_builtMap(P.LinkedHashMap_LinkedHashMap$from(_this._list_multimap$_builtMap, t2, t3));
                _this.set$_list_multimap$_builtMapOwner(null);
              }
              if (key == null)
                H.throwExpression(P.ArgumentError$("null key"));
              if (value == null)
                H.throwExpression(P.ArgumentError$("null value"));
              t7 = _this._list_multimap$_getValuesBuilder$1(key);
              t8 = t7.$ti;
              t9 = t8._eval$1("1*");
              t9._as(value);
              if (t7._listOwner != null) {
                t7.set$_list(t8._eval$1("List<1*>*")._as(P.List_List$from(t7._list, true, t9)));
                t7.set$_listOwner(null);
              }
              t7 = t7._list;
              (t7 && C.JSArray_methods).add$1(t7, value);
            } else
              throw H.wrapException(P.ArgumentError$("map contained invalid value: " + H.S(value) + ", for key " + H.S(key)));
          }
        else
          throw H.wrapException(P.ArgumentError$("map contained invalid key: " + H.S(key)));
      }
    },
    set$_list_multimap$_builtMap: function(_builtMap) {
      this._list_multimap$_builtMap = this.$ti._eval$1("Map<1*,BuiltList<2*>*>*")._as(_builtMap);
    },
    set$_list_multimap$_builtMapOwner: function(_builtMapOwner) {
      this._list_multimap$_builtMapOwner = this.$ti._eval$1("_BuiltListMultimap<1*,2*>*")._as(_builtMapOwner);
    },
    set$_list_multimap$_builderMap: function(_builderMap) {
      this._list_multimap$_builderMap = this.$ti._eval$1("Map<1*,ListBuilder<2*>*>*")._as(_builderMap);
    }
  };
  M.ListMultimapBuilder_replace_closure.prototype = {
    call$1: function(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 2
  };
  A.BuiltMap.prototype = {
    toBuilder$0: function() {
      var t1 = this.$ti;
      t1._eval$1("_BuiltMap<BuiltMap.K*,BuiltMap.V*>*")._as(this);
      return new A.MapBuilder(this._mapFactory, this._map$_map, this, t1._eval$1("@<BuiltMap.K*>")._bind$1(t1._eval$1("BuiltMap.V*"))._eval$1("MapBuilder<1,2>"));
    },
    get$hashCode: function(_) {
      var _this = this,
        t1 = _this._map$_hashCode;
      if (t1 == null) {
        t1 = J.map$1$1$ax(J.get$keys$x(_this._map$_map), new A.BuiltMap_hashCode_closure(_this), type$.legacy_int).toList$1$growable(0, false);
        C.JSArray_methods.sort$0(t1);
        t1 = _this._map$_hashCode = A.hashObjects(t1);
      }
      return t1;
    },
    $eq: function(_, other) {
      var t1, t2, t3, t4, t5, 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 = J.getInterceptor$asx(t1);
      t3 = _this._map$_map;
      t4 = J.getInterceptor$asx(t3);
      if (t2.get$length(t1) != t4.get$length(t3))
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (t5 = J.get$iterator$ax(_this.get$keys(_this)); t5.moveNext$0();) {
        key = t5.get$current(t5);
        if (!J.$eq$(t2.$index(t1, key), t4.$index(t3, key)))
          return false;
      }
      return true;
    },
    toString$0: function(_) {
      return J.toString$0$(this._map$_map);
    },
    get$keys: function(_) {
      var _this = this;
      if (_this._map$_keys == null)
        _this.set$_map$_keys(J.get$keys$x(_this._map$_map));
      return _this._map$_keys;
    },
    get$length: function(_) {
      return J.get$length$asx(this._map$_map);
    },
    map$1: function(_, f) {
      var t1 = type$.dynamic;
      return A._BuiltMap$withSafeMap(null, J.map$2$1$ax(this._map$_map, this.$ti._eval$1("MapEntry<@,@>*(BuiltMap.K*,BuiltMap.V*)*")._as(f), t1, t1), t1, t1);
    },
    BuiltMap$_$2: function(_mapFactory, _map, $K, $V) {
      if (H.createRuntimeType($K._eval$1("0*")) === C.Type_dynamic_0Rz)
        throw H.wrapException(P.UnsupportedError$('explicit key type required, for example "new BuiltMap<int, int>"'));
      if (H.createRuntimeType($V._eval$1("0*")) === C.Type_dynamic_0Rz)
        throw H.wrapException(P.UnsupportedError$('explicit value type required, for example "new BuiltMap<int, int>"'));
    },
    set$_map$_keys: function(_keys) {
      this._map$_keys = this.$ti._eval$1("Iterable<BuiltMap.K*>*")._as(_keys);
    }
  };
  A.BuiltMap_BuiltMap_closure.prototype = {
    call$1: function(k) {
      return this.map.$index(0, k);
    },
    $signature: 2
  };
  A.BuiltMap_hashCode_closure.prototype = {
    call$1: function(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._eval$1("BuiltMap.K*")._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(J.$index$asx(t1._map$_map, key));
      return A._finish(A._combine(A._combine(0, J.get$hashCode$(t2)), J.get$hashCode$(t1)));
    },
    $signature: function() {
      return this.$this.$ti._eval$1("int*(BuiltMap.K*)");
    }
  };
  A._BuiltMap.prototype = {
    _BuiltMap$copyAndCheckTypes$2: function(keys, lookup, $K, $V) {
      var t1, t2, t3, t4, t5, key, value;
      for (t1 = J.get$iterator$ax(keys), t2 = this._map$_map, t3 = J.getInterceptor$ax(t2), t4 = $V._eval$1("0*"), t5 = $K._eval$1("0*"); t1.moveNext$0();) {
        key = t1.get$current(t1);
        if (t5._is(key)) {
          value = lookup.call$1(key);
          if (t4._is(value))
            t3.$indexSet(t2, key, value);
          else
            throw H.wrapException(P.ArgumentError$("map contained invalid value: " + H.S(value)));
        } else
          throw H.wrapException(P.ArgumentError$("map contained invalid key: " + H.S(key)));
      }
    }
  };
  A.MapBuilder.prototype = {
    build$0: function() {
      var t1, _this = this;
      if (_this._mapOwner == null) {
        t1 = _this.$ti;
        _this.set$_mapOwner(A._BuiltMap$withSafeMap(_this._mapFactory, _this._map$_map, t1._eval$1("1*"), t1._eval$1("2*")));
      }
      return _this._mapOwner;
    },
    replace$1: function(_, 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.set$_mapOwner(null);
      _this.set$_map$_map(replacement);
    },
    $indexSet: function(_, key, value) {
      var _this = this,
        t1 = _this.$ti;
      t1._eval$1("1*")._as(key);
      t1._eval$1("2*")._as(value);
      if (key == null)
        H.throwExpression(P.ArgumentError$("null key"));
      if (value == null)
        H.throwExpression(P.ArgumentError$("null value"));
      if (_this._mapOwner != null) {
        t1 = _this._createMap$0();
        J.addAll$1$ax(t1, _this._map$_map);
        _this.set$_map$_map(t1);
        _this.set$_mapOwner(null);
      }
      J.$indexSet$ax(_this._map$_map, key, value);
    },
    get$length: function(_) {
      return J.get$length$asx(this._map$_map);
    },
    get$_safeMap: function() {
      var t1, _this = this;
      if (_this._mapOwner != null) {
        t1 = _this._createMap$0();
        J.addAll$1$ax(t1, _this._map$_map);
        _this.set$_map$_map(t1);
        _this.set$_mapOwner(null);
      }
      return _this._map$_map;
    },
    _createMap$0: function() {
      var t1 = this.$ti;
      return P.LinkedHashMap_LinkedHashMap$_empty(t1._eval$1("1*"), t1._eval$1("2*"));
    },
    set$_map$_map: function(_map) {
      this._map$_map = this.$ti._eval$1("Map<1*,2*>*")._as(_map);
    },
    set$_mapOwner: function(_mapOwner) {
      this._mapOwner = this.$ti._eval$1("_BuiltMap<1*,2*>*")._as(_mapOwner);
    }
  };
  A.MapBuilder_replace_closure.prototype = {
    call$2: function(key, value) {
      var t1 = this.$this.$ti;
      J.$indexSet$ax(this.replacement, t1._eval$1("1*")._as(key), t1._eval$1("2*")._as(value));
    },
    $signature: 43
  };
  L.BuiltSet.prototype = {
    get$hashCode: function(_) {
      var _this = this,
        t1 = _this._set$_hashCode;
      if (t1 == null) {
        t1 = _this._set$_set.map$1$1(0, new L.BuiltSet_hashCode_closure(_this), type$.legacy_int);
        t1 = P.List_List$of(t1, false, H._instanceType(t1)._eval$1("Iterable.E"));
        C.JSArray_methods.sort$0(t1);
        t1 = _this._set$_hashCode = A.hashObjects(t1);
      }
      return t1;
    },
    $eq: function(_, other) {
      var t1, t2, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof L.BuiltSet))
        return false;
      t1 = other._set$_set;
      t2 = _this._set$_set;
      if (t1.get$length(t1) !== t2.get$length(t2))
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      return t2.containsAll$1(other);
    },
    toString$0: function(_) {
      return J.toString$0$(this._set$_set);
    },
    get$length: function(_) {
      var t1 = this._set$_set;
      return t1.get$length(t1);
    },
    get$iterator: function(_) {
      var t1 = this._set$_set;
      return t1.get$iterator(t1);
    },
    map$1$1: function(_, f, $T) {
      return this._set$_set.map$1$1(0, this.$ti._bind$1($T)._eval$1("1*(BuiltSet.E*)*")._as(f), $T._eval$1("0*"));
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    contains$1: function(_, element) {
      return this._set$_set.contains$1(0, element);
    },
    get$isEmpty: function(_) {
      var t1 = this._set$_set;
      return t1.get$isEmpty(t1);
    },
    get$isNotEmpty: function(_) {
      var t1 = this._set$_set;
      return t1.get$isNotEmpty(t1);
    },
    skip$1: function(_, n) {
      return this._set$_set.skip$1(0, n);
    },
    get$first: function(_) {
      var t1 = this._set$_set;
      return t1.get$first(t1);
    },
    elementAt$1: function(_, index) {
      return this._set$_set.elementAt$1(0, index);
    },
    BuiltSet$_$2: function(_setFactory, _set, $E) {
      if (H.createRuntimeType($E._eval$1("0*")) === C.Type_dynamic_0Rz)
        throw H.wrapException(P.UnsupportedError$(string$.explicBS));
    },
    $isIterable: 1
  };
  L.BuiltSet_hashCode_closure.prototype = {
    call$1: function(e) {
      return J.get$hashCode$(this.$this.$ti._eval$1("BuiltSet.E*")._as(e));
    },
    $signature: function() {
      return this.$this.$ti._eval$1("int*(BuiltSet.E*)");
    }
  };
  L._BuiltSet.prototype = {
    _BuiltSet$copyAndCheckTypes$1: function(iterable, $E) {
      var t1, t2, t3, _i, element;
      for (t1 = iterable.length, t2 = this._set$_set, t3 = $E._eval$1("0*"), _i = 0; _i < iterable.length; iterable.length === t1 || (0, H.throwConcurrentModificationError)(iterable), ++_i) {
        element = iterable[_i];
        if (t3._is(element))
          t2.add$1(0, element);
        else
          throw H.wrapException(P.ArgumentError$("iterable contained invalid element: " + H.S(element)));
      }
    }
  };
  L.SetBuilder.prototype = {
    build$0: function() {
      var t1, t2, t3, t4, _this = this;
      if (_this._setOwner == null) {
        t1 = _this._setFactory;
        t2 = _this._set$_set;
        t3 = _this.$ti;
        t4 = new L._BuiltSet(t1, t2, t3._eval$1("_BuiltSet<1*>"));
        t4.BuiltSet$_$2(t1, t2, t3._eval$1("1*"));
        _this.set$_setOwner(t4);
      }
      return _this._setOwner;
    },
    replace$1: function(_, iterable) {
      var t3, element,
        t1 = this.$ti,
        t2 = t1._eval$1("1*"),
        set = P.LinkedHashSet_LinkedHashSet$_empty(t2);
      for (t3 = J.get$iterator$ax(iterable); t3.moveNext$0();) {
        element = t3.get$current(t3);
        if (t2._is(element))
          set.add$1(0, element);
        else
          throw H.wrapException(P.ArgumentError$("iterable contained invalid element: " + H.S(element)));
      }
      t1._eval$1("Set<1*>*")._as(set);
      this.set$_setOwner(null);
      this.set$_set$_set(set);
    },
    get$length: function(_) {
      var t1 = this._set$_set;
      return t1.get$length(t1);
    },
    map$1: function(_, f) {
      var t2, result, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1*(1*)*")._as(f);
      t2 = t1._eval$1("1*");
      result = P.LinkedHashSet_LinkedHashSet$_empty(t2);
      result.addAll$1(0, _this._set$_set.map$1$1(0, f, t2));
      _this._checkElements$1(result);
      t1._eval$1("Set<1*>*")._as(result);
      _this.set$_setOwner(null);
      _this.set$_set$_set(result);
    },
    get$_safeSet: function() {
      var t1, _this = this;
      if (_this._setOwner != null) {
        t1 = P.LinkedHashSet_LinkedHashSet$_empty(_this.$ti._eval$1("1*"));
        t1.addAll$1(0, _this._set$_set);
        _this.set$_set$_set(t1);
        _this.set$_setOwner(null);
      }
      return _this._set$_set;
    },
    _checkElements$1: function(elements) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("Iterable<1*>*")._as(elements);
      for (t2 = elements.get$iterator(elements), t1 = t1._eval$1("1*"); t2.moveNext$0();)
        if (t1._as(t2.get$current(t2)) == null)
          H.throwExpression(P.ArgumentError$("null element"));
    },
    set$_set$_set: function(_set) {
      this._set$_set = this.$ti._eval$1("Set<1*>*")._as(_set);
    },
    set$_setOwner: function(_setOwner) {
      this._setOwner = this.$ti._eval$1("_BuiltSet<1*>*")._as(_setOwner);
    }
  };
  E.BuiltSetMultimap.prototype = {
    get$hashCode: function(_) {
      var t2, _this = this,
        t1 = _this._set_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._set_multimap$_map;
        t1 = t1.get$keys(t1);
        t2 = H._instanceType(t1);
        t2 = H.MappedIterable_MappedIterable(t1, t2._eval$1("int*(Iterable.E)")._as(new E.BuiltSetMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.legacy_int);
        t2 = P.List_List$of(t2, false, H._instanceType(t2)._eval$1("Iterable.E"));
        C.JSArray_methods.sort$0(t2);
        t2 = _this._set_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq: function(_, 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 E.BuiltSetMultimap))
        return false;
      t1 = other._set_multimap$_map;
      t2 = _this._set_multimap$_map;
      if (t1.get$length(t1) !== t2.get$length(t2))
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t3 = t3.get$iterator(t3), t4 = other._emptySet, t5 = _this._emptySet; t3.moveNext$0();) {
        key = t3.get$current(t3);
        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: function(_) {
      return J.toString$0$(this._set_multimap$_map);
    },
    get$keys: function(_) {
      var t1, _this = this;
      if (_this._set_multimap$_keys == null) {
        t1 = _this._set_multimap$_map;
        _this.set$_set_multimap$_keys(t1.get$keys(t1));
      }
      return _this._set_multimap$_keys;
    },
    get$length: function(_) {
      var t1 = this._set_multimap$_map;
      return t1.get$length(t1);
    },
    BuiltSetMultimap$_$1: function(_map, $K, $V) {
      if (H.createRuntimeType($K._eval$1("0*")) === C.Type_dynamic_0Rz)
        throw H.wrapException(P.UnsupportedError$('explicit key type required, for example "new BuiltSetMultimap<int, int>"'));
      if (H.createRuntimeType($V._eval$1("0*")) === C.Type_dynamic_0Rz)
        throw H.wrapException(P.UnsupportedError$('explicit value type required, for example "new BuiltSetMultimap<int, int>"'));
    },
    set$_set_multimap$_keys: function(_keys) {
      this._set_multimap$_keys = this.$ti._eval$1("Iterable<BuiltSetMultimap.K*>*")._as(_keys);
    }
  };
  E.BuiltSetMultimap_hashCode_closure.prototype = {
    call$1: function(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._eval$1("BuiltSetMultimap.K*")._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, J.get$hashCode$(t2)), J.get$hashCode$(t1)));
    },
    $signature: function() {
      return this.$this.$ti._eval$1("int*(BuiltSetMultimap.K*)");
    }
  };
  E._BuiltSetMultimap.prototype = {};
  E.SetMultimapBuilder.prototype = {
    build$0: function() {
      var t1, key, t2, t3, t4, t5, builtSet, _this = this;
      if (_this._builtMapOwner == null) {
        for (t1 = _this._builderMap, t1 = t1.get$keys(t1), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
          key = t1.get$current(t1);
          t2 = _this._builderMap.$index(0, key);
          if (t2._setOwner == null) {
            t3 = t2._setFactory;
            t4 = t2._set$_set;
            t5 = H._instanceType(t2);
            if (H.createRuntimeType(t5._eval$1("1*")) === C.Type_dynamic_0Rz)
              H.throwExpression(P.UnsupportedError$(string$.explicBS));
            t2.set$_setOwner(new L._BuiltSet(t3, t4, t5._eval$1("_BuiltSet<1*>")));
          }
          builtSet = t2._setOwner;
          t2 = builtSet._set$_set;
          t2 = t2.get$isEmpty(t2);
          t3 = _this._builtMap;
          if (t2)
            t3.remove$1(0, key);
          else
            t3.$indexSet(0, key, builtSet);
        }
        t1 = _this._builtMap;
        t2 = _this.$ti;
        t3 = t2._eval$1("2*");
        t4 = new E._BuiltSetMultimap(t1, L.BuiltSet_BuiltSet$from(C.List_empty0, t3), t2._eval$1("@<1*>")._bind$1(t3)._eval$1("_BuiltSetMultimap<1,2>"));
        t4.BuiltSetMultimap$_$1(t1, t2._eval$1("1*"), t3);
        _this.set$_builtMapOwner(t4);
      }
      return _this._builtMapOwner;
    },
    replace$1: function(_, multimap) {
      this._setWithCopyAndCheck$2(multimap.get$keys(multimap), new E.SetMultimapBuilder_replace_closure(multimap));
    },
    _getValuesBuilder$1: function(key) {
      var result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1*")._as(key);
      result = _this._builderMap.$index(0, key);
      if (result == null) {
        builtValues = _this._builtMap.$index(0, key);
        if (builtValues == null)
          result = L.SetBuilder_SetBuilder(t1._eval$1("2*"));
        else {
          t1 = builtValues.$ti;
          t1._eval$1("_BuiltSet<BuiltSet.E*>*")._as(builtValues);
          result = new L.SetBuilder(builtValues._setFactory, builtValues._set$_set, builtValues, t1._eval$1("SetBuilder<BuiltSet.E*>"));
        }
        _this._builderMap.$indexSet(0, key, result);
      }
      return result;
    },
    _setWithCopyAndCheck$2: function(keys, lookup) {
      var t1, t2, t3, t4, t5, key, t6, value, t7, _this = this;
      _this.set$_builtMapOwner(null);
      t1 = _this.$ti;
      t2 = t1._eval$1("1*");
      t3 = t1._eval$1("BuiltSet<2*>*");
      _this.set$_builtMap(P.LinkedHashMap_LinkedHashMap$_empty(t2, t3));
      _this.set$_builderMap(P.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("SetBuilder<2*>*")));
      for (t4 = J.get$iterator$ax(keys), t5 = type$.legacy_Iterable_dynamic, t1 = t1._eval$1("2*"); t4.moveNext$0();) {
        key = t4.get$current(t4);
        if (t2._is(key))
          for (t6 = J.get$iterator$ax(t5._as(lookup.call$1(key))); t6.moveNext$0();) {
            value = t6.get$current(t6);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._builtMapOwner != null) {
                _this.set$_builtMap(P.LinkedHashMap_LinkedHashMap$from(_this._builtMap, t2, t3));
                _this.set$_builtMapOwner(null);
              }
              if (key == null)
                H.throwExpression(P.ArgumentError$("invalid key: " + H.S(key)));
              if (value == null)
                H.throwExpression(P.ArgumentError$("invalid value: " + H.S(value)));
              t7 = _this._getValuesBuilder$1(key);
              t7.$ti._eval$1("1*")._as(value);
              t7.get$_safeSet().add$1(0, value);
            } else
              throw H.wrapException(P.ArgumentError$("map contained invalid value: " + H.S(value) + ", for key " + H.S(key)));
          }
        else
          throw H.wrapException(P.ArgumentError$("map contained invalid key: " + H.S(key)));
      }
    },
    set$_builtMap: function(_builtMap) {
      this._builtMap = this.$ti._eval$1("Map<1*,BuiltSet<2*>*>*")._as(_builtMap);
    },
    set$_builtMapOwner: function(_builtMapOwner) {
      this._builtMapOwner = this.$ti._eval$1("_BuiltSetMultimap<1*,2*>*")._as(_builtMapOwner);
    },
    set$_builderMap: function(_builderMap) {
      this._builderMap = this.$ti._eval$1("Map<1*,SetBuilder<2*>*>*")._as(_builderMap);
    }
  };
  E.SetMultimapBuilder_replace_closure.prototype = {
    call$1: function(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 2
  };
  Y.EnumClass.prototype = {
    toString$0: function(_) {
      return this.name;
    }
  };
  Y.newBuiltValueToStringHelper_closure.prototype = {
    call$1: function(className) {
      var t1 = new P.StringBuffer("");
      t1._contents = className;
      t1._contents = className + " {\n";
      $._indentingBuiltValueToStringHelperIndent = $._indentingBuiltValueToStringHelperIndent + 2;
      return new Y.IndentingBuiltValueToStringHelper(t1);
    },
    $signature: 44
  };
  Y.IndentingBuiltValueToStringHelper.prototype = {
    add$2: function(_, field, value) {
      var t1, t2;
      if (value != null) {
        t1 = this._result;
        t2 = t1._contents += C.JSString_methods.$mul(" ", $._indentingBuiltValueToStringHelperIndent);
        t2 += field;
        t1._contents = t2;
        t1._contents = t2 + "=";
        t2 = t1._contents += H.S(value);
        t1._contents = t2 + ",\n";
      }
    },
    toString$0: function(_) {
      var t2, stringResult,
        t1 = $._indentingBuiltValueToStringHelperIndent - 2;
      $._indentingBuiltValueToStringHelperIndent = t1;
      t2 = this._result;
      t1 = t2._contents += C.JSString_methods.$mul(" ", t1);
      t2._contents = t1 + "}";
      stringResult = J.toString$0$(this._result);
      this._result = null;
      return stringResult;
    }
  };
  Y.BuiltValueNullFieldError.prototype = {
    toString$0: function(_) {
      var t1 = this.field;
      return 'Tried to construct class "' + this.type + '" with null field "' + t1 + '". This is forbidden; to allow it, mark "' + t1 + '" with @nullable.';
    }
  };
  Y.BuiltValueNestedFieldError.prototype = {
    toString$0: function(_) {
      return 'Tried to build class "' + this.type + '" but nested builder for field "' + H.S(this.field) + '" threw: ' + H.S(this.error);
    }
  };
  A.JsonObject.prototype = {
    toString$0: function(_) {
      return J.toString$0$(this.get$value(this));
    }
  };
  A.BoolJsonObject.prototype = {
    $eq: function(_, 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: function(_) {
      return C.JSBool_methods.get$hashCode(this.value);
    },
    get$value: function(receiver) {
      return this.value;
    }
  };
  A.ListJsonObject.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.ListJsonObject))
        return false;
      return C.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode: function(_) {
      return C.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value: function(receiver) {
      return this.value;
    }
  };
  A.MapJsonObject.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.MapJsonObject))
        return false;
      return C.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode: function(_) {
      return C.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value: function(receiver) {
      return this.value;
    }
  };
  A.NumJsonObject.prototype = {
    $eq: function(_, 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: function(_) {
      return C.JSNumber_methods.get$hashCode(this.value);
    },
    get$value: function(receiver) {
      return this.value;
    }
  };
  A.StringJsonObject.prototype = {
    $eq: function(_, 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: function(_) {
      return C.JSString_methods.get$hashCode(this.value);
    },
    get$value: function(receiver) {
      return this.value;
    }
  };
  U.Serializers_Serializers_closure.prototype = {
    call$0: function() {
      return S.ListBuilder_ListBuilder(C.List_empty0, type$.legacy_Object);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 45
  };
  U.Serializers_Serializers_closure0.prototype = {
    call$0: function() {
      var t1 = type$.legacy_Object;
      return M.ListMultimapBuilder_ListMultimapBuilder(t1, t1);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 46
  };
  U.Serializers_Serializers_closure1.prototype = {
    call$0: function() {
      var t1 = type$.legacy_Object;
      return A.MapBuilder_MapBuilder(t1, t1);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 47
  };
  U.Serializers_Serializers_closure2.prototype = {
    call$0: function() {
      return L.SetBuilder_SetBuilder(type$.legacy_Object);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 48
  };
  U.Serializers_Serializers_closure3.prototype = {
    call$0: function() {
      var t1 = type$.legacy_Object;
      return E.SetMultimapBuilder_SetMultimapBuilder(t1, t1);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 49
  };
  U.FullType.prototype = {
    $eq: function(_, other) {
      var t1, t2, t3, t4, i, t5;
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof U.FullType))
        return false;
      if (this.root != other.root)
        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 H.ioore(t1, i);
        t5 = t1[i];
        if (i >= t4)
          return H.ioore(t3, i);
        if (!t5.$eq(0, t3[i]))
          return false;
      }
      return true;
    },
    get$hashCode: function(_) {
      var t1 = A.hashObjects(this.parameters);
      return A._finish(A._combine(A._combine(0, J.get$hashCode$(this.root)), C.JSInt_methods.get$hashCode(t1)));
    },
    toString$0: function(_) {
      var t2,
        t1 = this.root;
      if (t1 == null)
        t1 = "unspecified";
      else {
        t2 = this.parameters;
        t1 = t2.length === 0 ? U.FullType__getRawName(t1) : U.FullType__getRawName(t1) + "<" + C.JSArray_methods.join$1(t2, ", ") + ">";
      }
      return t1;
    }
  };
  U.DeserializationError.prototype = {
    toString$0: function(_) {
      return "Deserializing '" + this.json + "' to '" + this.type.toString$0(0) + "' failed due to: " + this.error.toString$0(0);
    }
  };
  O.BigIntSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, bigInt, specifiedType) {
      return J.toString$0$(type$.legacy_BigInt._as(bigInt));
    },
    serialize$2: function(serializers, bigInt) {
      return this.serialize$3$specifiedType(serializers, bigInt, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var result;
      H._asStringS(serialized);
      result = P._BigIntImpl__tryParse(serialized, null);
      if (result == null)
        H.throwExpression(P.FormatException$("Could not parse BigInt", serialized, null));
      return result;
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "BigInt";
    }
  };
  R.BoolSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, boolean, specifiedType) {
      return H._asBoolS(boolean);
    },
    serialize$2: function(serializers, boolean) {
      return this.serialize$3$specifiedType(serializers, boolean, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return H._asBoolS(serialized);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "bool";
    }
  };
  Y.BuiltJsonSerializers.prototype = {
    serialize$2$specifiedType: function(object, specifiedType) {
      var t1, t2, t3, transformedObject, result;
      for (t1 = this._plugins._list, t2 = H.instanceType(t1)._eval$1("ArrayIterator<1>"), t3 = new J.ArrayIterator(t1, t1.length, t2), transformedObject = object; t3.moveNext$0();)
        transformedObject = t3.__interceptors$_current.beforeSerialize$2(transformedObject, specifiedType);
      result = this._serialize$2(transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t2); t1.moveNext$0();)
        result = t1.__interceptors$_current.afterSerialize$2(result, specifiedType);
      return result;
    },
    serialize$1: function(object) {
      return this.serialize$2$specifiedType(object, C.FullType_null_List_empty);
    },
    _serialize$2: function(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 H.wrapException(P.StateError$("No serializer for '" + t1.get$runtimeType(object).toString$0(0) + "'."));
        if (type$.legacy_StructuredSerializer_dynamic._is(serializer)) {
          result = H.setRuntimeTypeInfo([serializer.get$wireName()], type$.JSArray_legacy_Object);
          C.JSArray_methods.addAll$1(result, serializer.serialize$2(_this, object));
          return result;
        } else if (type$.legacy_PrimitiveSerializer_dynamic._is(serializer))
          return H.setRuntimeTypeInfo([serializer.get$wireName(), serializer.serialize$2(_this, object)], type$.JSArray_legacy_Object);
        else
          throw H.wrapException(P.StateError$(_s62_));
      } else {
        serializer = _this.serializerForType$1(t1);
        if (serializer == null)
          return _this.serialize$1(object);
        if (type$.legacy_StructuredSerializer_dynamic._is(serializer))
          return J.toList$0$ax(serializer.serialize$3$specifiedType(_this, object, specifiedType));
        else if (type$.legacy_PrimitiveSerializer_dynamic._is(serializer))
          return serializer.serialize$3$specifiedType(_this, object, specifiedType);
        else
          throw H.wrapException(P.StateError$(_s62_));
      }
    },
    deserialize$2$specifiedType: function(object, specifiedType) {
      var t1, t2, t3, transformedObject, result;
      for (t1 = this._plugins._list, t2 = H.instanceType(t1)._eval$1("ArrayIterator<1>"), t3 = new J.ArrayIterator(t1, t1.length, t2), transformedObject = object; t3.moveNext$0();)
        transformedObject = t3.__interceptors$_current.beforeDeserialize$2(transformedObject, specifiedType);
      result = this._deserialize$3(object, transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t2); t1.moveNext$0();)
        result = t1.__interceptors$_current.afterDeserialize$2(result, specifiedType);
      return result;
    },
    deserialize$1: function(object) {
      return this.deserialize$2$specifiedType(object, C.FullType_null_List_empty);
    },
    _deserialize$3: function(objectBeforePlugins, object, specifiedType) {
      var serializer, error, error0, serializer0, error1, error2, wireName, exception, _this = this,
        _s19_ = "No serializer for '",
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        type$.legacy_List_dynamic._as(object);
        t1 = J.getInterceptor$ax(object);
        wireName = H._asStringS(t1.get$first(object));
        serializer = J.$index$asx(_this._wireNameToSerializer._map$_map, wireName);
        if (serializer == null)
          throw H.wrapException(P.StateError$(_s19_ + H.S(wireName) + "'."));
        if (type$.legacy_StructuredSerializer_dynamic._is(serializer))
          try {
            t1 = serializer.deserialize$2(_this, t1.sublist$1(object, 1));
            return t1;
          } catch (exception) {
            t1 = H.unwrapException(exception);
            if (type$.legacy_Error._is(t1)) {
              error = t1;
              throw H.wrapException(U.DeserializationError_DeserializationError(object, specifiedType, error));
            } else
              throw exception;
          }
        else if (type$.legacy_PrimitiveSerializer_dynamic._is(serializer))
          try {
            t1 = serializer.deserialize$2(_this, t1.$index(object, 1));
            return t1;
          } catch (exception) {
            t1 = H.unwrapException(exception);
            if (type$.legacy_Error._is(t1)) {
              error0 = t1;
              throw H.wrapException(U.DeserializationError_DeserializationError(object, specifiedType, error0));
            } else
              throw exception;
          }
        else
          throw H.wrapException(P.StateError$(_s62_));
      } else {
        serializer0 = _this.serializerForType$1(t1);
        if (serializer0 == null)
          if (type$.legacy_List_dynamic._is(object) && typeof J.get$first$ax(object) == "string")
            return _this.deserialize$1(objectBeforePlugins);
          else
            throw H.wrapException(P.StateError$(_s19_ + t1.toString$0(0) + "'."));
        if (type$.legacy_StructuredSerializer_dynamic._is(serializer0))
          try {
            t1 = serializer0.deserialize$3$specifiedType(_this, type$.legacy_Iterable_dynamic._as(object), specifiedType);
            return t1;
          } catch (exception) {
            t1 = H.unwrapException(exception);
            if (type$.legacy_Error._is(t1)) {
              error1 = t1;
              throw H.wrapException(U.DeserializationError_DeserializationError(object, specifiedType, error1));
            } else
              throw exception;
          }
        else if (type$.legacy_PrimitiveSerializer_dynamic._is(serializer0))
          try {
            t1 = serializer0.deserialize$3$specifiedType(_this, object, specifiedType);
            return t1;
          } catch (exception) {
            t1 = H.unwrapException(exception);
            if (type$.legacy_Error._is(t1)) {
              error2 = t1;
              throw H.wrapException(U.DeserializationError_DeserializationError(object, specifiedType, error2));
            } else
              throw exception;
          }
        else
          throw H.wrapException(P.StateError$(_s62_));
      }
    },
    serializerForType$1: function(type) {
      var t1 = J.$index$asx(this._typeToSerializer._map$_map, type);
      if (t1 == null) {
        t1 = Y._getRawName(type);
        t1 = J.$index$asx(this._typeNameToSerializer._map$_map, t1);
      }
      return t1;
    },
    newBuilder$1: function(fullType) {
      var builderFactory = J.$index$asx(this.builderFactories._map$_map, fullType);
      if (builderFactory == null)
        this._throwMissingBuilderFactory$1(fullType);
      return builderFactory.call$0();
    },
    _throwMissingBuilderFactory$1: function(fullType) {
      throw H.wrapException(P.StateError$("No builder factory for " + fullType.toString$0(0) + ". Fix by adding one, see SerializersBuilder.addBuilderFactory."));
    },
    $isSerializers: 1
  };
  Y.BuiltJsonSerializersBuilder.prototype = {
    add$1: function(_, serializer) {
      var t1, t2, t3, t4, t5, t6, $name, genericsStart, t7;
      if (!type$.legacy_StructuredSerializer_dynamic._is(serializer) && !type$.legacy_PrimitiveSerializer_dynamic._is(serializer))
        throw H.wrapException(P.ArgumentError$(string$.serial));
      this._wireNameToSerializer.$indexSet(0, serializer.get$wireName(), serializer);
      for (t1 = J.get$iterator$ax(serializer.get$types(serializer)), t2 = this._typeNameToSerializer, t3 = this._typeToSerializer, t4 = t3.$ti, t5 = t4._eval$1("1*"), t4 = t4._eval$1("2*"); t1.moveNext$0();) {
        t6 = t1.get$current(t1);
        t5._as(t6);
        t4._as(serializer);
        if (t6 == null)
          H.throwExpression(P.ArgumentError$("null key"));
        J.$indexSet$ax(t3.get$_safeMap(), t6, serializer);
        $name = J.toString$0$(t6);
        genericsStart = J.indexOf$1$s($name, "<");
        t6 = genericsStart === -1 ? $name : C.JSString_methods.substring$2($name, 0, genericsStart);
        t7 = t2.$ti;
        t7._eval$1("1*")._as(t6);
        t7._eval$1("2*")._as(serializer);
        J.$indexSet$ax(t2.get$_safeMap(), t6, serializer);
      }
    },
    addBuilderFactory$2: function(types, $function) {
      this._builderFactories.$indexSet(0, types, $function);
    },
    build$0: function() {
      var _this = this;
      return new Y.BuiltJsonSerializers(_this._typeToSerializer.build$0(), _this._wireNameToSerializer.build$0(), _this._typeNameToSerializer.build$0(), _this._builderFactories.build$0(), _this._plugins.build$0());
    }
  };
  R.BuiltListMultimapSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, builtListMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.legacy_BuiltListMultimap_dynamic_dynamic._as(builtListMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!J.containsKey$1$x(serializers.builderFactories._map$_map, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = C.FullType_null_List_empty;
      else {
        if (1 >= t2)
          return H.ioore(t1, 1);
        valueType = t1[1];
      }
      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
      for (t1 = builtListMultimap.get$keys(builtListMultimap), t1 = t1.get$iterator(t1), t2 = builtListMultimap._list_multimap$_map, t3 = builtListMultimap._emptyList; t1.moveNext$0();) {
        key = t1.get$current(t1);
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4.$ti._eval$1("Object*(BuiltList.E*)*")._as(new R.BuiltListMultimapSerializer_serialize_closure(serializers, valueType));
        t4 = t4._list;
        t4.toString;
        t6 = H._arrayInstanceType(t4);
        t7 = t6._eval$1("MappedListIterable<1,Object*>");
        C.JSArray_methods.add$1(result, P.List_List$of(new H.MappedListIterable(t4, t6._eval$1("Object*(1)")._as(t5), t7), true, t7._eval$1("ListIterable.E")));
      }
      return result;
    },
    serialize$2: function(serializers, builtListMultimap) {
      return this.serialize$3$specifiedType(serializers, builtListMultimap, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, i, key, value, t5, t6,
        t1 = type$.legacy_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 = C.FullType_null_List_empty;
      else {
        if (0 >= t3)
          return H.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = C.FullType_null_List_empty;
      else {
        if (1 >= t3)
          return H.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.legacy_Object;
        result = M.ListMultimapBuilder_ListMultimapBuilder(t2, t2);
      } else
        result = type$.legacy_ListMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (C.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw H.wrapException(P.ArgumentError$("odd length"));
      for (i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        for (t3 = J.get$iterator$ax(t1._as(J.map$1$ax(t2.elementAt$1(serialized, i + 1), new R.BuiltListMultimapSerializer_deserialize_closure(serializers, valueType)))); t3.moveNext$0();) {
          value = t3.get$current(t3);
          result.toString;
          t4 = result.$ti;
          t5 = t4._eval$1("1*");
          t5._as(key);
          t4._eval$1("2*")._as(value);
          if (result._list_multimap$_builtMapOwner != null) {
            result.set$_list_multimap$_builtMap(P.LinkedHashMap_LinkedHashMap$from(result._list_multimap$_builtMap, t5, t4._eval$1("BuiltList<2*>*")));
            result.set$_list_multimap$_builtMapOwner(null);
          }
          if (key == null)
            H.throwExpression(P.ArgumentError$("null key"));
          if (value == null)
            H.throwExpression(P.ArgumentError$("null value"));
          t4 = result._list_multimap$_getValuesBuilder$1(key);
          t5 = t4.$ti;
          t6 = t5._eval$1("1*");
          t6._as(value);
          if (t4._listOwner != null) {
            t4.set$_list(t5._eval$1("List<1*>*")._as(P.List_List$from(t4._list, true, t6)));
            t4.set$_listOwner(null);
          }
          t4 = t4._list;
          (t4 && C.JSArray_methods).add$1(t4, value);
        }
      }
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "listMultimap";
    }
  };
  R.BuiltListMultimapSerializer_serialize_closure.prototype = {
    call$1: function(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  R.BuiltListMultimapSerializer_deserialize_closure.prototype = {
    call$1: function(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  K.BuiltListSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, builtList, specifiedType) {
      var t1, t2, elementType, t3;
      type$.legacy_BuiltList_dynamic._as(builtList);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!J.containsKey$1$x(serializers.builderFactories._map$_map, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        elementType = t1[0];
      }
      builtList.toString;
      t1 = builtList.$ti._eval$1("@(BuiltList.E*)*")._as(new K.BuiltListSerializer_serialize_closure(serializers, elementType));
      t2 = builtList._list;
      t2.toString;
      t3 = H._arrayInstanceType(t2);
      return new H.MappedListIterable(t2, t3._eval$1("@(1)")._as(t1), t3._eval$1("MappedListIterable<1,@>"));
    },
    serialize$2: function(serializers, builtList) {
      return this.serialize$3$specifiedType(serializers, builtList, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.legacy_Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? S.ListBuilder_ListBuilder(C.List_empty0, type$.legacy_Object) : type$.legacy_ListBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new K.BuiltListSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "list";
    }
  };
  K.BuiltListSerializer_serialize_closure.prototype = {
    call$1: function(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  K.BuiltListSerializer_deserialize_closure.prototype = {
    call$1: function(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  K.BuiltMapSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, builtMap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key;
      type$.legacy_BuiltMap_dynamic_dynamic._as(builtMap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!J.containsKey$1$x(serializers.builderFactories._map$_map, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = C.FullType_null_List_empty;
      else {
        if (1 >= t2)
          return H.ioore(t1, 1);
        valueType = t1[1];
      }
      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
      for (t1 = J.get$iterator$ax(builtMap.get$keys(builtMap)), t2 = builtMap._map$_map, t3 = J.getInterceptor$asx(t2); t1.moveNext$0();) {
        key = t1.get$current(t1);
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(key, keyType));
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(t3.$index(t2, key), valueType));
      }
      return result;
    },
    serialize$2: function(serializers, builtMap) {
      return this.serialize$3$specifiedType(serializers, builtMap, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, t3, keyType, valueType, result, i, key, value;
      type$.legacy_Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = C.FullType_null_List_empty;
      else {
        if (1 >= t2)
          return H.ioore(t1, 1);
        valueType = t1[1];
      }
      if (isUnderspecified) {
        t1 = type$.legacy_Object;
        result = A.MapBuilder_MapBuilder(t1, t1);
      } else
        result = type$.legacy_MapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t1 = J.getInterceptor$asx(serialized);
      if (C.JSInt_methods.$mod(t1.get$length(serialized), 2) === 1)
        throw H.wrapException(P.ArgumentError$("odd length"));
      for (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);
        result.toString;
        t2 = result.$ti;
        t2._eval$1("1*")._as(key);
        t2._eval$1("2*")._as(value);
        if (key == null)
          H.throwExpression(P.ArgumentError$("null key"));
        if (value == null)
          H.throwExpression(P.ArgumentError$("null value"));
        J.$indexSet$ax(result.get$_safeMap(), key, value);
      }
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "map";
    }
  };
  R.BuiltSetMultimapSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, builtSetMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, t4, key, result0, t5;
      type$.legacy_BuiltSetMultimap_dynamic_dynamic._as(builtSetMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!J.containsKey$1$x(serializers.builderFactories._map$_map, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = C.FullType_null_List_empty;
      else {
        if (1 >= t2)
          return H.ioore(t1, 1);
        valueType = t1[1];
      }
      result = H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
      for (t1 = builtSetMultimap.get$keys(builtSetMultimap), t1 = t1.get$iterator(t1), t2 = type$.legacy_Object, t3 = builtSetMultimap._set_multimap$_map, t4 = builtSetMultimap._emptySet; t1.moveNext$0();) {
        key = t1.get$current(t1);
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(key, keyType));
        result0 = t3.$index(0, key);
        t5 = result0 == null ? t4 : result0;
        t5 = t5._set$_set.map$1$1(0, t5.$ti._eval$1("Object*(BuiltSet.E*)*")._as(new R.BuiltSetMultimapSerializer_serialize_closure(serializers, valueType)), t2);
        C.JSArray_methods.add$1(result, P.List_List$of(t5, true, H._instanceType(t5)._eval$1("Iterable.E")));
      }
      return result;
    },
    serialize$2: function(serializers, builtSetMultimap) {
      return this.serialize$3$specifiedType(serializers, builtSetMultimap, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, i, key, value, t5,
        t1 = type$.legacy_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 = C.FullType_null_List_empty;
      else {
        if (0 >= t3)
          return H.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = C.FullType_null_List_empty;
      else {
        if (1 >= t3)
          return H.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.legacy_Object;
        result = E.SetMultimapBuilder_SetMultimapBuilder(t2, t2);
      } else
        result = type$.legacy_SetMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (C.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw H.wrapException(P.ArgumentError$("odd length"));
      for (i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        for (t3 = J.get$iterator$ax(t1._as(J.map$1$ax(t2.elementAt$1(serialized, i + 1), new R.BuiltSetMultimapSerializer_deserialize_closure(serializers, valueType)))); t3.moveNext$0();) {
          value = t3.get$current(t3);
          result.toString;
          t4 = result.$ti;
          t5 = t4._eval$1("1*");
          t5._as(key);
          t4._eval$1("2*")._as(value);
          if (result._builtMapOwner != null) {
            result.set$_builtMap(P.LinkedHashMap_LinkedHashMap$from(result._builtMap, t5, t4._eval$1("BuiltSet<2*>*")));
            result.set$_builtMapOwner(null);
          }
          if (key == null)
            H.throwExpression(P.ArgumentError$("invalid key: " + H.S(key)));
          if (value == null)
            H.throwExpression(P.ArgumentError$("invalid value: " + H.S(value)));
          t4 = result._getValuesBuilder$1(key);
          t4.$ti._eval$1("1*")._as(value);
          t4.get$_safeSet().add$1(0, value);
        }
      }
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "setMultimap";
    }
  };
  R.BuiltSetMultimapSerializer_serialize_closure.prototype = {
    call$1: function(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  R.BuiltSetMultimapSerializer_deserialize_closure.prototype = {
    call$1: function(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  O.BuiltSetSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, builtSet, specifiedType) {
      var t1, t2, elementType;
      type$.legacy_BuiltSet_dynamic._as(builtSet);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!J.containsKey$1$x(serializers.builderFactories._map$_map, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        elementType = t1[0];
      }
      builtSet.toString;
      return builtSet._set$_set.map$1$1(0, builtSet.$ti._eval$1("@(BuiltSet.E*)*")._as(new O.BuiltSetSerializer_serialize_closure(serializers, elementType)), type$.dynamic);
    },
    serialize$2: function(serializers, builtSet) {
      return this.serialize$3$specifiedType(serializers, builtSet, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.legacy_Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = C.FullType_null_List_empty;
      else {
        if (0 >= t2)
          return H.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? L.SetBuilder_SetBuilder(type$.legacy_Object) : type$.legacy_SetBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new O.BuiltSetSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "set";
    }
  };
  O.BuiltSetSerializer_serialize_closure.prototype = {
    call$1: function(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  O.BuiltSetSerializer_deserialize_closure.prototype = {
    call$1: function(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  Z.DateTimeSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, dateTime, specifiedType) {
      type$.legacy_DateTime._as(dateTime);
      if (!dateTime.isUtc)
        throw H.wrapException(P.ArgumentError$value(dateTime, "dateTime", "Must be in utc for serialization."));
      return 1000 * dateTime._value;
    },
    serialize$2: function(serializers, dateTime) {
      return this.serialize$3$specifiedType(serializers, dateTime, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var t1, t2;
      H._asIntS(serialized);
      if (typeof serialized !== "number")
        return serialized.$div();
      t1 = C.JSNumber_methods.round$0(serialized / 1000);
      if (Math.abs(t1) <= 864e13)
        t2 = false;
      else
        t2 = true;
      if (t2)
        H.throwExpression(P.ArgumentError$("DateTime is outside valid range: " + t1));
      H.checkNotNullable(true, "isUtc", type$.bool);
      return new P.DateTime(t1, true);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "DateTime";
    }
  };
  D.DoubleSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, aDouble, specifiedType) {
      H._asDoubleS(aDouble);
      aDouble.toString;
      if (isNaN(aDouble))
        return "NaN";
      else if (aDouble == 1 / 0 || aDouble == -1 / 0)
        return C.JSNumber_methods.get$isNegative(aDouble) ? "-INF" : "INF";
      else
        return aDouble;
    },
    serialize$2: function(serializers, aDouble) {
      return this.serialize$3$specifiedType(serializers, aDouble, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(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 {
        H._asNumS(serialized);
        serialized.toString;
        return serialized;
      }
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "double";
    }
  };
  K.DurationSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, duration, specifiedType) {
      return type$.legacy_Duration._as(duration)._duration;
    },
    serialize$2: function(serializers, duration) {
      return this.serialize$3$specifiedType(serializers, duration, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      H._asIntS(serialized);
      if (typeof serialized !== "number")
        return H.iae(serialized);
      return new P.Duration(serialized);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "Duration";
    }
  };
  Q.Int64Serializer.prototype = {
    serialize$3$specifiedType: function(serializers, int64, specifiedType) {
      return J.toString$0$(type$.legacy_Int64._as(int64));
    },
    serialize$2: function(serializers, int64) {
      return this.serialize$3$specifiedType(serializers, int64, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return V.Int64__parseRadix(H._asStringS(serialized), 10);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "Int64";
    }
  };
  B.IntSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, integer, specifiedType) {
      return H._asIntS(integer);
    },
    serialize$2: function(serializers, integer) {
      return this.serialize$3$specifiedType(serializers, integer, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return H._asIntS(serialized);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "int";
    }
  };
  O.JsonObjectSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, jsonObject, specifiedType) {
      type$.legacy_JsonObject._as(jsonObject);
      return jsonObject.get$value(jsonObject);
    },
    serialize$2: function(serializers, jsonObject) {
      return this.serialize$3$specifiedType(serializers, jsonObject, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return A.JsonObject_JsonObject(serialized);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "JsonObject";
    }
  };
  K.NumSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, number, specifiedType) {
      H._asNumS(number);
      number.toString;
      if (isNaN(number))
        return "NaN";
      else if (number == 1 / 0 || number == -1 / 0)
        return C.JSNumber_methods.get$isNegative(number) ? "-INF" : "INF";
      else
        return number;
    },
    serialize$2: function(serializers, number) {
      return this.serialize$3$specifiedType(serializers, number, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(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 H._asNumS(serialized);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "num";
    }
  };
  K.RegExpSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, value, specifiedType) {
      return type$.legacy_RegExp._as(value).pattern;
    },
    serialize$2: function(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return P.RegExp_RegExp(H._asStringS(serialized), true);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "RegExp";
    }
  };
  M.StringSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, string, specifiedType) {
      return H._asStringS(string);
    },
    serialize$2: function(serializers, string) {
      return this.serialize$3$specifiedType(serializers, string, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return H._asStringS(serialized);
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "String";
    }
  };
  O.UriSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, uri, specifiedType) {
      return J.toString$0$(type$.legacy_Uri._as(uri));
    },
    serialize$2: function(serializers, uri) {
      return this.serialize$3$specifiedType(serializers, uri, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return P.Uri_parse(H._asStringS(serialized));
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function(receiver) {
      return this.types;
    },
    get$wireName: function() {
      return "Uri";
    }
  };
  U.DefaultEquality.prototype = {$isEquality: 1};
  U.IterableEquality.prototype = {
    equals$2: function(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; true;) {
        hasNext = it1.moveNext$0();
        if (hasNext !== it2.moveNext$0())
          return false;
        if (!hasNext)
          return true;
        if (!t1.equals$2(it1.get$current(it1), it2.get$current(it2)))
          return false;
      }
    },
    hash$1: function(_, elements) {
      var t1, t2, hash, c;
      this.$ti._eval$1("Iterable<1>?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();) {
        c = t2.hash$1(0, t1.get$current(t1));
        if (typeof c !== "number")
          return H.iae(c);
        hash = hash + c & 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
  };
  U.ListEquality.prototype = {
    equals$2: function(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: function(_, list) {
      var t1, t2, hash, i, c;
      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) {
        c = t2.hash$1(0, t1.$index(list, i));
        if (typeof c !== "number")
          return H.iae(c);
        hash = hash + c & 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
  };
  U._UnorderedEquality.prototype = {
    equals$2: function(elements1, elements2) {
      var counts, $length, e, count,
        t1 = H._instanceType(this),
        t2 = t1._eval$1("_UnorderedEquality.T");
      t2._as(elements1);
      t2._as(elements2);
      if (elements1 === elements2)
        return true;
      t2 = this._elementEquality;
      counts = P.HashMap_HashMap(t2.get$equals(), t2.get$hash(t2), t2.get$isValidKey(), t1._eval$1("_UnorderedEquality.E"), type$.dynamic);
      for (t1 = J.get$iterator$ax(elements1), $length = 0; t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        counts.$indexSet(0, e, J.$add$ansx(count == null ? 0 : count, 1));
        ++$length;
      }
      for (t1 = J.get$iterator$ax(elements2); t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        if (count == null || J.$eq$(count, 0))
          return false;
        counts.$indexSet(0, e, J.$sub$n(count, 1));
        --$length;
      }
      return $length === 0;
    },
    hash$1: function(_, elements) {
      var t1, t2, hash, c;
      H._instanceType(this)._eval$1("_UnorderedEquality.T")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();) {
        c = t2.hash$1(0, t1.get$current(t1));
        if (typeof c !== "number")
          return H.iae(c);
        hash = hash + c & 2147483647;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  U.SetEquality.prototype = {};
  U._MapEntry.prototype = {
    get$hashCode: function(_) {
      var t1 = this.equality,
        t2 = t1._keyEquality.hash$1(0, this.key);
      if (typeof t2 !== "number")
        return H.iae(t2);
      t1 = t1._valueEquality.hash$1(0, this.value);
      if (typeof t1 !== "number")
        return H.iae(t1);
      return 3 * t2 + 7 * t1 & 2147483647;
    },
    $eq: function(_, other) {
      var t1;
      if (other == null)
        return false;
      if (other instanceof U._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;
    }
  };
  U.MapEquality.prototype = {
    equals$2: function(map1, map2) {
      var t2, equalElementCounts, t3, key, entry, count,
        t1 = this.$ti._eval$1("Map<1,2>?");
      t1._as(map1);
      t1._as(map2);
      if (map1 === map2)
        return true;
      t1 = J.getInterceptor$asx(map1);
      t2 = J.getInterceptor$asx(map2);
      if (t1.get$length(map1) != t2.get$length(map2))
        return false;
      equalElementCounts = P.HashMap_HashMap(null, null, null, type$._MapEntry, type$.int);
      for (t3 = J.get$iterator$ax(t1.get$keys(map1)); t3.moveNext$0();) {
        key = t3.get$current(t3);
        entry = new U._MapEntry(this, key, t1.$index(map1, key));
        count = equalElementCounts.$index(0, entry);
        equalElementCounts.$indexSet(0, entry, (count == null ? 0 : count) + 1);
      }
      for (t1 = J.get$iterator$ax(t2.get$keys(map2)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        entry = new U._MapEntry(this, key, t2.$index(map2, key));
        count = equalElementCounts.$index(0, entry);
        if (count == null || count === 0)
          return false;
        if (typeof count !== "number")
          return count.$sub();
        equalElementCounts.$indexSet(0, entry, count - 1);
      }
      return true;
    },
    hash$1: function(_, map) {
      var t1, t2, t3, t4, hash, key, keyHash, valueHash;
      this.$ti._eval$1("Map<1,2>?")._as(map);
      for (t1 = J.getInterceptor$x(map), t2 = J.get$iterator$ax(t1.get$keys(map)), t3 = this._keyEquality, t4 = this._valueEquality, hash = 0; t2.moveNext$0();) {
        key = t2.get$current(t2);
        keyHash = t3.hash$1(0, key);
        valueHash = t4.hash$1(0, t1.$index(map, key));
        if (typeof keyHash !== "number")
          return H.iae(keyHash);
        if (typeof valueHash !== "number")
          return H.iae(valueHash);
        hash = hash + 3 * keyHash + 7 * valueHash & 2147483647;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  U.DeepCollectionEquality.prototype = {
    equals$2: function(e1, e2) {
      var _this = this,
        t1 = type$.Set_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new U.SetEquality(_this, type$.SetEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Map_dynamic_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new U.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).equals$2(e1, e2);
      t1 = type$.List_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new U.ListEquality(_this, type$.ListEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Iterable_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && H.boolConversionCheck(new U.IterableEquality(_this, type$.IterableEquality_dynamic).equals$2(e1, e2));
      return J.$eq$(e1, e2);
    },
    hash$1: function(_, o) {
      var _this = this;
      if (type$.Set_dynamic._is(o))
        return new U.SetEquality(_this, type$.SetEquality_dynamic).hash$1(0, o);
      if (type$.Map_dynamic_dynamic._is(o))
        return new U.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).hash$1(0, o);
      if (type$.List_dynamic._is(o))
        return new U.ListEquality(_this, type$.ListEquality_dynamic).hash$1(0, o);
      if (type$.Iterable_dynamic._is(o))
        return new U.IterableEquality(_this, type$.IterableEquality_dynamic).hash$1(0, o);
      return J.get$hashCode$(o);
    },
    isValidKey$1: function(o) {
      !type$.Iterable_dynamic._is(o);
      return true;
    },
    $isEquality: 1
  };
  Q.BuildStatus.prototype = {};
  Q.BuildResult.prototype = {};
  Q._$BuildStatusSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      return type$.legacy_BuildStatus._as(object).name;
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      return Q._$valueOf(H._asStringS(serialized));
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types: function() {
      return C.List_Type_BuildStatus_ahk;
    },
    get$wireName: function() {
      return "BuildStatus";
    }
  };
  Q._$BuildResultSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      return H.setRuntimeTypeInfo(["status", serializers.serialize$2$specifiedType(type$.legacy_BuildResult._as(object).status, C.FullType_qAw)], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var t1, key, value, t2, t3, _$result,
        result = new Q.BuildResultBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (t1 = type$.legacy_BuildStatus; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "status":
            t2 = t1._as(serializers.deserialize$2$specifiedType(value, C.FullType_qAw));
            t3 = result._build_result$_$v;
            if (t3 != null) {
              result._status = t3.status;
              result._build_result$_$v = null;
            }
            result._status = t2;
            break;
        }
      }
      _$result = result._build_result$_$v;
      if (_$result == null) {
        t1 = result.get$_build_result$_$this()._status;
        _$result = new Q._$BuildResult(t1);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$("BuildResult", "status"));
      }
      return result._build_result$_$v = _$result;
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_OHe;
    },
    get$wireName: function() {
      return "BuildResult";
    }
  };
  Q._$BuildResult.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof Q.BuildResult && this.status == other.status;
    },
    get$hashCode: function(_) {
      return Y.$jf(Y.$jc(0, J.get$hashCode$(this.status)));
    },
    toString$0: function(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BuildResult"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "status", this.status);
      return t2.toString$0(t1);
    }
  };
  Q.BuildResultBuilder.prototype = {
    get$_build_result$_$this: function() {
      var _this = this,
        t1 = _this._build_result$_$v;
      if (t1 != null) {
        _this._status = t1.status;
        _this._build_result$_$v = null;
      }
      return _this;
    }
  };
  E.ConnectRequest.prototype = {};
  E._$ConnectRequestSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      type$.legacy_ConnectRequest._as(object);
      return H.setRuntimeTypeInfo(["appId", serializers.serialize$2$specifiedType(object.appId, C.FullType_aZ8), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, C.FullType_aZ8), "entrypointPath", serializers.serialize$2$specifiedType(object.entrypointPath, C.FullType_aZ8)], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var key, value, t1,
        result = new E.ConnectRequestBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "appId":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_$this()._appId = t1;
            break;
          case "instanceId":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_$this()._instanceId = t1;
            break;
          case "entrypointPath":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_$this()._entrypointPath = t1;
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_ssp;
    },
    get$wireName: function() {
      return "ConnectRequest";
    }
  };
  E._$ConnectRequest.prototype = {
    $eq: function(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof E.ConnectRequest && _this.appId == other.appId && _this.instanceId == other.instanceId && _this.entrypointPath == other.entrypointPath;
    },
    get$hashCode: function(_) {
      return Y.$jf(Y.$jc(Y.$jc(Y.$jc(0, J.get$hashCode$(this.appId)), J.get$hashCode$(this.instanceId)), J.get$hashCode$(this.entrypointPath)));
    },
    toString$0: function(_) {
      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);
    }
  };
  E.ConnectRequestBuilder.prototype = {
    get$_$this: function() {
      var _this = this,
        t1 = _this._$v;
      if (t1 != null) {
        _this._appId = t1.appId;
        _this._instanceId = t1.instanceId;
        _this._entrypointPath = t1.entrypointPath;
        _this._$v = null;
      }
      return _this;
    },
    build$0: function() {
      var t1, t2, t3, _this = this,
        _s14_ = "ConnectRequest",
        _$result = _this._$v;
      if (_$result == null) {
        t1 = _this.get$_$this()._appId;
        t2 = _this.get$_$this()._instanceId;
        t3 = _this.get$_$this()._entrypointPath;
        _$result = new E._$ConnectRequest(t1, t2, t3);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s14_, "appId"));
        if (t2 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s14_, "instanceId"));
        if (t3 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s14_, "entrypointPath"));
      }
      return _this._$v = _$result;
    }
  };
  M.DevToolsRequest.prototype = {};
  M.DevToolsResponse.prototype = {};
  M._$DevToolsRequestSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      var result, t1;
      type$.legacy_DevToolsRequest._as(object);
      result = H.setRuntimeTypeInfo(["appId", serializers.serialize$2$specifiedType(object.appId, C.FullType_aZ8), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, C.FullType_aZ8)], type$.JSArray_legacy_Object);
      t1 = object.contextId;
      if (t1 != null) {
        C.JSArray_methods.add$1(result, "contextId");
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(t1, C.FullType_kaS));
      }
      t1 = object.tabUrl;
      if (t1 != null) {
        C.JSArray_methods.add$1(result, "tabUrl");
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(t1, C.FullType_aZ8));
      }
      return result;
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var key, value, t1,
        result = new M.DevToolsRequestBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "appId":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_devtools_request$_$this()._devtools_request$_appId = t1;
            break;
          case "instanceId":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
            break;
          case "contextId":
            t1 = H._asIntS(serializers.deserialize$2$specifiedType(value, C.FullType_kaS));
            result.get$_devtools_request$_$this()._contextId = t1;
            break;
          case "tabUrl":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_devtools_request$_$this()._tabUrl = t1;
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_BCG;
    },
    get$wireName: function() {
      return "DevToolsRequest";
    }
  };
  M._$DevToolsResponseSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      var result, t1;
      type$.legacy_DevToolsResponse._as(object);
      result = H.setRuntimeTypeInfo(["success", serializers.serialize$2$specifiedType(object.success, C.FullType_6bM), "promptExtension", serializers.serialize$2$specifiedType(object.promptExtension, C.FullType_6bM)], type$.JSArray_legacy_Object);
      t1 = object.error;
      if (t1 != null) {
        C.JSArray_methods.add$1(result, "error");
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(t1, C.FullType_aZ8));
      }
      return result;
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var key, value, t1, _$result, t2,
        _s16_ = "DevToolsResponse",
        result = new M.DevToolsResponseBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "success":
            t1 = H._asBoolS(serializers.deserialize$2$specifiedType(value, C.FullType_6bM));
            result.get$_devtools_request$_$this()._success = t1;
            break;
          case "promptExtension":
            t1 = H._asBoolS(serializers.deserialize$2$specifiedType(value, C.FullType_6bM));
            result.get$_devtools_request$_$this()._promptExtension = t1;
            break;
          case "error":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_devtools_request$_$this()._error = t1;
            break;
        }
      }
      _$result = result._devtools_request$_$v;
      if (_$result == null) {
        t1 = result.get$_devtools_request$_$this()._success;
        t2 = result.get$_devtools_request$_$this()._promptExtension;
        _$result = new M._$DevToolsResponse(t1, t2, result.get$_devtools_request$_$this()._error);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s16_, "success"));
        if (t2 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s16_, "promptExtension"));
      }
      return result._devtools_request$_$v = _$result;
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_41A;
    },
    get$wireName: function() {
      return "DevToolsResponse";
    }
  };
  M._$DevToolsRequest.prototype = {
    $eq: function(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof M.DevToolsRequest && _this.appId == other.appId && _this.instanceId == other.instanceId && _this.contextId == other.contextId && _this.tabUrl == other.tabUrl;
    },
    get$hashCode: function(_) {
      var _this = this;
      return Y.$jf(Y.$jc(Y.$jc(Y.$jc(Y.$jc(0, J.get$hashCode$(_this.appId)), J.get$hashCode$(_this.instanceId)), J.get$hashCode$(_this.contextId)), J.get$hashCode$(_this.tabUrl)));
    },
    toString$0: function(_) {
      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);
      return t2.toString$0(t1);
    }
  };
  M.DevToolsRequestBuilder.prototype = {
    get$_devtools_request$_$this: function() {
      var _this = this,
        t1 = _this._devtools_request$_$v;
      if (t1 != null) {
        _this._devtools_request$_appId = t1.appId;
        _this._devtools_request$_instanceId = t1.instanceId;
        _this._contextId = t1.contextId;
        _this._tabUrl = t1.tabUrl;
        _this._devtools_request$_$v = null;
      }
      return _this;
    },
    build$0: function() {
      var t1, t2, _this = this,
        _s15_ = "DevToolsRequest",
        _$result = _this._devtools_request$_$v;
      if (_$result == null) {
        t1 = _this.get$_devtools_request$_$this()._devtools_request$_appId;
        t2 = _this.get$_devtools_request$_$this()._devtools_request$_instanceId;
        _$result = new M._$DevToolsRequest(t1, t2, _this.get$_devtools_request$_$this()._contextId, _this.get$_devtools_request$_$this()._tabUrl);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s15_, "appId"));
        if (t2 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s15_, "instanceId"));
      }
      return _this._devtools_request$_$v = _$result;
    }
  };
  M._$DevToolsResponse.prototype = {
    $eq: function(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof M.DevToolsResponse && _this.success == other.success && _this.promptExtension == other.promptExtension && _this.error == other.error;
    },
    get$hashCode: function(_) {
      return Y.$jf(Y.$jc(Y.$jc(Y.$jc(0, J.get$hashCode$(this.success)), J.get$hashCode$(this.promptExtension)), J.get$hashCode$(this.error)));
    },
    toString$0: function(_) {
      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);
    }
  };
  M.DevToolsResponseBuilder.prototype = {
    get$_devtools_request$_$this: function() {
      var _this = this,
        t1 = _this._devtools_request$_$v;
      if (t1 != null) {
        _this._success = t1.success;
        _this._promptExtension = t1.promptExtension;
        _this._error = t1.error;
        _this._devtools_request$_$v = null;
      }
      return _this;
    }
  };
  X.ErrorResponse.prototype = {};
  X._$ErrorResponseSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      type$.legacy_ErrorResponse._as(object);
      return H.setRuntimeTypeInfo(["error", serializers.serialize$2$specifiedType(object.error, C.FullType_aZ8), "stackTrace", serializers.serialize$2$specifiedType(object.stackTrace, C.FullType_aZ8)], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var key, value, t1, t2, _$result,
        _s13_ = "ErrorResponse",
        result = new X.ErrorResponseBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "error":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            t2 = result._error_response$_$v;
            if (t2 != null) {
              result._error_response$_error = t2.error;
              result._stackTrace = t2.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_error = t1;
            break;
          case "stackTrace":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            t2 = result._error_response$_$v;
            if (t2 != null) {
              result._error_response$_error = t2.error;
              result._stackTrace = t2.stackTrace;
              result._error_response$_$v = null;
            }
            result._stackTrace = t1;
            break;
        }
      }
      _$result = result._error_response$_$v;
      if (_$result == null) {
        t1 = result.get$_error_response$_$this()._error_response$_error;
        t2 = result.get$_error_response$_$this()._stackTrace;
        _$result = new X._$ErrorResponse(t1, t2);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s13_, "error"));
        if (t2 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s13_, "stackTrace"));
      }
      return result._error_response$_$v = _$result;
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_gQA;
    },
    get$wireName: function() {
      return "ErrorResponse";
    }
  };
  X._$ErrorResponse.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof X.ErrorResponse && this.error == other.error && this.stackTrace == other.stackTrace;
    },
    get$hashCode: function(_) {
      return Y.$jf(Y.$jc(Y.$jc(0, J.get$hashCode$(this.error)), J.get$hashCode$(this.stackTrace)));
    },
    toString$0: function(_) {
      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);
    }
  };
  X.ErrorResponseBuilder.prototype = {
    get$_error_response$_$this: function() {
      var _this = this,
        t1 = _this._error_response$_$v;
      if (t1 != null) {
        _this._error_response$_error = t1.error;
        _this._stackTrace = t1.stackTrace;
        _this._error_response$_$v = null;
      }
      return _this;
    }
  };
  S.ExtensionRequest.prototype = {};
  S.ExtensionResponse.prototype = {};
  S.ExtensionEvent.prototype = {};
  S.BatchedEvents.prototype = {};
  S._$ExtensionRequestSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      var result, t1;
      type$.legacy_ExtensionRequest._as(object);
      result = H.setRuntimeTypeInfo(["id", serializers.serialize$2$specifiedType(object.id, C.FullType_kaS), "command", serializers.serialize$2$specifiedType(object.command, C.FullType_aZ8)], type$.JSArray_legacy_Object);
      t1 = object.commandParams;
      if (t1 != null) {
        C.JSArray_methods.add$1(result, "commandParams");
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(t1, C.FullType_aZ8));
      }
      return result;
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var key, value, t1, _$result, t2,
        _s16_ = "ExtensionRequest",
        result = new S.ExtensionRequestBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "id":
            t1 = H._asIntS(serializers.deserialize$2$specifiedType(value, C.FullType_kaS));
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "command":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_extension_request$_$this()._command = t1;
            break;
          case "commandParams":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_extension_request$_$this()._commandParams = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = result.get$_extension_request$_$this()._id;
        t2 = result.get$_extension_request$_$this()._command;
        _$result = new S._$ExtensionRequest(t1, t2, result.get$_extension_request$_$this()._commandParams);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s16_, "id"));
        if (t2 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s16_, "command"));
      }
      return result._extension_request$_$v = _$result;
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_evd;
    },
    get$wireName: function() {
      return "ExtensionRequest";
    }
  };
  S._$ExtensionResponseSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      var result, t1;
      type$.legacy_ExtensionResponse._as(object);
      result = H.setRuntimeTypeInfo(["id", serializers.serialize$2$specifiedType(object.id, C.FullType_kaS), "success", serializers.serialize$2$specifiedType(object.success, C.FullType_6bM), "result", serializers.serialize$2$specifiedType(object.result, C.FullType_aZ8)], type$.JSArray_legacy_Object);
      t1 = object.error;
      if (t1 != null) {
        C.JSArray_methods.add$1(result, "error");
        C.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(t1, C.FullType_aZ8));
      }
      return result;
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var key, value, t1, _$result, t2, t3,
        _s17_ = "ExtensionResponse",
        result = new S.ExtensionResponseBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "id":
            t1 = H._asIntS(serializers.deserialize$2$specifiedType(value, C.FullType_kaS));
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "success":
            t1 = H._asBoolS(serializers.deserialize$2$specifiedType(value, C.FullType_6bM));
            result.get$_extension_request$_$this()._extension_request$_success = t1;
            break;
          case "result":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_extension_request$_$this()._extension_request$_result = t1;
            break;
          case "error":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            result.get$_extension_request$_$this()._extension_request$_error = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = result.get$_extension_request$_$this()._id;
        t2 = result.get$_extension_request$_$this()._extension_request$_success;
        t3 = result.get$_extension_request$_$this()._extension_request$_result;
        _$result = new S._$ExtensionResponse(t1, t2, t3, result.get$_extension_request$_$this()._extension_request$_error);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s17_, "id"));
        if (t2 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s17_, "success"));
        if (t3 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s17_, "result"));
      }
      return result._extension_request$_$v = _$result;
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_tQ0;
    },
    get$wireName: function() {
      return "ExtensionResponse";
    }
  };
  S._$ExtensionEventSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      type$.legacy_ExtensionEvent._as(object);
      return H.setRuntimeTypeInfo(["params", serializers.serialize$2$specifiedType(object.params, C.FullType_aZ8), "method", serializers.serialize$2$specifiedType(object.method, C.FullType_aZ8)], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var key, value, t1, t2, _$result,
        _s14_ = "ExtensionEvent",
        result = new S.ExtensionEventBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "params":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            t2 = result._extension_request$_$v;
            if (t2 != null) {
              result._params = t2.params;
              result._method = t2.method;
              result._extension_request$_$v = null;
            }
            result._params = t1;
            break;
          case "method":
            t1 = H._asStringS(serializers.deserialize$2$specifiedType(value, C.FullType_aZ8));
            t2 = result._extension_request$_$v;
            if (t2 != null) {
              result._params = t2.params;
              result._method = t2.method;
              result._extension_request$_$v = null;
            }
            result._method = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = result.get$_extension_request$_$this()._params;
        t2 = result.get$_extension_request$_$this()._method;
        _$result = new S._$ExtensionEvent(t1, t2);
        if (t1 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s14_, "params"));
        if (t2 == null)
          H.throwExpression(Y.BuiltValueNullFieldError$(_s14_, "method"));
      }
      return result._extension_request$_$v = _$result;
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_pnF;
    },
    get$wireName: function() {
      return "ExtensionEvent";
    }
  };
  S._$BatchedEventsSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      return H.setRuntimeTypeInfo(["events", serializers.serialize$2$specifiedType(type$.legacy_BatchedEvents._as(object).events, C.FullType_CGY)], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, key, value, t5, t6, t7, t8,
        result = new S.BatchedEventsBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (t1 = type$.legacy_BuiltList_legacy_Object, t2 = type$.legacy_ExtensionEvent, t3 = type$.legacy_List_legacy_ExtensionEvent, t4 = type$.ListBuilder_legacy_ExtensionEvent; iterator.moveNext$0();) {
        key = H._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "events":
            t5 = result.get$_extension_request$_$this();
            t6 = t5._events;
            if (t6 == null) {
              t6 = new S.ListBuilder(t4);
              if (H.createRuntimeType(t2) === C.Type_dynamic_0Rz)
                H.throwExpression(P.UnsupportedError$(string$.explicL));
              t6.set$_list(t3._as(P.List_List$from(C.List_empty0, true, t2)));
              t6.set$_listOwner(null);
              t5.set$_events(t6);
              t5 = t6;
            } else
              t5 = t6;
            t6 = t1._as(serializers.deserialize$2$specifiedType(value, C.FullType_CGY));
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1*>*");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.set$_list(t6._list);
              t5.set$_listOwner(t6);
            } else {
              t5.set$_list(t7._eval$1("List<1*>*")._as(P.List_List$from(t6, true, t7._eval$1("1*"))));
              t5.set$_listOwner(null);
            }
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_w8N;
    },
    get$wireName: function() {
      return "BatchedEvents";
    }
  };
  S._$ExtensionRequest.prototype = {
    $eq: function(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof S.ExtensionRequest && _this.id == other.id && _this.command == other.command && _this.commandParams == other.commandParams;
    },
    get$hashCode: function(_) {
      return Y.$jf(Y.$jc(Y.$jc(Y.$jc(0, J.get$hashCode$(this.id)), J.get$hashCode$(this.command)), J.get$hashCode$(this.commandParams)));
    },
    toString$0: function(_) {
      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);
    }
  };
  S.ExtensionRequestBuilder.prototype = {
    get$_extension_request$_$this: function() {
      var _this = this,
        t1 = _this._extension_request$_$v;
      if (t1 != null) {
        _this._id = t1.id;
        _this._command = t1.command;
        _this._commandParams = t1.commandParams;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  S._$ExtensionResponse.prototype = {
    $eq: function(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof S.ExtensionResponse && _this.id == other.id && _this.success == other.success && _this.result == other.result && _this.error == other.error;
    },
    get$hashCode: function(_) {
      var _this = this;
      return Y.$jf(Y.$jc(Y.$jc(Y.$jc(Y.$jc(0, J.get$hashCode$(_this.id)), J.get$hashCode$(_this.success)), J.get$hashCode$(_this.result)), J.get$hashCode$(_this.error)));
    },
    toString$0: function(_) {
      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);
    }
  };
  S.ExtensionResponseBuilder.prototype = {
    get$_extension_request$_$this: function() {
      var _this = this,
        t1 = _this._extension_request$_$v;
      if (t1 != null) {
        _this._id = t1.id;
        _this._extension_request$_success = t1.success;
        _this._extension_request$_result = t1.result;
        _this._extension_request$_error = t1.error;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  S._$ExtensionEvent.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof S.ExtensionEvent && this.params == other.params && this.method == other.method;
    },
    get$hashCode: function(_) {
      return Y.$jf(Y.$jc(Y.$jc(0, J.get$hashCode$(this.params)), J.get$hashCode$(this.method)));
    },
    toString$0: function(_) {
      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);
    }
  };
  S.ExtensionEventBuilder.prototype = {
    get$_extension_request$_$this: function() {
      var _this = this,
        t1 = _this._extension_request$_$v;
      if (t1 != null) {
        _this._params = t1.params;
        _this._method = t1.method;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  S._$BatchedEvents.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof S.BatchedEvents && J.$eq$(this.events, other.events);
    },
    get$hashCode: function(_) {
      return Y.$jf(Y.$jc(0, J.get$hashCode$(this.events)));
    },
    toString$0: function(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  S.BatchedEventsBuilder.prototype = {
    get$events: function() {
      var _this = this,
        t1 = _this._extension_request$_$v;
      if (t1 != null) {
        t1 = t1.events;
        _this.set$_events(t1 == null ? null : S.ListBuilder_ListBuilder(t1, t1.$ti._eval$1("BuiltList.E*")));
        _this._extension_request$_$v = null;
      }
      t1 = _this._events;
      if (t1 == null) {
        t1 = S.ListBuilder_ListBuilder(C.List_empty0, type$.legacy_ExtensionEvent);
        _this.set$_events(t1);
      }
      return t1;
    },
    get$_extension_request$_$this: function() {
      var _this = this,
        t1 = _this._extension_request$_$v;
      if (t1 != null) {
        t1 = t1.events;
        _this.set$_events(t1 == null ? null : S.ListBuilder_ListBuilder(t1, t1.$ti._eval$1("BuiltList.E*")));
        _this._extension_request$_$v = null;
      }
      return _this;
    },
    build$0: function() {
      var _$failedField, e, _$result0, t1, exception, t2, _this = this,
        _s13_ = "BatchedEvents",
        _$result = null;
      try {
        _$result0 = _this._extension_request$_$v;
        if (_$result0 == null) {
          t1 = _this.get$events().build$0();
          _$result0 = new S._$BatchedEvents(t1);
          if (t1 == null)
            H.throwExpression(Y.BuiltValueNullFieldError$(_s13_, "events"));
        }
        _$result = _$result0;
      } catch (exception) {
        H.unwrapException(exception);
        _$failedField = null;
        try {
          _$failedField = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = H.unwrapException(exception);
          t1 = _$failedField;
          t2 = J.toString$0$(e);
          throw H.wrapException(new Y.BuiltValueNestedFieldError(_s13_, t1, t2));
        }
        throw exception;
      }
      t1 = type$.legacy_BatchedEvents._as(_$result);
      if (t1 == null)
        H.throwExpression(P.ArgumentError$notNull("other"));
      _this._extension_request$_$v = t1;
      return _$result;
    },
    set$_events: function(_events) {
      this._events = type$.legacy_ListBuilder_legacy_ExtensionEvent._as(_events);
    }
  };
  M.IsolateExit.prototype = {};
  M.IsolateStart.prototype = {};
  M._$IsolateExitSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      type$.legacy_IsolateExit._as(object);
      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      type$.legacy_Iterable_legacy_Object._as(serialized);
      return new M.IsolateExitBuilder().build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_LT1;
    },
    get$wireName: function() {
      return "IsolateExit";
    }
  };
  M._$IsolateStartSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      type$.legacy_IsolateStart._as(object);
      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      type$.legacy_Iterable_legacy_Object._as(serialized);
      return new M.IsolateStartBuilder().build$0();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_6TA;
    },
    get$wireName: function() {
      return "IsolateStart";
    }
  };
  M._$IsolateExit.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof M.IsolateExit;
    },
    get$hashCode: function(_) {
      return 814065794;
    },
    toString$0: function(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateExit"));
    }
  };
  M.IsolateExitBuilder.prototype = {
    build$0: function() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new M._$IsolateExit();
      return this._isolate_events$_$v = _$result;
    }
  };
  M._$IsolateStart.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof M.IsolateStart;
    },
    get$hashCode: function(_) {
      return 97463111;
    },
    toString$0: function(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateStart"));
    }
  };
  M.IsolateStartBuilder.prototype = {
    build$0: function() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new M._$IsolateStart();
      return this._isolate_events$_$v = _$result;
    }
  };
  A.RunRequest.prototype = {};
  A._$RunRequestSerializer.prototype = {
    serialize$3$specifiedType: function(serializers, object, specifiedType) {
      type$.legacy_RunRequest._as(object);
      return H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object);
    },
    serialize$2: function(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, C.FullType_null_List_empty);
    },
    deserialize$3$specifiedType: function(serializers, serialized, specifiedType) {
      type$.legacy_Iterable_legacy_Object._as(serialized);
      return new A._$RunRequest();
    },
    deserialize$2: function(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, C.FullType_null_List_empty);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types: function() {
      return C.List_wsa;
    },
    get$wireName: function() {
      return "RunRequest";
    }
  };
  A._$RunRequest.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.RunRequest;
    },
    get$hashCode: function(_) {
      return 248087772;
    },
    toString$0: function(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("RunRequest"));
    }
  };
  K._$serializers_closure.prototype = {
    call$0: function() {
      return S.ListBuilder_ListBuilder(C.List_empty0, type$.legacy_ExtensionEvent);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 54
  };
  R.SocketClient.prototype = {};
  R.SseSocketClient.prototype = {
    get$sink: function() {
      var t1 = this._sockets$_client._outgoingController;
      return new P._StreamSinkWrapper(t1, H._instanceType(t1)._eval$1("_StreamSinkWrapper<1>"));
    },
    get$stream: function(_) {
      var t1 = this._sockets$_client._incomingController;
      return new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>"));
    }
  };
  R.WebSocketClient.prototype = {
    get$sink: function() {
      return this._channel.get$sink();
    },
    get$stream: function(_) {
      var t2,
        t1 = this._channel._html0$_controller.get$_foreign();
      t1 = t1.get$stream(t1);
      t2 = H._instanceType(t1);
      return new P._MapStream(t2._eval$1("String*(Stream.T)")._as(new R.WebSocketClient_stream_closure()), t1, t2._eval$1("_MapStream<Stream.T,String*>"));
    }
  };
  R.WebSocketClient_stream_closure.prototype = {
    call$1: function(o) {
      return o == null ? null : J.toString$0$(o);
    },
    $signature: 55
  };
  V.Int64.prototype = {
    $add: function(_, other) {
      var o = V.Int64__promote(other),
        sum0 = this._l + o._l,
        sum1 = this._m + o._m + (sum0 >>> 22);
      return new V.Int64(sum0 & 4194303, sum1 & 4194303, this._h + o._h + (sum1 >>> 22) & 1048575);
    },
    $sub: function(_, other) {
      var o = V.Int64__promote(other);
      return V.Int64__sub(this._l, this._m, this._h, o._l, o._m, o._h);
    },
    $eq: function(_, other) {
      var o, _this = this;
      if (other == null)
        return false;
      if (other instanceof V.Int64)
        o = other;
      else if (H._isInt(other)) {
        if (_this._h === 0 && _this._m === 0)
          return _this._l === other;
        if ((other & 4194303) === other)
          return false;
        o = V.Int64_Int64(other);
      } else
        o = null;
      if (o != null)
        return _this._l === o._l && _this._m === o._m && _this._h === o._h;
      return false;
    },
    compareTo$1: function(_, other) {
      return this._compareTo$1(other);
    },
    _compareTo$1: function(other) {
      var o = V.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: function(_) {
      var t1 = this._m;
      return (((t1 & 1023) << 22 | this._l) ^ (this._h << 12 | t1 >>> 10 & 4095)) >>> 0;
    },
    toString$0: function(_) {
      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 - (C.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (C.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return V.Int64__toRadixStringUnsigned(10, d0, d1, d2, sign);
    },
    $isComparable: 1
  };
  L.stronglyConnectedComponents_strongConnect.prototype = {
    call$1: function(node) {
      var t2, t3, lowLink, t4, t5, t6, t7, newTable, split, next, component, result, _this = this,
        t1 = _this.T;
      t1._as(node);
      t2 = _this.indexes;
      t3 = _this._box_0;
      t2.$indexSet(0, node, t3.index);
      lowLink = t3.index;
      t4 = _this.lowLinks;
      t4.$indexSet(0, node, lowLink);
      ++t3.index;
      t3 = _this.lastVisited;
      t5 = t3.$ti;
      t5._precomputed1._as(node);
      C.JSArray_methods.$indexSet(t3._table, t3._tail, node);
      t6 = t3._tail;
      t7 = t3._table.length;
      t6 = (t6 + 1 & t7 - 1) >>> 0;
      t3._tail = t6;
      if (t3._head === t6) {
        newTable = P.List_List$filled(t7 * 2, null, false, t5._eval$1("1?"));
        t5 = t3._table;
        t6 = t3._head;
        split = t5.length - t6;
        C.JSArray_methods.setRange$4(newTable, 0, split, t5, t6);
        C.JSArray_methods.setRange$4(newTable, split, split + t3._head, t3._table, 0);
        t3._head = 0;
        t3._tail = t3._table.length;
        t3.set$_table(newTable);
      }
      ++t3._modificationCount;
      t5 = _this.onStack;
      t5.add$1(0, node);
      for (t6 = J.get$iterator$ax(_this.edges.call$1(node)); t6.moveNext$0();) {
        next = t6.get$current(t6);
        if (!t2.containsKey$1(0, next)) {
          _this.call$1(next);
          t7 = t4.$index(0, next);
          t7.toString;
          lowLink = Math.min(lowLink, H.checkNum(t7));
          t4.$indexSet(0, node, lowLink);
        } else if (t5.contains$1(0, next)) {
          t7 = t2.$index(0, next);
          t7.toString;
          lowLink = Math.min(lowLink, H.checkNum(t7));
          t4.$indexSet(0, node, lowLink);
        }
      }
      if (J.$eq$(t4.$index(0, node), t2.$index(0, node))) {
        component = H.setRuntimeTypeInfo([], t1._eval$1("JSArray<0>"));
        t1 = _this.nonNullEquals;
        do {
          t2 = t3._head;
          t4 = t3._tail;
          if (t2 === t4)
            H.throwExpression(H.IterableElementError_noElement());
          ++t3._modificationCount;
          t2 = t3._table;
          t6 = t2.length;
          t4 = (t4 - 1 & t6 - 1) >>> 0;
          t3._tail = t4;
          if (t4 < 0 || t4 >= t6)
            return H.ioore(t2, t4);
          result = t2[t4];
          C.JSArray_methods.$indexSet(t2, t4, null);
          t5.remove$1(0, result);
          C.JSArray_methods.add$1(component, result);
        } while (!H.boolConversionCheck(t1.call$2(result, node)));
        C.JSArray_methods.add$1(_this.result, component);
      }
    },
    $signature: function() {
      return this.T._eval$1("~(0)");
    }
  };
  Y.Level.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Y.Level && this.value === other.value;
    },
    compareTo$1: function(_, other) {
      return this.value - type$.Level._as(other).value;
    },
    get$hashCode: function(_) {
      return this.value;
    },
    toString$0: function(_) {
      return this.name;
    },
    $isComparable: 1
  };
  L.LogRecord.prototype = {
    toString$0: function(_) {
      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
    }
  };
  F.Logger.prototype = {
    get$fullName: function() {
      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: function(_) {
      var t1, effectiveLevel;
      if (this.parent == null) {
        t1 = this._level;
        t1.toString;
        effectiveLevel = t1;
      } else {
        t1 = $.$get$Logger_root();
        t1 = t1._level;
        t1.toString;
        effectiveLevel = t1;
      }
      return effectiveLevel;
    },
    log$4: function(logLevel, message, error, stackTrace) {
      var record, _this = this,
        t1 = logLevel.value;
      if (t1 >= _this.get$level(_this).value) {
        if (t1 >= 2000) {
          P.StackTrace_current();
          logLevel.toString$0(0);
        }
        t1 = _this.get$fullName();
        Date.now();
        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
        record = new L.LogRecord(logLevel, message, t1);
        if (_this.parent == null)
          _this._publish$1(record);
        else
          $.$get$Logger_root()._publish$1(record);
      }
    },
    _publish$1: function(record) {
      return null;
    }
  };
  F.Logger_Logger_closure.prototype = {
    call$0: function() {
      var dot, $parent, t1,
        thisName = this.name;
      if (C.JSString_methods.startsWith$1(thisName, "."))
        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
      if (dot === -1)
        $parent = thisName !== "" ? F.Logger_Logger("") : null;
      else {
        $parent = F.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
      }
      t1 = new F.Logger(thisName, $parent, P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger));
      if ($parent == null)
        t1._level = C.Level_INFO_800;
      else
        $parent._children.$indexSet(0, thisName, t1);
      return t1;
    },
    $signature: 56
  };
  A.hashObjects_closure.prototype = {
    call$2: function(h, i) {
      return A._combine(H._asIntS(h), J.get$hashCode$(i));
    },
    $signature: 57
  };
  M.SseClient.prototype = {
    SseClient$1: function(serverUrl) {
      var t1, t2, t3, t4, _this = this,
        clientId = T.generateUuidV4();
      _this._eventSource = W.EventSource__factoryEventSource(H.S(serverUrl) + "?sseClientId=" + clientId, P.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], type$.String, type$.dynamic));
      _this._serverUrl = H.S(serverUrl) + "?sseClientId=" + clientId;
      t1 = new W._EventStream(_this._eventSource, "open", false, type$._EventStream_legacy_Event);
      t1.get$first(t1).whenComplete$1(new M.SseClient_closure(_this));
      C.EventSource_methods.addEventListener$2(_this._eventSource, "message", _this.get$_onIncomingMessage());
      C.EventSource_methods.addEventListener$2(_this._eventSource, "control", _this.get$_onIncomingControlMessage());
      t1 = _this._eventSource;
      t2 = type$.nullable_void_Function_legacy_Event;
      t3 = t2._as(new M.SseClient_closure0(_this));
      type$.nullable_void_Function._as(null);
      t4 = type$.legacy_Event;
      W._EventStreamSubscription$(t1, "open", t3, false, t4);
      W._EventStreamSubscription$(_this._eventSource, "error", t2._as(new M.SseClient_closure1(_this)), false, t4);
    },
    get$sink: function() {
      var t1 = this._outgoingController;
      return new P._StreamSinkWrapper(t1, H._instanceType(t1)._eval$1("_StreamSinkWrapper<1>"));
    },
    get$stream: function(_) {
      var t1 = this._incomingController;
      return new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>"));
    },
    close$0: function(_) {
      var t1, _this = this;
      _this._eventSource.close();
      if (_this._onConnected.future._state === 0) {
        t1 = _this._outgoingController;
        new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$cancelOnError(null, true).asFuture$1$1(null, type$.dynamic);
      }
      _this._incomingController.close$0(0);
      _this._outgoingController.close$0(0);
    },
    _onIncomingControlMessage$1: function(message) {
      var data = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event._as(message)).data, true);
      if (J.$eq$(data, "close"))
        this.close$0(0);
      else
        throw H.wrapException(P.UnsupportedError$('Illegal Control Message "' + H.S(data) + '"'));
    },
    _onIncomingMessage$1: function(message) {
      this._incomingController.add$1(0, H._asStringS(C.C_JsonCodec.decode$2$reviver(0, H._asStringS(new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event._as(message)).data, true)), null)));
    },
    _onOutgoingDone$0: function() {
      this.close$0(0);
    },
    _onOutgoingMessage$1: function(message) {
      return this._onOutgoingMessage$body$SseClient(H._asStringS(message));
    },
    _onOutgoingMessage$body$SseClient: function(message) {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.dynamic),
        $async$handler = 1, $async$currentError, $async$next = [], $async$self = this, e, e0, e1, exception, t1, encodedMessage, $async$exception;
      var $async$_onOutgoingMessage$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              encodedMessage = null;
              try {
                encodedMessage = C.C_JsonCodec.encode$2$toEncodable(message, null);
              } catch (exception) {
                t1 = H.unwrapException(exception);
                if (t1 instanceof P.JsonUnsupportedObjectError) {
                  e = t1;
                  $async$self._logger.log$4(C.Level_WARNING_900, "Unable to encode outgoing message: " + H.S(e), null, null);
                } else if (t1 instanceof P.ArgumentError) {
                  e0 = t1;
                  $async$self._logger.log$4(C.Level_WARNING_900, "Invalid argument: " + H.S(e0), null, null);
                } else
                  throw exception;
              }
              $async$handler = 3;
              $async$goto = 6;
              return P._asyncAwait(W.HttpRequest_request($async$self._serverUrl + "&messageId=" + ++$async$self._lastMessageId, "POST", null, encodedMessage, true), $async$_onOutgoingMessage$1);
            case 6:
              // returning from await.
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$currentError;
              e1 = H.unwrapException($async$exception);
              t1 = "Failed to send " + H.S(message) + ":\n " + H.S(e1);
              $async$self._logger.log$4(C.Level_SEVERE_1000, t1, null, null);
              $async$self.close$0(0);
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return P._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return P._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return P._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
    }
  };
  M.SseClient_closure.prototype = {
    call$0: function() {
      var t2,
        t1 = this.$this;
      t1._onConnected.complete$0(0);
      t2 = t1._outgoingController;
      new P._ControllerStream(t2, H._instanceType(t2)._eval$1("_ControllerStream<1>")).listen$2$onDone(t1.get$_onOutgoingMessage(), t1.get$_onOutgoingDone());
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  M.SseClient_closure0.prototype = {
    call$1: function(_) {
      var t1 = this.$this._errorTimer;
      if (t1 != null)
        t1.cancel$0(0);
    },
    $signature: 10
  };
  M.SseClient_closure1.prototype = {
    call$1: function(error) {
      var t1 = this.$this,
        t2 = t1._errorTimer;
      t2 = t2 == null ? null : t2._handle != null;
      if (t2 !== true)
        t1._errorTimer = P.Timer_Timer(C.Duration_5000000, new M.SseClient__closure(t1, error));
    },
    $signature: 10
  };
  M.SseClient__closure.prototype = {
    call$0: function() {
      var t1 = this.$this,
        t2 = this.error;
      t1._incomingController.addError$1(t2);
      t1.close$0(0);
      t1 = t1._onConnected;
      if (t1.future._state === 0)
        t1.completeError$1(t2);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  T.generateUuidV4__generateBits.prototype = {
    call$1: function(bitCount) {
      return this.random.nextInt$1(C.JSInt_methods._shlPositive$1(1, bitCount));
    },
    $signature: 61
  };
  T.generateUuidV4__printDigits.prototype = {
    call$2: function(value, count) {
      return C.JSString_methods.padLeft$2(C.JSInt_methods.toRadixString$1(value, 16), count, "0");
    },
    $signature: 28
  };
  T.generateUuidV4__bitsDigits.prototype = {
    call$2: function(bitCount, digitCount) {
      return this._printDigits.call$2(this._generateBits.call$1(bitCount), digitCount);
    },
    $signature: 28
  };
  K.GuaranteeChannel.prototype = {
    get$stream: function(_) {
      var t1 = this.get$_streamController();
      t1.toString;
      return new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>"));
    },
    get$sink: function() {
      return this.get$_guarantee_channel$_sink();
    },
    get$_guarantee_channel$_sink: function() {
      var t1 = this.__GuaranteeChannel__sink;
      return t1 === $ ? H.throwExpression(H.LateError$fieldNI("_sink")) : t1;
    },
    get$_streamController: function() {
      var t1 = this.__GuaranteeChannel__streamController;
      return t1 === $ ? H.throwExpression(H.LateError$fieldNI("_streamController")) : t1;
    },
    GuaranteeChannel$3$allowSinkErrors: function(innerSink, allowSinkErrors, _box_0, $T) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_GuaranteeSink<1>")._as(new K._GuaranteeSink(innerSink, _this, new P._AsyncCompleter(new P._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic), allowSinkErrors, $T._eval$1("_GuaranteeSink<0>")));
      if (_this.__GuaranteeChannel__sink === $)
        _this.set$__GuaranteeChannel__sink(t2);
      else
        H.throwExpression(H.LateError$fieldAI("_sink"));
      t1 = t1._eval$1("StreamController<1>")._as(P.StreamController_StreamController(null, new K.GuaranteeChannel_closure(_box_0, _this), true, $T));
      if (_this.__GuaranteeChannel__streamController === $)
        _this.set$__GuaranteeChannel__streamController(t1);
      else
        H.throwExpression(H.LateError$fieldAI("_streamController"));
    },
    _onSinkDisconnected$0: function() {
      this._disconnected = true;
      var subscription = this._guarantee_channel$_subscription;
      if (subscription != null)
        subscription.cancel$0(0);
      this.get$_streamController().close$0(0);
    },
    set$__GuaranteeChannel__sink: function(__GuaranteeChannel__sink) {
      this.__GuaranteeChannel__sink = this.$ti._eval$1("_GuaranteeSink<1>?")._as(__GuaranteeChannel__sink);
    },
    set$__GuaranteeChannel__streamController: function(__GuaranteeChannel__streamController) {
      this.__GuaranteeChannel__streamController = this.$ti._eval$1("StreamController<1>?")._as(__GuaranteeChannel__streamController);
    },
    set$_guarantee_channel$_subscription: function(_subscription) {
      this._guarantee_channel$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  K.GuaranteeChannel_closure.prototype = {
    call$0: function() {
      var t2, t3,
        t1 = this.$this;
      if (t1._disconnected)
        return;
      t2 = this._box_0.innerStream;
      t3 = t1.get$_streamController();
      t1.set$_guarantee_channel$_subscription(t2.listen$3$onDone$onError(t3.get$add(t3), new K.GuaranteeChannel__closure(t1), t1.get$_streamController().get$addError()));
    },
    $signature: 0
  };
  K.GuaranteeChannel__closure.prototype = {
    call$0: function() {
      var t1 = this.$this;
      t1.get$_guarantee_channel$_sink()._onStreamDisconnected$0();
      t1.get$_streamController().close$0(0);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  K._GuaranteeSink.prototype = {
    add$1: function(_, data) {
      var t1, _this = this;
      _this.$ti._precomputed1._as(data);
      if (_this._closed)
        throw H.wrapException(P.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: function(error, stackTrace) {
      if (this._closed)
        throw H.wrapException(P.StateError$("Cannot add event after closing."));
      if (this._disconnected)
        return;
      this._guarantee_channel$_addError$2(error, stackTrace);
    },
    addError$1: function(error) {
      return this.addError$2(error, null);
    },
    _guarantee_channel$_addError$2: function(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(0).catchError$1(new K._GuaranteeSink__addError_closure());
    },
    close$0: function(_) {
      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(0, _this._inner._async$_target.close$0(0));
      }
      return _this._doneCompleter.future;
    },
    _onStreamDisconnected$0: function() {
      this._disconnected = true;
      var t1 = this._doneCompleter;
      if (t1.future._state === 0)
        t1.complete$0(0);
      return;
    },
    $isStreamSink: 1
  };
  K._GuaranteeSink__addError_closure.prototype = {
    call$1: function(_) {
    },
    $signature: 6
  };
  B.StreamChannelController.prototype = {
    get$_local: function() {
      var t1 = this.__StreamChannelController__local;
      return t1 === $ ? H.throwExpression(H.LateError$fieldNI("_local")) : t1;
    },
    get$_foreign: function() {
      var t1 = this.__StreamChannelController__foreign;
      return t1 === $ ? H.throwExpression(H.LateError$fieldNI("_foreign")) : t1;
    },
    set$__StreamChannelController__local: function(__StreamChannelController__local) {
      this.__StreamChannelController__local = this.$ti._eval$1("StreamChannel<1>?")._as(__StreamChannelController__local);
    },
    set$__StreamChannelController__foreign: function(__StreamChannelController__foreign) {
      this.__StreamChannelController__foreign = this.$ti._eval$1("StreamChannel<1>?")._as(__StreamChannelController__foreign);
    }
  };
  R.StreamChannelMixin.prototype = {$isStreamChannel: 1};
  K.Uuid.prototype = {
    v1$0: function() {
      var t1, seedBytes, nodeId, t2, clockSeq, mSecs, nSecs, tl, tmh, node, n, t3,
        _s9_ = "hasInitV1",
        _s9_0 = "seedBytes",
        _s4_ = "node",
        _s8_ = "clockSeq",
        _s5_ = "mSecs", _s5_0 = "nSecs",
        buf = new Uint8Array(16),
        options = P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      type$.nullable_Map_String_dynamic._as(options);
      t1 = $.Uuid__state.$index(0, _s9_);
      t1.toString;
      if (!H._asBoolS(t1)) {
        options.$index(0, "v1rngPositionalArgs");
        options.$index(0, "v1rngNamedArgs");
        options.$index(0, "v1rng");
        seedBytes = T.UuidUtil_mathRNG();
        if ($.Uuid__state.$index(0, _s9_0) != null)
          $.Uuid__state.$index(0, _s9_0);
        else
          $.Uuid__state.$indexSet(0, _s9_0, seedBytes);
        nodeId = H.setRuntimeTypeInfo([seedBytes[0] | 1, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]], type$.JSArray_int);
        if ($.Uuid__state.$index(0, _s4_) != null)
          $.Uuid__state.$index(0, _s4_);
        else
          $.Uuid__state.$indexSet(0, _s4_, nodeId);
        t1 = seedBytes[6];
        t2 = seedBytes[7];
        if ($.Uuid__state.$index(0, _s8_) == null)
          $.Uuid__state.$indexSet(0, _s8_, (t1 << 8 | t2) & 262143);
        $.Uuid__state.$indexSet(0, _s5_, 0);
        $.Uuid__state.$indexSet(0, _s5_0, 0);
        $.Uuid__state.$indexSet(0, _s9_, true);
      }
      options.$index(0, _s8_);
      clockSeq = H._asIntS($.Uuid__state.$index(0, _s8_));
      options.$index(0, _s5_);
      mSecs = Date.now();
      options.$index(0, _s5_0);
      t1 = $.Uuid__state.$index(0, _s5_0);
      t1.toString;
      nSecs = H._asIntS(t1) + 1;
      t1 = $.Uuid__state.$index(0, _s5_);
      if (typeof t1 !== "number")
        return H.iae(t1);
      t2 = $.Uuid__state.$index(0, _s5_0);
      if (typeof t2 !== "number")
        return H.iae(t2);
      t1 = mSecs - t1 + (nSecs - t2) / 10000 < 0;
      if (t1) {
        options.$index(0, _s8_);
        t2 = true;
      } else
        t2 = false;
      if (t2) {
        if (typeof clockSeq !== "number")
          return clockSeq.$add();
        clockSeq = clockSeq + 1 & 16383;
      }
      if (!t1) {
        t1 = $.Uuid__state.$index(0, _s5_);
        if (typeof t1 !== "number")
          return H.iae(t1);
        t1 = mSecs > t1;
      } else
        t1 = true;
      if (t1) {
        options.$index(0, _s5_0);
        t1 = true;
      } else
        t1 = false;
      if (t1)
        nSecs = 0;
      if (nSecs >= 10000)
        throw H.wrapException(P.Exception_Exception("uuid.v1(): Can't create more than 10M uuids/sec"));
      $.Uuid__state.$indexSet(0, _s5_, mSecs);
      $.Uuid__state.$indexSet(0, _s5_0, nSecs);
      $.Uuid__state.$indexSet(0, _s8_, clockSeq);
      mSecs += 122192928e5;
      tl = C.JSInt_methods.$mod((mSecs & 268435455) * 10000 + nSecs, 4294967296);
      buf[0] = C.JSInt_methods._shrOtherPositive$1(tl, 24) & 255;
      buf[1] = C.JSInt_methods._shrOtherPositive$1(tl, 16) & 255;
      buf[2] = C.JSInt_methods._shrOtherPositive$1(tl, 8) & 255;
      buf[3] = tl & 255;
      tmh = C.JSNumber_methods.floor$0(mSecs / 4294967296 * 10000) & 268435455;
      buf[4] = tmh >>> 8 & 255;
      buf[5] = tmh & 255;
      buf[6] = tmh >>> 24 & 15 | 16;
      buf[7] = tmh >>> 16 & 255;
      if (typeof clockSeq !== "number")
        return clockSeq.$and();
      buf[8] = clockSeq >>> 8 & 63 | 128;
      buf[9] = clockSeq & 255;
      options.$index(0, _s4_);
      node = $.Uuid__state.$index(0, _s4_);
      for (t1 = J.getInterceptor$asx(node), n = 0; n < 6; ++n)
        C.NativeUint8List_methods.$indexSet(buf, 10 + n, H._asIntS(t1.$index(node, n)));
      t1 = $.$get$Uuid__byteToHex();
      t2 = buf[0];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t1[t2];
      t3 = buf[1];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      t3 = t2 + t1[t3];
      t2 = buf[2];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[3];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[4];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[5];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[6];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[7];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[8];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[9];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[10];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[11];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      t3 = t2 + t1[t3];
      t2 = buf[12];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[13];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      t3 = t2 + t1[t3];
      t2 = buf[14];
      if (t2 >= 256)
        return H.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[15];
      if (t3 >= 256)
        return H.ioore(t1, t3);
      return t2 + t1[t3];
    }
  };
  A.HtmlWebSocketChannel.prototype = {
    get$stream: function(_) {
      var t1 = this._html0$_controller.get$_foreign();
      return t1.get$stream(t1);
    },
    get$sink: function() {
      var _this = this,
        t1 = _this.__HtmlWebSocketChannel_sink;
      if (t1 === $) {
        t1 = new A._HtmlWebSocketSink(_this, _this._html0$_controller.get$_foreign().get$sink());
        if (_this.__HtmlWebSocketChannel_sink === $)
          _this.__HtmlWebSocketChannel_sink = t1;
        else
          t1 = H.throwExpression(H.LateError$fieldADI("sink"));
      }
      return t1;
    },
    HtmlWebSocketChannel$1: function(_webSocket) {
      var t2, t3, _this = this,
        t1 = _this._html0$_webSocket;
      if (t1.readyState === 1)
        _this._listen$0();
      else {
        t2 = new W._EventStream(t1, "open", false, type$._EventStream_legacy_Event);
        t2.get$first(t2).then$1$1(0, new A.HtmlWebSocketChannel_closure(_this), type$.Null);
      }
      t2 = new W._EventStream(t1, "error", false, type$._EventStream_legacy_Event);
      t3 = type$.Null;
      t2.get$first(t2).then$1$1(0, new A.HtmlWebSocketChannel_closure0(_this), t3);
      t2 = type$.nullable_void_Function_legacy_MessageEvent._as(new A.HtmlWebSocketChannel_closure1(_this));
      type$.nullable_void_Function._as(null);
      W._EventStreamSubscription$(t1, "message", t2, false, type$.legacy_MessageEvent);
      t1 = new W._EventStream(t1, "close", false, type$._EventStream_legacy_CloseEvent);
      t1.get$first(t1).then$1$1(0, new A.HtmlWebSocketChannel_closure2(_this), t3);
    },
    _listen$0: function() {
      var t1 = this._html0$_controller.get$_local();
      t1.get$stream(t1).listen$2$onDone(C.WebSocket_methods.get$send(this._html0$_webSocket), new A.HtmlWebSocketChannel__listen_closure(this));
    },
    $isWebSocketChannel: 1
  };
  A.HtmlWebSocketChannel_closure.prototype = {
    call$1: function(_) {
      type$.Event._as(_);
      this.$this._listen$0();
    },
    $signature: 29
  };
  A.HtmlWebSocketChannel_closure0.prototype = {
    call$1: function(_) {
      var t1;
      type$.Event._as(_);
      t1 = this.$this._html0$_controller;
      t1.get$_local().get$sink().addError$1(new E.WebSocketChannelException("WebSocket connection failed."));
      t1.get$_local().get$sink().close$0(0);
    },
    $signature: 29
  };
  A.HtmlWebSocketChannel_closure1.prototype = {
    call$1: function($event) {
      var data = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as($event).data, true);
      if (type$.ByteBuffer._is(data))
        data = H.NativeUint8List_NativeUint8List$view(data, 0, null);
      this.$this._html0$_controller.get$_local().get$sink().add$1(0, data);
    },
    $signature: 64
  };
  A.HtmlWebSocketChannel_closure2.prototype = {
    call$1: function($event) {
      type$.CloseEvent._as($event);
      $event.code;
      $event.reason;
      this.$this._html0$_controller.get$_local().get$sink().close$0(0);
    },
    $signature: 98
  };
  A.HtmlWebSocketChannel__listen_closure.prototype = {
    call$0: function() {
      this.$this._html0$_webSocket.close();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  A._HtmlWebSocketSink.prototype = {
    close$0: function(_) {
      var t1 = this._html0$_channel;
      t1._localCloseReason = t1._localCloseCode = null;
      return this.super$DelegatingStreamSink$close(0);
    },
    $isWebSocketSink: 1
  };
  N.WebSocketChannel.prototype = {
    get$stream: function(_) {
      return new P.StreamView(this._webSocket, type$.StreamView_dynamic);
    },
    get$sink: function() {
      var t1 = this._webSocket;
      return new N.WebSocketSink(t1, t1);
    }
  };
  N.WebSocketSink.prototype = {
    close$0: function(_) {
      return this._webSocket.close$2(0, null, null);
    }
  };
  E.WebSocketChannelException.prototype = {
    toString$0: function(_) {
      var t1 = "WebSocketChannelException: " + this.message;
      return t1;
    }
  };
  D.main_closure.prototype = {
    call$1: function(e) {
      if (e == null)
        self.chrome.runtime.lastError;
    },
    call$0: function() {
      return this.call$1(null);
    },
    "call*": "call$1",
    $requiredArgCount: 0,
    $defaultValues: function() {
      return [null];
    },
    $signature: 66
  };
  D.main_closure0.prototype = {
    call$0: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
        uri, fixedPath, fixedUri, client, restarter, manager, t1, t2, t3;
      var $async$call$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              if (self.$dartAppInstanceId == null)
                self.$dartAppInstanceId = C.C_Uuid.v1$0();
              uri = P.Uri_parse(self.$dwdsDevHandlerPath);
              if (window.location.protocol === "https:" && uri.get$scheme() === "http" && uri.get$host(uri) !== "localhost")
                uri = uri.replace$1$scheme(0, "https");
              else if (window.location.protocol === "wss:" && uri.get$scheme() === "ws" && uri.get$host(uri) !== "localhost")
                uri = uri.replace$1$scheme(0, "wss");
              fixedPath = uri.toString$0(0);
              fixedUri = P.Uri_parse(fixedPath);
              client = fixedUri.isScheme$1("ws") || fixedUri.isScheme$1("wss") ? new R.WebSocketClient(A.HtmlWebSocketChannel$connect(fixedUri, null)) : new R.SseSocketClient(M.SseClient$(fixedPath));
              $async$goto = J.$eq$(self.$dartModuleStrategy, "require-js") ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = 5;
              return P._asyncAwait(X.RequireRestarter_create(), $async$call$0);
            case 5:
              // returning from await.
              restarter = $async$result;
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if (J.$eq$(self.$dartModuleStrategy, "legacy"))
                restarter = new Z.LegacyRestarter();
              else
                throw H.wrapException(P.StateError$("Unknown module strategy: " + H.S(self.$dartModuleStrategy)));
            case 3:
              // join
              manager = new Q.ReloadingManager(client, restarter);
              self.$dartHotRestart = P.allowInterop(new D.main__closure(manager), type$.legacy_legacy_Promise_legacy_bool_Function);
              self.$launchDevTools = P.allowInterop(new D.main__closure0(client), type$.legacy_void_Function);
              client.get$stream(client).listen$2$onError(new D.main__closure1(manager), new D.main__closure2());
              if (H.boolConversionCheck(self.$dwdsEnableDevtoolsLaunch)) {
                t1 = window;
                t2 = type$.nullable_void_Function_legacy_KeyboardEvent._as(new D.main__closure3());
                type$.nullable_void_Function._as(null);
                W._EventStreamSubscription$(t1, "keydown", t2, false, type$.legacy_KeyboardEvent);
              }
              if (J.contains$1$asx(window.navigator.userAgent, "Chrome")) {
                t1 = client.get$sink();
                t2 = $.$get$serializers();
                t3 = new E.ConnectRequestBuilder();
                type$.legacy_void_Function_legacy_ConnectRequestBuilder._as(new D.main__closure4()).call$1(t3);
                t1.add$1(0, C.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3.build$0()), null));
              } else
                V.runMain();
              // implicit return
              return P._asyncReturn(null, $async$completer);
          }
      });
      return P._asyncStartSync($async$call$0, $async$completer);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 67
  };
  D.main__closure.prototype = {
    call$0: function() {
      return S.toPromise(this.manager.hotRestart$0(), type$.legacy_bool);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 68
  };
  D.main__closure0.prototype = {
    call$0: function() {
      var t1, t2, t3;
      if (!J.contains$1$asx(window.navigator.userAgent, "Chrome")) {
        C.Window_methods.alert$1(window, "Dart DevTools is only supported on Chromium based browsers.");
        return;
      }
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new M.DevToolsRequestBuilder();
      type$.legacy_void_Function_legacy_DevToolsRequestBuilder._as(new D.main___closure()).call$1(t3);
      t1.add$1(0, C.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3.build$0()), null));
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  D.main___closure.prototype = {
    call$1: function(b) {
      var t1 = H._asStringS(self.$dartAppId);
      b.get$_devtools_request$_$this()._devtools_request$_appId = t1;
      t1 = H._asStringS(self.$dartAppInstanceId);
      b.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
      return b;
    },
    $signature: 69
  };
  D.main__closure1.prototype = {
    call$1: function(serialized) {
      return this.$call$body$main__closure(H._asStringS(serialized));
    },
    $call$body$main__closure: function(serialized) {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.Null),
        $async$self = this, $alert, t1, $event;
      var $async$call$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $event = $.$get$serializers().deserialize$1(C.C_JsonCodec.decode$2$reviver(0, serialized, null));
              $async$goto = $event instanceof Q.BuildResult ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.liveReload") ? 5 : 7;
              break;
            case 5:
              // then
              window.location.reload();
              // goto join
              $async$goto = 6;
              break;
            case 7:
              // else
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotRestart") ? 8 : 10;
              break;
            case 8:
              // then
              $async$goto = 11;
              return P._asyncAwait($async$self.manager.hotRestart$0(), $async$call$1);
            case 11:
              // returning from await.
              // goto join
              $async$goto = 9;
              break;
            case 10:
              // else
              if (J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotReload"))
                P.print("Hot reload is currently unsupported. Ignoring change.");
            case 9:
              // join
            case 6:
              // join
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if ($event instanceof M.DevToolsResponse) {
                if (!H.boolConversionCheck($event.success)) {
                  $alert = "DevTools failed to open with:\n" + H.S($event.error);
                  if (H.boolConversionCheck($event.promptExtension) && H.boolConversionCheck(C.Window_methods.confirm$1(window, $alert)))
                    C.Window_methods.open$2(window, "https://goo.gle/dart-debug-extension", "_blank");
                  else
                    C.Window_methods.alert$1(window, $alert);
                }
              } else if ($event instanceof A.RunRequest)
                V.runMain();
              else if ($event instanceof X.ErrorResponse) {
                t1 = "Error from backend:\n\nError: " + H.S($event.error) + "\n\nStack Trace:\n" + H.S($event.stackTrace);
                if (typeof console != "undefined")
                  window.console.error(t1);
              }
            case 3:
              // join
              // implicit return
              return P._asyncReturn(null, $async$completer);
          }
      });
      return P._asyncStartSync($async$call$1, $async$completer);
    },
    $signature: 70
  };
  D.main__closure2.prototype = {
    call$1: function(error) {
    },
    $signature: 6
  };
  D.main__closure3.prototype = {
    call$1: function(e) {
      if (type$.legacy_KeyboardEvent._is(e) && C.JSArray_methods.contains$1(C.List_zgw, e.key) && H.boolConversionCheck(e.altKey) && !H.boolConversionCheck(e.ctrlKey) && !H.boolConversionCheck(e.metaKey)) {
        e.preventDefault();
        self.$launchDevTools.call$0();
      }
    },
    $signature: 10
  };
  D.main__closure4.prototype = {
    call$1: function(b) {
      var t1 = H._asStringS(self.$dartAppId);
      b.get$_$this()._appId = t1;
      t1 = H._asStringS(self.$dartAppInstanceId);
      b.get$_$this()._instanceId = t1;
      t1 = H._asStringS(self.$dartEntrypointPath);
      b.get$_$this()._entrypointPath = t1;
      return b;
    },
    $signature: 71
  };
  D.main_closure1.prototype = {
    call$2: function(error, stackTrace) {
      type$.legacy_StackTrace._as(stackTrace);
      P.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" + H.S(error) + "\n" + H.S(stackTrace) + "\n");
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 72
  };
  D.ChromeError.prototype = {};
  D.RequestOptions.prototype = {};
  Z.LegacyRestarter.prototype = {
    restart$0: function() {
      return this.restart$body$LegacyRestarter();
    },
    restart$body$LegacyRestarter: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, t2, t3, t4, t1;
      var $async$restart$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = {};
              type$.legacy_JsObject._as($.$get$_context().$index(0, "dart_library")).callMethod$1("reload");
              t2 = new P._Future($.Zone__current, type$._Future_legacy_bool);
              t1.sub = null;
              t3 = window;
              t4 = type$.nullable_void_Function_legacy_MessageEvent._as(new Z.LegacyRestarter_restart_closure(t1, new P._AsyncCompleter(t2, type$._AsyncCompleter_legacy_bool)));
              type$.nullable_void_Function._as(null);
              t1.sub = W._EventStreamSubscription$(t3, "message", t4, false, type$.legacy_MessageEvent);
              $async$returnValue = t2;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return P._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return P._asyncStartSync($async$restart$0, $async$completer);
    },
    $isRestarter: 1
  };
  Z.LegacyRestarter_restart_closure.prototype = {
    call$1: function($event) {
      var t1,
        message = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as($event).data, true);
      if (type$.legacy_Map_dynamic_dynamic._is(message)) {
        t1 = J.getInterceptor$asx(message);
        t1 = J.$eq$(t1.$index(message, "type"), "DDC_STATE_CHANGE") && J.$eq$(t1.$index(message, "state"), "restart_end");
      } else
        t1 = false;
      if (t1) {
        this.reloadCompleter.complete$1(0, true);
        this._box_0.sub.cancel$0(0);
      }
    },
    $signature: 73
  };
  Q.ReloadingManager.prototype = {
    hotRestart$0: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, $async$self = this, result, t1, t2;
      var $async$hotRestart$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._client.get$sink();
              t2 = $.$get$serializers();
              type$.legacy_void_Function_legacy_IsolateExitBuilder._as(null);
              t1.add$1(0, C.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new M.IsolateExitBuilder().build$0()), null));
              $async$goto = 3;
              return P._asyncAwait($async$self._restarter.restart$0(), $async$hotRestart$0);
            case 3:
              // returning from await.
              result = $async$result;
              $async$self._afterRestart$1(result);
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return P._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return P._asyncStartSync($async$hotRestart$0, $async$completer);
    },
    _afterRestart$1: function(succeeded) {
      var t1, t2;
      if (!H.boolConversionCheck(succeeded))
        return;
      t1 = this._client.get$sink();
      t2 = $.$get$serializers();
      type$.legacy_void_Function_legacy_IsolateStartBuilder._as(null);
      t1.add$1(0, C.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new M.IsolateStartBuilder().build$0()), null));
    }
  };
  S.Promise.prototype = {};
  S.toPromise_closure.prototype = {
    call$2: function(resolve, reject) {
      this.T._eval$1("~(0*)*")._as(resolve);
      type$.legacy_void_Function_dynamic._as(reject);
      this.future.then$1$1(0, resolve, type$.void).catchError$1(reject);
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: function() {
      return this.T._eval$1("Null(~(0*)*,~(@)*)");
    }
  };
  X.RequireLoader.prototype = {};
  X.HotReloadFailedException.prototype = {
    toString$0: function(_) {
      return "HotReloadFailedException: '" + H.S(this._s) + "'";
    }
  };
  X.JsError.prototype = {};
  X.JsMap.prototype = {};
  X.RequireRestarter.prototype = {
    restart$0: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, $async$self = this, t3, completer, newDigests, modulesToLoad, t4, line, toZone, result, developer, t1, t2;
      var $async$restart$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              developer = self.$loadModuleConfig.call$1("dart_sdk").developer;
              t1 = developer._extensions;
              t2 = type$.JSArray_legacy_Object;
              $async$goto = H.boolConversionCheck(H._asBoolS(t1.containsKey.apply(t1, H.setRuntimeTypeInfo(["ext.flutter.disassemble"], t2)))) ? 3 : 4;
              break;
            case 3:
              // then
              t1 = type$.legacy_Promise_void._as(developer.invokeExtension.apply(developer, H.setRuntimeTypeInfo(["ext.flutter.disassemble", "{}"], t2)));
              t3 = new P._Future($.Zone__current, type$._Future_void);
              completer = new P._AsyncCompleter(t3, type$._AsyncCompleter_void);
              J.then$2$x(t1, P.allowInterop(completer.get$complete(completer), type$.legacy_dynamic_Function_void), P.allowInterop(completer.get$completeError(), type$.legacy_dynamic_Function_dynamic));
              $async$goto = 5;
              return P._asyncAwait(t3, $async$restart$0);
            case 5:
              // returning from await.
            case 4:
              // join
              $async$goto = 6;
              return P._asyncAwait($async$self._getDigests$0(), $async$restart$0);
            case 6:
              // returning from await.
              newDigests = $async$result;
              modulesToLoad = H.setRuntimeTypeInfo([], type$.JSArray_legacy_String);
              for (t1 = J.getInterceptor$x(newDigests), t3 = J.get$iterator$ax(t1.get$keys(newDigests)); t3.moveNext$0();) {
                t4 = t3.get$current(t3);
                if (!J.containsKey$1$x($._lastKnownDigests, t4)) {
                  line = "Error during script reloading, refreshing the page. \nUnable to find an existing digest for module: " + H.S(t4) + ".";
                  toZone = $.printToZone;
                  if (toZone == null)
                    H.printString(line);
                  else
                    toZone.call$1(line);
                  window.location.reload();
                } else if (!J.$eq$(J.$index$asx($._lastKnownDigests, t4), t1.$index(newDigests, t4))) {
                  J.$indexSet$ax($._lastKnownDigests, t4, t1.$index(newDigests, t4));
                  C.JSArray_methods.add$1(modulesToLoad, t4);
                }
              }
              $async$goto = modulesToLoad.length !== 0 ? 7 : 9;
              break;
            case 7:
              // then
              $async$self._updateGraph$0();
              $async$goto = 10;
              return P._asyncAwait($async$self._reload$1(modulesToLoad), $async$restart$0);
            case 10:
              // returning from await.
              result = $async$result;
              // goto join
              $async$goto = 8;
              break;
            case 9:
              // else
              result = true;
            case 8:
              // join
              t1 = self.$loadModuleConfig.call$1("dart_sdk").dart;
              t1.hotRestart.apply(t1, H.setRuntimeTypeInfo([], t2));
              V.runMain();
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return P._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return P._asyncStartSync($async$restart$0, $async$completer);
    },
    _getDigests$0: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Map_of_legacy_String_and_legacy_String),
        $async$returnValue, t1, $async$temp1, $async$temp2, $async$temp3;
      var $async$_getDigests$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.legacy_String;
              $async$temp1 = J;
              $async$temp2 = type$.legacy_Map_dynamic_dynamic;
              $async$temp3 = W;
              $async$goto = 3;
              return P._asyncAwait(W.HttpRequest_request(J.get$digestsPath$x(self.$requireLoader), "GET", "json", null, null), $async$_getDigests$0);
            case 3:
              // returning from await.
              $async$returnValue = $async$temp1.cast$2$0$ax($async$temp2._as($async$temp3._convertNativeToDart_XHR_Response($async$result.response)), t1, t1);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return P._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return P._asyncStartSync($async$_getDigests$0, $async$completer);
    },
    _initialize$0: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, $async$temp1;
      var $async$_initialize$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$temp1 = $;
              $async$goto = 2;
              return P._asyncAwait($async$self._getDigests$0(), $async$_initialize$0);
            case 2:
              // returning from await.
              $async$temp1._lastKnownDigests = $async$result;
              // implicit return
              return P._asyncReturn(null, $async$completer);
          }
      });
      return P._asyncStartSync($async$_initialize$0, $async$completer);
    },
    _moduleParents$1: function(module) {
      var t1;
      H._asStringS(module);
      t1 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), module);
      t1 = t1 == null ? null : J.cast$1$0$ax(t1, type$.legacy_String);
      return t1 == null ? H.setRuntimeTypeInfo([], type$.JSArray_legacy_String) : t1;
    },
    _moduleTopologicalCompare$2: function(module1, module2) {
      var t1, order1, order2, t2, topological;
      H._asStringS(module1);
      H._asStringS(module2);
      t1 = this._moduleOrdering;
      order1 = t1.$index(0, module1);
      order2 = t1.$index(0, module2);
      t2 = order1 == null;
      if (t2 || order2 == null)
        throw H.wrapException(X.HotReloadFailedException$("Unable to fetch ordering info for module: " + H.S(t2 ? module1 : module2)));
      topological = J.compareTo$1$ns(t1.$index(0, module2), t1.$index(0, module1));
      return topological === 0 ? J.compareTo$1$ns(module1, module2) : topological;
    },
    _reload$1: function(modules) {
      return this._reload$body$RequireRestarter(type$.legacy_List_legacy_String._as(modules));
    },
    _reload$body$RequireRestarter: function(modules) {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, reloadedModules, previousModuleId, moduleId, parentIds, childModule, e, t2, t3, t4, t5, t6, exception, t1, $async$exception;
      var $async$_reload$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._running.future;
              $async$goto = t1._state === 0 ? 3 : 4;
              break;
            case 3:
              // then
              $async$goto = 5;
              return P._asyncAwait(t1, $async$_reload$1);
            case 5:
              // returning from await.
              $async$returnValue = $async$result;
              // goto return
              $async$goto = 1;
              break;
            case 4:
              // join
              $async$self.set$_running(new P._AsyncCompleter(new P._Future($.Zone__current, type$._Future_legacy_bool), type$._AsyncCompleter_legacy_bool));
              reloadedModules = 0;
              $async$handler = 7;
              $async$self._dirtyModules.addAll$1(0, modules);
              previousModuleId = null;
              t1 = $async$self.get$_moduleTopologicalCompare(), t2 = type$.legacy_String, t3 = type$.JSArray_legacy_String, t4 = type$.JSArray_legacy_Object, t5 = type$.legacy_dynamic_Function;
            case 10:
              // for condition
              if (!(t6 = $async$self._dirtyModules, t6._root != null)) {
                // goto after for
                $async$goto = 11;
                break;
              }
              if (t6._count === 0)
                H.throwExpression(H.IterableElementError_noElement());
              moduleId = t6.get$_collection$_first().key;
              $async$self._dirtyModules.remove$1(0, moduleId);
              t6 = H._asStringS(moduleId);
              t6 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), t6);
              t6 = t6 == null ? null : J.cast$1$0$ax(t6, t2);
              parentIds = t6 == null ? H.setRuntimeTypeInfo([], t3) : t6;
              $async$goto = parentIds == null || J.get$isEmpty$asx(parentIds) ? 12 : 14;
              break;
            case 12:
              // then
              t6 = self.$loadModuleConfig.call$1("dart_sdk").dart;
              childModule = t6.getModuleLibraries.apply(t6, H.setRuntimeTypeInfo([previousModuleId], t4));
              self.$dartRunMain = P.allowInterop(new X.RequireRestarter__reload_closure(childModule), t5);
              // goto join
              $async$goto = 13;
              break;
            case 14:
              // else
              t6 = reloadedModules;
              if (typeof t6 !== "number") {
                $async$returnValue = t6.$add();
                // goto return
                $async$goto = 1;
                break;
              }
              reloadedModules = t6 + 1;
              $async$goto = 15;
              return P._asyncAwait($async$self._reloadModule$1(moduleId), $async$_reload$1);
            case 15:
              // returning from await.
              J.sort$1$ax(parentIds, t1);
              $async$self._dirtyModules.addAll$1(0, parentIds);
              previousModuleId = moduleId;
            case 13:
              // join
              // goto for condition
              $async$goto = 10;
              break;
            case 11:
              // after for
              P.print(H.S(reloadedModules) + " module(s) were hot-reloaded.");
              $async$self._running.complete$1(0, true);
              $async$handler = 2;
              // goto after finally
              $async$goto = 9;
              break;
            case 7:
              // catch
              $async$handler = 6;
              $async$exception = $async$currentError;
              t1 = H.unwrapException($async$exception);
              if (t1 instanceof X.HotReloadFailedException) {
                e = t1;
                P.print("Error during script reloading. Firing full page reload. " + H.S(e));
                window.location.reload();
                $async$self._running.complete$1(0, 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 P._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return P._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return P._asyncStartSync($async$_reload$1, $async$completer);
    },
    _reloadModule$1: function(moduleId) {
      var t1 = new P._Future($.Zone__current, type$._Future_dynamic),
        completer = new P._AsyncCompleter(t1, type$._AsyncCompleter_dynamic),
        stackTrace = P.StackTrace_current();
      J.forceLoadModule$3$x(self.$requireLoader, moduleId, P.allowInterop(new X.RequireRestarter__reloadModule_closure(completer), type$.legacy_void_Function), P.allowInterop(new X.RequireRestarter__reloadModule_closure0(completer, stackTrace), type$.legacy_void_Function_legacy_JsError));
      return t1;
    },
    _updateGraph$0: function() {
      var i, t2, t3, _i,
        t1 = type$.legacy_String,
        stronglyConnectedComponents = L.stronglyConnectedComponents(P.List_List$from(self.Array.from(J.keys$0$x(J.get$moduleParentsGraph$x(self.$requireLoader))), true, t1), this.get$_moduleParents(), t1);
      t1 = this._moduleOrdering;
      if (t1._collection$_length > 0) {
        t1._collection$_strings = t1._collection$_nums = t1._collection$_rest = t1._keys = null;
        t1._collection$_length = 0;
      }
      for (i = 0; i < stronglyConnectedComponents.length; ++i)
        for (t2 = stronglyConnectedComponents[i], t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, H.throwConcurrentModificationError)(t2), ++_i)
          t1.$indexSet(0, t2[_i], i);
    },
    set$_dirtyModules: function(_dirtyModules) {
      this._dirtyModules = type$.legacy_SplayTreeSet_legacy_String._as(_dirtyModules);
    },
    set$_running: function(_running) {
      this._running = type$.legacy_Completer_legacy_bool._as(_running);
    },
    $isRestarter: 1
  };
  X.RequireRestarter__reload_closure.prototype = {
    call$0: function() {
      var t1 = J.get$first$ax(self.Object.values(this.childModule));
      t1.main.apply(t1, H.setRuntimeTypeInfo([], type$.JSArray_legacy_Object));
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  X.RequireRestarter__reloadModule_closure.prototype = {
    call$0: function() {
      this.completer.complete$0(0);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 1
  };
  X.RequireRestarter__reloadModule_closure0.prototype = {
    call$1: function(e) {
      return this.completer.completeError$2(new X.HotReloadFailedException(J.get$message$x(type$.legacy_JsError._as(e))), this.stackTrace);
    },
    $signature: 76
  };
  V._createScript_closure.prototype = {
    call$0: function() {
      var nonce = V._findNonce();
      if (nonce == null)
        return new V._createScript__closure();
      return new V._createScript__closure0(nonce);
    },
    $signature: 77
  };
  V._createScript__closure.prototype = {
    call$0: function() {
      return document.createElement("script");
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 30
  };
  V._createScript__closure0.prototype = {
    call$0: function() {
      var t1 = document.createElement("script");
      t1.setAttribute("nonce", this.nonce);
      return t1;
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 30
  };
  (function aliases() {
    var _ = J.Interceptor.prototype;
    _.super$Interceptor$toString = _.toString$0;
    _.super$Interceptor$noSuchMethod = _.noSuchMethod$1;
    _ = J.JavaScriptObject.prototype;
    _.super$JavaScriptObject$toString = _.toString$0;
    _ = P._BufferingStreamSubscription.prototype;
    _.super$_BufferingStreamSubscription$_add = _._add$1;
    _.super$_BufferingStreamSubscription$_addError = _._addError$2;
    _ = P._HashMap.prototype;
    _.super$_HashMap$_containsKey = _._containsKey$1;
    _.super$_HashMap$_get = _._get$1;
    _.super$_HashMap$_set = _._set$2;
    _ = P.Iterable.prototype;
    _.super$Iterable$where = _.where$1;
    _ = P.Object.prototype;
    _.super$Object$toString = _.toString$0;
    _ = W.Element.prototype;
    _.super$Element$createFragment = _.createFragment$3$treeSanitizer$validator;
    _ = W._SimpleNodeValidator.prototype;
    _.super$_SimpleNodeValidator$allowsAttribute = _.allowsAttribute$3;
    _ = P.JsObject.prototype;
    _.super$JsObject$$index = _.$index;
    _.super$JsObject$$indexSet = _.$indexSet;
    _ = P._JsArray_JsObject_ListMixin.prototype;
    _.super$_JsArray_JsObject_ListMixin$$indexSet = _.$indexSet;
    _ = O.DelegatingStreamSink.prototype;
    _.super$DelegatingStreamSink$close = _.close$0;
  })();
  (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_0_u = hunkHelpers._instance_0u,
      _instance_1_u = hunkHelpers._instance_1u,
      _instance_0_i = hunkHelpers._instance_0i;
    _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 31);
    _static_1(P, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 11);
    _static_1(P, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 11);
    _static_1(P, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 11);
    _static_0(P, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
    _static_1(P, "async___nullDataHandler$closure", "_nullDataHandler", 5);
    _static_2(P, "async___nullErrorHandler$closure", "_nullErrorHandler", 14);
    _static_0(P, "async___nullDoneHandler$closure", "_nullDoneHandler", 0);
    _static(P, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 81, 0);
    _static(P, "async___rootRun$closure", 4, null, ["call$1$4", "call$4"], ["_rootRun", function($self, $parent, zone, f) {
      return P._rootRun($self, $parent, zone, f, type$.dynamic);
    }], 82, 1);
    _static(P, "async___rootRunUnary$closure", 5, null, ["call$2$5", "call$5"], ["_rootRunUnary", function($self, $parent, zone, f, arg) {
      return P._rootRunUnary($self, $parent, zone, f, arg, type$.dynamic, type$.dynamic);
    }], 83, 1);
    _static(P, "async___rootRunBinary$closure", 6, null, ["call$3$6", "call$6"], ["_rootRunBinary", function($self, $parent, zone, f, arg1, arg2) {
      return P._rootRunBinary($self, $parent, zone, f, arg1, arg2, type$.dynamic, type$.dynamic, type$.dynamic);
    }], 84, 1);
    _static(P, "async___rootRegisterCallback$closure", 4, null, ["call$1$4", "call$4"], ["_rootRegisterCallback", function($self, $parent, zone, f) {
      return P._rootRegisterCallback($self, $parent, zone, f, type$.dynamic);
    }], 85, 0);
    _static(P, "async___rootRegisterUnaryCallback$closure", 4, null, ["call$2$4", "call$4"], ["_rootRegisterUnaryCallback", function($self, $parent, zone, f) {
      return P._rootRegisterUnaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic);
    }], 86, 0);
    _static(P, "async___rootRegisterBinaryCallback$closure", 4, null, ["call$3$4", "call$4"], ["_rootRegisterBinaryCallback", function($self, $parent, zone, f) {
      return P._rootRegisterBinaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic, type$.dynamic);
    }], 87, 0);
    _static(P, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 88, 0);
    _static(P, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 89, 0);
    _static(P, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 90, 0);
    _static(P, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 91, 0);
    _static(P, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 92, 0);
    _static_1(P, "async___printToZone$closure", "_printToZone", 93);
    _static(P, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 94, 0);
    _instance(P._Completer.prototype, "get$completeError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 13, 0);
    _instance(P._AsyncCompleter.prototype, "get$complete", 1, 0, function() {
      return [null];
    }, ["call$1", "call$0"], ["complete$1", "complete$0"], 36, 0);
    _instance_2_u(P._Future.prototype, "get$_completeError", "_completeError$2", 14);
    var _;
    _instance_1_i(_ = P._StreamController.prototype, "get$add", "add$1", 16);
    _instance(_, "get$addError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["addError$2", "addError$1"], 13, 0);
    _instance_0_u(_ = P._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = P._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = P._ForwardingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_1_u(_, "get$_handleData", "_handleData$1", 16);
    _instance_2_u(_, "get$_handleError", "_handleError$2", 79);
    _instance_0_u(_, "get$_handleDone", "_handleDone$0", 0);
    _static_2(P, "collection___defaultEquals$closure", "_defaultEquals", 8);
    _static_1(P, "collection___defaultHashCode$closure", "_defaultHashCode", 9);
    _static_2(P, "collection_ListMixin__compareAny$closure", "ListMixin__compareAny", 31);
    _static_1(P, "convert___defaultToEncodable$closure", "_defaultToEncodable", 2);
    _static_1(P, "core__identityHashCode$closure", "identityHashCode", 9);
    _static_2(P, "core__identical$closure", "identical", 8);
    _static(W, "html__Html5NodeValidator__standardAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__standardAttributeValidator"], 12, 0);
    _static(W, "html__Html5NodeValidator__uriAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__uriAttributeValidator"], 12, 0);
    _instance_0_i(W.Node.prototype, "get$remove", "remove$0", 0);
    _instance_1_i(W.WebSocket.prototype, "get$send", "send$1", 5);
    _static_1(P, "js___convertToJS$closure", "_convertToJS", 96);
    _static_1(P, "js___convertToDart$closure", "_convertToDart", 97);
    _instance_2_u(_ = U.DeepCollectionEquality.prototype, "get$equals", "equals$2", 8);
    _instance_1_i(_, "get$hash", "hash$1", 9);
    _instance_1_u(_, "get$isValidKey", "isValidKey$1", 53);
    _static_2(L, "strongly_connected_components___defaultEquals$closure", "_defaultEquals0", 65);
    _instance_1_u(_ = M.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 27);
    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 27);
    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 59);
    _instance_1_u(_ = X.RequireRestarter.prototype, "get$_moduleParents", "_moduleParents$1", 74);
    _instance_2_u(_, "get$_moduleTopologicalCompare", "_moduleTopologicalCompare$2", 75);
  })();
  (function inheritance() {
    var _mixin = hunkHelpers.mixin,
      _inherit = hunkHelpers.inherit,
      _inheritMany = hunkHelpers.inheritMany;
    _inherit(P.Object, null);
    _inheritMany(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Iterable, H.CastIterator, H.Closure, P.MapMixin, P.Error, H.ListIterator, P.Iterator, H.EmptyIterator, H.FixedLengthListMixin, H.UnmodifiableListMixin, P._ListBase_Object_ListMixin, H.Symbol, P.MapView, H.ConstantMap, H.JSInvocationMirror, H.TypeErrorDecoder, H.NullThrownFromJavaScriptException, H.ExceptionAndStackTrace, H._StackTrace, H._Required, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, H.JSSyntaxRegExp, H._MatchImplementation, H.Rti, H._FunctionParameters, H._Type, P._TimerImpl, P._AsyncAwaitCompleter, P.AsyncError, P._Completer, P._FutureListener, P._Future, P._AsyncCallbackEntry, P.Stream, P.StreamSubscription, P.StreamTransformerBase, P._StreamController, P._SyncStreamControllerDispatch, P._AsyncStreamControllerDispatch, P._BufferingStreamSubscription, P._StreamSinkWrapper, P._DelayedEvent, P._DelayedDone, P._PendingEvents, P._StreamIterator, P._ZoneFunction, P._RunNullaryZoneFunction, P._RunUnaryZoneFunction, P._RunBinaryZoneFunction, P._RegisterNullaryZoneFunction, P._RegisterUnaryZoneFunction, P._RegisterBinaryZoneFunction, P._ZoneSpecification, P._ZoneDelegate, P._Zone, P._HashMapKeyIterator, P.__SetBase_Object_SetMixin, P._HashSetIterator, P._LinkedHashSetCell, P._LinkedHashSetIterator, P.IterableMixin, P.ListMixin, P._UnmodifiableMapMixin, P._ListQueueIterator, P.SetMixin, P._SplayTreeNode, P._SplayTree, P._SplayTreeIterator, P.Codec, P._JsonStringifier, P._BigIntImpl, P.DateTime, P.Duration, P.OutOfMemoryError, P.StackOverflowError, P._Exception, P.FormatException, P.IntegerDivisionByZeroException, P.Null, P._StringStackTrace, P.StringBuffer, P._Uri, P.UriData, P._SimpleUri, W.CssStyleDeclarationBase, W.EventStreamProvider, W._Html5NodeValidator, W.ImmutableListMixin, W.NodeValidatorBuilder, W._SimpleNodeValidator, W._SvgNodeValidator, W.FixedSizeListIterator, W._DOMWindowCrossFrame, W._SameOriginUriPolicy, W._ValidatingTreeSanitizer, P._AcceptStructuredClone, P.JsObject, P.NullRejectionException, P._JSRandom, P._Random, O.DelegatingStreamSink, S.BuiltList, S.ListBuilder, M.BuiltListMultimap, M.ListMultimapBuilder, A.BuiltMap, A.MapBuilder, L.BuiltSet, L.SetBuilder, E.BuiltSetMultimap, E.SetMultimapBuilder, Y.EnumClass, Y.IndentingBuiltValueToStringHelper, A.JsonObject, U.FullType, O.BigIntSerializer, R.BoolSerializer, Y.BuiltJsonSerializers, Y.BuiltJsonSerializersBuilder, R.BuiltListMultimapSerializer, K.BuiltListSerializer, K.BuiltMapSerializer, R.BuiltSetMultimapSerializer, O.BuiltSetSerializer, Z.DateTimeSerializer, D.DoubleSerializer, K.DurationSerializer, Q.Int64Serializer, B.IntSerializer, O.JsonObjectSerializer, K.NumSerializer, K.RegExpSerializer, M.StringSerializer, O.UriSerializer, U.DefaultEquality, U.IterableEquality, U.ListEquality, U._UnorderedEquality, U._MapEntry, U.MapEquality, U.DeepCollectionEquality, Q.BuildResult, Q._$BuildStatusSerializer, Q._$BuildResultSerializer, Q.BuildResultBuilder, E.ConnectRequest, E._$ConnectRequestSerializer, E.ConnectRequestBuilder, M.DevToolsRequest, M.DevToolsResponse, M._$DevToolsRequestSerializer, M._$DevToolsResponseSerializer, M.DevToolsRequestBuilder, M.DevToolsResponseBuilder, X.ErrorResponse, X._$ErrorResponseSerializer, X.ErrorResponseBuilder, S.ExtensionRequest, S.ExtensionResponse, S.ExtensionEvent, S.BatchedEvents, S._$ExtensionRequestSerializer, S._$ExtensionResponseSerializer, S._$ExtensionEventSerializer, S._$BatchedEventsSerializer, S.ExtensionRequestBuilder, S.ExtensionResponseBuilder, S.ExtensionEventBuilder, S.BatchedEventsBuilder, M.IsolateExit, M.IsolateStart, M._$IsolateExitSerializer, M._$IsolateStartSerializer, M.IsolateExitBuilder, M.IsolateStartBuilder, A.RunRequest, A._$RunRequestSerializer, R.SocketClient, V.Int64, Y.Level, L.LogRecord, F.Logger, R.StreamChannelMixin, K._GuaranteeSink, B.StreamChannelController, K.Uuid, E.WebSocketChannelException, Z.LegacyRestarter, Q.ReloadingManager, X.HotReloadFailedException, X.RequireRestarter]);
    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JSArray, J.JSNumber, J.JSString, H.NativeByteBuffer, H.NativeTypedData, W.EventTarget, W.AccessibleNodeList, W.Blob, W.Event, W.CssTransformComponent, W.CssRule, W._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase, W.CssStyleValue, W.DataTransferItemList, W.DomException, W.DomImplementation, W._DomRectList_Interceptor_ListMixin, W.DomRectReadOnly, W._DomStringList_Interceptor_ListMixin, W.DomTokenList, W._FileList_Interceptor_ListMixin, W.Gamepad, W.History, W._HtmlCollection_Interceptor_ListMixin, W.ImageData, W.Location, W.MediaList, W._MidiInputMap_Interceptor_MapMixin, W._MidiOutputMap_Interceptor_MapMixin, W.MimeType, W._MimeTypeArray_Interceptor_ListMixin, W._NodeList_Interceptor_ListMixin, W.Plugin, W._PluginArray_Interceptor_ListMixin, W._RtcStatsReport_Interceptor_MapMixin, W.SpeechGrammar, W._SpeechGrammarList_Interceptor_ListMixin, W.SpeechRecognitionResult, W._Storage_Interceptor_MapMixin, W.StyleSheet, W._TextTrackCueList_Interceptor_ListMixin, W.TimeRanges, W.Touch, W._TouchList_Interceptor_ListMixin, W.TrackDefaultList, W.Url, W.__CssRuleList_Interceptor_ListMixin, W.__GamepadList_Interceptor_ListMixin, W.__NamedNodeMap_Interceptor_ListMixin, W.__SpeechRecognitionResultList_Interceptor_ListMixin, W.__StyleSheetList_Interceptor_ListMixin, P.KeyRange, P.Length, P._LengthList_Interceptor_ListMixin, P.Number, P._NumberList_Interceptor_ListMixin, P.PointList, P._StringList_Interceptor_ListMixin, P.Transform, P._TransformList_Interceptor_ListMixin, P.AudioBuffer, P._AudioParamMap_Interceptor_MapMixin, P._SqlResultSetRowList_Interceptor_ListMixin]);
    _inheritMany(J.JavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction, D.ChromeError, D.RequestOptions, S.Promise, X.RequireLoader, X.JsError, X.JsMap]);
    _inherit(J.JSUnmodifiableArray, J.JSArray);
    _inheritMany(J.JSNumber, [J.JSInt, J.JSNumNotInt]);
    _inheritMany(P.Iterable, [H._CastIterableBase, H.EfficientLengthIterable, H.MappedIterable, H.WhereIterable, H.SkipIterable, H._ConstantMapKeyIterable]);
    _inheritMany(H._CastIterableBase, [H.CastIterable, H.__CastListBase__CastIterableBase_ListMixin]);
    _inherit(H._EfficientLengthCastIterable, H.CastIterable);
    _inherit(H._CastListBase, H.__CastListBase__CastIterableBase_ListMixin);
    _inheritMany(H.Closure, [H._CastListBase_sort_closure, H.CastMap_forEach_closure, H.nullFuture_closure, H.ConstantMap_map_closure, H.Primitives_functionNoSuchMethod_closure, H.TearOffClosure, H.JsLinkedHashMap_addAll_closure, H.initHooks_closure, H.initHooks_closure0, H.initHooks_closure1, P._AsyncRun__initializeScheduleImmediate_internalCallback, P._AsyncRun__initializeScheduleImmediate_closure, P._AsyncRun__scheduleImmediateJsOverride_internalCallback, P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, P._TimerImpl_internalCallback, P._TimerImpl$periodic_closure, P._awaitOnObject_closure, P._awaitOnObject_closure0, P._wrapJsFunctionForAsync_closure, P.Future_Future$microtask_closure, P._Future__addListener_closure, P._Future__prependListeners_closure, P._Future__chainForeignFuture_closure, P._Future__chainForeignFuture_closure0, P._Future__chainForeignFuture_closure1, P._Future__asyncCompleteWithValue_closure, P._Future__chainFuture_closure, P._Future__asyncCompleteError_closure, P._Future__propagateToListeners_handleWhenCompleteCallback, P._Future__propagateToListeners_handleWhenCompleteCallback_closure, P._Future__propagateToListeners_handleValueCallback, P._Future__propagateToListeners_handleError, P.Stream_length_closure, P.Stream_length_closure0, P.Stream_first_closure, P.Stream_first_closure0, P._StreamController__subscribe_closure, P._StreamController__recordCancel_complete, P._BufferingStreamSubscription_asFuture_closure, P._BufferingStreamSubscription_asFuture_closure0, P._BufferingStreamSubscription_asFuture__closure, P._BufferingStreamSubscription__sendError_sendError, P._BufferingStreamSubscription__sendDone_sendDone, P._PendingEvents_schedule_closure, P._cancelAndValue_closure, P._CustomZone_bindCallback_closure, P._CustomZone_bindUnaryCallback_closure, P._CustomZone_bindCallbackGuarded_closure, P._CustomZone_bindUnaryCallbackGuarded_closure, P._rootHandleUncaughtError_closure, P._RootZone_bindCallback_closure, P._RootZone_bindCallbackGuarded_closure, P._RootZone_bindUnaryCallbackGuarded_closure, P.runZonedGuarded_closure, P._HashMap_addAll_closure, P._CustomHashMap_closure, P.LinkedHashMap_LinkedHashMap$from_closure, P.MapBase_mapToString_closure, P.SplayTreeSet_closure, P._JsonMap_addAll_closure, P._JsonStringifier_writeMap_closure, P._symbolMapToStringMap_closure, P.NoSuchMethodError_toString_closure, P._BigIntImpl_hashCode_combine, P._BigIntImpl_hashCode_finish, P.Duration_toString_sixDigits, P.Duration_toString_twoDigits, P.Uri__parseIPv4Address_error, P.Uri_parseIPv6Address_error, P.Uri_parseIPv6Address_parseHex, P._createTables_build, P._createTables_setChars, P._createTables_setRange, W.Element_Element$html_closure, W.HttpRequest_request_closure, W.MidiInputMap_keys_closure, W.MidiOutputMap_keys_closure, W.RtcStatsReport_keys_closure, W.Storage_addAll_closure, W.Storage_keys_closure, W._AttributeMap_addAll_closure, W._EventStreamSubscription_closure, W._EventStreamSubscription_onData_closure, W.NodeValidatorBuilder_allowsElement_closure, W.NodeValidatorBuilder_allowsAttribute_closure, W._SimpleNodeValidator_closure, W._SimpleNodeValidator_closure0, W._TemplatingNodeValidator_closure, W._ValidatingTreeSanitizer_sanitizeTree_walk, P._AcceptStructuredClone_walk_closure, P._convertDartToNative_Value_closure, P.convertDartToNative_Dictionary_closure, P._convertToJS_closure, P._convertToJS_closure0, P._wrapToDart_closure, P._wrapToDart_closure0, P._wrapToDart_closure1, P.promiseToFuture_closure, P.promiseToFuture_closure0, P.AudioParamMap_keys_closure, M.BuiltListMultimap_BuiltListMultimap_closure, M.BuiltListMultimap_hashCode_closure, M.ListMultimapBuilder_replace_closure, A.BuiltMap_BuiltMap_closure, A.BuiltMap_hashCode_closure, A.MapBuilder_replace_closure, L.BuiltSet_hashCode_closure, E.BuiltSetMultimap_hashCode_closure, E.SetMultimapBuilder_replace_closure, Y.newBuiltValueToStringHelper_closure, U.Serializers_Serializers_closure, U.Serializers_Serializers_closure0, U.Serializers_Serializers_closure1, U.Serializers_Serializers_closure2, U.Serializers_Serializers_closure3, R.BuiltListMultimapSerializer_serialize_closure, R.BuiltListMultimapSerializer_deserialize_closure, K.BuiltListSerializer_serialize_closure, K.BuiltListSerializer_deserialize_closure, R.BuiltSetMultimapSerializer_serialize_closure, R.BuiltSetMultimapSerializer_deserialize_closure, O.BuiltSetSerializer_serialize_closure, O.BuiltSetSerializer_deserialize_closure, K._$serializers_closure, R.WebSocketClient_stream_closure, L.stronglyConnectedComponents_strongConnect, F.Logger_Logger_closure, A.hashObjects_closure, M.SseClient_closure, M.SseClient_closure0, M.SseClient_closure1, M.SseClient__closure, T.generateUuidV4__generateBits, T.generateUuidV4__printDigits, T.generateUuidV4__bitsDigits, K.GuaranteeChannel_closure, K.GuaranteeChannel__closure, K._GuaranteeSink__addError_closure, A.HtmlWebSocketChannel_closure, A.HtmlWebSocketChannel_closure0, A.HtmlWebSocketChannel_closure1, A.HtmlWebSocketChannel_closure2, A.HtmlWebSocketChannel__listen_closure, D.main_closure, D.main_closure0, D.main__closure, D.main__closure0, D.main___closure, D.main__closure1, D.main__closure2, D.main__closure3, D.main__closure4, D.main_closure1, Z.LegacyRestarter_restart_closure, S.toPromise_closure, X.RequireRestarter__reload_closure, X.RequireRestarter__reloadModule_closure, X.RequireRestarter__reloadModule_closure0, V._createScript_closure, V._createScript__closure, V._createScript__closure0]);
    _inherit(H.CastList, H._CastListBase);
    _inherit(P.MapBase, P.MapMixin);
    _inheritMany(P.MapBase, [H.CastMap, H.JsLinkedHashMap, P._HashMap, P._JsonMap, W._AttributeMap]);
    _inheritMany(P.Error, [H.LateError, H.ReachabilityError, H.NotNullableError, P.TypeError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.RuntimeError, P.AssertionError, H._Error, P.JsonUnsupportedObjectError, P.NullThrownError, P.ArgumentError, P.NoSuchMethodError, P.UnsupportedError, P.UnimplementedError, P.StateError, P.ConcurrentModificationError, P.CyclicInitializationError, Y.BuiltValueNullFieldError, Y.BuiltValueNestedFieldError, U.DeserializationError]);
    _inheritMany(H.EfficientLengthIterable, [H.ListIterable, H.EmptyIterable, H.LinkedHashMapKeyIterable, P._HashMapKeyIterable]);
    _inheritMany(H.ListIterable, [H.SubListIterable, H.MappedListIterable, H.ReversedListIterable, P.ListQueue, P._JsonMapKeyIterable]);
    _inherit(H.EfficientLengthMappedIterable, H.MappedIterable);
    _inheritMany(P.Iterator, [H.MappedIterator, H.WhereIterator, H.SkipIterator]);
    _inherit(H.EfficientLengthSkipIterable, H.SkipIterable);
    _inherit(P.ListBase, P._ListBase_Object_ListMixin);
    _inheritMany(P.ListBase, [H.UnmodifiableListBase, W._FrozenElementList, W._ChildNodeListLazy]);
    _inherit(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P.MapView);
    _inherit(P.UnmodifiableMapView, P._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
    _inherit(H.ConstantMapView, P.UnmodifiableMapView);
    _inherit(H.ConstantStringMap, H.ConstantMap);
    _inherit(H.NullError, P.TypeError);
    _inheritMany(H.TearOffClosure, [H.StaticClosure, H.BoundClosure]);
    _inherit(H._AssertionError, P.AssertionError);
    _inheritMany(H.NativeTypedData, [H.NativeByteData, H.NativeTypedArray]);
    _inheritMany(H.NativeTypedArray, [H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]);
    _inherit(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin);
    _inherit(H.NativeTypedArrayOfDouble, H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inherit(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
    _inherit(H.NativeTypedArrayOfInt, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inheritMany(H.NativeTypedArrayOfDouble, [H.NativeFloat32List, H.NativeFloat64List]);
    _inheritMany(H.NativeTypedArrayOfInt, [H.NativeInt16List, H.NativeInt32List, H.NativeInt8List, H.NativeUint16List, H.NativeUint32List, H.NativeUint8ClampedList, H.NativeUint8List]);
    _inherit(H._TypeError, H._Error);
    _inherit(P._AsyncCompleter, P._Completer);
    _inheritMany(P.Stream, [P.StreamView, P._StreamImpl, P._ForwardingStream, W._EventStream]);
    _inheritMany(P._StreamController, [P._AsyncStreamController, P._SyncStreamController]);
    _inherit(P._ControllerStream, P._StreamImpl);
    _inheritMany(P._BufferingStreamSubscription, [P._ControllerSubscription, P._ForwardingStreamSubscription]);
    _inheritMany(P._DelayedEvent, [P._DelayedData, P._DelayedError]);
    _inherit(P._StreamImplEvents, P._PendingEvents);
    _inherit(P._MapStream, P._ForwardingStream);
    _inheritMany(P._Zone, [P._CustomZone, P._RootZone]);
    _inheritMany(P._HashMap, [P._IdentityHashMap, P._CustomHashMap]);
    _inherit(P._SetBase, P.__SetBase_Object_SetMixin);
    _inheritMany(P._SetBase, [P._HashSet, P._LinkedHashSet]);
    _inherit(P.UnmodifiableListView, H.UnmodifiableListBase);
    _inherit(P._SplayTreeSetNode, P._SplayTreeNode);
    _inherit(P._SplayTreeKeyIterator, P._SplayTreeIterator);
    _inherit(P._SplayTreeSet__SplayTree_IterableMixin, P._SplayTree);
    _inherit(P._SplayTreeSet__SplayTree_IterableMixin_SetMixin, P._SplayTreeSet__SplayTree_IterableMixin);
    _inherit(P.SplayTreeSet, P._SplayTreeSet__SplayTree_IterableMixin_SetMixin);
    _inheritMany(P.Codec, [P.Base64Codec, P.JsonCodec]);
    _inherit(P.Converter, P.StreamTransformerBase);
    _inheritMany(P.Converter, [P.Base64Encoder, P.JsonEncoder, P.JsonDecoder]);
    _inherit(P.JsonCyclicError, P.JsonUnsupportedObjectError);
    _inherit(P._JsonStringStringifier, P._JsonStringifier);
    _inheritMany(P.ArgumentError, [P.RangeError, P.IndexError]);
    _inherit(P._DataUri, P._Uri);
    _inheritMany(W.EventTarget, [W.Node, W.EventSource, W.FileWriter, W.HttpRequestEventTarget, W.SourceBuffer, W._SourceBufferList_EventTarget_ListMixin, W.TextTrack, W.TextTrackCue, W._TextTrackList_EventTarget_ListMixin, W.VideoTrackList, W.WebSocket, W.Window, W.WorkerGlobalScope, P.AudioTrackList, P.BaseAudioContext]);
    _inheritMany(W.Node, [W.Element, W.CharacterData, W.Document, W._Attr]);
    _inheritMany(W.Element, [W.HtmlElement, P.SvgElement]);
    _inheritMany(W.HtmlElement, [W.AnchorElement, W.AreaElement, W.BaseElement, W.BodyElement, W.FormElement, W.ScriptElement, W.SelectElement, W.TableElement, W.TableRowElement, W.TableSectionElement, W.TemplateElement]);
    _inheritMany(W.Event, [W.CloseEvent, W.UIEvent, W.MessageEvent, W.ProgressEvent]);
    _inherit(W.CssPerspective, W.CssTransformComponent);
    _inherit(W.CssStyleDeclaration, W._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase);
    _inheritMany(W.CssStyleValue, [W.CssTransformValue, W.CssUnparsedValue]);
    _inherit(W._DomRectList_Interceptor_ListMixin_ImmutableListMixin, W._DomRectList_Interceptor_ListMixin);
    _inherit(W.DomRectList, W._DomRectList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W._DomStringList_Interceptor_ListMixin_ImmutableListMixin, W._DomStringList_Interceptor_ListMixin);
    _inherit(W.DomStringList, W._DomStringList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.File, W.Blob);
    _inherit(W._FileList_Interceptor_ListMixin_ImmutableListMixin, W._FileList_Interceptor_ListMixin);
    _inherit(W.FileList, W._FileList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin, W._HtmlCollection_Interceptor_ListMixin);
    _inherit(W.HtmlCollection, W._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.HtmlDocument, W.Document);
    _inherit(W.HttpRequest, W.HttpRequestEventTarget);
    _inherit(W.KeyboardEvent, W.UIEvent);
    _inherit(W.MidiInputMap, W._MidiInputMap_Interceptor_MapMixin);
    _inherit(W.MidiOutputMap, W._MidiOutputMap_Interceptor_MapMixin);
    _inherit(W._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin, W._MimeTypeArray_Interceptor_ListMixin);
    _inherit(W.MimeTypeArray, W._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W._NodeList_Interceptor_ListMixin_ImmutableListMixin, W._NodeList_Interceptor_ListMixin);
    _inherit(W.NodeList, W._NodeList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W._PluginArray_Interceptor_ListMixin_ImmutableListMixin, W._PluginArray_Interceptor_ListMixin);
    _inherit(W.PluginArray, W._PluginArray_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.RtcStatsReport, W._RtcStatsReport_Interceptor_MapMixin);
    _inherit(W._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, W._SourceBufferList_EventTarget_ListMixin);
    _inherit(W.SourceBufferList, W._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(W._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin, W._SpeechGrammarList_Interceptor_ListMixin);
    _inherit(W.SpeechGrammarList, W._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.Storage, W._Storage_Interceptor_MapMixin);
    _inherit(W._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin, W._TextTrackCueList_Interceptor_ListMixin);
    _inherit(W.TextTrackCueList, W._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, W._TextTrackList_EventTarget_ListMixin);
    _inherit(W.TextTrackList, W._TextTrackList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(W._TouchList_Interceptor_ListMixin_ImmutableListMixin, W._TouchList_Interceptor_ListMixin);
    _inherit(W.TouchList, W._TouchList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin, W.__CssRuleList_Interceptor_ListMixin);
    _inherit(W._CssRuleList, W.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W._DomRect, W.DomRectReadOnly);
    _inherit(W.__GamepadList_Interceptor_ListMixin_ImmutableListMixin, W.__GamepadList_Interceptor_ListMixin);
    _inherit(W._GamepadList, W.__GamepadList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin, W.__NamedNodeMap_Interceptor_ListMixin);
    _inherit(W._NamedNodeMap, W.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin, W.__SpeechRecognitionResultList_Interceptor_ListMixin);
    _inherit(W._SpeechRecognitionResultList, W.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin, W.__StyleSheetList_Interceptor_ListMixin);
    _inherit(W._StyleSheetList, W.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(W._ElementAttributeMap, W._AttributeMap);
    _inherit(W._EventStreamSubscription, P.StreamSubscription);
    _inherit(W._TemplatingNodeValidator, W._SimpleNodeValidator);
    _inherit(P._AcceptStructuredCloneDart2Js, P._AcceptStructuredClone);
    _inheritMany(P.JsObject, [P.JsFunction, P._JsArray_JsObject_ListMixin]);
    _inherit(P.JsArray, P._JsArray_JsObject_ListMixin);
    _inherit(P._LengthList_Interceptor_ListMixin_ImmutableListMixin, P._LengthList_Interceptor_ListMixin);
    _inherit(P.LengthList, P._LengthList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(P._NumberList_Interceptor_ListMixin_ImmutableListMixin, P._NumberList_Interceptor_ListMixin);
    _inherit(P.NumberList, P._NumberList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(P.ScriptElement0, P.SvgElement);
    _inherit(P._StringList_Interceptor_ListMixin_ImmutableListMixin, P._StringList_Interceptor_ListMixin);
    _inherit(P.StringList, P._StringList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(P._TransformList_Interceptor_ListMixin_ImmutableListMixin, P._TransformList_Interceptor_ListMixin);
    _inherit(P.TransformList, P._TransformList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(P.AudioParamMap, P._AudioParamMap_Interceptor_MapMixin);
    _inherit(P.OfflineAudioContext, P.BaseAudioContext);
    _inherit(P._SqlResultSetRowList_Interceptor_ListMixin_ImmutableListMixin, P._SqlResultSetRowList_Interceptor_ListMixin);
    _inherit(P.SqlResultSetRowList, P._SqlResultSetRowList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(S._BuiltList, S.BuiltList);
    _inherit(M._BuiltListMultimap, M.BuiltListMultimap);
    _inherit(A._BuiltMap, A.BuiltMap);
    _inherit(L._BuiltSet, L.BuiltSet);
    _inherit(E._BuiltSetMultimap, E.BuiltSetMultimap);
    _inheritMany(A.JsonObject, [A.BoolJsonObject, A.ListJsonObject, A.MapJsonObject, A.NumJsonObject, A.StringJsonObject]);
    _inherit(U.SetEquality, U._UnorderedEquality);
    _inherit(Q.BuildStatus, Y.EnumClass);
    _inherit(Q._$BuildResult, Q.BuildResult);
    _inherit(E._$ConnectRequest, E.ConnectRequest);
    _inherit(M._$DevToolsRequest, M.DevToolsRequest);
    _inherit(M._$DevToolsResponse, M.DevToolsResponse);
    _inherit(X._$ErrorResponse, X.ErrorResponse);
    _inherit(S._$ExtensionRequest, S.ExtensionRequest);
    _inherit(S._$ExtensionResponse, S.ExtensionResponse);
    _inherit(S._$ExtensionEvent, S.ExtensionEvent);
    _inherit(S._$BatchedEvents, S.BatchedEvents);
    _inherit(M._$IsolateExit, M.IsolateExit);
    _inherit(M._$IsolateStart, M.IsolateStart);
    _inherit(A._$RunRequest, A.RunRequest);
    _inheritMany(R.SocketClient, [R.SseSocketClient, R.WebSocketClient]);
    _inheritMany(R.StreamChannelMixin, [M.SseClient, K.GuaranteeChannel, A.HtmlWebSocketChannel, N.WebSocketChannel]);
    _inheritMany(O.DelegatingStreamSink, [A._HtmlWebSocketSink, N.WebSocketSink]);
    _mixin(H.UnmodifiableListBase, H.UnmodifiableListMixin);
    _mixin(H.__CastListBase__CastIterableBase_ListMixin, P.ListMixin);
    _mixin(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, P.ListMixin);
    _mixin(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, H.FixedLengthListMixin);
    _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, P.ListMixin);
    _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H.FixedLengthListMixin);
    _mixin(P._AsyncStreamController, P._AsyncStreamControllerDispatch);
    _mixin(P._SyncStreamController, P._SyncStreamControllerDispatch);
    _mixin(P._ListBase_Object_ListMixin, P.ListMixin);
    _mixin(P._SplayTreeSet__SplayTree_IterableMixin, P.IterableMixin);
    _mixin(P._SplayTreeSet__SplayTree_IterableMixin_SetMixin, P.SetMixin);
    _mixin(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P._UnmodifiableMapMixin);
    _mixin(P.__SetBase_Object_SetMixin, P.SetMixin);
    _mixin(W._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase, W.CssStyleDeclarationBase);
    _mixin(W._DomRectList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._DomRectList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._DomStringList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._DomStringList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._FileList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._FileList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._HtmlCollection_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._MidiInputMap_Interceptor_MapMixin, P.MapMixin);
    _mixin(W._MidiOutputMap_Interceptor_MapMixin, P.MapMixin);
    _mixin(W._MimeTypeArray_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._NodeList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._NodeList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._PluginArray_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._PluginArray_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._RtcStatsReport_Interceptor_MapMixin, P.MapMixin);
    _mixin(W._SourceBufferList_EventTarget_ListMixin, P.ListMixin);
    _mixin(W._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._SpeechGrammarList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._Storage_Interceptor_MapMixin, P.MapMixin);
    _mixin(W._TextTrackCueList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._TextTrackList_EventTarget_ListMixin, P.ListMixin);
    _mixin(W._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W._TouchList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W._TouchList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W.__CssRuleList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W.__GamepadList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W.__GamepadList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W.__NamedNodeMap_Interceptor_ListMixin, P.ListMixin);
    _mixin(W.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W.__SpeechRecognitionResultList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(W.__StyleSheetList_Interceptor_ListMixin, P.ListMixin);
    _mixin(W.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(P._JsArray_JsObject_ListMixin, P.ListMixin);
    _mixin(P._LengthList_Interceptor_ListMixin, P.ListMixin);
    _mixin(P._LengthList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(P._NumberList_Interceptor_ListMixin, P.ListMixin);
    _mixin(P._NumberList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(P._StringList_Interceptor_ListMixin, P.ListMixin);
    _mixin(P._StringList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(P._TransformList_Interceptor_ListMixin, P.ListMixin);
    _mixin(P._TransformList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
    _mixin(P._AudioParamMap_Interceptor_MapMixin, P.MapMixin);
    _mixin(P._SqlResultSetRowList_Interceptor_ListMixin, P.ListMixin);
    _mixin(P._SqlResultSetRowList_Interceptor_ListMixin_ImmutableListMixin, W.ImmutableListMixin);
  })();
  var init = {
    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
    mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List"},
    mangledNames: {},
    getTypeFromName: getGlobalFromName,
    metadata: [],
    types: ["~()", "Null()", "@(@)", "Object*(@)", "~(String,@)", "~(@)", "Null(@)", "~(String,String)", "bool(Object?,Object?)", "int(Object?)", "Null(Event*)", "~(~())", "bool(Element,String,String,_Html5NodeValidator)", "~(Object[StackTrace?])", "~(Object,StackTrace)", "Null(Object,StackTrace)", "~(Object?)", "bool(@)", "~(@,@)", "~(Object?,Object?)", "~(Symbol0,@)", "int(int,int)", "String(int)", "~(Uint8List,String,int)", "~(Event)", "bool(NodeValidator)", "bool(String)", "~(Event*)", "String*(int*,int*)", "Null(Event)", "ScriptElement*()", "int(@,@)", "_Future<@>(@)", "Future<Null>()", "~(Zone,ZoneDelegate,Zone,Object,StackTrace)", "@(String)", "~([Object?])", "String(String)", "~(Node,Node?)", "@(@,@)", "JsFunction(@)", "JsArray<@>(@)", "JsObject(@)", "Null(Object*,Object*)", "IndentingBuiltValueToStringHelper*(String*)", "ListBuilder<Object*>*()", "ListMultimapBuilder<Object*,Object*>*()", "MapBuilder<Object*,Object*>*()", "SetBuilder<Object*>*()", "SetMultimapBuilder<Object*,Object*>*()", "@(@,String)", "Null(~())", "Null(@,StackTrace)", "bool(Object?)", "ListBuilder<ExtensionEvent*>*()", "String*(@)", "Logger()", "int*(int*,@)", "int(int)", "~(String*)", "~(int,@)", "int*(int*)", "~(String,int)", "~(String[@])", "~(MessageEvent)", "bool(Object,Object)", "Null([@])", "Future<Null>*()", "Promise<1&>*()", "DevToolsRequestBuilder*(DevToolsRequestBuilder*)", "Future<Null>*(String*)", "ConnectRequestBuilder*(ConnectRequestBuilder*)", "Null(Object*,StackTrace*)", "Null(MessageEvent*)", "List<String*>*(String*)", "int*(String*,String*)", "~(JsError*)", "ScriptElement*()*()", "Uint8List(@,@)", "~(@,StackTrace)", "bool(Node)", "~(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?>?)", "~(ProgressEvent)", "Object?(Object?)", "Object?(@)", "Null(CloseEvent)"],
    interceptorsByTag: null,
    leafTags: null,
    arrayRti: typeof Symbol == "function" && typeof Symbol() == "symbol" ? Symbol("$ti") : "$ti"
  };
  H._Universe_addRules(init.typeUniverse, JSON.parse('{"PlainJavaScriptObject":"JavaScriptObject","UnknownJavaScriptObject":"JavaScriptObject","JavaScriptFunction":"JavaScriptObject","ChromeError":"JavaScriptObject","RequestOptions":"JavaScriptObject","Promise":"JavaScriptObject","JsError":"JavaScriptObject","RequireLoader":"JavaScriptObject","JsMap":"JavaScriptObject","AbortPaymentEvent":"Event","ExtendableEvent":"Event","AudioContext":"BaseAudioContext","AbsoluteOrientationSensor":"EventTarget","OrientationSensor":"EventTarget","Sensor":"EventTarget","AElement":"SvgElement","GraphicsElement":"SvgElement","_ResourceProgressEvent":"ProgressEvent","AudioElement":"HtmlElement","MediaElement":"HtmlElement","ShadowRoot":"Node","DocumentFragment":"Node","XmlDocument":"Document","VttCue":"TextTrackCue","CompositionEvent":"UIEvent","DedicatedWorkerGlobalScope":"WorkerGlobalScope","CDataSection":"CharacterData","Text":"CharacterData","HttpRequestUpload":"HttpRequestEventTarget","HtmlFormControlsCollection":"HtmlCollection","CssCharsetRule":"CssRule","CssStyleSheet":"StyleSheet","JavaScriptObject":{"Promise":["1&"],"JsError":[]},"JSBool":{"bool":[]},"JSNull":{"Null":[]},"JSArray":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[]},"EfficientLengthIterable":{"Iterable":["1"]},"_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":{"ListMixin":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListMixin":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListMixin.E":"2","Iterable.E":"2"},"CastMap":{"MapMixin":["3","4"],"Map":["3","4"],"MapMixin.K":"3","MapMixin.V":"4"},"LateError":{"Error":[]},"ReachabilityError":{"Error":[]},"NotNullableError":{"Error":[]},"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"]},"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"]},"UnmodifiableListBase":{"ListMixin":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"Symbol":{"Symbol0":[]},"ConstantMapView":{"UnmodifiableMapView":["1","2"],"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_ConstantMapKeyIterable":{"Iterable":["1"],"Iterable.E":"1"},"JSInvocationMirror":{"Invocation":[]},"NullError":{"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapMixin":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"LinkedHashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"NativeByteBuffer":{"ByteBuffer":[]},"NativeTypedData":{"TypedData":[]},"NativeByteData":{"TypedData":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"TypedData":[]},"NativeTypedArrayOfDouble":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeFloat64List":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeInt16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint16List":{"ListMixin":["int"],"Uint16List":[],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8ClampedList":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8List":{"ListMixin":["int"],"Uint8List":[],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"_Type":{"Type":[]},"_Error":{"Error":[]},"_TypeError":{"Error":[]},"AsyncError":{"Error":[]},"_Future":{"Future":["1"]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"StreamView":{"Stream":["1"],"Stream.T":"1"},"StreamTransformerBase":{"StreamTransformer":["1","2"]},"_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"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_StreamImplEvents":{"_PendingEvents":["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":{"MapMixin":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_IdentityHashMap":{"_HashMap":["1","2"],"MapMixin":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_CustomHashMap":{"_HashMap":["1","2"],"MapMixin":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_HashSet":{"_SetBase":["1"],"SetMixin":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_HashSetIterator":{"Iterator":["1"]},"_LinkedHashSet":{"_SetBase":["1"],"SetMixin":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_LinkedHashSetIterator":{"Iterator":["1"]},"UnmodifiableListView":{"ListMixin":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListMixin.E":"1","UnmodifiableListMixin.E":"1"},"ListBase":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"MapMixin":["1","2"],"Map":["1","2"]},"MapMixin":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ListQueue":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"_SetBase":{"SetMixin":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SplayTreeIterator":{"Iterator":["3"]},"_SplayTreeKeyIterator":{"_SplayTreeIterator":["1","2","1"],"Iterator":["1"],"_SplayTreeIterator.1":"2","_SplayTreeIterator.K":"1"},"SplayTreeSet":{"SetMixin":["1"],"Set":["1"],"IterableMixin":["1"],"EfficientLengthIterable":["1"],"_SplayTree":["1","_SplayTreeSetNode<1>"],"Iterable":["1"],"_SplayTree.K":"1","_SplayTree.1":"_SplayTreeSetNode<1>"},"_JsonMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"Base64Codec":{"Codec":["List<int>","String"]},"Base64Encoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"Converter":{"StreamTransformer":["1","2"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"]},"JsonEncoder":{"Converter":["Object?","String"],"StreamTransformer":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"],"StreamTransformer":["String","Object?"]},"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":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"NullThrownError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"NoSuchMethodError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"CyclicInitializationError":{"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"HtmlElement":{"Element":[],"Node":[],"EventTarget":[]},"CloseEvent":{"Event":[]},"Element":{"Node":[],"EventTarget":[]},"File":{"Blob":[]},"HttpRequest":{"EventTarget":[]},"HttpRequestEventTarget":{"EventTarget":[]},"KeyboardEvent":{"Event":[]},"MessageEvent":{"Event":[]},"Node":{"EventTarget":[]},"ProgressEvent":{"Event":[]},"ScriptElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"SourceBuffer":{"EventTarget":[]},"TextTrack":{"EventTarget":[]},"TextTrackCue":{"EventTarget":[]},"UIEvent":{"Event":[]},"_Html5NodeValidator":{"NodeValidator":[]},"AnchorElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"AreaElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"BaseElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"BodyElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"CharacterData":{"Node":[],"EventTarget":[]},"Document":{"Node":[],"EventTarget":[]},"DomRectList":{"ListMixin":["Rectangle<num>"],"ImmutableListMixin":["Rectangle<num>"],"List":["Rectangle<num>"],"JavaScriptIndexingBehavior":["Rectangle<num>"],"EfficientLengthIterable":["Rectangle<num>"],"Iterable":["Rectangle<num>"],"ImmutableListMixin.E":"Rectangle<num>","ListMixin.E":"Rectangle<num>"},"DomRectReadOnly":{"Rectangle":["num"]},"DomStringList":{"ListMixin":["String"],"ImmutableListMixin":["String"],"List":["String"],"JavaScriptIndexingBehavior":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ImmutableListMixin.E":"String","ListMixin.E":"String"},"_FrozenElementList":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListMixin.E":"1"},"EventSource":{"EventTarget":[]},"FileList":{"ListMixin":["File"],"ImmutableListMixin":["File"],"List":["File"],"JavaScriptIndexingBehavior":["File"],"EfficientLengthIterable":["File"],"Iterable":["File"],"ImmutableListMixin.E":"File","ListMixin.E":"File"},"FileWriter":{"EventTarget":[]},"FormElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"HtmlCollection":{"ListMixin":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListMixin.E":"Node"},"HtmlDocument":{"Document":[],"Node":[],"EventTarget":[]},"MidiInputMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"MidiOutputMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"MimeTypeArray":{"ListMixin":["MimeType"],"ImmutableListMixin":["MimeType"],"List":["MimeType"],"JavaScriptIndexingBehavior":["MimeType"],"EfficientLengthIterable":["MimeType"],"Iterable":["MimeType"],"ImmutableListMixin.E":"MimeType","ListMixin.E":"MimeType"},"_ChildNodeListLazy":{"ListMixin":["Node"],"List":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ListMixin.E":"Node"},"NodeList":{"ListMixin":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListMixin.E":"Node"},"PluginArray":{"ListMixin":["Plugin"],"ImmutableListMixin":["Plugin"],"List":["Plugin"],"JavaScriptIndexingBehavior":["Plugin"],"EfficientLengthIterable":["Plugin"],"Iterable":["Plugin"],"ImmutableListMixin.E":"Plugin","ListMixin.E":"Plugin"},"RtcStatsReport":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"SelectElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"SourceBufferList":{"ListMixin":["SourceBuffer"],"ImmutableListMixin":["SourceBuffer"],"List":["SourceBuffer"],"JavaScriptIndexingBehavior":["SourceBuffer"],"EventTarget":[],"EfficientLengthIterable":["SourceBuffer"],"Iterable":["SourceBuffer"],"ImmutableListMixin.E":"SourceBuffer","ListMixin.E":"SourceBuffer"},"SpeechGrammarList":{"ListMixin":["SpeechGrammar"],"ImmutableListMixin":["SpeechGrammar"],"List":["SpeechGrammar"],"JavaScriptIndexingBehavior":["SpeechGrammar"],"EfficientLengthIterable":["SpeechGrammar"],"Iterable":["SpeechGrammar"],"ImmutableListMixin.E":"SpeechGrammar","ListMixin.E":"SpeechGrammar"},"Storage":{"MapMixin":["String","String"],"Map":["String","String"],"MapMixin.K":"String","MapMixin.V":"String"},"TableElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TableRowElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TableSectionElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TemplateElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TextTrackCueList":{"ListMixin":["TextTrackCue"],"ImmutableListMixin":["TextTrackCue"],"List":["TextTrackCue"],"JavaScriptIndexingBehavior":["TextTrackCue"],"EfficientLengthIterable":["TextTrackCue"],"Iterable":["TextTrackCue"],"ImmutableListMixin.E":"TextTrackCue","ListMixin.E":"TextTrackCue"},"TextTrackList":{"ListMixin":["TextTrack"],"ImmutableListMixin":["TextTrack"],"List":["TextTrack"],"JavaScriptIndexingBehavior":["TextTrack"],"EventTarget":[],"EfficientLengthIterable":["TextTrack"],"Iterable":["TextTrack"],"ImmutableListMixin.E":"TextTrack","ListMixin.E":"TextTrack"},"TouchList":{"ListMixin":["Touch"],"ImmutableListMixin":["Touch"],"List":["Touch"],"JavaScriptIndexingBehavior":["Touch"],"EfficientLengthIterable":["Touch"],"Iterable":["Touch"],"ImmutableListMixin.E":"Touch","ListMixin.E":"Touch"},"VideoTrackList":{"EventTarget":[]},"WebSocket":{"EventTarget":[]},"Window":{"EventTarget":[]},"WorkerGlobalScope":{"EventTarget":[]},"_Attr":{"Node":[],"EventTarget":[]},"_CssRuleList":{"ListMixin":["CssRule"],"ImmutableListMixin":["CssRule"],"List":["CssRule"],"JavaScriptIndexingBehavior":["CssRule"],"EfficientLengthIterable":["CssRule"],"Iterable":["CssRule"],"ImmutableListMixin.E":"CssRule","ListMixin.E":"CssRule"},"_DomRect":{"Rectangle":["num"]},"_GamepadList":{"ListMixin":["Gamepad?"],"ImmutableListMixin":["Gamepad?"],"List":["Gamepad?"],"JavaScriptIndexingBehavior":["Gamepad?"],"EfficientLengthIterable":["Gamepad?"],"Iterable":["Gamepad?"],"ImmutableListMixin.E":"Gamepad?","ListMixin.E":"Gamepad?"},"_NamedNodeMap":{"ListMixin":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListMixin.E":"Node"},"_SpeechRecognitionResultList":{"ListMixin":["SpeechRecognitionResult"],"ImmutableListMixin":["SpeechRecognitionResult"],"List":["SpeechRecognitionResult"],"JavaScriptIndexingBehavior":["SpeechRecognitionResult"],"EfficientLengthIterable":["SpeechRecognitionResult"],"Iterable":["SpeechRecognitionResult"],"ImmutableListMixin.E":"SpeechRecognitionResult","ListMixin.E":"SpeechRecognitionResult"},"_StyleSheetList":{"ListMixin":["StyleSheet"],"ImmutableListMixin":["StyleSheet"],"List":["StyleSheet"],"JavaScriptIndexingBehavior":["StyleSheet"],"EfficientLengthIterable":["StyleSheet"],"Iterable":["StyleSheet"],"ImmutableListMixin.E":"StyleSheet","ListMixin.E":"StyleSheet"},"_AttributeMap":{"MapMixin":["String","String"],"Map":["String","String"]},"_ElementAttributeMap":{"MapMixin":["String","String"],"Map":["String","String"],"MapMixin.K":"String","MapMixin.V":"String"},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"NodeValidatorBuilder":{"NodeValidator":[]},"_SimpleNodeValidator":{"NodeValidator":[]},"_TemplatingNodeValidator":{"NodeValidator":[]},"_SvgNodeValidator":{"NodeValidator":[]},"FixedSizeListIterator":{"Iterator":["1"]},"_DOMWindowCrossFrame":{"EventTarget":[]},"_SameOriginUriPolicy":{"UriPolicy":[]},"_ValidatingTreeSanitizer":{"NodeTreeSanitizer":[]},"JsFunction":{"JsObject":[]},"JsArray":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"JsObject":[],"Iterable":["1"],"ListMixin.E":"1"},"LengthList":{"ListMixin":["Length"],"ImmutableListMixin":["Length"],"List":["Length"],"EfficientLengthIterable":["Length"],"Iterable":["Length"],"ImmutableListMixin.E":"Length","ListMixin.E":"Length"},"NumberList":{"ListMixin":["Number"],"ImmutableListMixin":["Number"],"List":["Number"],"EfficientLengthIterable":["Number"],"Iterable":["Number"],"ImmutableListMixin.E":"Number","ListMixin.E":"Number"},"ScriptElement0":{"SvgElement":[],"Element":[],"Node":[],"EventTarget":[]},"StringList":{"ListMixin":["String"],"ImmutableListMixin":["String"],"List":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ImmutableListMixin.E":"String","ListMixin.E":"String"},"SvgElement":{"Element":[],"Node":[],"EventTarget":[]},"TransformList":{"ListMixin":["Transform"],"ImmutableListMixin":["Transform"],"List":["Transform"],"EfficientLengthIterable":["Transform"],"Iterable":["Transform"],"ImmutableListMixin.E":"Transform","ListMixin.E":"Transform"},"AudioParamMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"AudioTrackList":{"EventTarget":[]},"BaseAudioContext":{"EventTarget":[]},"OfflineAudioContext":{"EventTarget":[]},"SqlResultSetRowList":{"ListMixin":["Map<@,@>"],"ImmutableListMixin":["Map<@,@>"],"List":["Map<@,@>"],"EfficientLengthIterable":["Map<@,@>"],"Iterable":["Map<@,@>"],"ImmutableListMixin.E":"Map<@,@>","ListMixin.E":"Map<@,@>"},"DelegatingStreamSink":{"StreamSink":["1"]},"BuiltList":{"Iterable":["1*"]},"_BuiltList":{"BuiltList":["1*"],"Iterable":["1*"],"BuiltList.E":"1*"},"_BuiltListMultimap":{"BuiltListMultimap":["1*","2*"],"BuiltListMultimap.V":"2*","BuiltListMultimap.K":"1*"},"_BuiltMap":{"BuiltMap":["1*","2*"],"BuiltMap.K":"1*","BuiltMap.V":"2*"},"BuiltSet":{"Iterable":["1*"]},"_BuiltSet":{"BuiltSet":["1*"],"Iterable":["1*"],"BuiltSet.E":"1*"},"_BuiltSetMultimap":{"BuiltSetMultimap":["1*","2*"],"BuiltSetMultimap.V":"2*","BuiltSetMultimap.K":"1*"},"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*"]},"Int64Serializer":{"PrimitiveSerializer":["Int64*"],"Serializer":["Int64*"]},"IntSerializer":{"PrimitiveSerializer":["int*"],"Serializer":["int*"]},"JsonObjectSerializer":{"PrimitiveSerializer":["JsonObject*"],"Serializer":["JsonObject*"]},"NumSerializer":{"PrimitiveSerializer":["num*"],"Serializer":["num*"]},"RegExpSerializer":{"PrimitiveSerializer":["RegExp*"],"Serializer":["RegExp*"]},"StringSerializer":{"PrimitiveSerializer":["String*"],"Serializer":["String*"]},"UriSerializer":{"PrimitiveSerializer":["Uri*"],"Serializer":["Uri*"]},"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":["@"]},"_$BuildStatusSerializer":{"PrimitiveSerializer":["BuildStatus*"],"Serializer":["BuildStatus*"]},"_$BuildResultSerializer":{"StructuredSerializer":["BuildResult*"],"Serializer":["BuildResult*"]},"_$BuildResult":{"BuildResult":[]},"_$ConnectRequestSerializer":{"StructuredSerializer":["ConnectRequest*"],"Serializer":["ConnectRequest*"]},"_$ConnectRequest":{"ConnectRequest":[]},"_$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":[]},"_$IsolateExitSerializer":{"StructuredSerializer":["IsolateExit*"],"Serializer":["IsolateExit*"]},"_$IsolateStartSerializer":{"StructuredSerializer":["IsolateStart*"],"Serializer":["IsolateStart*"]},"_$IsolateExit":{"IsolateExit":[]},"_$IsolateStart":{"IsolateStart":[]},"_$RunRequestSerializer":{"StructuredSerializer":["RunRequest*"],"Serializer":["RunRequest*"]},"_$RunRequest":{"RunRequest":[]},"SseSocketClient":{"SocketClient":[]},"WebSocketClient":{"SocketClient":[]},"Int64":{"Comparable":["@"]},"Level":{"Comparable":["Level"]},"SseClient":{"StreamChannel":["String*"]},"GuaranteeChannel":{"StreamChannel":["1"]},"_GuaranteeSink":{"StreamSink":["1"]},"StreamChannelMixin":{"StreamChannel":["1"]},"HtmlWebSocketChannel":{"WebSocketChannel":[],"StreamChannel":["@"]},"_HtmlWebSocketSink":{"WebSocketSink":[],"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"WebSocketChannel":{"StreamChannel":["@"]},"WebSocketSink":{"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"LegacyRestarter":{"Restarter":[]},"RequireRestarter":{"Restarter":[]},"ByteData":{"TypedData":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]}}'));
  H._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"StreamTransformerBase":2,"ListBase":1,"MapBase":2,"_ListBase_Object_ListMixin":1,"_SplayTreeSet__SplayTree_IterableMixin":1,"_SplayTreeSet__SplayTree_IterableMixin_SetMixin":1,"__SetBase_Object_SetMixin":1,"MapEntry":2,"_JsArray_JsObject_ListMixin":1,"_RectangleBase":1,"StreamChannelMixin":1}'));
  var string$ = {
    _null_: "`null` encountered as the result from expression with type `Never`.",
    explicBL: 'explicit element type required, for example "new BuiltList<int>"',
    explicBS: 'explicit element type required, for example "new BuiltSet<int>"',
    explicL: 'explicit element type required, for example "new ListBuilder<int>"',
    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 = H.findType;
    return {
      AsyncError: findType("AsyncError"),
      BaseElement: findType("BaseElement"),
      Blob: findType("Blob"),
      BodyElement: findType("BodyElement"),
      ByteBuffer: findType("ByteBuffer"),
      CloseEvent: findType("CloseEvent"),
      Comparable_dynamic: findType("Comparable<@>"),
      ConstantMapView_Symbol_dynamic: findType("ConstantMapView<Symbol0,@>"),
      CssRule: findType("CssRule"),
      DateTime: findType("DateTime"),
      Document: findType("Document"),
      Duration: findType("Duration"),
      EfficientLengthIterable_dynamic: findType("EfficientLengthIterable<@>"),
      Element: findType("Element"),
      Error: findType("Error"),
      Event: findType("Event"),
      File: findType("File"),
      Function: findType("Function"),
      Future_dynamic: findType("Future<@>"),
      Future_void: findType("Future<~>"),
      ImageData: findType("ImageData"),
      Invocation: findType("Invocation"),
      IterableEquality_dynamic: findType("IterableEquality<@>"),
      Iterable_Node: findType("Iterable<Node>"),
      Iterable_dynamic: findType("Iterable<@>"),
      JSArray_NodeValidator: findType("JSArray<NodeValidator>"),
      JSArray_String: findType("JSArray<String>"),
      JSArray_dynamic: findType("JSArray<@>"),
      JSArray_int: findType("JSArray<int>"),
      JSArray_legacy_FullType: findType("JSArray<FullType*>"),
      JSArray_legacy_Object: findType("JSArray<Object*>"),
      JSArray_legacy_String: findType("JSArray<String*>"),
      JSArray_legacy_Type: findType("JSArray<Type*>"),
      JSArray_legacy_int: findType("JSArray<int*>"),
      JSNull: findType("JSNull"),
      JavaScriptFunction: findType("JavaScriptFunction"),
      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
      JsArray_dynamic: findType("JsArray<@>"),
      JsLinkedHashMap_String_dynamic: findType("JsLinkedHashMap<String,@>"),
      JsLinkedHashMap_Symbol_dynamic: findType("JsLinkedHashMap<Symbol0,@>"),
      KeyRange: findType("KeyRange"),
      Length: findType("Length"),
      Level: findType("Level"),
      ListBuilder_legacy_ExtensionEvent: findType("ListBuilder<ExtensionEvent*>"),
      ListEquality_dynamic: findType("ListEquality<@>"),
      List_dynamic: findType("List<@>"),
      Logger: findType("Logger"),
      MapEquality_dynamic_dynamic: findType("MapEquality<@,@>"),
      Map_String_String: findType("Map<String,String>"),
      Map_String_dynamic: findType("Map<String,@>"),
      Map_dynamic_dynamic: findType("Map<@,@>"),
      MappedListIterable_of_legacy_String_and_String: findType("MappedListIterable<String*,String>"),
      MessageEvent: findType("MessageEvent"),
      MimeType: findType("MimeType"),
      NativeUint8List: findType("NativeUint8List"),
      Node: findType("Node"),
      NodeValidator: findType("NodeValidator"),
      Null: findType("Null"),
      Number: findType("Number"),
      Object: findType("Object"),
      Plugin: findType("Plugin"),
      ProgressEvent: findType("ProgressEvent"),
      Rectangle_num: findType("Rectangle<num>"),
      ReversedListIterable_String: findType("ReversedListIterable<String>"),
      ScriptElement: findType("ScriptElement0"),
      SetEquality_dynamic: findType("SetEquality<@>"),
      Set_dynamic: findType("Set<@>"),
      SourceBuffer: findType("SourceBuffer"),
      SpeechGrammar: findType("SpeechGrammar"),
      SpeechRecognitionResult: findType("SpeechRecognitionResult"),
      StackTrace: findType("StackTrace"),
      StreamChannelController_dynamic: findType("StreamChannelController<@>"),
      StreamView_dynamic: findType("StreamView<@>"),
      String: findType("String"),
      String_Function_legacy_String: findType("String(String*)"),
      StyleSheet: findType("StyleSheet"),
      SvgElement: findType("SvgElement"),
      Symbol: findType("Symbol0"),
      TemplateElement: findType("TemplateElement"),
      TextTrack: findType("TextTrack"),
      TextTrackCue: findType("TextTrackCue"),
      Timer: findType("Timer"),
      Touch: findType("Touch"),
      Transform: findType("Transform"),
      TypedData: findType("TypedData"),
      Uint8List: findType("Uint8List"),
      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
      UnmodifiableListView_legacy_Object: findType("UnmodifiableListView<Object*>"),
      UnmodifiableMapView_of_legacy_String_and_legacy_Object: findType("UnmodifiableMapView<String*,Object*>"),
      Uri: findType("Uri"),
      Window: findType("Window"),
      WorkerGlobalScope: findType("WorkerGlobalScope"),
      Zone: findType("Zone"),
      _AsyncCompleter_HttpRequest: findType("_AsyncCompleter<HttpRequest>"),
      _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"),
      _AsyncCompleter_legacy_bool: findType("_AsyncCompleter<bool*>"),
      _AsyncCompleter_void: findType("_AsyncCompleter<~>"),
      _Attr: findType("_Attr"),
      _BigIntImpl: findType("_BigIntImpl"),
      _ChildNodeListLazy: findType("_ChildNodeListLazy"),
      _EventStream_legacy_CloseEvent: findType("_EventStream<CloseEvent*>"),
      _EventStream_legacy_Event: findType("_EventStream<Event*>"),
      _FrozenElementList_legacy_Element: findType("_FrozenElementList<Element*>"),
      _Future_HttpRequest: findType("_Future<HttpRequest>"),
      _Future_Null: findType("_Future<Null>"),
      _Future_dynamic: findType("_Future<@>"),
      _Future_int: findType("_Future<int>"),
      _Future_legacy_bool: findType("_Future<bool*>"),
      _Future_void: findType("_Future<~>"),
      _Html5NodeValidator: findType("_Html5NodeValidator"),
      _MapEntry: findType("_MapEntry"),
      _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState<Object?>"),
      _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)"),
      double: findType("double"),
      dynamic: findType("@"),
      dynamic_Function: findType("@()"),
      dynamic_Function_Object: findType("@(Object)"),
      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
      dynamic_Function_dynamic_dynamic: findType("@(@,@)"),
      int: findType("int"),
      legacy_BatchedEvents: findType("BatchedEvents*"),
      legacy_BigInt: findType("BigInt*"),
      legacy_BuildResult: findType("BuildResult*"),
      legacy_BuildStatus: findType("BuildStatus*"),
      legacy_BuiltListMultimap_dynamic_dynamic: findType("BuiltListMultimap<@,@>*"),
      legacy_BuiltList_dynamic: findType("BuiltList<@>*"),
      legacy_BuiltList_legacy_Object: findType("BuiltList<Object*>*"),
      legacy_BuiltMap_dynamic_dynamic: findType("BuiltMap<@,@>*"),
      legacy_BuiltSetMultimap_dynamic_dynamic: findType("BuiltSetMultimap<@,@>*"),
      legacy_BuiltSet_dynamic: findType("BuiltSet<@>*"),
      legacy_Completer_legacy_bool: findType("Completer<bool*>*"),
      legacy_ConnectRequest: findType("ConnectRequest*"),
      legacy_DateTime: findType("DateTime*"),
      legacy_DevToolsRequest: findType("DevToolsRequest*"),
      legacy_DevToolsResponse: findType("DevToolsResponse*"),
      legacy_Duration: findType("Duration*"),
      legacy_Element: findType("Element*"),
      legacy_Error: findType("Error*"),
      legacy_ErrorResponse: findType("ErrorResponse*"),
      legacy_Event: findType("Event*"),
      legacy_ExtensionEvent: findType("ExtensionEvent*"),
      legacy_ExtensionRequest: findType("ExtensionRequest*"),
      legacy_ExtensionResponse: findType("ExtensionResponse*"),
      legacy_FullType: findType("FullType*"),
      legacy_Function: findType("Function*"),
      legacy_Future_void: findType("Future<~>*"),
      legacy_HtmlElement: findType("HtmlElement*"),
      legacy_Int64: findType("Int64*"),
      legacy_IsolateExit: findType("IsolateExit*"),
      legacy_IsolateStart: findType("IsolateStart*"),
      legacy_Iterable_dynamic: findType("Iterable<@>*"),
      legacy_Iterable_legacy_Object: findType("Iterable<Object*>*"),
      legacy_JsError: findType("JsError*"),
      legacy_JsObject: findType("JsObject*"),
      legacy_JsonObject: findType("JsonObject*"),
      legacy_KeyboardEvent: findType("KeyboardEvent*"),
      legacy_ListBuilder_dynamic: findType("ListBuilder<@>*"),
      legacy_ListBuilder_legacy_ExtensionEvent: findType("ListBuilder<ExtensionEvent*>*"),
      legacy_ListMultimapBuilder_dynamic_dynamic: findType("ListMultimapBuilder<@,@>*"),
      legacy_List_dynamic: findType("List<@>*"),
      legacy_List_legacy_ExtensionEvent: findType("List<ExtensionEvent*>*"),
      legacy_List_legacy_Object: findType("List<Object*>*"),
      legacy_List_legacy_String: findType("List<String*>*"),
      legacy_MapBuilder_dynamic_dynamic: findType("MapBuilder<@,@>*"),
      legacy_Map_dynamic_dynamic: findType("Map<@,@>*"),
      legacy_Map_of_legacy_String_and_legacy_Object: findType("Map<String*,Object*>*"),
      legacy_Map_of_legacy_String_and_legacy_String: findType("Map<String*,String*>*"),
      legacy_MessageEvent: findType("MessageEvent*"),
      legacy_Never: findType("0&*"),
      legacy_Object: findType("Object*"),
      legacy_PrimitiveSerializer_dynamic: findType("PrimitiveSerializer<@>*"),
      legacy_ProgressEvent: findType("ProgressEvent*"),
      legacy_Promise_void: findType("Promise<1&>*"),
      legacy_RegExp: findType("RegExp*"),
      legacy_RequireRestarter: findType("RequireRestarter*"),
      legacy_RunRequest: findType("RunRequest*"),
      legacy_SerializerPlugin: findType("SerializerPlugin*"),
      legacy_Serializer_dynamic: findType("Serializer<@>*"),
      legacy_SetBuilder_dynamic: findType("SetBuilder<@>*"),
      legacy_SetMultimapBuilder_dynamic_dynamic: findType("SetMultimapBuilder<@,@>*"),
      legacy_SplayTreeSet_legacy_String: findType("SplayTreeSet<String*>*"),
      legacy_StackTrace: findType("StackTrace*"),
      legacy_String: findType("String*"),
      legacy_StructuredSerializer_dynamic: findType("StructuredSerializer<@>*"),
      legacy_Type: findType("Type*"),
      legacy_Uri: findType("Uri*"),
      legacy_bool: findType("bool*"),
      legacy_dynamic_Function: findType("@()*"),
      legacy_dynamic_Function_dynamic: findType("@(@)*"),
      legacy_dynamic_Function_void: findType("@(~)*"),
      legacy_int: findType("int*"),
      legacy_legacy_Promise_legacy_bool_Function: findType("Promise<1&>*()*"),
      legacy_void_Function: findType("~()*"),
      legacy_void_Function_dynamic: findType("~(@)*"),
      legacy_void_Function_legacy_ConnectRequestBuilder: findType("~(ConnectRequestBuilder*)*"),
      legacy_void_Function_legacy_DevToolsRequestBuilder: findType("~(DevToolsRequestBuilder*)*"),
      legacy_void_Function_legacy_IsolateExitBuilder: findType("~(IsolateExitBuilder*)*"),
      legacy_void_Function_legacy_IsolateStartBuilder: findType("~(IsolateStartBuilder*)*"),
      legacy_void_Function_legacy_JsError: findType("~(JsError*)*"),
      nullable_Future_Null: findType("Future<Null>?"),
      nullable_Gamepad: findType("Gamepad?"),
      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_StackTrace: findType("StackTrace?"),
      nullable_Zone: findType("Zone?"),
      nullable_ZoneDelegate: findType("ZoneDelegate?"),
      nullable_ZoneSpecification: findType("ZoneSpecification?"),
      nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"),
      nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"),
      nullable__LinkedHashSetCell: findType("_LinkedHashSetCell?"),
      nullable_dynamic_Function_Event: findType("@(Event)?"),
      nullable_int_Function_Node_Node: findType("int(Node,Node)?"),
      nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object: findType("Object?(Object?,Object?)?"),
      nullable_nullable_Object_Function_dynamic: findType("Object?(@)?"),
      nullable_void_Function: findType("~()?"),
      nullable_void_Function_legacy_Event: findType("~(Event*)?"),
      nullable_void_Function_legacy_KeyboardEvent: findType("~(KeyboardEvent*)?"),
      nullable_void_Function_legacy_MessageEvent: findType("~(MessageEvent*)?"),
      nullable_void_Function_legacy_ProgressEvent: findType("~(ProgressEvent*)?"),
      num: findType("num"),
      void: findType("~"),
      void_Function: findType("~()"),
      void_Function_Object: findType("~(Object)"),
      void_Function_Object_StackTrace: findType("~(Object,StackTrace)"),
      void_Function_String_String: findType("~(String,String)"),
      void_Function_String_dynamic: findType("~(String,@)"),
      void_Function_Timer: findType("~(Timer)")
    };
  })();
  (function constants() {
    var makeConstList = hunkHelpers.makeConstList;
    C.AnchorElement_methods = W.AnchorElement.prototype;
    C.BodyElement_methods = W.BodyElement.prototype;
    C.DomImplementation_methods = W.DomImplementation.prototype;
    C.EventSource_methods = W.EventSource.prototype;
    C.HtmlDocument_methods = W.HtmlDocument.prototype;
    C.HttpRequest_methods = W.HttpRequest.prototype;
    C.Interceptor_methods = J.Interceptor.prototype;
    C.JSArray_methods = J.JSArray.prototype;
    C.JSBool_methods = J.JSBool.prototype;
    C.JSInt_methods = J.JSInt.prototype;
    C.JSNumber_methods = J.JSNumber.prototype;
    C.JSString_methods = J.JSString.prototype;
    C.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
    C.NativeUint8List_methods = H.NativeUint8List.prototype;
    C.NodeList_methods = W.NodeList.prototype;
    C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
    C.TableElement_methods = W.TableElement.prototype;
    C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
    C.WebSocket_methods = W.WebSocket.prototype;
    C.Window_methods = W.Window.prototype;
    C.BuildStatus_failed = new Q.BuildStatus("failed");
    C.BuildStatus_started = new Q.BuildStatus("started");
    C.BuildStatus_succeeded = new Q.BuildStatus("succeeded");
    C.C_Base64Encoder = new P.Base64Encoder();
    C.C_Base64Codec = new P.Base64Codec();
    C.C_DefaultEquality = new U.DefaultEquality(H.findType("DefaultEquality<0&*>"));
    C.C_DeepCollectionEquality = new U.DeepCollectionEquality();
    C.C_EmptyIterator = new H.EmptyIterator(H.findType("EmptyIterator<0&*>"));
    C.C_IntegerDivisionByZeroException = new P.IntegerDivisionByZeroException();
    C.C_JS_CONST = function getTagFallback(o) {
  var s = Object.prototype.toString.call(o);
  return s.substring(8, s.length - 1);
};
    C.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 (self.HTMLElement && 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 navigator == "object";
  return {
    getTag: getTag,
    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
    prototypeForTag: prototypeForTag,
    discriminator: discriminator };
};
    C.C_JS_CONST6 = function(getTagFallback) {
  return function(hooks) {
    if (typeof navigator != "object") return hooks;
    var ua = navigator.userAgent;
    if (ua.indexOf("DumpRenderTree") >= 0) return hooks;
    if (ua.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;
  };
};
    C.C_JS_CONST1 = function(hooks) {
  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
};
    C.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;
};
    C.C_JS_CONST5 = function(hooks) {
  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
  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;
};
    C.C_JS_CONST4 = function(hooks) {
  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
  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;
};
    C.C_JS_CONST3 = function(hooks) { return hooks; }
;
    C.C_JsonCodec = new P.JsonCodec();
    C.C_OutOfMemoryError = new P.OutOfMemoryError();
    C.C_Uuid = new K.Uuid();
    C.C__DelayedDone = new P._DelayedDone();
    C.C__JSRandom = new P._JSRandom();
    C.C__Required = new H._Required();
    C.C__RootZone = new P._RootZone();
    C.C__StringStackTrace = new P._StringStackTrace();
    C.Duration_0 = new P.Duration(0);
    C.Duration_5000000 = new P.Duration(5000000);
    C.Type_bool_lhE = H.typeLiteral("bool");
    C.List_empty1 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_FullType);
    C.FullType_6bM = new U.FullType(C.Type_bool_lhE, C.List_empty1);
    C.Type_BuiltSetMultimap_9Fi = H.typeLiteral("BuiltSetMultimap<@,@>");
    C.Type_Object_xQ6 = H.typeLiteral("Object");
    C.FullType_sIv = new U.FullType(C.Type_Object_xQ6, C.List_empty1);
    C.List_Ult = H.setRuntimeTypeInfo(makeConstList([C.FullType_sIv, C.FullType_sIv]), type$.JSArray_legacy_FullType);
    C.FullType_C1B = new U.FullType(C.Type_BuiltSetMultimap_9Fi, C.List_Ult);
    C.Type_BuiltList_iTR = H.typeLiteral("BuiltList<@>");
    C.Type_ExtensionEvent_gsm = H.typeLiteral("ExtensionEvent");
    C.FullType_Ure = new U.FullType(C.Type_ExtensionEvent_gsm, C.List_empty1);
    C.List_w7S = H.setRuntimeTypeInfo(makeConstList([C.FullType_Ure]), type$.JSArray_legacy_FullType);
    C.FullType_CGY = new U.FullType(C.Type_BuiltList_iTR, C.List_w7S);
    C.Type_BuiltSet_fcN = H.typeLiteral("BuiltSet<@>");
    C.List_0ju = H.setRuntimeTypeInfo(makeConstList([C.FullType_sIv]), type$.JSArray_legacy_FullType);
    C.FullType_ECn = new U.FullType(C.Type_BuiltSet_fcN, C.List_0ju);
    C.FullType_GJM = new U.FullType(C.Type_BuiltList_iTR, C.List_0ju);
    C.Type_BuiltListMultimap_2Mt = H.typeLiteral("BuiltListMultimap<@,@>");
    C.FullType_UGJ = new U.FullType(C.Type_BuiltListMultimap_2Mt, C.List_Ult);
    C.Type_String_k8F = H.typeLiteral("String");
    C.FullType_aZ8 = new U.FullType(C.Type_String_k8F, C.List_empty1);
    C.Type_int_tHn = H.typeLiteral("int");
    C.FullType_kaS = new U.FullType(C.Type_int_tHn, C.List_empty1);
    C.FullType_null_List_empty = new U.FullType(null, C.List_empty1);
    C.Type_BuildStatus_ahk = H.typeLiteral("BuildStatus");
    C.FullType_qAw = new U.FullType(C.Type_BuildStatus_ahk, C.List_empty1);
    C.Type_BuiltMap_qd4 = H.typeLiteral("BuiltMap<@,@>");
    C.FullType_sEu = new U.FullType(C.Type_BuiltMap_qd4, C.List_Ult);
    C.JsonDecoder_null = new P.JsonDecoder(null);
    C.JsonEncoder_null = new P.JsonEncoder(null);
    C.Level_INFO_800 = new Y.Level("INFO", 800);
    C.Level_SEVERE_1000 = new Y.Level("SEVERE", 1000);
    C.Level_WARNING_900 = new Y.Level("WARNING", 900);
    C.List_2Vk = H.setRuntimeTypeInfo(makeConstList([0, 0, 32776, 33792, 1, 10240, 0, 0]), type$.JSArray_legacy_int);
    C.List_2Zi = H.setRuntimeTypeInfo(makeConstList(["*::class", "*::dir", "*::draggable", "*::hidden", "*::id", "*::inert", "*::itemprop", "*::itemref", "*::itemscope", "*::lang", "*::spellcheck", "*::title", "*::translate", "A::accesskey", "A::coords", "A::hreflang", "A::name", "A::shape", "A::tabindex", "A::target", "A::type", "AREA::accesskey", "AREA::alt", "AREA::coords", "AREA::nohref", "AREA::shape", "AREA::tabindex", "AREA::target", "AUDIO::controls", "AUDIO::loop", "AUDIO::mediagroup", "AUDIO::muted", "AUDIO::preload", "BDO::dir", "BODY::alink", "BODY::bgcolor", "BODY::link", "BODY::text", "BODY::vlink", "BR::clear", "BUTTON::accesskey", "BUTTON::disabled", "BUTTON::name", "BUTTON::tabindex", "BUTTON::type", "BUTTON::value", "CANVAS::height", "CANVAS::width", "CAPTION::align", "COL::align", "COL::char", "COL::charoff", "COL::span", "COL::valign", "COL::width", "COLGROUP::align", "COLGROUP::char", "COLGROUP::charoff", "COLGROUP::span", "COLGROUP::valign", "COLGROUP::width", "COMMAND::checked", "COMMAND::command", "COMMAND::disabled", "COMMAND::label", "COMMAND::radiogroup", "COMMAND::type", "DATA::value", "DEL::datetime", "DETAILS::open", "DIR::compact", "DIV::align", "DL::compact", "FIELDSET::disabled", "FONT::color", "FONT::face", "FONT::size", "FORM::accept", "FORM::autocomplete", "FORM::enctype", "FORM::method", "FORM::name", "FORM::novalidate", "FORM::target", "FRAME::name", "H1::align", "H2::align", "H3::align", "H4::align", "H5::align", "H6::align", "HR::align", "HR::noshade", "HR::size", "HR::width", "HTML::version", "IFRAME::align", "IFRAME::frameborder", "IFRAME::height", "IFRAME::marginheight", "IFRAME::marginwidth", "IFRAME::width", "IMG::align", "IMG::alt", "IMG::border", "IMG::height", "IMG::hspace", "IMG::ismap", "IMG::name", "IMG::usemap", "IMG::vspace", "IMG::width", "INPUT::accept", "INPUT::accesskey", "INPUT::align", "INPUT::alt", "INPUT::autocomplete", "INPUT::autofocus", "INPUT::checked", "INPUT::disabled", "INPUT::inputmode", "INPUT::ismap", "INPUT::list", "INPUT::max", "INPUT::maxlength", "INPUT::min", "INPUT::multiple", "INPUT::name", "INPUT::placeholder", "INPUT::readonly", "INPUT::required", "INPUT::size", "INPUT::step", "INPUT::tabindex", "INPUT::type", "INPUT::usemap", "INPUT::value", "INS::datetime", "KEYGEN::disabled", "KEYGEN::keytype", "KEYGEN::name", "LABEL::accesskey", "LABEL::for", "LEGEND::accesskey", "LEGEND::align", "LI::type", "LI::value", "LINK::sizes", "MAP::name", "MENU::compact", "MENU::label", "MENU::type", "METER::high", "METER::low", "METER::max", "METER::min", "METER::value", "OBJECT::typemustmatch", "OL::compact", "OL::reversed", "OL::start", "OL::type", "OPTGROUP::disabled", "OPTGROUP::label", "OPTION::disabled", "OPTION::label", "OPTION::selected", "OPTION::value", "OUTPUT::for", "OUTPUT::name", "P::align", "PRE::width", "PROGRESS::max", "PROGRESS::min", "PROGRESS::value", "SELECT::autocomplete", "SELECT::disabled", "SELECT::multiple", "SELECT::name", "SELECT::required", "SELECT::size", "SELECT::tabindex", "SOURCE::type", "TABLE::align", "TABLE::bgcolor", "TABLE::border", "TABLE::cellpadding", "TABLE::cellspacing", "TABLE::frame", "TABLE::rules", "TABLE::summary", "TABLE::width", "TBODY::align", "TBODY::char", "TBODY::charoff", "TBODY::valign", "TD::abbr", "TD::align", "TD::axis", "TD::bgcolor", "TD::char", "TD::charoff", "TD::colspan", "TD::headers", "TD::height", "TD::nowrap", "TD::rowspan", "TD::scope", "TD::valign", "TD::width", "TEXTAREA::accesskey", "TEXTAREA::autocomplete", "TEXTAREA::cols", "TEXTAREA::disabled", "TEXTAREA::inputmode", "TEXTAREA::name", "TEXTAREA::placeholder", "TEXTAREA::readonly", "TEXTAREA::required", "TEXTAREA::rows", "TEXTAREA::tabindex", "TEXTAREA::wrap", "TFOOT::align", "TFOOT::char", "TFOOT::charoff", "TFOOT::valign", "TH::abbr", "TH::align", "TH::axis", "TH::bgcolor", "TH::char", "TH::charoff", "TH::colspan", "TH::headers", "TH::height", "TH::nowrap", "TH::rowspan", "TH::scope", "TH::valign", "TH::width", "THEAD::align", "THEAD::char", "THEAD::charoff", "THEAD::valign", "TR::align", "TR::bgcolor", "TR::char", "TR::charoff", "TR::valign", "TRACK::default", "TRACK::kind", "TRACK::label", "TRACK::srclang", "UL::compact", "UL::type", "VIDEO::controls", "VIDEO::height", "VIDEO::loop", "VIDEO::mediagroup", "VIDEO::muted", "VIDEO::preload", "VIDEO::width"]), type$.JSArray_legacy_String);
    C.Type_DevToolsResponse_Hhy = H.typeLiteral("DevToolsResponse");
    C.Type__$DevToolsResponse_23h = H.typeLiteral("_$DevToolsResponse");
    C.List_41A = H.setRuntimeTypeInfo(makeConstList([C.Type_DevToolsResponse_Hhy, C.Type__$DevToolsResponse_23h]), type$.JSArray_legacy_Type);
    C.Type_IsolateStart_0 = H.typeLiteral("IsolateStart");
    C.Type__$IsolateStart_o3b = H.typeLiteral("_$IsolateStart");
    C.List_6TA = H.setRuntimeTypeInfo(makeConstList([C.Type_IsolateStart_0, C.Type__$IsolateStart_o3b]), type$.JSArray_legacy_Type);
    C.Type_DevToolsRequest_A0n = H.typeLiteral("DevToolsRequest");
    C.Type__$DevToolsRequest_cDy = H.typeLiteral("_$DevToolsRequest");
    C.List_BCG = H.setRuntimeTypeInfo(makeConstList([C.Type_DevToolsRequest_A0n, C.Type__$DevToolsRequest_cDy]), type$.JSArray_legacy_Type);
    C.List_CVk = H.setRuntimeTypeInfo(makeConstList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    C.List_JYB = H.setRuntimeTypeInfo(makeConstList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]), type$.JSArray_legacy_int);
    C.Type_IsolateExit_D1o = H.typeLiteral("IsolateExit");
    C.Type__$IsolateExit_eWg = H.typeLiteral("_$IsolateExit");
    C.List_LT1 = H.setRuntimeTypeInfo(makeConstList([C.Type_IsolateExit_D1o, C.Type__$IsolateExit_eWg]), type$.JSArray_legacy_Type);
    C.Type_BuildResult_dEV = H.typeLiteral("BuildResult");
    C.Type__$BuildResult_knt = H.typeLiteral("_$BuildResult");
    C.List_OHe = H.setRuntimeTypeInfo(makeConstList([C.Type_BuildResult_dEV, C.Type__$BuildResult_knt]), type$.JSArray_legacy_Type);
    C.List_Type_BuildStatus_ahk = H.setRuntimeTypeInfo(makeConstList([C.Type_BuildStatus_ahk]), type$.JSArray_legacy_Type);
    C.List_WrN = H.setRuntimeTypeInfo(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_legacy_int);
    C.List_ego = H.setRuntimeTypeInfo(makeConstList(["HEAD", "AREA", "BASE", "BASEFONT", "BR", "COL", "COLGROUP", "EMBED", "FRAME", "FRAMESET", "HR", "IMAGE", "IMG", "INPUT", "ISINDEX", "LINK", "META", "PARAM", "SOURCE", "STYLE", "TITLE", "WBR"]), type$.JSArray_legacy_String);
    C.List_empty0 = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_dynamic);
    C.List_empty = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_legacy_String);
    C.Type_ExtensionRequest_BMe = H.typeLiteral("ExtensionRequest");
    C.Type__$ExtensionRequest_1Ej = H.typeLiteral("_$ExtensionRequest");
    C.List_evd = H.setRuntimeTypeInfo(makeConstList([C.Type_ExtensionRequest_BMe, C.Type__$ExtensionRequest_1Ej]), type$.JSArray_legacy_Type);
    C.Type_ErrorResponse_Q43 = H.typeLiteral("ErrorResponse");
    C.Type__$ErrorResponse_xV7 = H.typeLiteral("_$ErrorResponse");
    C.List_gQA = H.setRuntimeTypeInfo(makeConstList([C.Type_ErrorResponse_Q43, C.Type__$ErrorResponse_xV7]), type$.JSArray_legacy_Type);
    C.List_gRj = H.setRuntimeTypeInfo(makeConstList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    C.List_nxB = H.setRuntimeTypeInfo(makeConstList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    C.Type__$ExtensionEvent_XOq = H.typeLiteral("_$ExtensionEvent");
    C.List_pnF = H.setRuntimeTypeInfo(makeConstList([C.Type_ExtensionEvent_gsm, C.Type__$ExtensionEvent_XOq]), type$.JSArray_legacy_Type);
    C.List_qNA = H.setRuntimeTypeInfo(makeConstList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    C.List_qg4 = H.setRuntimeTypeInfo(makeConstList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    C.Type_ConnectRequest_UGQ = H.typeLiteral("ConnectRequest");
    C.Type__$ConnectRequest_cJC = H.typeLiteral("_$ConnectRequest");
    C.List_ssp = H.setRuntimeTypeInfo(makeConstList([C.Type_ConnectRequest_UGQ, C.Type__$ConnectRequest_cJC]), type$.JSArray_legacy_Type);
    C.Type_ExtensionResponse_CC0 = H.typeLiteral("ExtensionResponse");
    C.Type__$ExtensionResponse_Ddl = H.typeLiteral("_$ExtensionResponse");
    C.List_tQ0 = H.setRuntimeTypeInfo(makeConstList([C.Type_ExtensionResponse_CC0, C.Type__$ExtensionResponse_Ddl]), type$.JSArray_legacy_Type);
    C.Type_BatchedEvents_gDG = H.typeLiteral("BatchedEvents");
    C.Type__$BatchedEvents_qxo = H.typeLiteral("_$BatchedEvents");
    C.List_w8N = H.setRuntimeTypeInfo(makeConstList([C.Type_BatchedEvents_gDG, C.Type__$BatchedEvents_qxo]), type$.JSArray_legacy_Type);
    C.List_wSV = H.setRuntimeTypeInfo(makeConstList(["bind", "if", "ref", "repeat", "syntax"]), type$.JSArray_legacy_String);
    C.Type_RunRequest_Pkw = H.typeLiteral("RunRequest");
    C.Type__$RunRequest_Im4 = H.typeLiteral("_$RunRequest");
    C.List_wsa = H.setRuntimeTypeInfo(makeConstList([C.Type_RunRequest_Pkw, C.Type__$RunRequest_Im4]), type$.JSArray_legacy_Type);
    C.List_yrN = H.setRuntimeTypeInfo(makeConstList(["A::href", "AREA::href", "BLOCKQUOTE::cite", "BODY::background", "COMMAND::icon", "DEL::cite", "FORM::action", "IMG::src", "INPUT::src", "INS::cite", "Q::cite", "VIDEO::poster"]), type$.JSArray_legacy_String);
    C.List_zgw = H.setRuntimeTypeInfo(makeConstList(["d", "D", "\u2202", "\xce"]), type$.JSArray_legacy_String);
    C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty0, H.findType("ConstantStringMap<@,@>"));
    C.List_empty2 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Symbol0*>"));
    C.Map_empty0 = new H.ConstantStringMap(0, {}, C.List_empty2, H.findType("ConstantStringMap<Symbol0*,@>"));
    C.Symbol_call = new H.Symbol("call");
    C.Type_BigInt_8OV = H.typeLiteral("BigInt");
    C.Type_BoolJsonObject_8HQ = H.typeLiteral("BoolJsonObject");
    C.Type_ByteBuffer_RkP = H.typeLiteral("ByteBuffer");
    C.Type_ByteData_zNC = H.typeLiteral("ByteData");
    C.Type_DateTime_8AS = H.typeLiteral("DateTime");
    C.Type_Duration_SnA = H.typeLiteral("Duration");
    C.Type_Float32List_LB7 = H.typeLiteral("Float32List");
    C.Type_Float64List_LB7 = H.typeLiteral("Float64List");
    C.Type_Int16List_uXf = H.typeLiteral("Int16List");
    C.Type_Int32List_O50 = H.typeLiteral("Int32List");
    C.Type_Int64_gc6 = H.typeLiteral("Int64");
    C.Type_Int8List_ekJ = H.typeLiteral("Int8List");
    C.Type_JSObject_8k0 = H.typeLiteral("JSObject");
    C.Type_JsonObject_gyf = H.typeLiteral("JsonObject");
    C.Type_ListJsonObject_yPV = H.typeLiteral("ListJsonObject");
    C.Type_MapJsonObject_bBG = H.typeLiteral("MapJsonObject");
    C.Type_Null_Yyn = H.typeLiteral("Null");
    C.Type_NumJsonObject_H9C = H.typeLiteral("NumJsonObject");
    C.Type_RegExp_Eeh = H.typeLiteral("RegExp");
    C.Type_StringJsonObject_GAC = H.typeLiteral("StringJsonObject");
    C.Type_Uint16List_2bx = H.typeLiteral("Uint16List");
    C.Type_Uint32List_2bx = H.typeLiteral("Uint32List");
    C.Type_Uint8ClampedList_Jik = H.typeLiteral("Uint8ClampedList");
    C.Type_Uint8List_WLA = H.typeLiteral("Uint8List");
    C.Type_Uri_EFX = H.typeLiteral("Uri");
    C.Type_double_K1J = H.typeLiteral("double");
    C.Type_dynamic_0Rz = H.typeLiteral("@");
    C.Type_num_cv7 = H.typeLiteral("num");
    C._RegisterBinaryZoneFunction_kGu = new P._RegisterBinaryZoneFunction(C.C__RootZone, P.async___rootRegisterBinaryCallback$closure());
    C._RegisterNullaryZoneFunction__RootZone__rootRegisterCallback = new P._RegisterNullaryZoneFunction(C.C__RootZone, P.async___rootRegisterCallback$closure());
    C._RegisterUnaryZoneFunction_Bqo = new P._RegisterUnaryZoneFunction(C.C__RootZone, P.async___rootRegisterUnaryCallback$closure());
    C._RunBinaryZoneFunction__RootZone__rootRunBinary = new P._RunBinaryZoneFunction(C.C__RootZone, P.async___rootRunBinary$closure());
    C._RunNullaryZoneFunction__RootZone__rootRun = new P._RunNullaryZoneFunction(C.C__RootZone, P.async___rootRun$closure());
    C._RunUnaryZoneFunction__RootZone__rootRunUnary = new P._RunUnaryZoneFunction(C.C__RootZone, P.async___rootRunUnary$closure());
    C._ZoneFunction_3bB = new P._ZoneFunction(C.C__RootZone, P.async___rootCreatePeriodicTimer$closure(), H.findType("_ZoneFunction<Timer*(Zone*,ZoneDelegate*,Zone*,Duration*,~(Timer*)*)*>"));
    C._ZoneFunction_NMc = new P._ZoneFunction(C.C__RootZone, P.async___rootHandleUncaughtError$closure(), H.findType("_ZoneFunction<~(Zone*,ZoneDelegate*,Zone*,Object*,StackTrace*)*>"));
    C._ZoneFunction__RootZone__rootCreateTimer = new P._ZoneFunction(C.C__RootZone, P.async___rootCreateTimer$closure(), H.findType("_ZoneFunction<Timer*(Zone*,ZoneDelegate*,Zone*,Duration*,~()*)*>"));
    C._ZoneFunction__RootZone__rootErrorCallback = new P._ZoneFunction(C.C__RootZone, P.async___rootErrorCallback$closure(), H.findType("_ZoneFunction<AsyncError?(Zone*,ZoneDelegate*,Zone*,Object*,StackTrace?)*>"));
    C._ZoneFunction__RootZone__rootFork = new P._ZoneFunction(C.C__RootZone, P.async___rootFork$closure(), H.findType("_ZoneFunction<Zone*(Zone*,ZoneDelegate*,Zone*,ZoneSpecification?,Map<Object?,Object?>?)*>"));
    C._ZoneFunction__RootZone__rootPrint = new P._ZoneFunction(C.C__RootZone, P.async___rootPrint$closure(), H.findType("_ZoneFunction<~(Zone*,ZoneDelegate*,Zone*,String*)*>"));
    C._ZoneFunction__RootZone__rootScheduleMicrotask = new P._ZoneFunction(C.C__RootZone, P.async___rootScheduleMicrotask$closure(), H.findType("_ZoneFunction<~(Zone*,ZoneDelegate*,Zone*,~()*)*>"));
    C._ZoneSpecification_ALf = new P._ZoneSpecification(null, null, null, null, null, null, null, null, null, null, null, null, null);
  })();
  (function staticFields() {
    $._JS_INTEROP_INTERCEPTOR_TAG = null;
    $.printToZone = null;
    $.Closure_functionCounter = 0;
    $.BoundClosure_selfFieldNameCache = null;
    $.BoundClosure_receiverFieldNameCache = null;
    $.getTagFunction = null;
    $.alternateTagFunction = null;
    $.prototypeForTagFunction = null;
    $.dispatchRecordsForInstanceTags = null;
    $.interceptorsForUncacheableTags = null;
    $.initNativeDispatchFlag = null;
    $._nextCallback = null;
    $._lastCallback = null;
    $._lastPriorityCallback = null;
    $._isInCallbackLoop = false;
    $.Zone__current = C.C__RootZone;
    $._RootZone__rootDelegate = null;
    $._toStringVisiting = H.setRuntimeTypeInfo([], H.findType("JSArray<Object>"));
    $._BigIntImpl__lastDividendDigits = null;
    $._BigIntImpl__lastDividendUsed = null;
    $._BigIntImpl__lastDivisorDigits = null;
    $._BigIntImpl__lastDivisorUsed = null;
    $._BigIntImpl____lastQuoRemDigits = $;
    $._BigIntImpl____lastQuoRemUsed = $;
    $._BigIntImpl____lastRemUsed = $;
    $._BigIntImpl____lastRem_nsh = $;
    $.Element__parseDocument = null;
    $.Element__parseRange = null;
    $.Element__defaultValidator = null;
    $.Element__defaultSanitizer = null;
    $._Html5NodeValidator__attributeValidators = P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Function);
    $._indentingBuiltValueToStringHelperIndent = 0;
    $.LogRecord__nextNumber = 0;
    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger);
    $.Uuid__state = P.LinkedHashMap_LinkedHashMap$_literal(["seedBytes", null, "node", null, "clockSeq", null, "mSecs", 0, "nSecs", 0, "hasInitV1", false, "hasInitV4", false], type$.String, type$.nullable_Object);
    $._lastKnownDigests = null;
  })();
  (function lazyInitializers() {
    var _lazyFinal = hunkHelpers.lazyFinal,
      _lazy = hunkHelpers.lazy,
      _lazyOld = hunkHelpers.lazyOld;
    _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", function() {
      return H.getIsolateAffinityTag("_$dart_dartClosure");
    });
    _lazyFinal($, "nullFuture", "$get$nullFuture", function() {
      return C.C__RootZone.run$1$1(new H.nullFuture_closure(), H.findType("Future<Null>"));
    });
    _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({
        toString: function() {
          return "$receiver$";
        }
      }));
    });
    _lazyFinal($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
        toString: function() {
          return "$receiver$";
        }
      }));
    });
    _lazyFinal($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
    });
    _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        var $argumentsExpr$ = "$arguments$";
        try {
          null.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        var $argumentsExpr$ = "$arguments$";
        try {
          (void 0).$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
    });
    _lazyFinal($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        try {
          null.$method$;
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        try {
          (void 0).$method$;
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", function() {
      return P._AsyncRun__initializeScheduleImmediate();
    });
    _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", function() {
      return type$._Future_Null._as($.$get$nullFuture());
    });
    _lazyFinal($, "_RootZone__rootMap", "$get$_RootZone__rootMap", function() {
      var t1 = type$.dynamic;
      return P.HashMap_HashMap(null, null, null, t1, t1);
    });
    _lazyFinal($, "_Base64Decoder__inverseAlphabet", "$get$_Base64Decoder__inverseAlphabet", function() {
      return H.NativeInt8List__create1(H._ensureNativeList(H.setRuntimeTypeInfo([-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($, "_hasErrorStackProperty", "$get$_hasErrorStackProperty", function() {
      return new Error().stack != void 0;
    });
    _lazyFinal($, "_BigIntImpl_zero", "$get$_BigIntImpl_zero", function() {
      return P._BigIntImpl__BigIntImpl$_fromInt(0);
    });
    _lazyFinal($, "_BigIntImpl_one", "$get$_BigIntImpl_one", function() {
      return P._BigIntImpl__BigIntImpl$_fromInt(1);
    });
    _lazyFinal($, "_BigIntImpl__minusOne", "$get$_BigIntImpl__minusOne", function() {
      return $.$get$_BigIntImpl_one().$negate(0);
    });
    _lazyFinal($, "_BigIntImpl__bigInt10000", "$get$_BigIntImpl__bigInt10000", function() {
      return P._BigIntImpl__BigIntImpl$_fromInt(10000);
    });
    _lazy($, "_BigIntImpl__parseRE", "$get$_BigIntImpl__parseRE", function() {
      return P.RegExp_RegExp("^\\s*([+-]?)((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$", false);
    });
    _lazyFinal($, "_scannerTables", "$get$_scannerTables", function() {
      return P._createTables();
    });
    _lazyFinal($, "_Html5NodeValidator__allowedElements", "$get$_Html5NodeValidator__allowedElements", function() {
      return P.LinkedHashSet_LinkedHashSet$from(["A", "ABBR", "ACRONYM", "ADDRESS", "AREA", "ARTICLE", "ASIDE", "AUDIO", "B", "BDI", "BDO", "BIG", "BLOCKQUOTE", "BR", "BUTTON", "CANVAS", "CAPTION", "CENTER", "CITE", "CODE", "COL", "COLGROUP", "COMMAND", "DATA", "DATALIST", "DD", "DEL", "DETAILS", "DFN", "DIR", "DIV", "DL", "DT", "EM", "FIELDSET", "FIGCAPTION", "FIGURE", "FONT", "FOOTER", "FORM", "H1", "H2", "H3", "H4", "H5", "H6", "HEADER", "HGROUP", "HR", "I", "IFRAME", "IMG", "INPUT", "INS", "KBD", "LABEL", "LEGEND", "LI", "MAP", "MARK", "MENU", "METER", "NAV", "NOBR", "OL", "OPTGROUP", "OPTION", "OUTPUT", "P", "PRE", "PROGRESS", "Q", "S", "SAMP", "SECTION", "SELECT", "SMALL", "SOURCE", "SPAN", "STRIKE", "STRONG", "SUB", "SUMMARY", "SUP", "TABLE", "TBODY", "TD", "TEXTAREA", "TFOOT", "TH", "THEAD", "TIME", "TR", "TRACK", "TT", "U", "UL", "VAR", "VIDEO", "WBR"], type$.String);
    });
    _lazyFinal($, "_context", "$get$_context", function() {
      return P._wrapToDart(self);
    });
    _lazyFinal($, "_DART_OBJECT_PROPERTY_NAME", "$get$_DART_OBJECT_PROPERTY_NAME", function() {
      return H.getIsolateAffinityTag("_$dart_dartObject");
    });
    _lazyFinal($, "_dartProxyCtor", "$get$_dartProxyCtor", function() {
      return function DartObject(o) {
        this.o = o;
      };
    });
    _lazyOld($, "newBuiltValueToStringHelper", "$get$newBuiltValueToStringHelper", function() {
      return new Y.newBuiltValueToStringHelper_closure();
    });
    _lazyOld($, "_runtimeType", "$get$_runtimeType", function() {
      return H.getRuntimeType(P.RegExp_RegExp("", true));
    });
    _lazyOld($, "_$buildStatusSerializer", "$get$_$buildStatusSerializer", function() {
      return new Q._$BuildStatusSerializer();
    });
    _lazyOld($, "_$buildResultSerializer", "$get$_$buildResultSerializer", function() {
      return new Q._$BuildResultSerializer();
    });
    _lazyOld($, "_$connectRequestSerializer", "$get$_$connectRequestSerializer", function() {
      return new E._$ConnectRequestSerializer();
    });
    _lazyOld($, "_$devToolsRequestSerializer", "$get$_$devToolsRequestSerializer", function() {
      return new M._$DevToolsRequestSerializer();
    });
    _lazyOld($, "_$devToolsResponseSerializer", "$get$_$devToolsResponseSerializer", function() {
      return new M._$DevToolsResponseSerializer();
    });
    _lazyOld($, "_$errorResponseSerializer", "$get$_$errorResponseSerializer", function() {
      return new X._$ErrorResponseSerializer();
    });
    _lazyOld($, "_$extensionRequestSerializer", "$get$_$extensionRequestSerializer", function() {
      return new S._$ExtensionRequestSerializer();
    });
    _lazyOld($, "_$extensionResponseSerializer", "$get$_$extensionResponseSerializer", function() {
      return new S._$ExtensionResponseSerializer();
    });
    _lazyOld($, "_$extensionEventSerializer", "$get$_$extensionEventSerializer", function() {
      return new S._$ExtensionEventSerializer();
    });
    _lazyOld($, "_$batchedEventsSerializer", "$get$_$batchedEventsSerializer", function() {
      return new S._$BatchedEventsSerializer();
    });
    _lazyOld($, "_$isolateExitSerializer", "$get$_$isolateExitSerializer", function() {
      return new M._$IsolateExitSerializer();
    });
    _lazyOld($, "_$isolateStartSerializer", "$get$_$isolateStartSerializer", function() {
      return new M._$IsolateStartSerializer();
    });
    _lazyOld($, "_$runRequestSerializer", "$get$_$runRequestSerializer", function() {
      return new A._$RunRequestSerializer();
    });
    _lazyOld($, "serializers", "$get$serializers", function() {
      return $.$get$_$serializers();
    });
    _lazyOld($, "_$serializers", "$get$_$serializers", function() {
      var t1 = U.Serializers_Serializers();
      t1 = Y.BuiltJsonSerializersBuilder$_(t1._typeToSerializer.toBuilder$0(), t1._wireNameToSerializer.toBuilder$0(), t1._typeNameToSerializer.toBuilder$0(), t1.builderFactories.toBuilder$0(), t1._plugins.toBuilder$0());
      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$_$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$_$isolateExitSerializer());
      t1.add$1(0, $.$get$_$isolateStartSerializer());
      t1.add$1(0, $.$get$_$runRequestSerializer());
      t1.addBuilderFactory$2(C.FullType_CGY, new K._$serializers_closure());
      return t1.build$0();
    });
    _lazyFinal($, "Logger_root", "$get$Logger_root", function() {
      return F.Logger_Logger("");
    });
    _lazyFinal($, "Uuid__byteToHex", "$get$Uuid__byteToHex", function() {
      var i,
        _list = J.JSArray_JSArray$allocateGrowable(256, type$.String);
      for (i = 0; i < 256; ++i)
        _list[i] = C.JSString_methods.padLeft$2(C.JSInt_methods.toRadixString$1(i, 16), 2, "0");
      return _list;
    });
    _lazyFinal($, "UuidUtil__random", "$get$UuidUtil__random", function() {
      return P.Random_Random(null);
    });
    _lazyOld($, "_createScript", "$get$_createScript", function() {
      return new V._createScript_closure().call$0();
    });
    _lazyOld($, "_noncePattern", "$get$_noncePattern", function() {
      return P.RegExp_RegExp("^[\\w+/_-]+[=]{0,2}$", true);
    });
  })();
  (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({AnimationEffectReadOnly: J.Interceptor, AnimationEffectTiming: J.Interceptor, AnimationEffectTimingReadOnly: J.Interceptor, AnimationTimeline: J.Interceptor, AnimationWorkletGlobalScope: J.Interceptor, AuthenticatorAssertionResponse: J.Interceptor, AuthenticatorAttestationResponse: J.Interceptor, AuthenticatorResponse: J.Interceptor, BackgroundFetchFetch: J.Interceptor, BackgroundFetchManager: J.Interceptor, BackgroundFetchSettledFetch: J.Interceptor, BarProp: J.Interceptor, BarcodeDetector: J.Interceptor, BluetoothRemoteGATTDescriptor: J.Interceptor, Body: J.Interceptor, BudgetState: J.Interceptor, CacheStorage: J.Interceptor, CanvasGradient: J.Interceptor, CanvasPattern: J.Interceptor, CanvasRenderingContext2D: J.Interceptor, Client: J.Interceptor, Clients: J.Interceptor, CookieStore: J.Interceptor, Coordinates: J.Interceptor, Credential: J.Interceptor, CredentialUserData: J.Interceptor, CredentialsContainer: J.Interceptor, Crypto: J.Interceptor, CryptoKey: J.Interceptor, CSS: J.Interceptor, CSSVariableReferenceValue: J.Interceptor, CustomElementRegistry: J.Interceptor, DataTransfer: J.Interceptor, DataTransferItem: J.Interceptor, DeprecatedStorageInfo: J.Interceptor, DeprecatedStorageQuota: J.Interceptor, DeprecationReport: J.Interceptor, DetectedBarcode: J.Interceptor, DetectedFace: J.Interceptor, DetectedText: J.Interceptor, DeviceAcceleration: J.Interceptor, DeviceRotationRate: J.Interceptor, DirectoryEntry: J.Interceptor, DirectoryReader: J.Interceptor, DocumentOrShadowRoot: J.Interceptor, DocumentTimeline: J.Interceptor, DOMError: J.Interceptor, Iterator: J.Interceptor, DOMMatrix: J.Interceptor, DOMMatrixReadOnly: J.Interceptor, DOMParser: J.Interceptor, DOMPoint: J.Interceptor, DOMPointReadOnly: J.Interceptor, DOMQuad: J.Interceptor, DOMStringMap: J.Interceptor, Entry: J.Interceptor, External: J.Interceptor, FaceDetector: J.Interceptor, FederatedCredential: J.Interceptor, FileEntry: J.Interceptor, DOMFileSystem: J.Interceptor, FontFace: J.Interceptor, FontFaceSource: J.Interceptor, FormData: J.Interceptor, GamepadButton: J.Interceptor, GamepadPose: J.Interceptor, Geolocation: J.Interceptor, Position: J.Interceptor, Headers: J.Interceptor, HTMLHyperlinkElementUtils: J.Interceptor, IdleDeadline: J.Interceptor, ImageBitmap: J.Interceptor, ImageBitmapRenderingContext: J.Interceptor, ImageCapture: J.Interceptor, InputDeviceCapabilities: J.Interceptor, IntersectionObserver: J.Interceptor, IntersectionObserverEntry: J.Interceptor, InterventionReport: J.Interceptor, KeyframeEffect: J.Interceptor, KeyframeEffectReadOnly: J.Interceptor, MediaCapabilities: J.Interceptor, MediaCapabilitiesInfo: J.Interceptor, MediaDeviceInfo: J.Interceptor, MediaError: J.Interceptor, MediaKeyStatusMap: J.Interceptor, MediaKeySystemAccess: J.Interceptor, MediaKeys: J.Interceptor, MediaKeysPolicy: J.Interceptor, MediaMetadata: J.Interceptor, MediaSession: J.Interceptor, MediaSettingsRange: J.Interceptor, MemoryInfo: J.Interceptor, MessageChannel: J.Interceptor, Metadata: J.Interceptor, MutationObserver: J.Interceptor, WebKitMutationObserver: J.Interceptor, MutationRecord: J.Interceptor, NavigationPreloadManager: J.Interceptor, Navigator: J.Interceptor, NavigatorAutomationInformation: J.Interceptor, NavigatorConcurrentHardware: J.Interceptor, NavigatorCookies: J.Interceptor, NavigatorUserMediaError: J.Interceptor, NodeFilter: J.Interceptor, NodeIterator: J.Interceptor, NonDocumentTypeChildNode: J.Interceptor, NonElementParentNode: J.Interceptor, NoncedElement: J.Interceptor, OffscreenCanvasRenderingContext2D: J.Interceptor, OverconstrainedError: J.Interceptor, PaintRenderingContext2D: J.Interceptor, PaintSize: J.Interceptor, PaintWorkletGlobalScope: J.Interceptor, PasswordCredential: J.Interceptor, Path2D: J.Interceptor, PaymentAddress: J.Interceptor, PaymentInstruments: J.Interceptor, PaymentManager: J.Interceptor, PaymentResponse: J.Interceptor, PerformanceEntry: J.Interceptor, PerformanceLongTaskTiming: J.Interceptor, PerformanceMark: J.Interceptor, PerformanceMeasure: J.Interceptor, PerformanceNavigation: J.Interceptor, PerformanceNavigationTiming: J.Interceptor, PerformanceObserver: J.Interceptor, PerformanceObserverEntryList: J.Interceptor, PerformancePaintTiming: J.Interceptor, PerformanceResourceTiming: J.Interceptor, PerformanceServerTiming: J.Interceptor, PerformanceTiming: J.Interceptor, Permissions: J.Interceptor, PhotoCapabilities: J.Interceptor, PositionError: J.Interceptor, Presentation: J.Interceptor, PresentationReceiver: J.Interceptor, PublicKeyCredential: J.Interceptor, PushManager: J.Interceptor, PushMessageData: J.Interceptor, PushSubscription: J.Interceptor, PushSubscriptionOptions: J.Interceptor, Range: J.Interceptor, RelatedApplication: J.Interceptor, ReportBody: J.Interceptor, ReportingObserver: J.Interceptor, ResizeObserver: J.Interceptor, ResizeObserverEntry: J.Interceptor, RTCCertificate: J.Interceptor, RTCIceCandidate: J.Interceptor, mozRTCIceCandidate: J.Interceptor, RTCLegacyStatsReport: J.Interceptor, RTCRtpContributingSource: J.Interceptor, RTCRtpReceiver: J.Interceptor, RTCRtpSender: J.Interceptor, RTCSessionDescription: J.Interceptor, mozRTCSessionDescription: J.Interceptor, RTCStatsResponse: J.Interceptor, Screen: J.Interceptor, ScrollState: J.Interceptor, ScrollTimeline: J.Interceptor, Selection: J.Interceptor, SharedArrayBuffer: J.Interceptor, SpeechRecognitionAlternative: J.Interceptor, SpeechSynthesisVoice: J.Interceptor, StaticRange: J.Interceptor, StorageManager: J.Interceptor, StyleMedia: J.Interceptor, StylePropertyMap: J.Interceptor, StylePropertyMapReadonly: J.Interceptor, SyncManager: J.Interceptor, TaskAttributionTiming: J.Interceptor, TextDetector: J.Interceptor, TextMetrics: J.Interceptor, TrackDefault: J.Interceptor, TreeWalker: J.Interceptor, TrustedHTML: J.Interceptor, TrustedScriptURL: J.Interceptor, TrustedURL: J.Interceptor, UnderlyingSourceBase: J.Interceptor, URLSearchParams: J.Interceptor, VRCoordinateSystem: J.Interceptor, VRDisplayCapabilities: J.Interceptor, VREyeParameters: J.Interceptor, VRFrameData: J.Interceptor, VRFrameOfReference: J.Interceptor, VRPose: J.Interceptor, VRStageBounds: J.Interceptor, VRStageBoundsPoint: J.Interceptor, VRStageParameters: J.Interceptor, ValidityState: J.Interceptor, VideoPlaybackQuality: J.Interceptor, VideoTrack: J.Interceptor, VTTRegion: J.Interceptor, WindowClient: J.Interceptor, WorkletAnimation: J.Interceptor, WorkletGlobalScope: J.Interceptor, XPathEvaluator: J.Interceptor, XPathExpression: J.Interceptor, XPathNSResolver: J.Interceptor, XPathResult: J.Interceptor, XMLSerializer: J.Interceptor, XSLTProcessor: J.Interceptor, Bluetooth: J.Interceptor, BluetoothCharacteristicProperties: J.Interceptor, BluetoothRemoteGATTServer: J.Interceptor, BluetoothRemoteGATTService: J.Interceptor, BluetoothUUID: J.Interceptor, BudgetService: J.Interceptor, Cache: J.Interceptor, DOMFileSystemSync: J.Interceptor, DirectoryEntrySync: J.Interceptor, DirectoryReaderSync: J.Interceptor, EntrySync: J.Interceptor, FileEntrySync: J.Interceptor, FileReaderSync: J.Interceptor, FileWriterSync: J.Interceptor, HTMLAllCollection: J.Interceptor, Mojo: J.Interceptor, MojoHandle: J.Interceptor, MojoWatcher: J.Interceptor, NFC: J.Interceptor, PagePopupController: J.Interceptor, Report: J.Interceptor, Request: J.Interceptor, Response: J.Interceptor, SubtleCrypto: J.Interceptor, USBAlternateInterface: J.Interceptor, USBConfiguration: J.Interceptor, USBDevice: J.Interceptor, USBEndpoint: J.Interceptor, USBInTransferResult: J.Interceptor, USBInterface: J.Interceptor, USBIsochronousInTransferPacket: J.Interceptor, USBIsochronousInTransferResult: J.Interceptor, USBIsochronousOutTransferPacket: J.Interceptor, USBIsochronousOutTransferResult: J.Interceptor, USBOutTransferResult: J.Interceptor, WorkerLocation: J.Interceptor, WorkerNavigator: J.Interceptor, Worklet: J.Interceptor, IDBCursor: J.Interceptor, IDBCursorWithValue: J.Interceptor, IDBFactory: J.Interceptor, IDBIndex: J.Interceptor, IDBObjectStore: J.Interceptor, IDBObservation: J.Interceptor, IDBObserver: J.Interceptor, IDBObserverChanges: J.Interceptor, SVGAngle: J.Interceptor, SVGAnimatedAngle: J.Interceptor, SVGAnimatedBoolean: J.Interceptor, SVGAnimatedEnumeration: J.Interceptor, SVGAnimatedInteger: J.Interceptor, SVGAnimatedLength: J.Interceptor, SVGAnimatedLengthList: J.Interceptor, SVGAnimatedNumber: J.Interceptor, SVGAnimatedNumberList: J.Interceptor, SVGAnimatedPreserveAspectRatio: J.Interceptor, SVGAnimatedRect: J.Interceptor, SVGAnimatedString: J.Interceptor, SVGAnimatedTransformList: J.Interceptor, SVGMatrix: J.Interceptor, SVGPoint: J.Interceptor, SVGPreserveAspectRatio: J.Interceptor, SVGRect: J.Interceptor, SVGUnitTypes: J.Interceptor, AudioListener: J.Interceptor, AudioParam: J.Interceptor, AudioTrack: J.Interceptor, AudioWorkletGlobalScope: J.Interceptor, AudioWorkletProcessor: J.Interceptor, PeriodicWave: J.Interceptor, WebGLActiveInfo: J.Interceptor, ANGLEInstancedArrays: J.Interceptor, ANGLE_instanced_arrays: J.Interceptor, WebGLBuffer: J.Interceptor, WebGLCanvas: J.Interceptor, WebGLColorBufferFloat: J.Interceptor, WebGLCompressedTextureASTC: J.Interceptor, WebGLCompressedTextureATC: J.Interceptor, WEBGL_compressed_texture_atc: J.Interceptor, WebGLCompressedTextureETC1: J.Interceptor, WEBGL_compressed_texture_etc1: J.Interceptor, WebGLCompressedTextureETC: J.Interceptor, WebGLCompressedTexturePVRTC: J.Interceptor, WEBGL_compressed_texture_pvrtc: J.Interceptor, WebGLCompressedTextureS3TC: J.Interceptor, WEBGL_compressed_texture_s3tc: J.Interceptor, WebGLCompressedTextureS3TCsRGB: J.Interceptor, WebGLDebugRendererInfo: J.Interceptor, WEBGL_debug_renderer_info: J.Interceptor, WebGLDebugShaders: J.Interceptor, WEBGL_debug_shaders: J.Interceptor, WebGLDepthTexture: J.Interceptor, WEBGL_depth_texture: J.Interceptor, WebGLDrawBuffers: J.Interceptor, WEBGL_draw_buffers: J.Interceptor, EXTsRGB: J.Interceptor, EXT_sRGB: J.Interceptor, EXTBlendMinMax: J.Interceptor, EXT_blend_minmax: J.Interceptor, EXTColorBufferFloat: J.Interceptor, EXTColorBufferHalfFloat: J.Interceptor, EXTDisjointTimerQuery: J.Interceptor, EXTDisjointTimerQueryWebGL2: J.Interceptor, EXTFragDepth: J.Interceptor, EXT_frag_depth: J.Interceptor, EXTShaderTextureLOD: J.Interceptor, EXT_shader_texture_lod: J.Interceptor, EXTTextureFilterAnisotropic: J.Interceptor, EXT_texture_filter_anisotropic: J.Interceptor, WebGLFramebuffer: J.Interceptor, WebGLGetBufferSubDataAsync: J.Interceptor, WebGLLoseContext: J.Interceptor, WebGLExtensionLoseContext: J.Interceptor, WEBGL_lose_context: J.Interceptor, OESElementIndexUint: J.Interceptor, OES_element_index_uint: J.Interceptor, OESStandardDerivatives: J.Interceptor, OES_standard_derivatives: J.Interceptor, OESTextureFloat: J.Interceptor, OES_texture_float: J.Interceptor, OESTextureFloatLinear: J.Interceptor, OES_texture_float_linear: J.Interceptor, OESTextureHalfFloat: J.Interceptor, OES_texture_half_float: J.Interceptor, OESTextureHalfFloatLinear: J.Interceptor, OES_texture_half_float_linear: J.Interceptor, OESVertexArrayObject: J.Interceptor, OES_vertex_array_object: J.Interceptor, WebGLProgram: J.Interceptor, WebGLQuery: J.Interceptor, WebGLRenderbuffer: J.Interceptor, WebGLRenderingContext: J.Interceptor, WebGL2RenderingContext: J.Interceptor, WebGLSampler: J.Interceptor, WebGLShader: J.Interceptor, WebGLShaderPrecisionFormat: J.Interceptor, WebGLSync: J.Interceptor, WebGLTexture: J.Interceptor, WebGLTimerQueryEXT: J.Interceptor, WebGLTransformFeedback: J.Interceptor, WebGLUniformLocation: J.Interceptor, WebGLVertexArrayObject: J.Interceptor, WebGLVertexArrayObjectOES: J.Interceptor, WebGL: J.Interceptor, WebGL2RenderingContextBase: J.Interceptor, Database: J.Interceptor, SQLError: J.Interceptor, SQLResultSet: J.Interceptor, SQLTransaction: J.Interceptor, ArrayBuffer: H.NativeByteBuffer, ArrayBufferView: H.NativeTypedData, DataView: H.NativeByteData, Float32Array: H.NativeFloat32List, Float64Array: H.NativeFloat64List, Int16Array: H.NativeInt16List, Int32Array: H.NativeInt32List, Int8Array: H.NativeInt8List, Uint16Array: H.NativeUint16List, Uint32Array: H.NativeUint32List, Uint8ClampedArray: H.NativeUint8ClampedList, CanvasPixelArray: H.NativeUint8ClampedList, Uint8Array: H.NativeUint8List, HTMLAudioElement: W.HtmlElement, HTMLBRElement: W.HtmlElement, HTMLButtonElement: W.HtmlElement, HTMLCanvasElement: W.HtmlElement, HTMLContentElement: W.HtmlElement, HTMLDListElement: W.HtmlElement, HTMLDataElement: W.HtmlElement, HTMLDataListElement: W.HtmlElement, HTMLDetailsElement: W.HtmlElement, HTMLDialogElement: W.HtmlElement, HTMLDivElement: W.HtmlElement, HTMLEmbedElement: W.HtmlElement, HTMLFieldSetElement: W.HtmlElement, HTMLHRElement: W.HtmlElement, HTMLHeadElement: W.HtmlElement, HTMLHeadingElement: W.HtmlElement, HTMLHtmlElement: W.HtmlElement, HTMLIFrameElement: W.HtmlElement, HTMLImageElement: W.HtmlElement, HTMLInputElement: W.HtmlElement, HTMLLIElement: W.HtmlElement, HTMLLabelElement: W.HtmlElement, HTMLLegendElement: W.HtmlElement, HTMLLinkElement: W.HtmlElement, HTMLMapElement: W.HtmlElement, HTMLMediaElement: W.HtmlElement, HTMLMenuElement: W.HtmlElement, HTMLMetaElement: W.HtmlElement, HTMLMeterElement: W.HtmlElement, HTMLModElement: W.HtmlElement, HTMLOListElement: W.HtmlElement, HTMLObjectElement: W.HtmlElement, HTMLOptGroupElement: W.HtmlElement, HTMLOptionElement: W.HtmlElement, HTMLOutputElement: W.HtmlElement, HTMLParagraphElement: W.HtmlElement, HTMLParamElement: W.HtmlElement, HTMLPictureElement: W.HtmlElement, HTMLPreElement: W.HtmlElement, HTMLProgressElement: W.HtmlElement, HTMLQuoteElement: W.HtmlElement, HTMLShadowElement: W.HtmlElement, HTMLSlotElement: W.HtmlElement, HTMLSourceElement: W.HtmlElement, HTMLSpanElement: W.HtmlElement, HTMLStyleElement: W.HtmlElement, HTMLTableCaptionElement: W.HtmlElement, HTMLTableCellElement: W.HtmlElement, HTMLTableDataCellElement: W.HtmlElement, HTMLTableHeaderCellElement: W.HtmlElement, HTMLTableColElement: W.HtmlElement, HTMLTextAreaElement: W.HtmlElement, HTMLTimeElement: W.HtmlElement, HTMLTitleElement: W.HtmlElement, HTMLTrackElement: W.HtmlElement, HTMLUListElement: W.HtmlElement, HTMLUnknownElement: W.HtmlElement, HTMLVideoElement: W.HtmlElement, HTMLDirectoryElement: W.HtmlElement, HTMLFontElement: W.HtmlElement, HTMLFrameElement: W.HtmlElement, HTMLFrameSetElement: W.HtmlElement, HTMLMarqueeElement: W.HtmlElement, HTMLElement: W.HtmlElement, AccessibleNodeList: W.AccessibleNodeList, HTMLAnchorElement: W.AnchorElement, HTMLAreaElement: W.AreaElement, HTMLBaseElement: W.BaseElement, Blob: W.Blob, HTMLBodyElement: W.BodyElement, CDATASection: W.CharacterData, CharacterData: W.CharacterData, Comment: W.CharacterData, ProcessingInstruction: W.CharacterData, Text: W.CharacterData, CloseEvent: W.CloseEvent, CSSPerspective: W.CssPerspective, CSSCharsetRule: W.CssRule, CSSConditionRule: W.CssRule, CSSFontFaceRule: W.CssRule, CSSGroupingRule: W.CssRule, CSSImportRule: W.CssRule, CSSKeyframeRule: W.CssRule, MozCSSKeyframeRule: W.CssRule, WebKitCSSKeyframeRule: W.CssRule, CSSKeyframesRule: W.CssRule, MozCSSKeyframesRule: W.CssRule, WebKitCSSKeyframesRule: W.CssRule, CSSMediaRule: W.CssRule, CSSNamespaceRule: W.CssRule, CSSPageRule: W.CssRule, CSSRule: W.CssRule, CSSStyleRule: W.CssRule, CSSSupportsRule: W.CssRule, CSSViewportRule: W.CssRule, CSSStyleDeclaration: W.CssStyleDeclaration, MSStyleCSSProperties: W.CssStyleDeclaration, CSS2Properties: W.CssStyleDeclaration, CSSImageValue: W.CssStyleValue, CSSKeywordValue: W.CssStyleValue, CSSNumericValue: W.CssStyleValue, CSSPositionValue: W.CssStyleValue, CSSResourceValue: W.CssStyleValue, CSSUnitValue: W.CssStyleValue, CSSURLImageValue: W.CssStyleValue, CSSStyleValue: W.CssStyleValue, CSSMatrixComponent: W.CssTransformComponent, CSSRotation: W.CssTransformComponent, CSSScale: W.CssTransformComponent, CSSSkew: W.CssTransformComponent, CSSTranslation: W.CssTransformComponent, CSSTransformComponent: W.CssTransformComponent, CSSTransformValue: W.CssTransformValue, CSSUnparsedValue: W.CssUnparsedValue, DataTransferItemList: W.DataTransferItemList, XMLDocument: W.Document, Document: W.Document, DOMException: W.DomException, DOMImplementation: W.DomImplementation, ClientRectList: W.DomRectList, DOMRectList: W.DomRectList, DOMRectReadOnly: W.DomRectReadOnly, DOMStringList: W.DomStringList, DOMTokenList: W.DomTokenList, Element: W.Element, AbortPaymentEvent: W.Event, AnimationEvent: W.Event, AnimationPlaybackEvent: W.Event, ApplicationCacheErrorEvent: W.Event, BackgroundFetchClickEvent: W.Event, BackgroundFetchEvent: W.Event, BackgroundFetchFailEvent: W.Event, BackgroundFetchedEvent: W.Event, BeforeInstallPromptEvent: W.Event, BeforeUnloadEvent: W.Event, BlobEvent: W.Event, CanMakePaymentEvent: W.Event, ClipboardEvent: W.Event, CustomEvent: W.Event, DeviceMotionEvent: W.Event, DeviceOrientationEvent: W.Event, ErrorEvent: W.Event, ExtendableEvent: W.Event, ExtendableMessageEvent: W.Event, FetchEvent: W.Event, FontFaceSetLoadEvent: W.Event, ForeignFetchEvent: W.Event, GamepadEvent: W.Event, HashChangeEvent: W.Event, InstallEvent: W.Event, MediaEncryptedEvent: W.Event, MediaKeyMessageEvent: W.Event, MediaQueryListEvent: W.Event, MediaStreamEvent: W.Event, MediaStreamTrackEvent: W.Event, MIDIConnectionEvent: W.Event, MIDIMessageEvent: W.Event, MutationEvent: W.Event, NotificationEvent: W.Event, PageTransitionEvent: W.Event, PaymentRequestEvent: W.Event, PaymentRequestUpdateEvent: W.Event, PopStateEvent: W.Event, PresentationConnectionAvailableEvent: W.Event, PresentationConnectionCloseEvent: W.Event, PromiseRejectionEvent: W.Event, PushEvent: W.Event, RTCDataChannelEvent: W.Event, RTCDTMFToneChangeEvent: W.Event, RTCPeerConnectionIceEvent: W.Event, RTCTrackEvent: W.Event, SecurityPolicyViolationEvent: W.Event, SensorErrorEvent: W.Event, SpeechRecognitionError: W.Event, SpeechRecognitionEvent: W.Event, SpeechSynthesisEvent: W.Event, StorageEvent: W.Event, SyncEvent: W.Event, TrackEvent: W.Event, TransitionEvent: W.Event, WebKitTransitionEvent: W.Event, VRDeviceEvent: W.Event, VRDisplayEvent: W.Event, VRSessionEvent: W.Event, MojoInterfaceRequestEvent: W.Event, USBConnectionEvent: W.Event, IDBVersionChangeEvent: W.Event, AudioProcessingEvent: W.Event, OfflineAudioCompletionEvent: W.Event, WebGLContextEvent: W.Event, Event: W.Event, InputEvent: W.Event, SubmitEvent: W.Event, EventSource: W.EventSource, AbsoluteOrientationSensor: W.EventTarget, Accelerometer: W.EventTarget, AccessibleNode: W.EventTarget, AmbientLightSensor: W.EventTarget, Animation: W.EventTarget, ApplicationCache: W.EventTarget, DOMApplicationCache: W.EventTarget, OfflineResourceList: W.EventTarget, BackgroundFetchRegistration: W.EventTarget, BatteryManager: W.EventTarget, BroadcastChannel: W.EventTarget, CanvasCaptureMediaStreamTrack: W.EventTarget, FileReader: W.EventTarget, FontFaceSet: W.EventTarget, Gyroscope: W.EventTarget, LinearAccelerationSensor: W.EventTarget, Magnetometer: W.EventTarget, MediaDevices: W.EventTarget, MediaKeySession: W.EventTarget, MediaQueryList: W.EventTarget, MediaRecorder: W.EventTarget, MediaSource: W.EventTarget, MediaStream: W.EventTarget, MediaStreamTrack: W.EventTarget, MessagePort: W.EventTarget, MIDIAccess: W.EventTarget, MIDIInput: W.EventTarget, MIDIOutput: W.EventTarget, MIDIPort: W.EventTarget, NetworkInformation: W.EventTarget, Notification: W.EventTarget, OffscreenCanvas: W.EventTarget, OrientationSensor: W.EventTarget, PaymentRequest: W.EventTarget, Performance: W.EventTarget, PermissionStatus: W.EventTarget, PresentationAvailability: W.EventTarget, PresentationConnection: W.EventTarget, PresentationConnectionList: W.EventTarget, PresentationRequest: W.EventTarget, RelativeOrientationSensor: W.EventTarget, RemotePlayback: W.EventTarget, RTCDataChannel: W.EventTarget, DataChannel: W.EventTarget, RTCDTMFSender: W.EventTarget, RTCPeerConnection: W.EventTarget, webkitRTCPeerConnection: W.EventTarget, mozRTCPeerConnection: W.EventTarget, ScreenOrientation: W.EventTarget, Sensor: W.EventTarget, ServiceWorker: W.EventTarget, ServiceWorkerContainer: W.EventTarget, ServiceWorkerRegistration: W.EventTarget, SharedWorker: W.EventTarget, SpeechRecognition: W.EventTarget, SpeechSynthesis: W.EventTarget, SpeechSynthesisUtterance: W.EventTarget, VR: W.EventTarget, VRDevice: W.EventTarget, VRDisplay: W.EventTarget, VRSession: W.EventTarget, VisualViewport: W.EventTarget, Worker: W.EventTarget, WorkerPerformance: W.EventTarget, BluetoothDevice: W.EventTarget, BluetoothRemoteGATTCharacteristic: W.EventTarget, Clipboard: W.EventTarget, MojoInterfaceInterceptor: W.EventTarget, USB: W.EventTarget, IDBDatabase: W.EventTarget, IDBOpenDBRequest: W.EventTarget, IDBVersionChangeRequest: W.EventTarget, IDBRequest: W.EventTarget, IDBTransaction: W.EventTarget, AnalyserNode: W.EventTarget, RealtimeAnalyserNode: W.EventTarget, AudioBufferSourceNode: W.EventTarget, AudioDestinationNode: W.EventTarget, AudioNode: W.EventTarget, AudioScheduledSourceNode: W.EventTarget, AudioWorkletNode: W.EventTarget, BiquadFilterNode: W.EventTarget, ChannelMergerNode: W.EventTarget, AudioChannelMerger: W.EventTarget, ChannelSplitterNode: W.EventTarget, AudioChannelSplitter: W.EventTarget, ConstantSourceNode: W.EventTarget, ConvolverNode: W.EventTarget, DelayNode: W.EventTarget, DynamicsCompressorNode: W.EventTarget, GainNode: W.EventTarget, AudioGainNode: W.EventTarget, IIRFilterNode: W.EventTarget, MediaElementAudioSourceNode: W.EventTarget, MediaStreamAudioDestinationNode: W.EventTarget, MediaStreamAudioSourceNode: W.EventTarget, OscillatorNode: W.EventTarget, Oscillator: W.EventTarget, PannerNode: W.EventTarget, AudioPannerNode: W.EventTarget, webkitAudioPannerNode: W.EventTarget, ScriptProcessorNode: W.EventTarget, JavaScriptAudioNode: W.EventTarget, StereoPannerNode: W.EventTarget, WaveShaperNode: W.EventTarget, EventTarget: W.EventTarget, File: W.File, FileList: W.FileList, FileWriter: W.FileWriter, HTMLFormElement: W.FormElement, Gamepad: W.Gamepad, History: W.History, HTMLCollection: W.HtmlCollection, HTMLFormControlsCollection: W.HtmlCollection, HTMLOptionsCollection: W.HtmlCollection, HTMLDocument: W.HtmlDocument, XMLHttpRequest: W.HttpRequest, XMLHttpRequestUpload: W.HttpRequestEventTarget, XMLHttpRequestEventTarget: W.HttpRequestEventTarget, ImageData: W.ImageData, KeyboardEvent: W.KeyboardEvent, Location: W.Location, MediaList: W.MediaList, MessageEvent: W.MessageEvent, MIDIInputMap: W.MidiInputMap, MIDIOutputMap: W.MidiOutputMap, MimeType: W.MimeType, MimeTypeArray: W.MimeTypeArray, DocumentFragment: W.Node, ShadowRoot: W.Node, DocumentType: W.Node, Node: W.Node, NodeList: W.NodeList, RadioNodeList: W.NodeList, Plugin: W.Plugin, PluginArray: W.PluginArray, ProgressEvent: W.ProgressEvent, ResourceProgressEvent: W.ProgressEvent, RTCStatsReport: W.RtcStatsReport, HTMLScriptElement: W.ScriptElement, HTMLSelectElement: W.SelectElement, SourceBuffer: W.SourceBuffer, SourceBufferList: W.SourceBufferList, SpeechGrammar: W.SpeechGrammar, SpeechGrammarList: W.SpeechGrammarList, SpeechRecognitionResult: W.SpeechRecognitionResult, Storage: W.Storage, CSSStyleSheet: W.StyleSheet, StyleSheet: W.StyleSheet, HTMLTableElement: W.TableElement, HTMLTableRowElement: W.TableRowElement, HTMLTableSectionElement: W.TableSectionElement, HTMLTemplateElement: W.TemplateElement, TextTrack: W.TextTrack, TextTrackCue: W.TextTrackCue, VTTCue: W.TextTrackCue, TextTrackCueList: W.TextTrackCueList, TextTrackList: W.TextTrackList, TimeRanges: W.TimeRanges, Touch: W.Touch, TouchList: W.TouchList, TrackDefaultList: W.TrackDefaultList, CompositionEvent: W.UIEvent, FocusEvent: W.UIEvent, MouseEvent: W.UIEvent, DragEvent: W.UIEvent, PointerEvent: W.UIEvent, TextEvent: W.UIEvent, TouchEvent: W.UIEvent, WheelEvent: W.UIEvent, UIEvent: W.UIEvent, URL: W.Url, VideoTrackList: W.VideoTrackList, WebSocket: W.WebSocket, Window: W.Window, DOMWindow: W.Window, DedicatedWorkerGlobalScope: W.WorkerGlobalScope, ServiceWorkerGlobalScope: W.WorkerGlobalScope, SharedWorkerGlobalScope: W.WorkerGlobalScope, WorkerGlobalScope: W.WorkerGlobalScope, Attr: W._Attr, CSSRuleList: W._CssRuleList, ClientRect: W._DomRect, DOMRect: W._DomRect, GamepadList: W._GamepadList, NamedNodeMap: W._NamedNodeMap, MozNamedAttrMap: W._NamedNodeMap, SpeechRecognitionResultList: W._SpeechRecognitionResultList, StyleSheetList: W._StyleSheetList, IDBKeyRange: P.KeyRange, SVGLength: P.Length, SVGLengthList: P.LengthList, SVGNumber: P.Number, SVGNumberList: P.NumberList, SVGPointList: P.PointList, SVGScriptElement: P.ScriptElement0, SVGStringList: P.StringList, SVGAElement: P.SvgElement, SVGAnimateElement: P.SvgElement, SVGAnimateMotionElement: P.SvgElement, SVGAnimateTransformElement: P.SvgElement, SVGAnimationElement: P.SvgElement, SVGCircleElement: P.SvgElement, SVGClipPathElement: P.SvgElement, SVGDefsElement: P.SvgElement, SVGDescElement: P.SvgElement, SVGDiscardElement: P.SvgElement, SVGEllipseElement: P.SvgElement, SVGFEBlendElement: P.SvgElement, SVGFEColorMatrixElement: P.SvgElement, SVGFEComponentTransferElement: P.SvgElement, SVGFECompositeElement: P.SvgElement, SVGFEConvolveMatrixElement: P.SvgElement, SVGFEDiffuseLightingElement: P.SvgElement, SVGFEDisplacementMapElement: P.SvgElement, SVGFEDistantLightElement: P.SvgElement, SVGFEFloodElement: P.SvgElement, SVGFEFuncAElement: P.SvgElement, SVGFEFuncBElement: P.SvgElement, SVGFEFuncGElement: P.SvgElement, SVGFEFuncRElement: P.SvgElement, SVGFEGaussianBlurElement: P.SvgElement, SVGFEImageElement: P.SvgElement, SVGFEMergeElement: P.SvgElement, SVGFEMergeNodeElement: P.SvgElement, SVGFEMorphologyElement: P.SvgElement, SVGFEOffsetElement: P.SvgElement, SVGFEPointLightElement: P.SvgElement, SVGFESpecularLightingElement: P.SvgElement, SVGFESpotLightElement: P.SvgElement, SVGFETileElement: P.SvgElement, SVGFETurbulenceElement: P.SvgElement, SVGFilterElement: P.SvgElement, SVGForeignObjectElement: P.SvgElement, SVGGElement: P.SvgElement, SVGGeometryElement: P.SvgElement, SVGGraphicsElement: P.SvgElement, SVGImageElement: P.SvgElement, SVGLineElement: P.SvgElement, SVGLinearGradientElement: P.SvgElement, SVGMarkerElement: P.SvgElement, SVGMaskElement: P.SvgElement, SVGMetadataElement: P.SvgElement, SVGPathElement: P.SvgElement, SVGPatternElement: P.SvgElement, SVGPolygonElement: P.SvgElement, SVGPolylineElement: P.SvgElement, SVGRadialGradientElement: P.SvgElement, SVGRectElement: P.SvgElement, SVGSetElement: P.SvgElement, SVGStopElement: P.SvgElement, SVGStyleElement: P.SvgElement, SVGSVGElement: P.SvgElement, SVGSwitchElement: P.SvgElement, SVGSymbolElement: P.SvgElement, SVGTSpanElement: P.SvgElement, SVGTextContentElement: P.SvgElement, SVGTextElement: P.SvgElement, SVGTextPathElement: P.SvgElement, SVGTextPositioningElement: P.SvgElement, SVGTitleElement: P.SvgElement, SVGUseElement: P.SvgElement, SVGViewElement: P.SvgElement, SVGGradientElement: P.SvgElement, SVGComponentTransferFunctionElement: P.SvgElement, SVGFEDropShadowElement: P.SvgElement, SVGMPathElement: P.SvgElement, SVGElement: P.SvgElement, SVGTransform: P.Transform, SVGTransformList: P.TransformList, AudioBuffer: P.AudioBuffer, AudioParamMap: P.AudioParamMap, AudioTrackList: P.AudioTrackList, AudioContext: P.BaseAudioContext, webkitAudioContext: P.BaseAudioContext, BaseAudioContext: P.BaseAudioContext, OfflineAudioContext: P.OfflineAudioContext, SQLResultSetRowList: P.SqlResultSetRowList});
    hunkHelpers.setOrUpdateLeafTags({AnimationEffectReadOnly: true, AnimationEffectTiming: true, AnimationEffectTimingReadOnly: true, AnimationTimeline: true, AnimationWorkletGlobalScope: true, AuthenticatorAssertionResponse: true, AuthenticatorAttestationResponse: true, AuthenticatorResponse: true, BackgroundFetchFetch: true, BackgroundFetchManager: true, BackgroundFetchSettledFetch: true, BarProp: true, BarcodeDetector: true, BluetoothRemoteGATTDescriptor: true, Body: true, BudgetState: true, CacheStorage: true, CanvasGradient: true, CanvasPattern: true, CanvasRenderingContext2D: true, Client: true, Clients: true, CookieStore: true, Coordinates: true, Credential: true, CredentialUserData: true, CredentialsContainer: true, Crypto: true, CryptoKey: true, CSS: true, CSSVariableReferenceValue: true, CustomElementRegistry: true, DataTransfer: true, DataTransferItem: true, DeprecatedStorageInfo: true, DeprecatedStorageQuota: true, DeprecationReport: true, DetectedBarcode: true, DetectedFace: true, DetectedText: true, DeviceAcceleration: true, DeviceRotationRate: true, DirectoryEntry: true, DirectoryReader: true, DocumentOrShadowRoot: true, DocumentTimeline: true, DOMError: true, Iterator: true, DOMMatrix: true, DOMMatrixReadOnly: true, DOMParser: true, DOMPoint: true, DOMPointReadOnly: true, DOMQuad: true, DOMStringMap: true, Entry: true, External: true, FaceDetector: true, FederatedCredential: true, FileEntry: true, DOMFileSystem: true, FontFace: true, FontFaceSource: true, FormData: true, GamepadButton: true, GamepadPose: true, Geolocation: true, Position: true, Headers: true, HTMLHyperlinkElementUtils: true, IdleDeadline: true, ImageBitmap: true, ImageBitmapRenderingContext: true, ImageCapture: true, InputDeviceCapabilities: true, IntersectionObserver: true, IntersectionObserverEntry: true, InterventionReport: true, KeyframeEffect: true, KeyframeEffectReadOnly: true, MediaCapabilities: true, MediaCapabilitiesInfo: true, MediaDeviceInfo: true, MediaError: true, MediaKeyStatusMap: true, MediaKeySystemAccess: true, MediaKeys: true, MediaKeysPolicy: true, MediaMetadata: true, MediaSession: true, MediaSettingsRange: true, MemoryInfo: true, MessageChannel: true, Metadata: true, MutationObserver: true, WebKitMutationObserver: true, MutationRecord: true, NavigationPreloadManager: true, Navigator: true, NavigatorAutomationInformation: true, NavigatorConcurrentHardware: true, NavigatorCookies: true, NavigatorUserMediaError: true, NodeFilter: true, NodeIterator: true, NonDocumentTypeChildNode: true, NonElementParentNode: true, NoncedElement: true, OffscreenCanvasRenderingContext2D: true, OverconstrainedError: true, PaintRenderingContext2D: true, PaintSize: true, PaintWorkletGlobalScope: true, PasswordCredential: true, Path2D: true, PaymentAddress: true, PaymentInstruments: true, PaymentManager: true, PaymentResponse: true, PerformanceEntry: true, PerformanceLongTaskTiming: true, PerformanceMark: true, PerformanceMeasure: true, PerformanceNavigation: true, PerformanceNavigationTiming: true, PerformanceObserver: true, PerformanceObserverEntryList: true, PerformancePaintTiming: true, PerformanceResourceTiming: true, PerformanceServerTiming: true, PerformanceTiming: true, Permissions: true, PhotoCapabilities: true, PositionError: true, Presentation: true, PresentationReceiver: true, PublicKeyCredential: true, PushManager: true, PushMessageData: true, PushSubscription: true, PushSubscriptionOptions: true, Range: true, RelatedApplication: true, ReportBody: true, ReportingObserver: true, ResizeObserver: true, ResizeObserverEntry: true, RTCCertificate: true, RTCIceCandidate: true, mozRTCIceCandidate: true, RTCLegacyStatsReport: true, RTCRtpContributingSource: true, RTCRtpReceiver: true, RTCRtpSender: true, RTCSessionDescription: true, mozRTCSessionDescription: true, RTCStatsResponse: true, Screen: true, ScrollState: true, ScrollTimeline: true, Selection: true, SharedArrayBuffer: true, SpeechRecognitionAlternative: true, SpeechSynthesisVoice: true, StaticRange: true, StorageManager: true, StyleMedia: true, StylePropertyMap: true, StylePropertyMapReadonly: true, SyncManager: true, TaskAttributionTiming: true, TextDetector: true, TextMetrics: true, TrackDefault: true, TreeWalker: true, TrustedHTML: true, TrustedScriptURL: true, TrustedURL: true, UnderlyingSourceBase: true, URLSearchParams: true, VRCoordinateSystem: true, VRDisplayCapabilities: true, VREyeParameters: true, VRFrameData: true, VRFrameOfReference: true, VRPose: true, VRStageBounds: true, VRStageBoundsPoint: true, VRStageParameters: true, ValidityState: true, VideoPlaybackQuality: true, VideoTrack: true, VTTRegion: true, WindowClient: true, WorkletAnimation: true, WorkletGlobalScope: true, XPathEvaluator: true, XPathExpression: true, XPathNSResolver: true, XPathResult: true, XMLSerializer: true, XSLTProcessor: true, Bluetooth: true, BluetoothCharacteristicProperties: true, BluetoothRemoteGATTServer: true, BluetoothRemoteGATTService: true, BluetoothUUID: true, BudgetService: true, Cache: true, DOMFileSystemSync: true, DirectoryEntrySync: true, DirectoryReaderSync: true, EntrySync: true, FileEntrySync: true, FileReaderSync: true, FileWriterSync: true, HTMLAllCollection: true, Mojo: true, MojoHandle: true, MojoWatcher: true, NFC: true, PagePopupController: true, Report: true, Request: true, Response: true, SubtleCrypto: true, USBAlternateInterface: true, USBConfiguration: true, USBDevice: true, USBEndpoint: true, USBInTransferResult: true, USBInterface: true, USBIsochronousInTransferPacket: true, USBIsochronousInTransferResult: true, USBIsochronousOutTransferPacket: true, USBIsochronousOutTransferResult: true, USBOutTransferResult: true, WorkerLocation: true, WorkerNavigator: true, Worklet: true, IDBCursor: true, IDBCursorWithValue: true, IDBFactory: true, IDBIndex: true, IDBObjectStore: true, IDBObservation: true, IDBObserver: true, IDBObserverChanges: true, SVGAngle: true, SVGAnimatedAngle: true, SVGAnimatedBoolean: true, SVGAnimatedEnumeration: true, SVGAnimatedInteger: true, SVGAnimatedLength: true, SVGAnimatedLengthList: true, SVGAnimatedNumber: true, SVGAnimatedNumberList: true, SVGAnimatedPreserveAspectRatio: true, SVGAnimatedRect: true, SVGAnimatedString: true, SVGAnimatedTransformList: true, SVGMatrix: true, SVGPoint: true, SVGPreserveAspectRatio: true, SVGRect: true, SVGUnitTypes: true, AudioListener: true, AudioParam: true, AudioTrack: true, AudioWorkletGlobalScope: true, AudioWorkletProcessor: true, PeriodicWave: true, WebGLActiveInfo: true, ANGLEInstancedArrays: true, ANGLE_instanced_arrays: true, WebGLBuffer: true, WebGLCanvas: true, WebGLColorBufferFloat: true, WebGLCompressedTextureASTC: true, WebGLCompressedTextureATC: true, WEBGL_compressed_texture_atc: true, WebGLCompressedTextureETC1: true, WEBGL_compressed_texture_etc1: true, WebGLCompressedTextureETC: true, WebGLCompressedTexturePVRTC: true, WEBGL_compressed_texture_pvrtc: true, WebGLCompressedTextureS3TC: true, WEBGL_compressed_texture_s3tc: true, WebGLCompressedTextureS3TCsRGB: true, WebGLDebugRendererInfo: true, WEBGL_debug_renderer_info: true, WebGLDebugShaders: true, WEBGL_debug_shaders: true, WebGLDepthTexture: true, WEBGL_depth_texture: true, WebGLDrawBuffers: true, WEBGL_draw_buffers: true, EXTsRGB: true, EXT_sRGB: true, EXTBlendMinMax: true, EXT_blend_minmax: true, EXTColorBufferFloat: true, EXTColorBufferHalfFloat: true, EXTDisjointTimerQuery: true, EXTDisjointTimerQueryWebGL2: true, EXTFragDepth: true, EXT_frag_depth: true, EXTShaderTextureLOD: true, EXT_shader_texture_lod: true, EXTTextureFilterAnisotropic: true, EXT_texture_filter_anisotropic: true, WebGLFramebuffer: true, WebGLGetBufferSubDataAsync: true, WebGLLoseContext: true, WebGLExtensionLoseContext: true, WEBGL_lose_context: true, OESElementIndexUint: true, OES_element_index_uint: true, OESStandardDerivatives: true, OES_standard_derivatives: true, OESTextureFloat: true, OES_texture_float: true, OESTextureFloatLinear: true, OES_texture_float_linear: true, OESTextureHalfFloat: true, OES_texture_half_float: true, OESTextureHalfFloatLinear: true, OES_texture_half_float_linear: true, OESVertexArrayObject: true, OES_vertex_array_object: true, WebGLProgram: true, WebGLQuery: true, WebGLRenderbuffer: true, WebGLRenderingContext: true, WebGL2RenderingContext: true, WebGLSampler: true, WebGLShader: true, WebGLShaderPrecisionFormat: true, WebGLSync: true, WebGLTexture: true, WebGLTimerQueryEXT: true, WebGLTransformFeedback: true, WebGLUniformLocation: true, WebGLVertexArrayObject: true, WebGLVertexArrayObjectOES: true, WebGL: true, WebGL2RenderingContextBase: true, Database: true, SQLError: true, SQLResultSet: true, SQLTransaction: 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, HTMLAudioElement: true, HTMLBRElement: true, HTMLButtonElement: true, HTMLCanvasElement: true, HTMLContentElement: true, HTMLDListElement: true, HTMLDataElement: true, HTMLDataListElement: true, HTMLDetailsElement: true, HTMLDialogElement: true, HTMLDivElement: true, HTMLEmbedElement: true, HTMLFieldSetElement: true, HTMLHRElement: true, HTMLHeadElement: true, HTMLHeadingElement: true, HTMLHtmlElement: true, HTMLIFrameElement: true, HTMLImageElement: true, HTMLInputElement: true, HTMLLIElement: true, HTMLLabelElement: true, HTMLLegendElement: true, HTMLLinkElement: true, HTMLMapElement: true, HTMLMediaElement: true, HTMLMenuElement: true, HTMLMetaElement: true, HTMLMeterElement: true, HTMLModElement: true, HTMLOListElement: true, HTMLObjectElement: true, HTMLOptGroupElement: true, HTMLOptionElement: true, HTMLOutputElement: true, HTMLParagraphElement: true, HTMLParamElement: true, HTMLPictureElement: true, HTMLPreElement: true, HTMLProgressElement: true, HTMLQuoteElement: true, HTMLShadowElement: true, HTMLSlotElement: true, HTMLSourceElement: true, HTMLSpanElement: true, HTMLStyleElement: true, HTMLTableCaptionElement: true, HTMLTableCellElement: true, HTMLTableDataCellElement: true, HTMLTableHeaderCellElement: true, HTMLTableColElement: true, HTMLTextAreaElement: true, HTMLTimeElement: true, HTMLTitleElement: true, HTMLTrackElement: true, HTMLUListElement: true, HTMLUnknownElement: true, HTMLVideoElement: true, HTMLDirectoryElement: true, HTMLFontElement: true, HTMLFrameElement: true, HTMLFrameSetElement: true, HTMLMarqueeElement: true, HTMLElement: false, AccessibleNodeList: true, HTMLAnchorElement: true, HTMLAreaElement: true, HTMLBaseElement: true, Blob: false, HTMLBodyElement: true, CDATASection: true, CharacterData: true, Comment: true, ProcessingInstruction: true, Text: true, CloseEvent: true, CSSPerspective: true, CSSCharsetRule: true, CSSConditionRule: true, CSSFontFaceRule: true, CSSGroupingRule: true, CSSImportRule: true, CSSKeyframeRule: true, MozCSSKeyframeRule: true, WebKitCSSKeyframeRule: true, CSSKeyframesRule: true, MozCSSKeyframesRule: true, WebKitCSSKeyframesRule: true, CSSMediaRule: true, CSSNamespaceRule: true, CSSPageRule: true, CSSRule: true, CSSStyleRule: true, CSSSupportsRule: true, CSSViewportRule: true, CSSStyleDeclaration: true, MSStyleCSSProperties: true, CSS2Properties: true, CSSImageValue: true, CSSKeywordValue: true, CSSNumericValue: true, CSSPositionValue: true, CSSResourceValue: true, CSSUnitValue: true, CSSURLImageValue: true, CSSStyleValue: false, CSSMatrixComponent: true, CSSRotation: true, CSSScale: true, CSSSkew: true, CSSTranslation: true, CSSTransformComponent: false, CSSTransformValue: true, CSSUnparsedValue: true, DataTransferItemList: true, XMLDocument: true, Document: false, DOMException: true, DOMImplementation: true, ClientRectList: true, DOMRectList: true, DOMRectReadOnly: false, DOMStringList: true, DOMTokenList: true, Element: false, AbortPaymentEvent: true, AnimationEvent: true, AnimationPlaybackEvent: true, ApplicationCacheErrorEvent: true, BackgroundFetchClickEvent: true, BackgroundFetchEvent: true, BackgroundFetchFailEvent: true, BackgroundFetchedEvent: true, BeforeInstallPromptEvent: true, BeforeUnloadEvent: true, BlobEvent: true, CanMakePaymentEvent: true, ClipboardEvent: true, CustomEvent: true, DeviceMotionEvent: true, DeviceOrientationEvent: true, ErrorEvent: true, ExtendableEvent: true, ExtendableMessageEvent: true, FetchEvent: true, FontFaceSetLoadEvent: true, ForeignFetchEvent: true, GamepadEvent: true, HashChangeEvent: true, InstallEvent: true, MediaEncryptedEvent: true, MediaKeyMessageEvent: true, MediaQueryListEvent: true, MediaStreamEvent: true, MediaStreamTrackEvent: true, MIDIConnectionEvent: true, MIDIMessageEvent: true, MutationEvent: true, NotificationEvent: true, PageTransitionEvent: true, PaymentRequestEvent: true, PaymentRequestUpdateEvent: true, PopStateEvent: true, PresentationConnectionAvailableEvent: true, PresentationConnectionCloseEvent: true, PromiseRejectionEvent: true, PushEvent: true, RTCDataChannelEvent: true, RTCDTMFToneChangeEvent: true, RTCPeerConnectionIceEvent: true, RTCTrackEvent: true, SecurityPolicyViolationEvent: true, SensorErrorEvent: true, SpeechRecognitionError: true, SpeechRecognitionEvent: true, SpeechSynthesisEvent: true, StorageEvent: true, SyncEvent: true, TrackEvent: true, TransitionEvent: true, WebKitTransitionEvent: true, VRDeviceEvent: true, VRDisplayEvent: true, VRSessionEvent: true, MojoInterfaceRequestEvent: true, USBConnectionEvent: true, IDBVersionChangeEvent: true, AudioProcessingEvent: true, OfflineAudioCompletionEvent: true, WebGLContextEvent: true, Event: false, InputEvent: false, SubmitEvent: false, EventSource: true, AbsoluteOrientationSensor: true, Accelerometer: true, AccessibleNode: true, AmbientLightSensor: true, Animation: true, ApplicationCache: true, DOMApplicationCache: true, OfflineResourceList: true, BackgroundFetchRegistration: true, BatteryManager: true, BroadcastChannel: true, CanvasCaptureMediaStreamTrack: true, FileReader: true, FontFaceSet: true, Gyroscope: true, LinearAccelerationSensor: true, Magnetometer: true, MediaDevices: true, MediaKeySession: true, MediaQueryList: true, MediaRecorder: true, MediaSource: true, MediaStream: true, MediaStreamTrack: true, MessagePort: true, MIDIAccess: true, MIDIInput: true, MIDIOutput: true, MIDIPort: true, NetworkInformation: true, Notification: true, OffscreenCanvas: true, OrientationSensor: true, PaymentRequest: true, Performance: true, PermissionStatus: true, PresentationAvailability: true, PresentationConnection: true, PresentationConnectionList: true, PresentationRequest: true, RelativeOrientationSensor: true, RemotePlayback: true, RTCDataChannel: true, DataChannel: true, RTCDTMFSender: true, RTCPeerConnection: true, webkitRTCPeerConnection: true, mozRTCPeerConnection: true, ScreenOrientation: true, Sensor: true, ServiceWorker: true, ServiceWorkerContainer: true, ServiceWorkerRegistration: true, SharedWorker: true, SpeechRecognition: true, SpeechSynthesis: true, SpeechSynthesisUtterance: true, VR: true, VRDevice: true, VRDisplay: true, VRSession: true, VisualViewport: true, Worker: true, WorkerPerformance: true, BluetoothDevice: true, BluetoothRemoteGATTCharacteristic: true, Clipboard: true, MojoInterfaceInterceptor: true, USB: true, IDBDatabase: true, IDBOpenDBRequest: true, IDBVersionChangeRequest: true, IDBRequest: true, IDBTransaction: true, AnalyserNode: true, RealtimeAnalyserNode: true, AudioBufferSourceNode: true, AudioDestinationNode: true, AudioNode: true, AudioScheduledSourceNode: true, AudioWorkletNode: true, BiquadFilterNode: true, ChannelMergerNode: true, AudioChannelMerger: true, ChannelSplitterNode: true, AudioChannelSplitter: true, ConstantSourceNode: true, ConvolverNode: true, DelayNode: true, DynamicsCompressorNode: true, GainNode: true, AudioGainNode: true, IIRFilterNode: true, MediaElementAudioSourceNode: true, MediaStreamAudioDestinationNode: true, MediaStreamAudioSourceNode: true, OscillatorNode: true, Oscillator: true, PannerNode: true, AudioPannerNode: true, webkitAudioPannerNode: true, ScriptProcessorNode: true, JavaScriptAudioNode: true, StereoPannerNode: true, WaveShaperNode: true, EventTarget: false, File: true, FileList: true, FileWriter: true, HTMLFormElement: true, Gamepad: true, History: true, HTMLCollection: true, HTMLFormControlsCollection: true, HTMLOptionsCollection: true, HTMLDocument: true, XMLHttpRequest: true, XMLHttpRequestUpload: true, XMLHttpRequestEventTarget: false, ImageData: true, KeyboardEvent: true, Location: true, MediaList: true, MessageEvent: true, MIDIInputMap: true, MIDIOutputMap: true, MimeType: true, MimeTypeArray: true, DocumentFragment: true, ShadowRoot: true, DocumentType: true, Node: false, NodeList: true, RadioNodeList: true, Plugin: true, PluginArray: true, ProgressEvent: true, ResourceProgressEvent: true, RTCStatsReport: true, HTMLScriptElement: true, HTMLSelectElement: true, SourceBuffer: true, SourceBufferList: true, SpeechGrammar: true, SpeechGrammarList: true, SpeechRecognitionResult: true, Storage: true, CSSStyleSheet: true, StyleSheet: true, HTMLTableElement: true, HTMLTableRowElement: true, HTMLTableSectionElement: true, HTMLTemplateElement: true, TextTrack: true, TextTrackCue: true, VTTCue: true, TextTrackCueList: true, TextTrackList: true, TimeRanges: true, Touch: true, TouchList: true, TrackDefaultList: true, CompositionEvent: true, FocusEvent: true, MouseEvent: true, DragEvent: true, PointerEvent: true, TextEvent: true, TouchEvent: true, WheelEvent: true, UIEvent: false, URL: true, VideoTrackList: true, WebSocket: true, Window: true, DOMWindow: true, DedicatedWorkerGlobalScope: true, ServiceWorkerGlobalScope: true, SharedWorkerGlobalScope: true, WorkerGlobalScope: true, Attr: true, CSSRuleList: true, ClientRect: true, DOMRect: true, GamepadList: true, NamedNodeMap: true, MozNamedAttrMap: true, SpeechRecognitionResultList: true, StyleSheetList: true, IDBKeyRange: true, SVGLength: true, SVGLengthList: true, SVGNumber: true, SVGNumberList: true, SVGPointList: true, SVGScriptElement: true, SVGStringList: true, SVGAElement: true, SVGAnimateElement: true, SVGAnimateMotionElement: true, SVGAnimateTransformElement: true, SVGAnimationElement: true, SVGCircleElement: true, SVGClipPathElement: true, SVGDefsElement: true, SVGDescElement: true, SVGDiscardElement: true, SVGEllipseElement: true, SVGFEBlendElement: true, SVGFEColorMatrixElement: true, SVGFEComponentTransferElement: true, SVGFECompositeElement: true, SVGFEConvolveMatrixElement: true, SVGFEDiffuseLightingElement: true, SVGFEDisplacementMapElement: true, SVGFEDistantLightElement: true, SVGFEFloodElement: true, SVGFEFuncAElement: true, SVGFEFuncBElement: true, SVGFEFuncGElement: true, SVGFEFuncRElement: true, SVGFEGaussianBlurElement: true, SVGFEImageElement: true, SVGFEMergeElement: true, SVGFEMergeNodeElement: true, SVGFEMorphologyElement: true, SVGFEOffsetElement: true, SVGFEPointLightElement: true, SVGFESpecularLightingElement: true, SVGFESpotLightElement: true, SVGFETileElement: true, SVGFETurbulenceElement: true, SVGFilterElement: true, SVGForeignObjectElement: true, SVGGElement: true, SVGGeometryElement: true, SVGGraphicsElement: true, SVGImageElement: true, SVGLineElement: true, SVGLinearGradientElement: true, SVGMarkerElement: true, SVGMaskElement: true, SVGMetadataElement: true, SVGPathElement: true, SVGPatternElement: true, SVGPolygonElement: true, SVGPolylineElement: true, SVGRadialGradientElement: true, SVGRectElement: true, SVGSetElement: true, SVGStopElement: true, SVGStyleElement: true, SVGSVGElement: true, SVGSwitchElement: true, SVGSymbolElement: true, SVGTSpanElement: true, SVGTextContentElement: true, SVGTextElement: true, SVGTextPathElement: true, SVGTextPositioningElement: true, SVGTitleElement: true, SVGUseElement: true, SVGViewElement: true, SVGGradientElement: true, SVGComponentTransferFunctionElement: true, SVGFEDropShadowElement: true, SVGMPathElement: true, SVGElement: false, SVGTransform: true, SVGTransformList: true, AudioBuffer: true, AudioParamMap: true, AudioTrackList: true, AudioContext: true, webkitAudioContext: true, BaseAudioContext: false, OfflineAudioContext: true, SQLResultSetRowList: true});
    H.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H.NativeTypedArrayOfDouble.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H.NativeTypedArrayOfInt.$nativeSuperclassTag = "ArrayBufferView";
    W._SourceBufferList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    W._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
    W._TextTrackList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    W._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
  })();
  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$3 = function(a, b, c) {
    return this(a, b, c);
  };
  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$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$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$2$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$1$2 = function(a, b) {
    return this(a, b);
  };
  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$0 = function() {
    return this();
  };
  Function.prototype.call$2$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 = D.main;
    if (typeof dartMainRunner === "function")
      dartMainRunner(callMain, []);
    else
      callMain([]);
  });
})();
