anchor.diff:      return r_used;
     }
   
  -  // Return this << n.
  -  _Bigint _lShift(int n) {
  -    var ds = n ~/ _DIGIT_BITS;
  -    var bs = n % _DIGIT_BITS;
  -    if (bs == 0) {
  -      return _dlShift(ds);
  -    }
  -    var cbs = _DIGIT_BITS - bs;
  -    var bm = (1 << cbs) - 1;
  -    var r_used = _used + ds + 1;
  -    var digits = _digits;
  -    var r_digits = new Uint32List(r_used + (r_used & 1));
  -    var c = 0;
  -    var i = _used;
  -    while (--i >= 0) {
  -      final d = digits[i];
  -      r_digits[i + ds + 1] = (d >> cbs) | c;
  -      c = (d & bm) << bs;
  -    }
  -    r_digits[ds] = c;
  -    return new _Bigint(_neg, r_used, r_digits);
  -  }
  -
     // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n.
  -  // Return r_used.
  -  static int _lShiftDigits(Uint32List x_digits, int x_used, int n,
  -                           Uint32List r_digits) {
  -    var ds = n ~/ _DIGIT_BITS;
  -    var bs = n % _DIGIT_BITS;
  -    if (bs == 0) {
  -      return _dlShiftDigits(x_digits, x_used, ds, r_digits);
  -    }
  -    var cbs = _DIGIT_BITS - bs;
  -    var bm = (1 << cbs) - 1;
  -    var r_used = x_used + ds + 1;
  -    assert(r_digits.length >= r_used + (r_used & 1));
  +  static void _lsh(Uint32List x_digits, int x_used, int n,
  +                   Uint32List r_digits) {
  +    final ds = n ~/ _DIGIT_BITS;
  +    final bs = n % _DIGIT_BITS;
  +    final cbs = _DIGIT_BITS - bs;
  +    final bm = (1 << cbs) - 1;
       var c = 0;
       var i = x_used;
       while (--i >= 0) {
  
positive.code:     if (r_used <= 0) {
        return 0;
      }
      var cbs = _DIGIT_BITS - bs;
      var bm = (1 << bs) - 1;
      assert(r_digits.length >= r_used + (r_used & 1));
      r_digits[0] = x_digits[ds] >> bs;
      for (var i = ds + 1; i < x_used; i++) {
        final d = x_digits[i];
        r_digits[i - ds - 1] |= (d & bm) << cbs;
        r_digits[i - ds] = d >> bs;
      }
      if (r_digits[r_used - 1] == 0) {
        r_used--;  // Clamp result.
      } else if (r_used.isOdd) {
  
negative.code:     while (--i >= 0) {
        r_digits[i] = 0;
      }
    }
  
    // Return this << n.
    _Bigint _lShift(int n) {
      final ds = n ~/ _DIGIT_BITS;
      final bs = n % _DIGIT_BITS;
      if (bs == 0) {
        return _dlShift(ds);
      }
      var r_used = _used + ds + 1;
      var r_digits = new Uint32List(r_used + (r_used & 1));
      _lsh(_digits, _used, n, r_digits);
      return new _Bigint(_neg, r_used, r_digits);
    }
  
    // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n.
    // Return r_used.
    static int _lShiftDigits(Uint32List x_digits, int x_used, int n,
                             Uint32List r_digits) {
      final ds = n ~/ _DIGIT_BITS;
      final bs = n % _DIGIT_BITS;
      if (bs == 0) {
        return _dlShiftDigits(x_digits, x_used, ds, r_digits);
      }
      var r_used = x_used + ds + 1;
      assert(r_digits.length >= r_used + (r_used & 1));
      _lsh(x_digits, x_used, n, r_digits);
      if (r_digits[r_used - 1] == 0) {
        r_used--;  // Clamp result.
      } else if (r_used.isOdd) {
  